Skip to content

Commit 0fc739b

Browse files
committed
API for util header from arrayfire
Also, implemented `Copy` trait for `Aftype` and `Dim4` structs.
1 parent 2545bdf commit 0fc739b

File tree

5 files changed

+85
-29
lines changed

5 files changed

+85
-29
lines changed

src/array.rs

Lines changed: 64 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,32 @@ extern {
2727

2828
fn af_get_numdims(result: *mut c_uint, arr: AfArray) -> c_int;
2929

30+
fn af_is_empty(result: *mut c_int, arr: AfArray) -> c_int;
31+
32+
fn af_is_scalar(result: *mut c_int, arr: AfArray) -> c_int;
33+
34+
fn af_is_row(result: *mut c_int, arr: AfArray) -> c_int;
35+
36+
fn af_is_column(result: *mut c_int, arr: AfArray) -> c_int;
37+
38+
fn af_is_vector(result: *mut c_int, arr: AfArray) -> c_int;
39+
40+
fn af_is_complex(result: *mut c_int, arr: AfArray) -> c_int;
41+
42+
fn af_is_real(result: *mut c_int, arr: AfArray) -> c_int;
43+
44+
fn af_is_double(result: *mut c_int, arr: AfArray) -> c_int;
45+
46+
fn af_is_single(result: *mut c_int, arr: AfArray) -> c_int;
47+
48+
fn af_is_realfloating(result: *mut c_int, arr: AfArray) -> c_int;
49+
50+
fn af_is_floating(result: *mut c_int, arr: AfArray) -> c_int;
51+
52+
fn af_is_integer(result: *mut c_int, arr: AfArray) -> c_int;
53+
54+
fn af_is_bool(result: *mut c_int, arr: AfArray) -> c_int;
55+
3056
fn af_get_data_ptr(data: *mut c_void, arr: AfArray) -> c_int;
3157

3258
fn af_eval(arr: AfArray) -> c_int;
@@ -36,34 +62,42 @@ extern {
3662
fn af_print_array(arr: AfArray) -> c_int;
3763
}
3864

65+
macro_rules! is_func {
66+
($fn_name: ident, $ffi_fn: ident) => (
67+
pub fn $fn_name(&self) -> bool {
68+
unsafe {
69+
let mut ret_val: i32 = 0;
70+
$ffi_fn(&mut ret_val as *mut c_int, self.handle as AfArray);
71+
ret_val > 0
72+
}
73+
}
74+
)
75+
}
76+
3977
impl Array {
4078
#[allow(unused_mut)]
4179
pub fn new<T>(dims: Dim4, slice: &[T], aftype: Aftype) -> Array {
4280
unsafe {
4381
let mut temp: i64 = 0;
44-
af_create_array(&mut temp as *mut c_longlong,
45-
slice.as_ptr() as *const c_void,
46-
dims.ndims() as c_uint,
47-
dims.get().as_ptr() as * const c_longlong,
48-
get_ffi_type(aftype.clone()) as c_int);
49-
Array { handle: temp }
82+
af_create_array(&mut temp as MutAfArray, slice.as_ptr() as *const c_void,
83+
dims.ndims() as c_uint, dims.get().as_ptr() as * const c_longlong,
84+
get_ffi_type(aftype) as c_int);
85+
Array {handle: temp}
5086
}
5187
}
5288

5389
pub fn elements(&self) -> i64 {
5490
unsafe {
5591
let mut ret_val: i64 = 0;
56-
af_get_elements(&mut ret_val as *mut c_longlong,
57-
self.handle as c_longlong);
92+
af_get_elements(&mut ret_val as MutAfArray, self.handle as AfArray);
5893
ret_val
5994
}
6095
}
6196

6297
pub fn get_type(&self) -> Aftype {
6398
unsafe {
6499
let mut ret_val: i32 = 0;
65-
af_get_type(&mut ret_val as *mut c_int,
66-
self.handle as c_longlong);
100+
af_get_type(&mut ret_val as *mut c_int, self.handle as AfArray);
67101
get_af_type(ret_val)
68102
}
69103
}
@@ -74,20 +108,17 @@ impl Array {
74108
let mut ret1: i64 = 0;
75109
let mut ret2: i64 = 0;
76110
let mut ret3: i64 = 0;
77-
af_get_dims(&mut ret0 as *mut c_longlong,
78-
&mut ret1 as *mut c_longlong,
79-
&mut ret2 as *mut c_longlong,
80-
&mut ret3 as *mut c_longlong,
81-
self.handle as c_longlong);
82-
Dim4 { dims: [ret0 as u64, ret1 as u64, ret2 as u64, ret3 as u64] }
111+
af_get_dims(&mut ret0 as *mut c_longlong, &mut ret1 as *mut c_longlong,
112+
&mut ret2 as *mut c_longlong, &mut ret3 as *mut c_longlong,
113+
self.handle as AfArray);
114+
Dim4 {dims: [ret0 as u64, ret1 as u64, ret2 as u64, ret3 as u64]}
83115
}
84116
}
85117

86118
pub fn numdims(&self) -> u32 {
87119
unsafe {
88120
let mut ret_val: u32 = 0;
89-
af_get_numdims(&mut ret_val as *mut c_uint,
90-
self.handle as c_longlong);
121+
af_get_numdims(&mut ret_val as *mut c_uint, self.handle as AfArray);
91122
ret_val
92123
}
93124
}
@@ -98,16 +129,28 @@ impl Array {
98129

99130
pub fn host(&self, data:&mut [f64]) {
100131
unsafe {
101-
af_get_data_ptr(data.as_mut_ptr() as *mut c_void,
102-
self.handle as c_longlong);
132+
af_get_data_ptr(data.as_mut_ptr() as *mut c_void, self.handle as AfArray);
103133
}
104134
}
105135

106136
pub fn eval(&self) {
107137
unsafe {
108-
af_eval(self.handle as c_longlong);
138+
af_eval(self.handle as AfArray);
109139
}
110140
}
141+
142+
is_func!(is_empty, af_is_empty);
143+
is_func!(is_scalar, af_is_scalar);
144+
is_func!(is_row, af_is_row);
145+
is_func!(is_column, af_is_column);
146+
is_func!(is_vector, af_is_vector);
147+
is_func!(is_complex, af_is_complex);
148+
is_func!(is_double, af_is_double);
149+
is_func!(is_single, af_is_single);
150+
is_func!(is_real, af_is_real);
151+
is_func!(is_floating, af_is_floating);
152+
is_func!(is_integer, af_is_integer);
153+
is_func!(is_bool, af_is_bool);
111154
}
112155

113156
impl Drop for Array {

src/data/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ pub fn range(dims: Dim4, seq_dim: i32, aftype: Aftype) -> Array {
136136
af_range(&mut temp as MutAfArray,
137137
dims.ndims() as c_uint, dims.get().as_ptr() as *const DimT,
138138
seq_dim as c_int,
139-
get_ffi_type(aftype.clone()) as c_int);
139+
get_ffi_type(aftype) as c_int);
140140
Array {handle: temp}
141141
}
142142
}
@@ -148,7 +148,7 @@ pub fn iota(dims: Dim4, tdims: Dim4, aftype: Aftype) -> Array {
148148
af_iota(&mut temp as MutAfArray,
149149
dims.ndims() as c_uint, dims.get().as_ptr() as *const DimT,
150150
tdims.ndims() as c_uint, tdims.get().as_ptr() as *const DimT,
151-
get_ffi_type(aftype.clone()) as c_int);
151+
get_ffi_type(aftype) as c_int);
152152
Array {handle: temp}
153153
}
154154
}
@@ -172,7 +172,7 @@ pub fn randu(dims: Dim4, aftype: Aftype) -> Array {
172172
let mut temp: i64 = 0;
173173
af_randu(&mut temp as MutAfArray,
174174
dims.ndims() as c_uint, dims.get().as_ptr() as *const DimT,
175-
get_ffi_type(aftype.clone()) as c_int);
175+
get_ffi_type(aftype) as c_int);
176176
Array {handle: temp}
177177
}
178178
}
@@ -183,7 +183,7 @@ pub fn randn(dims: Dim4, aftype: Aftype) -> Array {
183183
let mut temp: i64 = 0;
184184
af_randn(&mut temp as MutAfArray,
185185
dims.ndims() as c_uint, dims.get().as_ptr() as *const DimT,
186-
get_ffi_type(aftype.clone()) as c_int);
186+
get_ffi_type(aftype) as c_int);
187187
Array {handle: temp}
188188
}
189189
}

