|
1 | 1 | extern crate libc; |
2 | 2 |
|
3 | 3 | use dim4::Dim4; |
| 4 | +use defines::AfError; |
4 | 5 | use defines::Aftype; |
5 | 6 | use self::libc::{uint8_t, c_void, c_int, c_uint, c_longlong}; |
6 | 7 |
|
@@ -67,78 +68,106 @@ pub struct Array { |
67 | 68 |
|
68 | 69 | macro_rules! is_func { |
69 | 70 | ($fn_name: ident, $ffi_fn: ident) => ( |
70 | | - pub fn $fn_name(&self) -> bool { |
| 71 | + pub fn $fn_name(&self) -> Result<bool, AfError> { |
71 | 72 | unsafe { |
72 | 73 | let mut ret_val: i32 = 0; |
73 | | - $ffi_fn(&mut ret_val as *mut c_int, self.handle as AfArray); |
74 | | - ret_val > 0 |
| 74 | + let err_val = $ffi_fn(&mut ret_val as *mut c_int, self.handle as AfArray); |
| 75 | + match err_val { |
| 76 | + 0 => Ok(ret_val>0), |
| 77 | + _ => Err(AfError::from(err_val)), |
| 78 | + } |
75 | 79 | } |
76 | 80 | } |
77 | 81 | ) |
78 | 82 | } |
79 | 83 |
|
80 | 84 | impl Array { |
81 | 85 | #[allow(unused_mut)] |
82 | | - pub fn new<T>(dims: Dim4, slice: &[T], aftype: Aftype) -> Array { |
| 86 | + pub fn new<T>(dims: Dim4, slice: &[T], aftype: Aftype) -> Result<Array, AfError> { |
83 | 87 | unsafe { |
84 | 88 | let mut temp: i64 = 0; |
85 | | - af_create_array(&mut temp as MutAfArray, slice.as_ptr() as *const c_void, |
86 | | - dims.ndims() as c_uint, dims.get().as_ptr() as * const c_longlong, |
87 | | - aftype as uint8_t); |
88 | | - Array {handle: temp} |
| 89 | + let err_val = af_create_array(&mut temp as MutAfArray, |
| 90 | + slice.as_ptr() as *const c_void, |
| 91 | + dims.ndims() as c_uint, |
| 92 | + dims.get().as_ptr() as * const c_longlong, |
| 93 | + aftype as uint8_t); |
| 94 | + match err_val { |
| 95 | + 0 => Ok(Array {handle: temp}), |
| 96 | + _ => Err(AfError::from(err_val)), |
| 97 | + } |
89 | 98 | } |
90 | 99 | } |
91 | 100 |
|
92 | | - pub fn elements(&self) -> i64 { |
| 101 | + pub fn elements(&self) -> Result<i64, AfError> { |
93 | 102 | unsafe { |
94 | 103 | let mut ret_val: i64 = 0; |
95 | | - af_get_elements(&mut ret_val as MutAfArray, self.handle as AfArray); |
96 | | - ret_val |
| 104 | + let err_val = af_get_elements(&mut ret_val as MutAfArray, self.handle as AfArray); |
| 105 | + match err_val { |
| 106 | + 0 => Ok(ret_val), |
| 107 | + _ => Err(AfError::from(err_val)), |
| 108 | + } |
97 | 109 | } |
98 | 110 | } |
99 | 111 |
|
100 | | - pub fn get_type(&self) -> Aftype { |
| 112 | + pub fn get_type(&self) -> Result<Aftype, AfError> { |
101 | 113 | unsafe { |
102 | 114 | let mut ret_val: u8 = 0; |
103 | | - af_get_type(&mut ret_val as *mut uint8_t, self.handle as AfArray); |
104 | | - Aftype::from(ret_val) |
| 115 | + let err_val = af_get_type(&mut ret_val as *mut uint8_t, self.handle as AfArray); |
| 116 | + match err_val { |
| 117 | + 0 => Ok(Aftype::from(ret_val)), |
| 118 | + _ => Err(AfError::from(err_val)), |
| 119 | + } |
105 | 120 | } |
106 | 121 | } |
107 | 122 |
|
108 | | - pub fn dims(&self) -> Dim4 { |
| 123 | + pub fn dims(&self) -> Result<Dim4, AfError> { |
109 | 124 | unsafe { |
110 | 125 | let mut ret0: i64 = 0; |
111 | 126 | let mut ret1: i64 = 0; |
112 | 127 | let mut ret2: i64 = 0; |
113 | 128 | let mut ret3: i64 = 0; |
114 | | - af_get_dims(&mut ret0 as *mut c_longlong, &mut ret1 as *mut c_longlong, |
115 | | - &mut ret2 as *mut c_longlong, &mut ret3 as *mut c_longlong, |
116 | | - self.handle as AfArray); |
117 | | - Dim4::new(&[ret0 as u64, ret1 as u64, ret2 as u64, ret3 as u64]) |
| 129 | + let err_val = af_get_dims(&mut ret0 as *mut c_longlong, &mut ret1 as *mut c_longlong, |
| 130 | + &mut ret2 as *mut c_longlong, &mut ret3 as *mut c_longlong, |
| 131 | + self.handle as AfArray); |
| 132 | + match err_val { |
| 133 | + 0 => Ok(Dim4::new(&[ret0 as u64, ret1 as u64, ret2 as u64, ret3 as u64])), |
| 134 | + _ => Err(AfError::from(err_val)), |
| 135 | + } |
118 | 136 | } |
119 | 137 | } |
120 | 138 |
|
121 | | - pub fn numdims(&self) -> u32 { |
| 139 | + pub fn numdims(&self) -> Result<u32, AfError> { |
122 | 140 | unsafe { |
123 | 141 | let mut ret_val: u32 = 0; |
124 | | - af_get_numdims(&mut ret_val as *mut c_uint, self.handle as AfArray); |
125 | | - ret_val |
| 142 | + let err_val = af_get_numdims(&mut ret_val as *mut c_uint, self.handle as AfArray); |
| 143 | + match err_val { |
| 144 | + 0 => Ok(ret_val), |
| 145 | + _ => Err(AfError::from(err_val)), |
| 146 | + } |
126 | 147 | } |
127 | 148 | } |
128 | 149 |
|
129 | 150 | pub fn get(&self) -> i64 { |
130 | 151 | self.handle |
131 | 152 | } |
132 | 153 |
|
133 | | - pub fn host(&self, data:&mut [f64]) { |
| 154 | + pub fn host(&self, data:&mut [f64]) -> Result<(), AfError> { |
134 | 155 | unsafe { |
135 | | - af_get_data_ptr(data.as_mut_ptr() as *mut c_void, self.handle as AfArray); |
| 156 | + let ret_val = af_get_data_ptr(data.as_mut_ptr() as *mut c_void, self.handle as AfArray); |
| 157 | + match ret_val { |
| 158 | + 0 => Ok(()), |
| 159 | + _ => Err(AfError::from(ret_val)), |
| 160 | + } |
136 | 161 | } |
137 | 162 | } |
138 | 163 |
|
139 | | - pub fn eval(&self) { |
| 164 | + pub fn eval(&self) -> Result<(), AfError> { |
140 | 165 | unsafe { |
141 | | - af_eval(self.handle as AfArray); |
| 166 | + let ret_val = af_eval(self.handle as AfArray); |
| 167 | + match ret_val { |
| 168 | + 0 => Ok(()), |
| 169 | + _ => Err(AfError::from(ret_val)), |
| 170 | + } |
142 | 171 | } |
143 | 172 | } |
144 | 173 |
|
@@ -166,22 +195,33 @@ impl Clone for Array { |
166 | 195 | fn clone(&self) -> Array { |
167 | 196 | unsafe { |
168 | 197 | let mut temp: i64 = 0; |
169 | | - af_retain_array(&mut temp as MutAfArray, self.handle as AfArray); |
170 | | - Array {handle: temp} |
| 198 | + let ret_val = af_retain_array(&mut temp as MutAfArray, self.handle as AfArray); |
| 199 | + match ret_val { |
| 200 | + 0 => Array {handle: temp}, |
| 201 | + _ => panic!("Weak copy of Array failed with error code: {}", ret_val), |
| 202 | + } |
171 | 203 | } |
172 | 204 | } |
173 | 205 | } |
174 | 206 |
|
175 | 207 | impl Drop for Array { |
176 | 208 | fn drop(&mut self) { |
177 | 209 | unsafe { |
178 | | - af_release_array(self.handle); |
| 210 | + let ret_val = af_release_array(self.handle); |
| 211 | + match ret_val { |
| 212 | + 0 => (), |
| 213 | + _ => panic!("Weak copy of Array failed with error code: {}", ret_val), |
| 214 | + } |
179 | 215 | } |
180 | 216 | } |
181 | 217 | } |
182 | 218 |
|
183 | | -pub fn print(input: &Array) { |
| 219 | +pub fn print(input: &Array) -> Result<(), AfError> { |
184 | 220 | unsafe { |
185 | | - af_print_array(input.get() as AfArray); |
| 221 | + let ret_val = af_print_array(input.get() as AfArray); |
| 222 | + match ret_val { |
| 223 | + 0 => Ok(()), |
| 224 | + _ => Err(AfError::from(ret_val)), |
| 225 | + } |
186 | 226 | } |
187 | 227 | } |
0 commit comments