isl_rs/bindings/
multi_aff.rs

1// Automatically generated by isl_bindings_generator.
2// LICENSE: MIT
3
4use super::{
5    Aff, AffList, BasicSet, Context, DimType, Error, Id, LibISLError, Map, MultiId, MultiPwAff,
6    MultiUnionPwAff, MultiVal, PwMultiAff, Set, Space, Val,
7};
8use libc::uintptr_t;
9use std::ffi::{CStr, CString};
10use std::os::raw::c_char;
11
12/// Wraps `isl_multi_aff`.
13pub struct MultiAff {
14    pub ptr: uintptr_t,
15    pub should_free_on_drop: bool,
16}
17
18extern "C" {
19
20    fn isl_multi_aff_add(multi1: uintptr_t, multi2: uintptr_t) -> uintptr_t;
21
22    fn isl_multi_aff_add_constant_multi_val(mpa: uintptr_t, mv: uintptr_t) -> uintptr_t;
23
24    fn isl_multi_aff_add_constant_val(mpa: uintptr_t, v: uintptr_t) -> uintptr_t;
25
26    fn isl_multi_aff_add_dims(multi: uintptr_t, type_: i32, n: u32) -> uintptr_t;
27
28    fn isl_multi_aff_align_params(multi: uintptr_t, model: uintptr_t) -> uintptr_t;
29
30    fn isl_multi_aff_as_map(ma: uintptr_t) -> uintptr_t;
31
32    fn isl_multi_aff_as_set(ma: uintptr_t) -> uintptr_t;
33
34    fn isl_multi_aff_bind(ma: uintptr_t, tuple: uintptr_t) -> uintptr_t;
35
36    fn isl_multi_aff_bind_domain(multi: uintptr_t, tuple: uintptr_t) -> uintptr_t;
37
38    fn isl_multi_aff_bind_domain_wrapped_domain(multi: uintptr_t, tuple: uintptr_t) -> uintptr_t;
39
40    fn isl_multi_aff_copy(multi: uintptr_t) -> uintptr_t;
41
42    fn isl_multi_aff_dim(multi: uintptr_t, type_: i32) -> i32;
43
44    fn isl_multi_aff_domain_map(space: uintptr_t) -> uintptr_t;
45
46    fn isl_multi_aff_domain_reverse(multi: uintptr_t) -> uintptr_t;
47
48    fn isl_multi_aff_drop_dims(multi: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
49
50    fn isl_multi_aff_dump(maff: uintptr_t) -> ();
51
52    fn isl_multi_aff_factor_range(multi: uintptr_t) -> uintptr_t;
53
54    fn isl_multi_aff_find_dim_by_id(multi: uintptr_t, type_: i32, id: uintptr_t) -> i32;
55
56    fn isl_multi_aff_find_dim_by_name(multi: uintptr_t, type_: i32, name: *const c_char) -> i32;
57
58    fn isl_multi_aff_flat_range_product(multi1: uintptr_t, multi2: uintptr_t) -> uintptr_t;
59
60    fn isl_multi_aff_flatten_domain(ma: uintptr_t) -> uintptr_t;
61
62    fn isl_multi_aff_flatten_range(multi: uintptr_t) -> uintptr_t;
63
64    fn isl_multi_aff_floor(ma: uintptr_t) -> uintptr_t;
65
66    fn isl_multi_aff_free(multi: uintptr_t) -> uintptr_t;
67
68    fn isl_multi_aff_from_aff(aff: uintptr_t) -> uintptr_t;
69
70    fn isl_multi_aff_from_aff_list(space: uintptr_t, list: uintptr_t) -> uintptr_t;
71
72    fn isl_multi_aff_from_range(multi: uintptr_t) -> uintptr_t;
73
74    fn isl_multi_aff_get_aff(multi: uintptr_t, pos: i32) -> uintptr_t;
75
76    fn isl_multi_aff_get_at(multi: uintptr_t, pos: i32) -> uintptr_t;
77
78    fn isl_multi_aff_get_constant_multi_val(ma: uintptr_t) -> uintptr_t;
79
80    fn isl_multi_aff_get_ctx(multi: uintptr_t) -> uintptr_t;
81
82    fn isl_multi_aff_get_dim_id(multi: uintptr_t, type_: i32, pos: u32) -> uintptr_t;
83
84    fn isl_multi_aff_get_domain_space(multi: uintptr_t) -> uintptr_t;
85
86    fn isl_multi_aff_get_list(multi: uintptr_t) -> uintptr_t;
87
88    fn isl_multi_aff_get_range_tuple_id(multi: uintptr_t) -> uintptr_t;
89
90    fn isl_multi_aff_get_space(multi: uintptr_t) -> uintptr_t;
91
92    fn isl_multi_aff_get_tuple_id(multi: uintptr_t, type_: i32) -> uintptr_t;
93
94    fn isl_multi_aff_get_tuple_name(multi: uintptr_t, type_: i32) -> *const c_char;
95
96    fn isl_multi_aff_gist(maff: uintptr_t, context: uintptr_t) -> uintptr_t;
97
98    fn isl_multi_aff_gist_params(maff: uintptr_t, context: uintptr_t) -> uintptr_t;
99
100    fn isl_multi_aff_has_range_tuple_id(multi: uintptr_t) -> i32;
101
102    fn isl_multi_aff_has_tuple_id(multi: uintptr_t, type_: i32) -> i32;
103
104    fn isl_multi_aff_identity(space: uintptr_t) -> uintptr_t;
105
106    fn isl_multi_aff_identity_multi_aff(multi: uintptr_t) -> uintptr_t;
107
108    fn isl_multi_aff_identity_on_domain_space(space: uintptr_t) -> uintptr_t;
109
110    fn isl_multi_aff_insert_dims(multi: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
111
112    fn isl_multi_aff_insert_domain(multi: uintptr_t, domain: uintptr_t) -> uintptr_t;
113
114    fn isl_multi_aff_involves_dims(multi: uintptr_t, type_: i32, first: u32, n: u32) -> i32;
115
116    fn isl_multi_aff_involves_locals(multi: uintptr_t) -> i32;
117
118    fn isl_multi_aff_involves_nan(multi: uintptr_t) -> i32;
119
120    fn isl_multi_aff_lex_ge_set(ma1: uintptr_t, ma2: uintptr_t) -> uintptr_t;
121
122    fn isl_multi_aff_lex_gt_set(ma1: uintptr_t, ma2: uintptr_t) -> uintptr_t;
123
124    fn isl_multi_aff_lex_le_set(ma1: uintptr_t, ma2: uintptr_t) -> uintptr_t;
125
126    fn isl_multi_aff_lex_lt_set(ma1: uintptr_t, ma2: uintptr_t) -> uintptr_t;
127
128    fn isl_multi_aff_mod_multi_val(multi: uintptr_t, mv: uintptr_t) -> uintptr_t;
129
130    fn isl_multi_aff_move_dims(ma: uintptr_t, dst_type: i32, dst_pos: u32, src_type: i32,
131                               src_pos: u32, n: u32)
132                               -> uintptr_t;
133
134    fn isl_multi_aff_multi_val_on_domain_space(space: uintptr_t, mv: uintptr_t) -> uintptr_t;
135
136    fn isl_multi_aff_multi_val_on_space(space: uintptr_t, mv: uintptr_t) -> uintptr_t;
137
138    fn isl_multi_aff_neg(multi: uintptr_t) -> uintptr_t;
139
140    fn isl_multi_aff_plain_cmp(multi1: uintptr_t, multi2: uintptr_t) -> i32;
141
142    fn isl_multi_aff_plain_is_equal(multi1: uintptr_t, multi2: uintptr_t) -> i32;
143
144    fn isl_multi_aff_product(multi1: uintptr_t, multi2: uintptr_t) -> uintptr_t;
145
146    fn isl_multi_aff_project_domain_on_params(multi: uintptr_t) -> uintptr_t;
147
148    fn isl_multi_aff_project_out_map(space: uintptr_t, type_: i32, first: u32, n: u32)
149                                     -> uintptr_t;
150
151    fn isl_multi_aff_pullback_multi_aff(ma1: uintptr_t, ma2: uintptr_t) -> uintptr_t;
152
153    fn isl_multi_aff_range_factor_domain(multi: uintptr_t) -> uintptr_t;
154
155    fn isl_multi_aff_range_factor_range(multi: uintptr_t) -> uintptr_t;
156
157    fn isl_multi_aff_range_is_wrapping(multi: uintptr_t) -> i32;
158
159    fn isl_multi_aff_range_map(space: uintptr_t) -> uintptr_t;
160
161    fn isl_multi_aff_range_product(multi1: uintptr_t, multi2: uintptr_t) -> uintptr_t;
162
163    fn isl_multi_aff_range_splice(multi1: uintptr_t, pos: u32, multi2: uintptr_t) -> uintptr_t;
164
165    fn isl_multi_aff_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
166
167    fn isl_multi_aff_reset_range_tuple_id(multi: uintptr_t) -> uintptr_t;
168
169    fn isl_multi_aff_reset_tuple_id(multi: uintptr_t, type_: i32) -> uintptr_t;
170
171    fn isl_multi_aff_reset_user(multi: uintptr_t) -> uintptr_t;
172
173    fn isl_multi_aff_scale_down_multi_val(multi: uintptr_t, mv: uintptr_t) -> uintptr_t;
174
175    fn isl_multi_aff_scale_down_val(multi: uintptr_t, v: uintptr_t) -> uintptr_t;
176
177    fn isl_multi_aff_scale_multi_val(multi: uintptr_t, mv: uintptr_t) -> uintptr_t;
178
179    fn isl_multi_aff_scale_val(multi: uintptr_t, v: uintptr_t) -> uintptr_t;
180
181    fn isl_multi_aff_set_aff(multi: uintptr_t, pos: i32, el: uintptr_t) -> uintptr_t;
182
183    fn isl_multi_aff_set_at(multi: uintptr_t, pos: i32, el: uintptr_t) -> uintptr_t;
184
185    fn isl_multi_aff_set_dim_id(multi: uintptr_t, type_: i32, pos: u32, id: uintptr_t)
186                                -> uintptr_t;
187
188    fn isl_multi_aff_set_dim_name(multi: uintptr_t, type_: i32, pos: u32, s: *const c_char)
189                                  -> uintptr_t;
190
191    fn isl_multi_aff_set_range_tuple_id(multi: uintptr_t, id: uintptr_t) -> uintptr_t;
192
193    fn isl_multi_aff_set_tuple_id(multi: uintptr_t, type_: i32, id: uintptr_t) -> uintptr_t;
194
195    fn isl_multi_aff_set_tuple_name(multi: uintptr_t, type_: i32, s: *const c_char) -> uintptr_t;
196
197    fn isl_multi_aff_size(multi: uintptr_t) -> i32;
198
199    fn isl_multi_aff_splice(multi1: uintptr_t, in_pos: u32, out_pos: u32, multi2: uintptr_t)
200                            -> uintptr_t;
201
202    fn isl_multi_aff_sub(multi1: uintptr_t, multi2: uintptr_t) -> uintptr_t;
203
204    fn isl_multi_aff_to_multi_pw_aff(ma: uintptr_t) -> uintptr_t;
205
206    fn isl_multi_aff_to_multi_union_pw_aff(ma: uintptr_t) -> uintptr_t;
207
208    fn isl_multi_aff_to_pw_multi_aff(ma: uintptr_t) -> uintptr_t;
209
210    fn isl_multi_aff_to_str(ma: uintptr_t) -> *const c_char;
211
212    fn isl_multi_aff_unbind_params_insert_domain(multi: uintptr_t, domain: uintptr_t) -> uintptr_t;
213
214    fn isl_multi_aff_zero(space: uintptr_t) -> uintptr_t;
215
216}
217
218impl MultiAff {
219    /// Wraps `isl_multi_aff_add`.
220    pub fn add(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
221        let multi1 = self;
222        let isl_rs_ctx = multi1.get_ctx();
223        let mut multi1 = multi1;
224        multi1.do_not_free_on_drop();
225        let multi1 = multi1.ptr;
226        let mut multi2 = multi2;
227        multi2.do_not_free_on_drop();
228        let multi2 = multi2.ptr;
229        let isl_rs_result = unsafe { isl_multi_aff_add(multi1, multi2) };
230        let isl_rs_result = MultiAff { ptr: isl_rs_result,
231                                       should_free_on_drop: true };
232        let err = isl_rs_ctx.last_error();
233        if err != Error::None_ {
234            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
235        }
236        Ok(isl_rs_result)
237    }
238
239    /// Wraps `isl_multi_aff_add_constant_multi_val`.
240    pub fn add_constant_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
241        let mpa = self;
242        let isl_rs_ctx = mpa.get_ctx();
243        let mut mpa = mpa;
244        mpa.do_not_free_on_drop();
245        let mpa = mpa.ptr;
246        let mut mv = mv;
247        mv.do_not_free_on_drop();
248        let mv = mv.ptr;
249        let isl_rs_result = unsafe { isl_multi_aff_add_constant_multi_val(mpa, mv) };
250        let isl_rs_result = MultiAff { ptr: isl_rs_result,
251                                       should_free_on_drop: true };
252        let err = isl_rs_ctx.last_error();
253        if err != Error::None_ {
254            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
255        }
256        Ok(isl_rs_result)
257    }
258
259    /// Wraps `isl_multi_aff_add_constant_val`.
260    pub fn add_constant_val(self, v: Val) -> Result<MultiAff, LibISLError> {
261        let mpa = self;
262        let isl_rs_ctx = mpa.get_ctx();
263        let mut mpa = mpa;
264        mpa.do_not_free_on_drop();
265        let mpa = mpa.ptr;
266        let mut v = v;
267        v.do_not_free_on_drop();
268        let v = v.ptr;
269        let isl_rs_result = unsafe { isl_multi_aff_add_constant_val(mpa, v) };
270        let isl_rs_result = MultiAff { ptr: isl_rs_result,
271                                       should_free_on_drop: true };
272        let err = isl_rs_ctx.last_error();
273        if err != Error::None_ {
274            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
275        }
276        Ok(isl_rs_result)
277    }
278
279    /// Wraps `isl_multi_aff_add_dims`.
280    pub fn add_dims(self, type_: DimType, n: u32) -> Result<MultiAff, LibISLError> {
281        let multi = self;
282        let isl_rs_ctx = multi.get_ctx();
283        let mut multi = multi;
284        multi.do_not_free_on_drop();
285        let multi = multi.ptr;
286        let type_ = type_.to_i32();
287        let isl_rs_result = unsafe { isl_multi_aff_add_dims(multi, type_, n) };
288        let isl_rs_result = MultiAff { ptr: isl_rs_result,
289                                       should_free_on_drop: true };
290        let err = isl_rs_ctx.last_error();
291        if err != Error::None_ {
292            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
293        }
294        Ok(isl_rs_result)
295    }
296
297    /// Wraps `isl_multi_aff_align_params`.
298    pub fn align_params(self, model: Space) -> Result<MultiAff, LibISLError> {
299        let multi = self;
300        let isl_rs_ctx = multi.get_ctx();
301        let mut multi = multi;
302        multi.do_not_free_on_drop();
303        let multi = multi.ptr;
304        let mut model = model;
305        model.do_not_free_on_drop();
306        let model = model.ptr;
307        let isl_rs_result = unsafe { isl_multi_aff_align_params(multi, model) };
308        let isl_rs_result = MultiAff { ptr: isl_rs_result,
309                                       should_free_on_drop: true };
310        let err = isl_rs_ctx.last_error();
311        if err != Error::None_ {
312            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
313        }
314        Ok(isl_rs_result)
315    }
316
317    /// Wraps `isl_multi_aff_as_map`.
318    pub fn as_map(self) -> Result<Map, LibISLError> {
319        let ma = self;
320        let isl_rs_ctx = ma.get_ctx();
321        let mut ma = ma;
322        ma.do_not_free_on_drop();
323        let ma = ma.ptr;
324        let isl_rs_result = unsafe { isl_multi_aff_as_map(ma) };
325        let isl_rs_result = Map { ptr: isl_rs_result,
326                                  should_free_on_drop: true };
327        let err = isl_rs_ctx.last_error();
328        if err != Error::None_ {
329            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
330        }
331        Ok(isl_rs_result)
332    }
333
334    /// Wraps `isl_multi_aff_as_set`.
335    pub fn as_set(self) -> Result<Set, LibISLError> {
336        let ma = self;
337        let isl_rs_ctx = ma.get_ctx();
338        let mut ma = ma;
339        ma.do_not_free_on_drop();
340        let ma = ma.ptr;
341        let isl_rs_result = unsafe { isl_multi_aff_as_set(ma) };
342        let isl_rs_result = Set { ptr: isl_rs_result,
343                                  should_free_on_drop: true };
344        let err = isl_rs_ctx.last_error();
345        if err != Error::None_ {
346            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
347        }
348        Ok(isl_rs_result)
349    }
350
351    /// Wraps `isl_multi_aff_bind`.
352    pub fn bind(self, tuple: MultiId) -> Result<BasicSet, LibISLError> {
353        let ma = self;
354        let isl_rs_ctx = ma.get_ctx();
355        let mut ma = ma;
356        ma.do_not_free_on_drop();
357        let ma = ma.ptr;
358        let mut tuple = tuple;
359        tuple.do_not_free_on_drop();
360        let tuple = tuple.ptr;
361        let isl_rs_result = unsafe { isl_multi_aff_bind(ma, tuple) };
362        let isl_rs_result = BasicSet { ptr: isl_rs_result,
363                                       should_free_on_drop: true };
364        let err = isl_rs_ctx.last_error();
365        if err != Error::None_ {
366            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
367        }
368        Ok(isl_rs_result)
369    }
370
371    /// Wraps `isl_multi_aff_bind_domain`.
372    pub fn bind_domain(self, tuple: MultiId) -> Result<MultiAff, LibISLError> {
373        let multi = self;
374        let isl_rs_ctx = multi.get_ctx();
375        let mut multi = multi;
376        multi.do_not_free_on_drop();
377        let multi = multi.ptr;
378        let mut tuple = tuple;
379        tuple.do_not_free_on_drop();
380        let tuple = tuple.ptr;
381        let isl_rs_result = unsafe { isl_multi_aff_bind_domain(multi, tuple) };
382        let isl_rs_result = MultiAff { ptr: isl_rs_result,
383                                       should_free_on_drop: true };
384        let err = isl_rs_ctx.last_error();
385        if err != Error::None_ {
386            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
387        }
388        Ok(isl_rs_result)
389    }
390
391    /// Wraps `isl_multi_aff_bind_domain_wrapped_domain`.
392    pub fn bind_domain_wrapped_domain(self, tuple: MultiId) -> Result<MultiAff, LibISLError> {
393        let multi = self;
394        let isl_rs_ctx = multi.get_ctx();
395        let mut multi = multi;
396        multi.do_not_free_on_drop();
397        let multi = multi.ptr;
398        let mut tuple = tuple;
399        tuple.do_not_free_on_drop();
400        let tuple = tuple.ptr;
401        let isl_rs_result = unsafe { isl_multi_aff_bind_domain_wrapped_domain(multi, tuple) };
402        let isl_rs_result = MultiAff { ptr: isl_rs_result,
403                                       should_free_on_drop: true };
404        let err = isl_rs_ctx.last_error();
405        if err != Error::None_ {
406            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
407        }
408        Ok(isl_rs_result)
409    }
410
411    /// Wraps `isl_multi_aff_copy`.
412    pub fn copy(&self) -> Result<MultiAff, LibISLError> {
413        let multi = self;
414        let isl_rs_ctx = multi.get_ctx();
415        let multi = multi.ptr;
416        let isl_rs_result = unsafe { isl_multi_aff_copy(multi) };
417        let isl_rs_result = MultiAff { ptr: isl_rs_result,
418                                       should_free_on_drop: true };
419        let err = isl_rs_ctx.last_error();
420        if err != Error::None_ {
421            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
422        }
423        Ok(isl_rs_result)
424    }
425
426    /// Wraps `isl_multi_aff_dim`.
427    pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
428        let multi = self;
429        let isl_rs_ctx = multi.get_ctx();
430        let multi = multi.ptr;
431        let type_ = type_.to_i32();
432        let isl_rs_result = unsafe { isl_multi_aff_dim(multi, type_) };
433        let err = isl_rs_ctx.last_error();
434        if err != Error::None_ {
435            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
436        }
437        Ok(isl_rs_result)
438    }
439
440    /// Wraps `isl_multi_aff_domain_map`.
441    pub fn domain_map(space: Space) -> Result<MultiAff, LibISLError> {
442        let isl_rs_ctx = space.get_ctx();
443        let mut space = space;
444        space.do_not_free_on_drop();
445        let space = space.ptr;
446        let isl_rs_result = unsafe { isl_multi_aff_domain_map(space) };
447        let isl_rs_result = MultiAff { ptr: isl_rs_result,
448                                       should_free_on_drop: true };
449        let err = isl_rs_ctx.last_error();
450        if err != Error::None_ {
451            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
452        }
453        Ok(isl_rs_result)
454    }
455
456    /// Wraps `isl_multi_aff_domain_reverse`.
457    pub fn domain_reverse(self) -> Result<MultiAff, LibISLError> {
458        let multi = self;
459        let isl_rs_ctx = multi.get_ctx();
460        let mut multi = multi;
461        multi.do_not_free_on_drop();
462        let multi = multi.ptr;
463        let isl_rs_result = unsafe { isl_multi_aff_domain_reverse(multi) };
464        let isl_rs_result = MultiAff { ptr: isl_rs_result,
465                                       should_free_on_drop: true };
466        let err = isl_rs_ctx.last_error();
467        if err != Error::None_ {
468            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
469        }
470        Ok(isl_rs_result)
471    }
472
473    /// Wraps `isl_multi_aff_drop_dims`.
474    pub fn drop_dims(self, type_: DimType, first: u32, n: u32) -> Result<MultiAff, LibISLError> {
475        let multi = self;
476        let isl_rs_ctx = multi.get_ctx();
477        let mut multi = multi;
478        multi.do_not_free_on_drop();
479        let multi = multi.ptr;
480        let type_ = type_.to_i32();
481        let isl_rs_result = unsafe { isl_multi_aff_drop_dims(multi, type_, first, n) };
482        let isl_rs_result = MultiAff { ptr: isl_rs_result,
483                                       should_free_on_drop: true };
484        let err = isl_rs_ctx.last_error();
485        if err != Error::None_ {
486            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
487        }
488        Ok(isl_rs_result)
489    }
490
491    /// Wraps `isl_multi_aff_dump`.
492    pub fn dump(&self) -> Result<(), LibISLError> {
493        let maff = self;
494        let isl_rs_ctx = maff.get_ctx();
495        let maff = maff.ptr;
496        let isl_rs_result = unsafe { isl_multi_aff_dump(maff) };
497        let err = isl_rs_ctx.last_error();
498        if err != Error::None_ {
499            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
500        }
501        Ok(isl_rs_result)
502    }
503
504    /// Wraps `isl_multi_aff_factor_range`.
505    pub fn factor_range(self) -> Result<MultiAff, LibISLError> {
506        let multi = self;
507        let isl_rs_ctx = multi.get_ctx();
508        let mut multi = multi;
509        multi.do_not_free_on_drop();
510        let multi = multi.ptr;
511        let isl_rs_result = unsafe { isl_multi_aff_factor_range(multi) };
512        let isl_rs_result = MultiAff { ptr: isl_rs_result,
513                                       should_free_on_drop: true };
514        let err = isl_rs_ctx.last_error();
515        if err != Error::None_ {
516            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
517        }
518        Ok(isl_rs_result)
519    }
520
521    /// Wraps `isl_multi_aff_find_dim_by_id`.
522    pub fn find_dim_by_id(&self, type_: DimType, id: &Id) -> Result<i32, LibISLError> {
523        let multi = self;
524        let isl_rs_ctx = multi.get_ctx();
525        let multi = multi.ptr;
526        let type_ = type_.to_i32();
527        let id = id.ptr;
528        let isl_rs_result = unsafe { isl_multi_aff_find_dim_by_id(multi, type_, id) };
529        let err = isl_rs_ctx.last_error();
530        if err != Error::None_ {
531            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
532        }
533        Ok(isl_rs_result)
534    }
535
536    /// Wraps `isl_multi_aff_find_dim_by_name`.
537    pub fn find_dim_by_name(&self, type_: DimType, name: &str) -> Result<i32, LibISLError> {
538        let multi = self;
539        let isl_rs_ctx = multi.get_ctx();
540        let multi = multi.ptr;
541        let type_ = type_.to_i32();
542        let name = CString::new(name).unwrap();
543        let name = name.as_ptr();
544        let isl_rs_result = unsafe { isl_multi_aff_find_dim_by_name(multi, type_, name) };
545        let err = isl_rs_ctx.last_error();
546        if err != Error::None_ {
547            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
548        }
549        Ok(isl_rs_result)
550    }
551
552    /// Wraps `isl_multi_aff_flat_range_product`.
553    pub fn flat_range_product(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
554        let multi1 = self;
555        let isl_rs_ctx = multi1.get_ctx();
556        let mut multi1 = multi1;
557        multi1.do_not_free_on_drop();
558        let multi1 = multi1.ptr;
559        let mut multi2 = multi2;
560        multi2.do_not_free_on_drop();
561        let multi2 = multi2.ptr;
562        let isl_rs_result = unsafe { isl_multi_aff_flat_range_product(multi1, multi2) };
563        let isl_rs_result = MultiAff { ptr: isl_rs_result,
564                                       should_free_on_drop: true };
565        let err = isl_rs_ctx.last_error();
566        if err != Error::None_ {
567            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
568        }
569        Ok(isl_rs_result)
570    }
571
572    /// Wraps `isl_multi_aff_flatten_domain`.
573    pub fn flatten_domain(self) -> Result<MultiAff, LibISLError> {
574        let ma = self;
575        let isl_rs_ctx = ma.get_ctx();
576        let mut ma = ma;
577        ma.do_not_free_on_drop();
578        let ma = ma.ptr;
579        let isl_rs_result = unsafe { isl_multi_aff_flatten_domain(ma) };
580        let isl_rs_result = MultiAff { ptr: isl_rs_result,
581                                       should_free_on_drop: true };
582        let err = isl_rs_ctx.last_error();
583        if err != Error::None_ {
584            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
585        }
586        Ok(isl_rs_result)
587    }
588
589    /// Wraps `isl_multi_aff_flatten_range`.
590    pub fn flatten_range(self) -> Result<MultiAff, LibISLError> {
591        let multi = self;
592        let isl_rs_ctx = multi.get_ctx();
593        let mut multi = multi;
594        multi.do_not_free_on_drop();
595        let multi = multi.ptr;
596        let isl_rs_result = unsafe { isl_multi_aff_flatten_range(multi) };
597        let isl_rs_result = MultiAff { ptr: isl_rs_result,
598                                       should_free_on_drop: true };
599        let err = isl_rs_ctx.last_error();
600        if err != Error::None_ {
601            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
602        }
603        Ok(isl_rs_result)
604    }
605
606    /// Wraps `isl_multi_aff_floor`.
607    pub fn floor(self) -> Result<MultiAff, LibISLError> {
608        let ma = self;
609        let isl_rs_ctx = ma.get_ctx();
610        let mut ma = ma;
611        ma.do_not_free_on_drop();
612        let ma = ma.ptr;
613        let isl_rs_result = unsafe { isl_multi_aff_floor(ma) };
614        let isl_rs_result = MultiAff { ptr: isl_rs_result,
615                                       should_free_on_drop: true };
616        let err = isl_rs_ctx.last_error();
617        if err != Error::None_ {
618            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
619        }
620        Ok(isl_rs_result)
621    }
622
623    /// Wraps `isl_multi_aff_free`.
624    pub fn free(self) -> Result<MultiAff, LibISLError> {
625        let multi = self;
626        let isl_rs_ctx = multi.get_ctx();
627        let mut multi = multi;
628        multi.do_not_free_on_drop();
629        let multi = multi.ptr;
630        let isl_rs_result = unsafe { isl_multi_aff_free(multi) };
631        let isl_rs_result = MultiAff { ptr: isl_rs_result,
632                                       should_free_on_drop: true };
633        let err = isl_rs_ctx.last_error();
634        if err != Error::None_ {
635            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
636        }
637        Ok(isl_rs_result)
638    }
639
640    /// Wraps `isl_multi_aff_from_aff`.
641    pub fn from_aff(aff: Aff) -> Result<MultiAff, LibISLError> {
642        let isl_rs_ctx = aff.get_ctx();
643        let mut aff = aff;
644        aff.do_not_free_on_drop();
645        let aff = aff.ptr;
646        let isl_rs_result = unsafe { isl_multi_aff_from_aff(aff) };
647        let isl_rs_result = MultiAff { ptr: isl_rs_result,
648                                       should_free_on_drop: true };
649        let err = isl_rs_ctx.last_error();
650        if err != Error::None_ {
651            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
652        }
653        Ok(isl_rs_result)
654    }
655
656    /// Wraps `isl_multi_aff_from_aff_list`.
657    pub fn from_aff_list(space: Space, list: AffList) -> Result<MultiAff, LibISLError> {
658        let isl_rs_ctx = space.get_ctx();
659        let mut space = space;
660        space.do_not_free_on_drop();
661        let space = space.ptr;
662        let mut list = list;
663        list.do_not_free_on_drop();
664        let list = list.ptr;
665        let isl_rs_result = unsafe { isl_multi_aff_from_aff_list(space, list) };
666        let isl_rs_result = MultiAff { ptr: isl_rs_result,
667                                       should_free_on_drop: true };
668        let err = isl_rs_ctx.last_error();
669        if err != Error::None_ {
670            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
671        }
672        Ok(isl_rs_result)
673    }
674
675    /// Wraps `isl_multi_aff_from_range`.
676    pub fn from_range(self) -> Result<MultiAff, LibISLError> {
677        let multi = self;
678        let isl_rs_ctx = multi.get_ctx();
679        let mut multi = multi;
680        multi.do_not_free_on_drop();
681        let multi = multi.ptr;
682        let isl_rs_result = unsafe { isl_multi_aff_from_range(multi) };
683        let isl_rs_result = MultiAff { ptr: isl_rs_result,
684                                       should_free_on_drop: true };
685        let err = isl_rs_ctx.last_error();
686        if err != Error::None_ {
687            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
688        }
689        Ok(isl_rs_result)
690    }
691
692    /// Wraps `isl_multi_aff_get_aff`.
693    pub fn get_aff(&self, pos: i32) -> Result<Aff, LibISLError> {
694        let multi = self;
695        let isl_rs_ctx = multi.get_ctx();
696        let multi = multi.ptr;
697        let isl_rs_result = unsafe { isl_multi_aff_get_aff(multi, pos) };
698        let isl_rs_result = Aff { ptr: isl_rs_result,
699                                  should_free_on_drop: true };
700        let err = isl_rs_ctx.last_error();
701        if err != Error::None_ {
702            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
703        }
704        Ok(isl_rs_result)
705    }
706
707    /// Wraps `isl_multi_aff_get_at`.
708    pub fn get_at(&self, pos: i32) -> Result<Aff, LibISLError> {
709        let multi = self;
710        let isl_rs_ctx = multi.get_ctx();
711        let multi = multi.ptr;
712        let isl_rs_result = unsafe { isl_multi_aff_get_at(multi, pos) };
713        let isl_rs_result = Aff { ptr: isl_rs_result,
714                                  should_free_on_drop: true };
715        let err = isl_rs_ctx.last_error();
716        if err != Error::None_ {
717            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
718        }
719        Ok(isl_rs_result)
720    }
721
722    /// Wraps `isl_multi_aff_get_constant_multi_val`.
723    pub fn get_constant_multi_val(&self) -> Result<MultiVal, LibISLError> {
724        let ma = self;
725        let isl_rs_ctx = ma.get_ctx();
726        let ma = ma.ptr;
727        let isl_rs_result = unsafe { isl_multi_aff_get_constant_multi_val(ma) };
728        let isl_rs_result = MultiVal { ptr: isl_rs_result,
729                                       should_free_on_drop: true };
730        let err = isl_rs_ctx.last_error();
731        if err != Error::None_ {
732            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
733        }
734        Ok(isl_rs_result)
735    }
736
737    /// Wraps `isl_multi_aff_get_ctx`.
738    pub fn get_ctx(&self) -> Context {
739        let multi = self;
740        let multi = multi.ptr;
741        let isl_rs_result = unsafe { isl_multi_aff_get_ctx(multi) };
742        let isl_rs_result = Context { ptr: isl_rs_result,
743                                      should_free_on_drop: false };
744        isl_rs_result
745    }
746
747    /// Wraps `isl_multi_aff_get_dim_id`.
748    pub fn get_dim_id(&self, type_: DimType, pos: u32) -> Result<Id, LibISLError> {
749        let multi = self;
750        let isl_rs_ctx = multi.get_ctx();
751        let multi = multi.ptr;
752        let type_ = type_.to_i32();
753        let isl_rs_result = unsafe { isl_multi_aff_get_dim_id(multi, type_, pos) };
754        let isl_rs_result = Id { ptr: isl_rs_result,
755                                 should_free_on_drop: true };
756        let err = isl_rs_ctx.last_error();
757        if err != Error::None_ {
758            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
759        }
760        Ok(isl_rs_result)
761    }
762
763    /// Wraps `isl_multi_aff_get_domain_space`.
764    pub fn get_domain_space(&self) -> Result<Space, LibISLError> {
765        let multi = self;
766        let isl_rs_ctx = multi.get_ctx();
767        let multi = multi.ptr;
768        let isl_rs_result = unsafe { isl_multi_aff_get_domain_space(multi) };
769        let isl_rs_result = Space { ptr: isl_rs_result,
770                                    should_free_on_drop: true };
771        let err = isl_rs_ctx.last_error();
772        if err != Error::None_ {
773            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
774        }
775        Ok(isl_rs_result)
776    }
777
778    /// Wraps `isl_multi_aff_get_list`.
779    pub fn get_list(&self) -> Result<AffList, LibISLError> {
780        let multi = self;
781        let isl_rs_ctx = multi.get_ctx();
782        let multi = multi.ptr;
783        let isl_rs_result = unsafe { isl_multi_aff_get_list(multi) };
784        let isl_rs_result = AffList { ptr: isl_rs_result,
785                                      should_free_on_drop: true };
786        let err = isl_rs_ctx.last_error();
787        if err != Error::None_ {
788            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
789        }
790        Ok(isl_rs_result)
791    }
792
793    /// Wraps `isl_multi_aff_get_range_tuple_id`.
794    pub fn get_range_tuple_id(&self) -> Result<Id, LibISLError> {
795        let multi = self;
796        let isl_rs_ctx = multi.get_ctx();
797        let multi = multi.ptr;
798        let isl_rs_result = unsafe { isl_multi_aff_get_range_tuple_id(multi) };
799        let isl_rs_result = Id { ptr: isl_rs_result,
800                                 should_free_on_drop: true };
801        let err = isl_rs_ctx.last_error();
802        if err != Error::None_ {
803            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
804        }
805        Ok(isl_rs_result)
806    }
807
808    /// Wraps `isl_multi_aff_get_space`.
809    pub fn get_space(&self) -> Result<Space, LibISLError> {
810        let multi = self;
811        let isl_rs_ctx = multi.get_ctx();
812        let multi = multi.ptr;
813        let isl_rs_result = unsafe { isl_multi_aff_get_space(multi) };
814        let isl_rs_result = Space { ptr: isl_rs_result,
815                                    should_free_on_drop: true };
816        let err = isl_rs_ctx.last_error();
817        if err != Error::None_ {
818            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
819        }
820        Ok(isl_rs_result)
821    }
822
823    /// Wraps `isl_multi_aff_get_tuple_id`.
824    pub fn get_tuple_id(&self, type_: DimType) -> Result<Id, LibISLError> {
825        let multi = self;
826        let isl_rs_ctx = multi.get_ctx();
827        let multi = multi.ptr;
828        let type_ = type_.to_i32();
829        let isl_rs_result = unsafe { isl_multi_aff_get_tuple_id(multi, type_) };
830        let isl_rs_result = Id { ptr: isl_rs_result,
831                                 should_free_on_drop: true };
832        let err = isl_rs_ctx.last_error();
833        if err != Error::None_ {
834            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
835        }
836        Ok(isl_rs_result)
837    }
838
839    /// Wraps `isl_multi_aff_get_tuple_name`.
840    pub fn get_tuple_name(&self, type_: DimType) -> Result<&str, LibISLError> {
841        let multi = self;
842        let isl_rs_ctx = multi.get_ctx();
843        let multi = multi.ptr;
844        let type_ = type_.to_i32();
845        let isl_rs_result = unsafe { isl_multi_aff_get_tuple_name(multi, type_) };
846        let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
847        let isl_rs_result = isl_rs_result.to_str().unwrap();
848        let err = isl_rs_ctx.last_error();
849        if err != Error::None_ {
850            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
851        }
852        Ok(isl_rs_result)
853    }
854
855    /// Wraps `isl_multi_aff_gist`.
856    pub fn gist(self, context: Set) -> Result<MultiAff, LibISLError> {
857        let maff = self;
858        let isl_rs_ctx = maff.get_ctx();
859        let mut maff = maff;
860        maff.do_not_free_on_drop();
861        let maff = maff.ptr;
862        let mut context = context;
863        context.do_not_free_on_drop();
864        let context = context.ptr;
865        let isl_rs_result = unsafe { isl_multi_aff_gist(maff, context) };
866        let isl_rs_result = MultiAff { ptr: isl_rs_result,
867                                       should_free_on_drop: true };
868        let err = isl_rs_ctx.last_error();
869        if err != Error::None_ {
870            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
871        }
872        Ok(isl_rs_result)
873    }
874
875    /// Wraps `isl_multi_aff_gist_params`.
876    pub fn gist_params(self, context: Set) -> Result<MultiAff, LibISLError> {
877        let maff = self;
878        let isl_rs_ctx = maff.get_ctx();
879        let mut maff = maff;
880        maff.do_not_free_on_drop();
881        let maff = maff.ptr;
882        let mut context = context;
883        context.do_not_free_on_drop();
884        let context = context.ptr;
885        let isl_rs_result = unsafe { isl_multi_aff_gist_params(maff, context) };
886        let isl_rs_result = MultiAff { ptr: isl_rs_result,
887                                       should_free_on_drop: true };
888        let err = isl_rs_ctx.last_error();
889        if err != Error::None_ {
890            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
891        }
892        Ok(isl_rs_result)
893    }
894
895    /// Wraps `isl_multi_aff_has_range_tuple_id`.
896    pub fn has_range_tuple_id(&self) -> Result<bool, LibISLError> {
897        let multi = self;
898        let isl_rs_ctx = multi.get_ctx();
899        let multi = multi.ptr;
900        let isl_rs_result = unsafe { isl_multi_aff_has_range_tuple_id(multi) };
901        let isl_rs_result = match isl_rs_result {
902            0 => false,
903            1 => true,
904            _ => panic!("Got isl_bool = -1"),
905        };
906        let err = isl_rs_ctx.last_error();
907        if err != Error::None_ {
908            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
909        }
910        Ok(isl_rs_result)
911    }
912
913    /// Wraps `isl_multi_aff_has_tuple_id`.
914    pub fn has_tuple_id(&self, type_: DimType) -> Result<bool, LibISLError> {
915        let multi = self;
916        let isl_rs_ctx = multi.get_ctx();
917        let multi = multi.ptr;
918        let type_ = type_.to_i32();
919        let isl_rs_result = unsafe { isl_multi_aff_has_tuple_id(multi, type_) };
920        let isl_rs_result = match isl_rs_result {
921            0 => false,
922            1 => true,
923            _ => panic!("Got isl_bool = -1"),
924        };
925        let err = isl_rs_ctx.last_error();
926        if err != Error::None_ {
927            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
928        }
929        Ok(isl_rs_result)
930    }
931
932    /// Wraps `isl_multi_aff_identity`.
933    pub fn identity(space: Space) -> Result<MultiAff, LibISLError> {
934        let isl_rs_ctx = space.get_ctx();
935        let mut space = space;
936        space.do_not_free_on_drop();
937        let space = space.ptr;
938        let isl_rs_result = unsafe { isl_multi_aff_identity(space) };
939        let isl_rs_result = MultiAff { ptr: isl_rs_result,
940                                       should_free_on_drop: true };
941        let err = isl_rs_ctx.last_error();
942        if err != Error::None_ {
943            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
944        }
945        Ok(isl_rs_result)
946    }
947
948    /// Wraps `isl_multi_aff_identity_multi_aff`.
949    pub fn identity_multi_aff(self) -> Result<MultiAff, LibISLError> {
950        let multi = self;
951        let isl_rs_ctx = multi.get_ctx();
952        let mut multi = multi;
953        multi.do_not_free_on_drop();
954        let multi = multi.ptr;
955        let isl_rs_result = unsafe { isl_multi_aff_identity_multi_aff(multi) };
956        let isl_rs_result = MultiAff { ptr: isl_rs_result,
957                                       should_free_on_drop: true };
958        let err = isl_rs_ctx.last_error();
959        if err != Error::None_ {
960            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
961        }
962        Ok(isl_rs_result)
963    }
964
965    /// Wraps `isl_multi_aff_identity_on_domain_space`.
966    pub fn identity_on_domain_space(space: Space) -> Result<MultiAff, LibISLError> {
967        let isl_rs_ctx = space.get_ctx();
968        let mut space = space;
969        space.do_not_free_on_drop();
970        let space = space.ptr;
971        let isl_rs_result = unsafe { isl_multi_aff_identity_on_domain_space(space) };
972        let isl_rs_result = MultiAff { ptr: isl_rs_result,
973                                       should_free_on_drop: true };
974        let err = isl_rs_ctx.last_error();
975        if err != Error::None_ {
976            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
977        }
978        Ok(isl_rs_result)
979    }
980
981    /// Wraps `isl_multi_aff_insert_dims`.
982    pub fn insert_dims(self, type_: DimType, first: u32, n: u32) -> Result<MultiAff, LibISLError> {
983        let multi = self;
984        let isl_rs_ctx = multi.get_ctx();
985        let mut multi = multi;
986        multi.do_not_free_on_drop();
987        let multi = multi.ptr;
988        let type_ = type_.to_i32();
989        let isl_rs_result = unsafe { isl_multi_aff_insert_dims(multi, type_, first, n) };
990        let isl_rs_result = MultiAff { ptr: isl_rs_result,
991                                       should_free_on_drop: true };
992        let err = isl_rs_ctx.last_error();
993        if err != Error::None_ {
994            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
995        }
996        Ok(isl_rs_result)
997    }
998
999    /// Wraps `isl_multi_aff_insert_domain`.
1000    pub fn insert_domain(self, domain: Space) -> Result<MultiAff, LibISLError> {
1001        let multi = self;
1002        let isl_rs_ctx = multi.get_ctx();
1003        let mut multi = multi;
1004        multi.do_not_free_on_drop();
1005        let multi = multi.ptr;
1006        let mut domain = domain;
1007        domain.do_not_free_on_drop();
1008        let domain = domain.ptr;
1009        let isl_rs_result = unsafe { isl_multi_aff_insert_domain(multi, domain) };
1010        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1011                                       should_free_on_drop: true };
1012        let err = isl_rs_ctx.last_error();
1013        if err != Error::None_ {
1014            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1015        }
1016        Ok(isl_rs_result)
1017    }
1018
1019    /// Wraps `isl_multi_aff_involves_dims`.
1020    pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
1021        let multi = self;
1022        let isl_rs_ctx = multi.get_ctx();
1023        let multi = multi.ptr;
1024        let type_ = type_.to_i32();
1025        let isl_rs_result = unsafe { isl_multi_aff_involves_dims(multi, type_, first, n) };
1026        let isl_rs_result = match isl_rs_result {
1027            0 => false,
1028            1 => true,
1029            _ => panic!("Got isl_bool = -1"),
1030        };
1031        let err = isl_rs_ctx.last_error();
1032        if err != Error::None_ {
1033            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1034        }
1035        Ok(isl_rs_result)
1036    }
1037
1038    /// Wraps `isl_multi_aff_involves_locals`.
1039    pub fn involves_locals(&self) -> Result<bool, LibISLError> {
1040        let multi = self;
1041        let isl_rs_ctx = multi.get_ctx();
1042        let multi = multi.ptr;
1043        let isl_rs_result = unsafe { isl_multi_aff_involves_locals(multi) };
1044        let isl_rs_result = match isl_rs_result {
1045            0 => false,
1046            1 => true,
1047            _ => panic!("Got isl_bool = -1"),
1048        };
1049        let err = isl_rs_ctx.last_error();
1050        if err != Error::None_ {
1051            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1052        }
1053        Ok(isl_rs_result)
1054    }
1055
1056    /// Wraps `isl_multi_aff_involves_nan`.
1057    pub fn involves_nan(&self) -> Result<bool, LibISLError> {
1058        let multi = self;
1059        let isl_rs_ctx = multi.get_ctx();
1060        let multi = multi.ptr;
1061        let isl_rs_result = unsafe { isl_multi_aff_involves_nan(multi) };
1062        let isl_rs_result = match isl_rs_result {
1063            0 => false,
1064            1 => true,
1065            _ => panic!("Got isl_bool = -1"),
1066        };
1067        let err = isl_rs_ctx.last_error();
1068        if err != Error::None_ {
1069            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1070        }
1071        Ok(isl_rs_result)
1072    }
1073
1074    /// Wraps `isl_multi_aff_lex_ge_set`.
1075    pub fn lex_ge_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1076        let ma1 = self;
1077        let isl_rs_ctx = ma1.get_ctx();
1078        let mut ma1 = ma1;
1079        ma1.do_not_free_on_drop();
1080        let ma1 = ma1.ptr;
1081        let mut ma2 = ma2;
1082        ma2.do_not_free_on_drop();
1083        let ma2 = ma2.ptr;
1084        let isl_rs_result = unsafe { isl_multi_aff_lex_ge_set(ma1, ma2) };
1085        let isl_rs_result = Set { ptr: isl_rs_result,
1086                                  should_free_on_drop: true };
1087        let err = isl_rs_ctx.last_error();
1088        if err != Error::None_ {
1089            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1090        }
1091        Ok(isl_rs_result)
1092    }
1093
1094    /// Wraps `isl_multi_aff_lex_gt_set`.
1095    pub fn lex_gt_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1096        let ma1 = self;
1097        let isl_rs_ctx = ma1.get_ctx();
1098        let mut ma1 = ma1;
1099        ma1.do_not_free_on_drop();
1100        let ma1 = ma1.ptr;
1101        let mut ma2 = ma2;
1102        ma2.do_not_free_on_drop();
1103        let ma2 = ma2.ptr;
1104        let isl_rs_result = unsafe { isl_multi_aff_lex_gt_set(ma1, ma2) };
1105        let isl_rs_result = Set { ptr: isl_rs_result,
1106                                  should_free_on_drop: true };
1107        let err = isl_rs_ctx.last_error();
1108        if err != Error::None_ {
1109            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1110        }
1111        Ok(isl_rs_result)
1112    }
1113
1114    /// Wraps `isl_multi_aff_lex_le_set`.
1115    pub fn lex_le_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1116        let ma1 = self;
1117        let isl_rs_ctx = ma1.get_ctx();
1118        let mut ma1 = ma1;
1119        ma1.do_not_free_on_drop();
1120        let ma1 = ma1.ptr;
1121        let mut ma2 = ma2;
1122        ma2.do_not_free_on_drop();
1123        let ma2 = ma2.ptr;
1124        let isl_rs_result = unsafe { isl_multi_aff_lex_le_set(ma1, ma2) };
1125        let isl_rs_result = Set { ptr: isl_rs_result,
1126                                  should_free_on_drop: true };
1127        let err = isl_rs_ctx.last_error();
1128        if err != Error::None_ {
1129            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1130        }
1131        Ok(isl_rs_result)
1132    }
1133
1134    /// Wraps `isl_multi_aff_lex_lt_set`.
1135    pub fn lex_lt_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1136        let ma1 = self;
1137        let isl_rs_ctx = ma1.get_ctx();
1138        let mut ma1 = ma1;
1139        ma1.do_not_free_on_drop();
1140        let ma1 = ma1.ptr;
1141        let mut ma2 = ma2;
1142        ma2.do_not_free_on_drop();
1143        let ma2 = ma2.ptr;
1144        let isl_rs_result = unsafe { isl_multi_aff_lex_lt_set(ma1, ma2) };
1145        let isl_rs_result = Set { ptr: isl_rs_result,
1146                                  should_free_on_drop: true };
1147        let err = isl_rs_ctx.last_error();
1148        if err != Error::None_ {
1149            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1150        }
1151        Ok(isl_rs_result)
1152    }
1153
1154    /// Wraps `isl_multi_aff_mod_multi_val`.
1155    pub fn mod_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1156        let multi = self;
1157        let isl_rs_ctx = multi.get_ctx();
1158        let mut multi = multi;
1159        multi.do_not_free_on_drop();
1160        let multi = multi.ptr;
1161        let mut mv = mv;
1162        mv.do_not_free_on_drop();
1163        let mv = mv.ptr;
1164        let isl_rs_result = unsafe { isl_multi_aff_mod_multi_val(multi, mv) };
1165        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1166                                       should_free_on_drop: true };
1167        let err = isl_rs_ctx.last_error();
1168        if err != Error::None_ {
1169            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1170        }
1171        Ok(isl_rs_result)
1172    }
1173
1174    /// Wraps `isl_multi_aff_move_dims`.
1175    pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
1176                     n: u32)
1177                     -> Result<MultiAff, LibISLError> {
1178        let ma = self;
1179        let isl_rs_ctx = ma.get_ctx();
1180        let mut ma = ma;
1181        ma.do_not_free_on_drop();
1182        let ma = ma.ptr;
1183        let dst_type = dst_type.to_i32();
1184        let src_type = src_type.to_i32();
1185        let isl_rs_result =
1186            unsafe { isl_multi_aff_move_dims(ma, dst_type, dst_pos, src_type, src_pos, n) };
1187        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1188                                       should_free_on_drop: true };
1189        let err = isl_rs_ctx.last_error();
1190        if err != Error::None_ {
1191            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1192        }
1193        Ok(isl_rs_result)
1194    }
1195
1196    /// Wraps `isl_multi_aff_multi_val_on_domain_space`.
1197    pub fn multi_val_on_domain_space(space: Space, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1198        let isl_rs_ctx = space.get_ctx();
1199        let mut space = space;
1200        space.do_not_free_on_drop();
1201        let space = space.ptr;
1202        let mut mv = mv;
1203        mv.do_not_free_on_drop();
1204        let mv = mv.ptr;
1205        let isl_rs_result = unsafe { isl_multi_aff_multi_val_on_domain_space(space, mv) };
1206        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1207                                       should_free_on_drop: true };
1208        let err = isl_rs_ctx.last_error();
1209        if err != Error::None_ {
1210            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1211        }
1212        Ok(isl_rs_result)
1213    }
1214
1215    /// Wraps `isl_multi_aff_multi_val_on_space`.
1216    pub fn multi_val_on_space(space: Space, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1217        let isl_rs_ctx = space.get_ctx();
1218        let mut space = space;
1219        space.do_not_free_on_drop();
1220        let space = space.ptr;
1221        let mut mv = mv;
1222        mv.do_not_free_on_drop();
1223        let mv = mv.ptr;
1224        let isl_rs_result = unsafe { isl_multi_aff_multi_val_on_space(space, mv) };
1225        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1226                                       should_free_on_drop: true };
1227        let err = isl_rs_ctx.last_error();
1228        if err != Error::None_ {
1229            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1230        }
1231        Ok(isl_rs_result)
1232    }
1233
1234    /// Wraps `isl_multi_aff_neg`.
1235    pub fn neg(self) -> Result<MultiAff, LibISLError> {
1236        let multi = self;
1237        let isl_rs_ctx = multi.get_ctx();
1238        let mut multi = multi;
1239        multi.do_not_free_on_drop();
1240        let multi = multi.ptr;
1241        let isl_rs_result = unsafe { isl_multi_aff_neg(multi) };
1242        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1243                                       should_free_on_drop: true };
1244        let err = isl_rs_ctx.last_error();
1245        if err != Error::None_ {
1246            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1247        }
1248        Ok(isl_rs_result)
1249    }
1250
1251    /// Wraps `isl_multi_aff_plain_cmp`.
1252    pub fn plain_cmp(&self, multi2: &MultiAff) -> Result<i32, LibISLError> {
1253        let multi1 = self;
1254        let isl_rs_ctx = multi1.get_ctx();
1255        let multi1 = multi1.ptr;
1256        let multi2 = multi2.ptr;
1257        let isl_rs_result = unsafe { isl_multi_aff_plain_cmp(multi1, multi2) };
1258        let err = isl_rs_ctx.last_error();
1259        if err != Error::None_ {
1260            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1261        }
1262        Ok(isl_rs_result)
1263    }
1264
1265    /// Wraps `isl_multi_aff_plain_is_equal`.
1266    pub fn plain_is_equal(&self, multi2: &MultiAff) -> Result<bool, LibISLError> {
1267        let multi1 = self;
1268        let isl_rs_ctx = multi1.get_ctx();
1269        let multi1 = multi1.ptr;
1270        let multi2 = multi2.ptr;
1271        let isl_rs_result = unsafe { isl_multi_aff_plain_is_equal(multi1, multi2) };
1272        let isl_rs_result = match isl_rs_result {
1273            0 => false,
1274            1 => true,
1275            _ => panic!("Got isl_bool = -1"),
1276        };
1277        let err = isl_rs_ctx.last_error();
1278        if err != Error::None_ {
1279            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1280        }
1281        Ok(isl_rs_result)
1282    }
1283
1284    /// Wraps `isl_multi_aff_product`.
1285    pub fn product(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1286        let multi1 = self;
1287        let isl_rs_ctx = multi1.get_ctx();
1288        let mut multi1 = multi1;
1289        multi1.do_not_free_on_drop();
1290        let multi1 = multi1.ptr;
1291        let mut multi2 = multi2;
1292        multi2.do_not_free_on_drop();
1293        let multi2 = multi2.ptr;
1294        let isl_rs_result = unsafe { isl_multi_aff_product(multi1, multi2) };
1295        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1296                                       should_free_on_drop: true };
1297        let err = isl_rs_ctx.last_error();
1298        if err != Error::None_ {
1299            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1300        }
1301        Ok(isl_rs_result)
1302    }
1303
1304    /// Wraps `isl_multi_aff_project_domain_on_params`.
1305    pub fn project_domain_on_params(self) -> Result<MultiAff, LibISLError> {
1306        let multi = self;
1307        let isl_rs_ctx = multi.get_ctx();
1308        let mut multi = multi;
1309        multi.do_not_free_on_drop();
1310        let multi = multi.ptr;
1311        let isl_rs_result = unsafe { isl_multi_aff_project_domain_on_params(multi) };
1312        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1313                                       should_free_on_drop: true };
1314        let err = isl_rs_ctx.last_error();
1315        if err != Error::None_ {
1316            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1317        }
1318        Ok(isl_rs_result)
1319    }
1320
1321    /// Wraps `isl_multi_aff_project_out_map`.
1322    pub fn project_out_map(space: Space, type_: DimType, first: u32, n: u32)
1323                           -> Result<MultiAff, LibISLError> {
1324        let isl_rs_ctx = space.get_ctx();
1325        let mut space = space;
1326        space.do_not_free_on_drop();
1327        let space = space.ptr;
1328        let type_ = type_.to_i32();
1329        let isl_rs_result = unsafe { isl_multi_aff_project_out_map(space, type_, first, n) };
1330        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1331                                       should_free_on_drop: true };
1332        let err = isl_rs_ctx.last_error();
1333        if err != Error::None_ {
1334            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1335        }
1336        Ok(isl_rs_result)
1337    }
1338
1339    /// Wraps `isl_multi_aff_pullback_multi_aff`.
1340    pub fn pullback_multi_aff(self, ma2: MultiAff) -> Result<MultiAff, LibISLError> {
1341        let ma1 = self;
1342        let isl_rs_ctx = ma1.get_ctx();
1343        let mut ma1 = ma1;
1344        ma1.do_not_free_on_drop();
1345        let ma1 = ma1.ptr;
1346        let mut ma2 = ma2;
1347        ma2.do_not_free_on_drop();
1348        let ma2 = ma2.ptr;
1349        let isl_rs_result = unsafe { isl_multi_aff_pullback_multi_aff(ma1, ma2) };
1350        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1351                                       should_free_on_drop: true };
1352        let err = isl_rs_ctx.last_error();
1353        if err != Error::None_ {
1354            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1355        }
1356        Ok(isl_rs_result)
1357    }
1358
1359    /// Wraps `isl_multi_aff_range_factor_domain`.
1360    pub fn range_factor_domain(self) -> Result<MultiAff, LibISLError> {
1361        let multi = self;
1362        let isl_rs_ctx = multi.get_ctx();
1363        let mut multi = multi;
1364        multi.do_not_free_on_drop();
1365        let multi = multi.ptr;
1366        let isl_rs_result = unsafe { isl_multi_aff_range_factor_domain(multi) };
1367        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1368                                       should_free_on_drop: true };
1369        let err = isl_rs_ctx.last_error();
1370        if err != Error::None_ {
1371            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1372        }
1373        Ok(isl_rs_result)
1374    }
1375
1376    /// Wraps `isl_multi_aff_range_factor_range`.
1377    pub fn range_factor_range(self) -> Result<MultiAff, LibISLError> {
1378        let multi = self;
1379        let isl_rs_ctx = multi.get_ctx();
1380        let mut multi = multi;
1381        multi.do_not_free_on_drop();
1382        let multi = multi.ptr;
1383        let isl_rs_result = unsafe { isl_multi_aff_range_factor_range(multi) };
1384        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1385                                       should_free_on_drop: true };
1386        let err = isl_rs_ctx.last_error();
1387        if err != Error::None_ {
1388            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1389        }
1390        Ok(isl_rs_result)
1391    }
1392
1393    /// Wraps `isl_multi_aff_range_is_wrapping`.
1394    pub fn range_is_wrapping(&self) -> Result<bool, LibISLError> {
1395        let multi = self;
1396        let isl_rs_ctx = multi.get_ctx();
1397        let multi = multi.ptr;
1398        let isl_rs_result = unsafe { isl_multi_aff_range_is_wrapping(multi) };
1399        let isl_rs_result = match isl_rs_result {
1400            0 => false,
1401            1 => true,
1402            _ => panic!("Got isl_bool = -1"),
1403        };
1404        let err = isl_rs_ctx.last_error();
1405        if err != Error::None_ {
1406            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1407        }
1408        Ok(isl_rs_result)
1409    }
1410
1411    /// Wraps `isl_multi_aff_range_map`.
1412    pub fn range_map(space: Space) -> Result<MultiAff, LibISLError> {
1413        let isl_rs_ctx = space.get_ctx();
1414        let mut space = space;
1415        space.do_not_free_on_drop();
1416        let space = space.ptr;
1417        let isl_rs_result = unsafe { isl_multi_aff_range_map(space) };
1418        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1419                                       should_free_on_drop: true };
1420        let err = isl_rs_ctx.last_error();
1421        if err != Error::None_ {
1422            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1423        }
1424        Ok(isl_rs_result)
1425    }
1426
1427    /// Wraps `isl_multi_aff_range_product`.
1428    pub fn range_product(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1429        let multi1 = self;
1430        let isl_rs_ctx = multi1.get_ctx();
1431        let mut multi1 = multi1;
1432        multi1.do_not_free_on_drop();
1433        let multi1 = multi1.ptr;
1434        let mut multi2 = multi2;
1435        multi2.do_not_free_on_drop();
1436        let multi2 = multi2.ptr;
1437        let isl_rs_result = unsafe { isl_multi_aff_range_product(multi1, multi2) };
1438        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1439                                       should_free_on_drop: true };
1440        let err = isl_rs_ctx.last_error();
1441        if err != Error::None_ {
1442            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1443        }
1444        Ok(isl_rs_result)
1445    }
1446
1447    /// Wraps `isl_multi_aff_range_splice`.
1448    pub fn range_splice(self, pos: u32, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1449        let multi1 = self;
1450        let isl_rs_ctx = multi1.get_ctx();
1451        let mut multi1 = multi1;
1452        multi1.do_not_free_on_drop();
1453        let multi1 = multi1.ptr;
1454        let mut multi2 = multi2;
1455        multi2.do_not_free_on_drop();
1456        let multi2 = multi2.ptr;
1457        let isl_rs_result = unsafe { isl_multi_aff_range_splice(multi1, pos, multi2) };
1458        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1459                                       should_free_on_drop: true };
1460        let err = isl_rs_ctx.last_error();
1461        if err != Error::None_ {
1462            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1463        }
1464        Ok(isl_rs_result)
1465    }
1466
1467    /// Wraps `isl_multi_aff_read_from_str`.
1468    pub fn read_from_str(ctx: &Context, str_: &str) -> Result<MultiAff, LibISLError> {
1469        let isl_rs_ctx = Context { ptr: ctx.ptr,
1470                                   should_free_on_drop: false };
1471        let ctx = ctx.ptr;
1472        let str_ = CString::new(str_).unwrap();
1473        let str_ = str_.as_ptr();
1474        let isl_rs_result = unsafe { isl_multi_aff_read_from_str(ctx, str_) };
1475        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1476                                       should_free_on_drop: true };
1477        let err = isl_rs_ctx.last_error();
1478        if err != Error::None_ {
1479            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1480        }
1481        Ok(isl_rs_result)
1482    }
1483
1484    /// Wraps `isl_multi_aff_reset_range_tuple_id`.
1485    pub fn reset_range_tuple_id(self) -> Result<MultiAff, LibISLError> {
1486        let multi = self;
1487        let isl_rs_ctx = multi.get_ctx();
1488        let mut multi = multi;
1489        multi.do_not_free_on_drop();
1490        let multi = multi.ptr;
1491        let isl_rs_result = unsafe { isl_multi_aff_reset_range_tuple_id(multi) };
1492        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1493                                       should_free_on_drop: true };
1494        let err = isl_rs_ctx.last_error();
1495        if err != Error::None_ {
1496            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1497        }
1498        Ok(isl_rs_result)
1499    }
1500
1501    /// Wraps `isl_multi_aff_reset_tuple_id`.
1502    pub fn reset_tuple_id(self, type_: DimType) -> Result<MultiAff, LibISLError> {
1503        let multi = self;
1504        let isl_rs_ctx = multi.get_ctx();
1505        let mut multi = multi;
1506        multi.do_not_free_on_drop();
1507        let multi = multi.ptr;
1508        let type_ = type_.to_i32();
1509        let isl_rs_result = unsafe { isl_multi_aff_reset_tuple_id(multi, type_) };
1510        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1511                                       should_free_on_drop: true };
1512        let err = isl_rs_ctx.last_error();
1513        if err != Error::None_ {
1514            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1515        }
1516        Ok(isl_rs_result)
1517    }
1518
1519    /// Wraps `isl_multi_aff_reset_user`.
1520    pub fn reset_user(self) -> Result<MultiAff, LibISLError> {
1521        let multi = self;
1522        let isl_rs_ctx = multi.get_ctx();
1523        let mut multi = multi;
1524        multi.do_not_free_on_drop();
1525        let multi = multi.ptr;
1526        let isl_rs_result = unsafe { isl_multi_aff_reset_user(multi) };
1527        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1528                                       should_free_on_drop: true };
1529        let err = isl_rs_ctx.last_error();
1530        if err != Error::None_ {
1531            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1532        }
1533        Ok(isl_rs_result)
1534    }
1535
1536    /// Wraps `isl_multi_aff_scale_down_multi_val`.
1537    pub fn scale_down_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1538        let multi = self;
1539        let isl_rs_ctx = multi.get_ctx();
1540        let mut multi = multi;
1541        multi.do_not_free_on_drop();
1542        let multi = multi.ptr;
1543        let mut mv = mv;
1544        mv.do_not_free_on_drop();
1545        let mv = mv.ptr;
1546        let isl_rs_result = unsafe { isl_multi_aff_scale_down_multi_val(multi, mv) };
1547        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1548                                       should_free_on_drop: true };
1549        let err = isl_rs_ctx.last_error();
1550        if err != Error::None_ {
1551            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1552        }
1553        Ok(isl_rs_result)
1554    }
1555
1556    /// Wraps `isl_multi_aff_scale_down_val`.
1557    pub fn scale_down_val(self, v: Val) -> Result<MultiAff, LibISLError> {
1558        let multi = self;
1559        let isl_rs_ctx = multi.get_ctx();
1560        let mut multi = multi;
1561        multi.do_not_free_on_drop();
1562        let multi = multi.ptr;
1563        let mut v = v;
1564        v.do_not_free_on_drop();
1565        let v = v.ptr;
1566        let isl_rs_result = unsafe { isl_multi_aff_scale_down_val(multi, v) };
1567        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1568                                       should_free_on_drop: true };
1569        let err = isl_rs_ctx.last_error();
1570        if err != Error::None_ {
1571            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1572        }
1573        Ok(isl_rs_result)
1574    }
1575
1576    /// Wraps `isl_multi_aff_scale_multi_val`.
1577    pub fn scale_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1578        let multi = self;
1579        let isl_rs_ctx = multi.get_ctx();
1580        let mut multi = multi;
1581        multi.do_not_free_on_drop();
1582        let multi = multi.ptr;
1583        let mut mv = mv;
1584        mv.do_not_free_on_drop();
1585        let mv = mv.ptr;
1586        let isl_rs_result = unsafe { isl_multi_aff_scale_multi_val(multi, mv) };
1587        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1588                                       should_free_on_drop: true };
1589        let err = isl_rs_ctx.last_error();
1590        if err != Error::None_ {
1591            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1592        }
1593        Ok(isl_rs_result)
1594    }
1595
1596    /// Wraps `isl_multi_aff_scale_val`.
1597    pub fn scale_val(self, v: Val) -> Result<MultiAff, LibISLError> {
1598        let multi = self;
1599        let isl_rs_ctx = multi.get_ctx();
1600        let mut multi = multi;
1601        multi.do_not_free_on_drop();
1602        let multi = multi.ptr;
1603        let mut v = v;
1604        v.do_not_free_on_drop();
1605        let v = v.ptr;
1606        let isl_rs_result = unsafe { isl_multi_aff_scale_val(multi, v) };
1607        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1608                                       should_free_on_drop: true };
1609        let err = isl_rs_ctx.last_error();
1610        if err != Error::None_ {
1611            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1612        }
1613        Ok(isl_rs_result)
1614    }
1615
1616    /// Wraps `isl_multi_aff_set_aff`.
1617    pub fn set_aff(self, pos: i32, el: Aff) -> Result<MultiAff, LibISLError> {
1618        let multi = self;
1619        let isl_rs_ctx = multi.get_ctx();
1620        let mut multi = multi;
1621        multi.do_not_free_on_drop();
1622        let multi = multi.ptr;
1623        let mut el = el;
1624        el.do_not_free_on_drop();
1625        let el = el.ptr;
1626        let isl_rs_result = unsafe { isl_multi_aff_set_aff(multi, pos, el) };
1627        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1628                                       should_free_on_drop: true };
1629        let err = isl_rs_ctx.last_error();
1630        if err != Error::None_ {
1631            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1632        }
1633        Ok(isl_rs_result)
1634    }
1635
1636    /// Wraps `isl_multi_aff_set_at`.
1637    pub fn set_at(self, pos: i32, el: Aff) -> Result<MultiAff, LibISLError> {
1638        let multi = self;
1639        let isl_rs_ctx = multi.get_ctx();
1640        let mut multi = multi;
1641        multi.do_not_free_on_drop();
1642        let multi = multi.ptr;
1643        let mut el = el;
1644        el.do_not_free_on_drop();
1645        let el = el.ptr;
1646        let isl_rs_result = unsafe { isl_multi_aff_set_at(multi, pos, el) };
1647        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1648                                       should_free_on_drop: true };
1649        let err = isl_rs_ctx.last_error();
1650        if err != Error::None_ {
1651            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1652        }
1653        Ok(isl_rs_result)
1654    }
1655
1656    /// Wraps `isl_multi_aff_set_dim_id`.
1657    pub fn set_dim_id(self, type_: DimType, pos: u32, id: Id) -> Result<MultiAff, LibISLError> {
1658        let multi = self;
1659        let isl_rs_ctx = multi.get_ctx();
1660        let mut multi = multi;
1661        multi.do_not_free_on_drop();
1662        let multi = multi.ptr;
1663        let type_ = type_.to_i32();
1664        let mut id = id;
1665        id.do_not_free_on_drop();
1666        let id = id.ptr;
1667        let isl_rs_result = unsafe { isl_multi_aff_set_dim_id(multi, type_, pos, id) };
1668        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1669                                       should_free_on_drop: true };
1670        let err = isl_rs_ctx.last_error();
1671        if err != Error::None_ {
1672            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1673        }
1674        Ok(isl_rs_result)
1675    }
1676
1677    /// Wraps `isl_multi_aff_set_dim_name`.
1678    pub fn set_dim_name(self, type_: DimType, pos: u32, s: &str) -> Result<MultiAff, LibISLError> {
1679        let multi = self;
1680        let isl_rs_ctx = multi.get_ctx();
1681        let mut multi = multi;
1682        multi.do_not_free_on_drop();
1683        let multi = multi.ptr;
1684        let type_ = type_.to_i32();
1685        let s = CString::new(s).unwrap();
1686        let s = s.as_ptr();
1687        let isl_rs_result = unsafe { isl_multi_aff_set_dim_name(multi, type_, pos, s) };
1688        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1689                                       should_free_on_drop: true };
1690        let err = isl_rs_ctx.last_error();
1691        if err != Error::None_ {
1692            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1693        }
1694        Ok(isl_rs_result)
1695    }
1696
1697    /// Wraps `isl_multi_aff_set_range_tuple_id`.
1698    pub fn set_range_tuple_id(self, id: Id) -> Result<MultiAff, LibISLError> {
1699        let multi = self;
1700        let isl_rs_ctx = multi.get_ctx();
1701        let mut multi = multi;
1702        multi.do_not_free_on_drop();
1703        let multi = multi.ptr;
1704        let mut id = id;
1705        id.do_not_free_on_drop();
1706        let id = id.ptr;
1707        let isl_rs_result = unsafe { isl_multi_aff_set_range_tuple_id(multi, id) };
1708        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1709                                       should_free_on_drop: true };
1710        let err = isl_rs_ctx.last_error();
1711        if err != Error::None_ {
1712            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1713        }
1714        Ok(isl_rs_result)
1715    }
1716
1717    /// Wraps `isl_multi_aff_set_tuple_id`.
1718    pub fn set_tuple_id(self, type_: DimType, id: Id) -> Result<MultiAff, LibISLError> {
1719        let multi = self;
1720        let isl_rs_ctx = multi.get_ctx();
1721        let mut multi = multi;
1722        multi.do_not_free_on_drop();
1723        let multi = multi.ptr;
1724        let type_ = type_.to_i32();
1725        let mut id = id;
1726        id.do_not_free_on_drop();
1727        let id = id.ptr;
1728        let isl_rs_result = unsafe { isl_multi_aff_set_tuple_id(multi, type_, id) };
1729        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1730                                       should_free_on_drop: true };
1731        let err = isl_rs_ctx.last_error();
1732        if err != Error::None_ {
1733            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1734        }
1735        Ok(isl_rs_result)
1736    }
1737
1738    /// Wraps `isl_multi_aff_set_tuple_name`.
1739    pub fn set_tuple_name(self, type_: DimType, s: &str) -> Result<MultiAff, LibISLError> {
1740        let multi = self;
1741        let isl_rs_ctx = multi.get_ctx();
1742        let mut multi = multi;
1743        multi.do_not_free_on_drop();
1744        let multi = multi.ptr;
1745        let type_ = type_.to_i32();
1746        let s = CString::new(s).unwrap();
1747        let s = s.as_ptr();
1748        let isl_rs_result = unsafe { isl_multi_aff_set_tuple_name(multi, type_, s) };
1749        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1750                                       should_free_on_drop: true };
1751        let err = isl_rs_ctx.last_error();
1752        if err != Error::None_ {
1753            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1754        }
1755        Ok(isl_rs_result)
1756    }
1757
1758    /// Wraps `isl_multi_aff_size`.
1759    pub fn size(&self) -> Result<i32, LibISLError> {
1760        let multi = self;
1761        let isl_rs_ctx = multi.get_ctx();
1762        let multi = multi.ptr;
1763        let isl_rs_result = unsafe { isl_multi_aff_size(multi) };
1764        let err = isl_rs_ctx.last_error();
1765        if err != Error::None_ {
1766            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1767        }
1768        Ok(isl_rs_result)
1769    }
1770
1771    /// Wraps `isl_multi_aff_splice`.
1772    pub fn splice(self, in_pos: u32, out_pos: u32, multi2: MultiAff)
1773                  -> Result<MultiAff, LibISLError> {
1774        let multi1 = self;
1775        let isl_rs_ctx = multi1.get_ctx();
1776        let mut multi1 = multi1;
1777        multi1.do_not_free_on_drop();
1778        let multi1 = multi1.ptr;
1779        let mut multi2 = multi2;
1780        multi2.do_not_free_on_drop();
1781        let multi2 = multi2.ptr;
1782        let isl_rs_result = unsafe { isl_multi_aff_splice(multi1, in_pos, out_pos, multi2) };
1783        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1784                                       should_free_on_drop: true };
1785        let err = isl_rs_ctx.last_error();
1786        if err != Error::None_ {
1787            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1788        }
1789        Ok(isl_rs_result)
1790    }
1791
1792    /// Wraps `isl_multi_aff_sub`.
1793    pub fn sub(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1794        let multi1 = self;
1795        let isl_rs_ctx = multi1.get_ctx();
1796        let mut multi1 = multi1;
1797        multi1.do_not_free_on_drop();
1798        let multi1 = multi1.ptr;
1799        let mut multi2 = multi2;
1800        multi2.do_not_free_on_drop();
1801        let multi2 = multi2.ptr;
1802        let isl_rs_result = unsafe { isl_multi_aff_sub(multi1, multi2) };
1803        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1804                                       should_free_on_drop: true };
1805        let err = isl_rs_ctx.last_error();
1806        if err != Error::None_ {
1807            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1808        }
1809        Ok(isl_rs_result)
1810    }
1811
1812    /// Wraps `isl_multi_aff_to_multi_pw_aff`.
1813    pub fn to_multi_pw_aff(self) -> Result<MultiPwAff, LibISLError> {
1814        let ma = self;
1815        let isl_rs_ctx = ma.get_ctx();
1816        let mut ma = ma;
1817        ma.do_not_free_on_drop();
1818        let ma = ma.ptr;
1819        let isl_rs_result = unsafe { isl_multi_aff_to_multi_pw_aff(ma) };
1820        let isl_rs_result = MultiPwAff { ptr: isl_rs_result,
1821                                         should_free_on_drop: true };
1822        let err = isl_rs_ctx.last_error();
1823        if err != Error::None_ {
1824            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1825        }
1826        Ok(isl_rs_result)
1827    }
1828
1829    /// Wraps `isl_multi_aff_to_multi_union_pw_aff`.
1830    pub fn to_multi_union_pw_aff(self) -> Result<MultiUnionPwAff, LibISLError> {
1831        let ma = self;
1832        let isl_rs_ctx = ma.get_ctx();
1833        let mut ma = ma;
1834        ma.do_not_free_on_drop();
1835        let ma = ma.ptr;
1836        let isl_rs_result = unsafe { isl_multi_aff_to_multi_union_pw_aff(ma) };
1837        let isl_rs_result = MultiUnionPwAff { ptr: isl_rs_result,
1838                                              should_free_on_drop: true };
1839        let err = isl_rs_ctx.last_error();
1840        if err != Error::None_ {
1841            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1842        }
1843        Ok(isl_rs_result)
1844    }
1845
1846    /// Wraps `isl_multi_aff_to_pw_multi_aff`.
1847    pub fn to_pw_multi_aff(self) -> Result<PwMultiAff, LibISLError> {
1848        let ma = self;
1849        let isl_rs_ctx = ma.get_ctx();
1850        let mut ma = ma;
1851        ma.do_not_free_on_drop();
1852        let ma = ma.ptr;
1853        let isl_rs_result = unsafe { isl_multi_aff_to_pw_multi_aff(ma) };
1854        let isl_rs_result = PwMultiAff { ptr: isl_rs_result,
1855                                         should_free_on_drop: true };
1856        let err = isl_rs_ctx.last_error();
1857        if err != Error::None_ {
1858            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1859        }
1860        Ok(isl_rs_result)
1861    }
1862
1863    /// Wraps `isl_multi_aff_to_str`.
1864    pub fn to_str(&self) -> Result<&str, LibISLError> {
1865        let ma = self;
1866        let isl_rs_ctx = ma.get_ctx();
1867        let ma = ma.ptr;
1868        let isl_rs_result = unsafe { isl_multi_aff_to_str(ma) };
1869        let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1870        let isl_rs_result = isl_rs_result.to_str().unwrap();
1871        let err = isl_rs_ctx.last_error();
1872        if err != Error::None_ {
1873            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1874        }
1875        Ok(isl_rs_result)
1876    }
1877
1878    /// Wraps `isl_multi_aff_unbind_params_insert_domain`.
1879    pub fn unbind_params_insert_domain(self, domain: MultiId) -> Result<MultiAff, LibISLError> {
1880        let multi = self;
1881        let isl_rs_ctx = multi.get_ctx();
1882        let mut multi = multi;
1883        multi.do_not_free_on_drop();
1884        let multi = multi.ptr;
1885        let mut domain = domain;
1886        domain.do_not_free_on_drop();
1887        let domain = domain.ptr;
1888        let isl_rs_result = unsafe { isl_multi_aff_unbind_params_insert_domain(multi, domain) };
1889        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1890                                       should_free_on_drop: true };
1891        let err = isl_rs_ctx.last_error();
1892        if err != Error::None_ {
1893            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1894        }
1895        Ok(isl_rs_result)
1896    }
1897
1898    /// Wraps `isl_multi_aff_zero`.
1899    pub fn zero(space: Space) -> Result<MultiAff, LibISLError> {
1900        let isl_rs_ctx = space.get_ctx();
1901        let mut space = space;
1902        space.do_not_free_on_drop();
1903        let space = space.ptr;
1904        let isl_rs_result = unsafe { isl_multi_aff_zero(space) };
1905        let isl_rs_result = MultiAff { ptr: isl_rs_result,
1906                                       should_free_on_drop: true };
1907        let err = isl_rs_ctx.last_error();
1908        if err != Error::None_ {
1909            return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1910        }
1911        Ok(isl_rs_result)
1912    }
1913
1914    /// Does not call isl_multi_aff_free() on being dropped. (For internal use
1915    /// only.)
1916    pub fn do_not_free_on_drop(&mut self) {
1917        self.should_free_on_drop = false;
1918    }
1919}
1920
1921impl Drop for MultiAff {
1922    fn drop(&mut self) {
1923        if self.should_free_on_drop {
1924            unsafe {
1925                isl_multi_aff_free(self.ptr);
1926            }
1927        }
1928    }
1929}