src/device/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,23 @@ extern crate libc;
33
use self::libc::c_int;
44

55
extern {
6+
fn af_get_version(major: *mut c_int, minor: *mut c_int, patch: *mut c_int) -> c_int;
7+
68
fn af_info() -> c_int;
79

810
fn af_set_device(device: c_int) -> c_int;
911
}
1012

13+
pub fn get_version() -> (i32, i32, i32) {
14+
unsafe {
15+
let mut maj: i32 = 0;
16+
let mut min: i32 = 0;
17+
let mut pat: i32 = 0;
18+
af_get_version(&mut maj as *mut c_int, &mut min as *mut c_int, &mut pat as *mut c_int);
19+
(maj, min, pat)
20+
}
21+
}
22+
1123
pub fn info() {
1224
unsafe { af_info(); }
1325
}

src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#[derive(Clone)]
1+
#[derive(Copy, Clone)]
22
pub enum Aftype {
33
F32,
44
C32,
@@ -12,7 +12,7 @@ pub enum Aftype {
1212
U64,
1313
}
1414

15-
#[derive(Clone)]
15+
#[derive(Copy, Clone)]
1616
pub struct Dim4 {
1717
dims: [u64; 4],
1818
}
@@ -28,7 +28,7 @@ mod dim4;
2828

2929
mod util;
3030

31-
pub use device::{info, set_device};
31+
pub use device::{get_version, info, set_device};
3232
mod device;
3333

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

tests/hello_world.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ fn main() {
4848
af::print(&inds);
4949

5050
println!("u8 constant array");
51-
let u8_cnst = af::constant(1 as u8, Dim4::new(&[4,4,1,1]));
51+
let u8_cnst = af::constant(1 as u8, dims);
5252
af::print(&u8_cnst);
53+
println!("Is u8_cnst array float precision type ? {}", u8_cnst.is_single());
5354
}

0 commit comments

Comments
 (0)