1use 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
12pub 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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}