Use modules.

This commit is contained in:
Stephen Chung 2020-09-22 19:17:50 +08:00
parent e7566da7d2
commit 41a16c9cf7
2 changed files with 32 additions and 30 deletions

View File

@ -23,23 +23,25 @@ pub type Unit = ();
macro_rules! gen_array_functions { macro_rules! gen_array_functions {
($root:ident => $($arg_type:ident),+ ) => { ($root:ident => $($arg_type:ident),+ ) => {
pub mod $root { $(pub mod $arg_type { pub mod $root { $( pub mod $arg_type {
use super::super::*; use super::super::*;
#[export_fn] #[export_module]
#[inline(always)] pub mod functions {
pub fn push(list: &mut Array, item: $arg_type) { #[rhai_fn(name = "push", name = "+=")]
list.push(Dynamic::from(item)); #[inline(always)]
} pub fn push(list: &mut Array, item: $arg_type) {
list.push(Dynamic::from(item));
}
#[export_fn] pub fn insert(list: &mut Array, position: INT, item: $arg_type) {
pub fn insert(list: &mut Array, position: INT, item: $arg_type) { if position <= 0 {
if position <= 0 { list.insert(0, Dynamic::from(item));
list.insert(0, Dynamic::from(item)); } else if (position as usize) >= list.len() - 1 {
} else if (position as usize) >= list.len() - 1 { push(list, item);
push(list, item); } else {
} else { list.insert(position as usize, Dynamic::from(item));
list.insert(position as usize, Dynamic::from(item)); }
} }
} }
})* } })* }
@ -48,9 +50,7 @@ macro_rules! gen_array_functions {
macro_rules! reg_functions { macro_rules! reg_functions {
($mod_name:ident += $root:ident ; $($arg_type:ident),+) => { $( ($mod_name:ident += $root:ident ; $($arg_type:ident),+) => { $(
set_exported_fn!($mod_name, "push", $root::$arg_type::push); combine_with_exported_module!($mod_name, "array_functions", $root::$arg_type::functions);
set_exported_fn!($mod_name, "+=", $root::$arg_type::push);
set_exported_fn!($mod_name, "insert", $root::$arg_type::insert);
$mod_name.set_raw_fn("pad", $mod_name.set_raw_fn("pad",
&[TypeId::of::<Array>(), TypeId::of::<INT>(), TypeId::of::<$arg_type>()], &[TypeId::of::<Array>(), TypeId::of::<INT>(), TypeId::of::<$arg_type>()],

View File

@ -17,28 +17,30 @@ use crate::stdlib::{
macro_rules! gen_concat_functions { macro_rules! gen_concat_functions {
($root:ident => $($arg_type:ident),+ ) => { ($root:ident => $($arg_type:ident),+ ) => {
pub mod $root { $(pub mod $arg_type { pub mod $root { $( pub mod $arg_type {
use super::super::*; use super::super::*;
#[export_fn] #[export_module]
#[inline] pub mod functions {
pub fn append_func(x: &mut ImmutableString, y: $arg_type) -> String { #[rhai_fn(name = "+")]
format!("{}{}", x, y) #[inline]
} pub fn append_func(x: &mut ImmutableString, y: $arg_type) -> String {
format!("{}{}", x, y)
}
#[export_fn] #[rhai_fn(name = "+")]
#[inline] #[inline]
pub fn prepend_func(x: &mut $arg_type, y: ImmutableString) -> String { pub fn prepend_func(x: &mut $arg_type, y: ImmutableString) -> String {
format!("{}{}", x, y) format!("{}{}", x, y)
}
} }
})* } } )* }
} }
} }
macro_rules! reg_functions { macro_rules! reg_functions {
($mod_name:ident += $root:ident ; $($arg_type:ident),+) => { $( ($mod_name:ident += $root:ident ; $($arg_type:ident),+) => { $(
set_exported_fn!($mod_name, "+", $root::$arg_type::append_func); combine_with_exported_module!($mod_name, "append", $root::$arg_type::functions);
set_exported_fn!($mod_name, "+", $root::$arg_type::prepend_func);
)* } )* }
} }