Skip to content

Commit 8cb8a3f

Browse files
committed
FEATURE: multiple array evaluation
* function to set manual evaluation setting * function to check manual evaluation setting * multiple array evaluation macro `eval!`
1 parent 551d054 commit 8cb8a3f

File tree

3 files changed

+71
-1
lines changed

3 files changed

+71
-1
lines changed

src/array.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ extern {
6363

6464
fn af_eval(arr: AfArray) -> c_int;
6565

66+
fn af_eval_multiple(num: c_int, arrays: *const AfArray) -> c_int;
67+
68+
fn af_set_manual_eval_flag(flag: c_int) -> c_int;
69+
70+
fn af_get_manual_eval_flag(flag: *mut c_int) -> c_int;
71+
6672
fn af_retain_array(out: MutAfArray, arr: AfArray) -> c_int;
6773

6874
fn af_copy_array(out: MutAfArray, arr: AfArray) -> c_int;
@@ -385,3 +391,53 @@ pub fn print(input: &Array) {
385391
HANDLE_ERROR(AfError::from(err_val));
386392
}
387393
}
394+
395+
/// evaluate multiple arrays
396+
///
397+
/// Use this function to evaluate multiple arrays in single call
398+
///
399+
/// # Parameters
400+
///
401+
/// - `inputs` are the list of arrays to be evaluated
402+
pub fn eval_multiple(inputs: Vec<&Array>) {
403+
unsafe {
404+
let mut v = Vec::new();
405+
for i in inputs {
406+
v.push(i.get());
407+
}
408+
409+
let err_val = af_eval_multiple(v.len() as c_int, v.as_ptr() as *const AfArray);
410+
HANDLE_ERROR(AfError::from(err_val));
411+
}
412+
}
413+
414+
/// Set eval flag value
415+
///
416+
/// This function can be used to toggle on/off the manual evaluation of arrays.
417+
///
418+
/// # Parameters
419+
///
420+
/// - `flag` is a boolean value indicating manual evaluation setting
421+
pub fn set_manual_eval(flag: bool) {
422+
unsafe {
423+
let err_val = af_set_manual_eval_flag(flag as c_int);
424+
HANDLE_ERROR(AfError::from(err_val));
425+
}
426+
}
427+
428+
/// Get eval flag value
429+
///
430+
/// This function can be used to find out if manual evaluation of arrays is
431+
/// turned on or off.
432+
///
433+
/// # Return Values
434+
///
435+
/// A boolean indicating manual evaluation setting.
436+
pub fn is_eval_manual() -> bool {
437+
unsafe {
438+
let mut ret_val: i32 = 0;
439+
let err_val = af_get_manual_eval_flag(&mut ret_val as *mut c_int);
440+
HANDLE_ERROR(AfError::from(err_val));
441+
ret_val > 0
442+
}
443+
}

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
extern crate lazy_static;
77

88
pub use array::Array;
9-
pub use array::{print};
9+
pub use array::{print, eval_multiple, is_eval_manual, set_manual_eval};
1010
mod array;
1111

1212
//pub use algorithm::{sum_nan, product_nan, sum_nan_all, product_nan_all};

src/macros.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,17 @@ macro_rules! af_print {
128128
}
129129
};
130130
}
131+
132+
/// Evaluate arbitrary number of arrays
133+
#[macro_export]
134+
macro_rules! eval {
135+
[$($x:ident),+] => {
136+
{
137+
let mut temp_vec = Vec::new();
138+
$(
139+
temp_vec.push($x);
140+
)*
141+
eval_multiple(temp_vec)
142+
}
143+
};
144+
}

0 commit comments

Comments
 (0)