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 let err_msg = isl_rs_ctx.last_error_msg();
235 isl_rs_ctx.reset_error();
236 return Err(LibISLError::new(err, err_msg));
237 }
238 Ok(isl_rs_result)
239 }
240
241 pub fn add_constant_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
243 let mpa = self;
244 let isl_rs_ctx = mpa.get_ctx();
245 let mut mpa = mpa;
246 mpa.do_not_free_on_drop();
247 let mpa = mpa.ptr;
248 let mut mv = mv;
249 mv.do_not_free_on_drop();
250 let mv = mv.ptr;
251 let isl_rs_result = unsafe { isl_multi_aff_add_constant_multi_val(mpa, mv) };
252 let isl_rs_result = MultiAff { ptr: isl_rs_result,
253 should_free_on_drop: true };
254 let err = isl_rs_ctx.last_error();
255 if err != Error::None_ {
256 let err_msg = isl_rs_ctx.last_error_msg();
257 isl_rs_ctx.reset_error();
258 return Err(LibISLError::new(err, err_msg));
259 }
260 Ok(isl_rs_result)
261 }
262
263 pub fn add_constant_val(self, v: Val) -> Result<MultiAff, LibISLError> {
265 let mpa = self;
266 let isl_rs_ctx = mpa.get_ctx();
267 let mut mpa = mpa;
268 mpa.do_not_free_on_drop();
269 let mpa = mpa.ptr;
270 let mut v = v;
271 v.do_not_free_on_drop();
272 let v = v.ptr;
273 let isl_rs_result = unsafe { isl_multi_aff_add_constant_val(mpa, v) };
274 let isl_rs_result = MultiAff { ptr: isl_rs_result,
275 should_free_on_drop: true };
276 let err = isl_rs_ctx.last_error();
277 if err != Error::None_ {
278 let err_msg = isl_rs_ctx.last_error_msg();
279 isl_rs_ctx.reset_error();
280 return Err(LibISLError::new(err, err_msg));
281 }
282 Ok(isl_rs_result)
283 }
284
285 pub fn add_dims(self, type_: DimType, n: u32) -> Result<MultiAff, LibISLError> {
287 let multi = self;
288 let isl_rs_ctx = multi.get_ctx();
289 let mut multi = multi;
290 multi.do_not_free_on_drop();
291 let multi = multi.ptr;
292 let type_ = type_.to_i32();
293 let isl_rs_result = unsafe { isl_multi_aff_add_dims(multi, type_, n) };
294 let isl_rs_result = MultiAff { ptr: isl_rs_result,
295 should_free_on_drop: true };
296 let err = isl_rs_ctx.last_error();
297 if err != Error::None_ {
298 let err_msg = isl_rs_ctx.last_error_msg();
299 isl_rs_ctx.reset_error();
300 return Err(LibISLError::new(err, err_msg));
301 }
302 Ok(isl_rs_result)
303 }
304
305 pub fn align_params(self, model: Space) -> Result<MultiAff, LibISLError> {
307 let multi = self;
308 let isl_rs_ctx = multi.get_ctx();
309 let mut multi = multi;
310 multi.do_not_free_on_drop();
311 let multi = multi.ptr;
312 let mut model = model;
313 model.do_not_free_on_drop();
314 let model = model.ptr;
315 let isl_rs_result = unsafe { isl_multi_aff_align_params(multi, model) };
316 let isl_rs_result = MultiAff { ptr: isl_rs_result,
317 should_free_on_drop: true };
318 let err = isl_rs_ctx.last_error();
319 if err != Error::None_ {
320 let err_msg = isl_rs_ctx.last_error_msg();
321 isl_rs_ctx.reset_error();
322 return Err(LibISLError::new(err, err_msg));
323 }
324 Ok(isl_rs_result)
325 }
326
327 pub fn as_map(self) -> Result<Map, LibISLError> {
329 let ma = self;
330 let isl_rs_ctx = ma.get_ctx();
331 let mut ma = ma;
332 ma.do_not_free_on_drop();
333 let ma = ma.ptr;
334 let isl_rs_result = unsafe { isl_multi_aff_as_map(ma) };
335 let isl_rs_result = Map { ptr: isl_rs_result,
336 should_free_on_drop: true };
337 let err = isl_rs_ctx.last_error();
338 if err != Error::None_ {
339 let err_msg = isl_rs_ctx.last_error_msg();
340 isl_rs_ctx.reset_error();
341 return Err(LibISLError::new(err, err_msg));
342 }
343 Ok(isl_rs_result)
344 }
345
346 pub fn as_set(self) -> Result<Set, LibISLError> {
348 let ma = self;
349 let isl_rs_ctx = ma.get_ctx();
350 let mut ma = ma;
351 ma.do_not_free_on_drop();
352 let ma = ma.ptr;
353 let isl_rs_result = unsafe { isl_multi_aff_as_set(ma) };
354 let isl_rs_result = Set { ptr: isl_rs_result,
355 should_free_on_drop: true };
356 let err = isl_rs_ctx.last_error();
357 if err != Error::None_ {
358 let err_msg = isl_rs_ctx.last_error_msg();
359 isl_rs_ctx.reset_error();
360 return Err(LibISLError::new(err, err_msg));
361 }
362 Ok(isl_rs_result)
363 }
364
365 pub fn bind(self, tuple: MultiId) -> Result<BasicSet, LibISLError> {
367 let ma = self;
368 let isl_rs_ctx = ma.get_ctx();
369 let mut ma = ma;
370 ma.do_not_free_on_drop();
371 let ma = ma.ptr;
372 let mut tuple = tuple;
373 tuple.do_not_free_on_drop();
374 let tuple = tuple.ptr;
375 let isl_rs_result = unsafe { isl_multi_aff_bind(ma, tuple) };
376 let isl_rs_result = BasicSet { ptr: isl_rs_result,
377 should_free_on_drop: true };
378 let err = isl_rs_ctx.last_error();
379 if err != Error::None_ {
380 let err_msg = isl_rs_ctx.last_error_msg();
381 isl_rs_ctx.reset_error();
382 return Err(LibISLError::new(err, err_msg));
383 }
384 Ok(isl_rs_result)
385 }
386
387 pub fn bind_domain(self, tuple: MultiId) -> Result<MultiAff, LibISLError> {
389 let multi = self;
390 let isl_rs_ctx = multi.get_ctx();
391 let mut multi = multi;
392 multi.do_not_free_on_drop();
393 let multi = multi.ptr;
394 let mut tuple = tuple;
395 tuple.do_not_free_on_drop();
396 let tuple = tuple.ptr;
397 let isl_rs_result = unsafe { isl_multi_aff_bind_domain(multi, tuple) };
398 let isl_rs_result = MultiAff { ptr: isl_rs_result,
399 should_free_on_drop: true };
400 let err = isl_rs_ctx.last_error();
401 if err != Error::None_ {
402 let err_msg = isl_rs_ctx.last_error_msg();
403 isl_rs_ctx.reset_error();
404 return Err(LibISLError::new(err, err_msg));
405 }
406 Ok(isl_rs_result)
407 }
408
409 pub fn bind_domain_wrapped_domain(self, tuple: MultiId) -> Result<MultiAff, LibISLError> {
411 let multi = self;
412 let isl_rs_ctx = multi.get_ctx();
413 let mut multi = multi;
414 multi.do_not_free_on_drop();
415 let multi = multi.ptr;
416 let mut tuple = tuple;
417 tuple.do_not_free_on_drop();
418 let tuple = tuple.ptr;
419 let isl_rs_result = unsafe { isl_multi_aff_bind_domain_wrapped_domain(multi, tuple) };
420 let isl_rs_result = MultiAff { ptr: isl_rs_result,
421 should_free_on_drop: true };
422 let err = isl_rs_ctx.last_error();
423 if err != Error::None_ {
424 let err_msg = isl_rs_ctx.last_error_msg();
425 isl_rs_ctx.reset_error();
426 return Err(LibISLError::new(err, err_msg));
427 }
428 Ok(isl_rs_result)
429 }
430
431 pub fn copy(&self) -> Result<MultiAff, LibISLError> {
433 let multi = self;
434 let isl_rs_ctx = multi.get_ctx();
435 let multi = multi.ptr;
436 let isl_rs_result = unsafe { isl_multi_aff_copy(multi) };
437 let isl_rs_result = MultiAff { ptr: isl_rs_result,
438 should_free_on_drop: true };
439 let err = isl_rs_ctx.last_error();
440 if err != Error::None_ {
441 let err_msg = isl_rs_ctx.last_error_msg();
442 isl_rs_ctx.reset_error();
443 return Err(LibISLError::new(err, err_msg));
444 }
445 Ok(isl_rs_result)
446 }
447
448 pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
450 let multi = self;
451 let isl_rs_ctx = multi.get_ctx();
452 let multi = multi.ptr;
453 let type_ = type_.to_i32();
454 let isl_rs_result = unsafe { isl_multi_aff_dim(multi, type_) };
455 let err = isl_rs_ctx.last_error();
456 if err != Error::None_ {
457 let err_msg = isl_rs_ctx.last_error_msg();
458 isl_rs_ctx.reset_error();
459 return Err(LibISLError::new(err, err_msg));
460 }
461 Ok(isl_rs_result)
462 }
463
464 pub fn domain_map(space: Space) -> Result<MultiAff, LibISLError> {
466 let isl_rs_ctx = space.get_ctx();
467 let mut space = space;
468 space.do_not_free_on_drop();
469 let space = space.ptr;
470 let isl_rs_result = unsafe { isl_multi_aff_domain_map(space) };
471 let isl_rs_result = MultiAff { ptr: isl_rs_result,
472 should_free_on_drop: true };
473 let err = isl_rs_ctx.last_error();
474 if err != Error::None_ {
475 let err_msg = isl_rs_ctx.last_error_msg();
476 isl_rs_ctx.reset_error();
477 return Err(LibISLError::new(err, err_msg));
478 }
479 Ok(isl_rs_result)
480 }
481
482 pub fn domain_reverse(self) -> Result<MultiAff, LibISLError> {
484 let multi = self;
485 let isl_rs_ctx = multi.get_ctx();
486 let mut multi = multi;
487 multi.do_not_free_on_drop();
488 let multi = multi.ptr;
489 let isl_rs_result = unsafe { isl_multi_aff_domain_reverse(multi) };
490 let isl_rs_result = MultiAff { ptr: isl_rs_result,
491 should_free_on_drop: true };
492 let err = isl_rs_ctx.last_error();
493 if err != Error::None_ {
494 let err_msg = isl_rs_ctx.last_error_msg();
495 isl_rs_ctx.reset_error();
496 return Err(LibISLError::new(err, err_msg));
497 }
498 Ok(isl_rs_result)
499 }
500
501 pub fn drop_dims(self, type_: DimType, first: u32, n: u32) -> Result<MultiAff, LibISLError> {
503 let multi = self;
504 let isl_rs_ctx = multi.get_ctx();
505 let mut multi = multi;
506 multi.do_not_free_on_drop();
507 let multi = multi.ptr;
508 let type_ = type_.to_i32();
509 let isl_rs_result = unsafe { isl_multi_aff_drop_dims(multi, type_, first, n) };
510 let isl_rs_result = MultiAff { ptr: isl_rs_result,
511 should_free_on_drop: true };
512 let err = isl_rs_ctx.last_error();
513 if err != Error::None_ {
514 let err_msg = isl_rs_ctx.last_error_msg();
515 isl_rs_ctx.reset_error();
516 return Err(LibISLError::new(err, err_msg));
517 }
518 Ok(isl_rs_result)
519 }
520
521 pub fn dump(&self) -> Result<(), LibISLError> {
523 let maff = self;
524 let isl_rs_ctx = maff.get_ctx();
525 let maff = maff.ptr;
526 let isl_rs_result = unsafe { isl_multi_aff_dump(maff) };
527 let err = isl_rs_ctx.last_error();
528 if err != Error::None_ {
529 let err_msg = isl_rs_ctx.last_error_msg();
530 isl_rs_ctx.reset_error();
531 return Err(LibISLError::new(err, err_msg));
532 }
533 Ok(isl_rs_result)
534 }
535
536 pub fn factor_range(self) -> Result<MultiAff, LibISLError> {
538 let multi = self;
539 let isl_rs_ctx = multi.get_ctx();
540 let mut multi = multi;
541 multi.do_not_free_on_drop();
542 let multi = multi.ptr;
543 let isl_rs_result = unsafe { isl_multi_aff_factor_range(multi) };
544 let isl_rs_result = MultiAff { ptr: isl_rs_result,
545 should_free_on_drop: true };
546 let err = isl_rs_ctx.last_error();
547 if err != Error::None_ {
548 let err_msg = isl_rs_ctx.last_error_msg();
549 isl_rs_ctx.reset_error();
550 return Err(LibISLError::new(err, err_msg));
551 }
552 Ok(isl_rs_result)
553 }
554
555 pub fn find_dim_by_id(&self, type_: DimType, id: &Id) -> Result<i32, LibISLError> {
557 let multi = self;
558 let isl_rs_ctx = multi.get_ctx();
559 let multi = multi.ptr;
560 let type_ = type_.to_i32();
561 let id = id.ptr;
562 let isl_rs_result = unsafe { isl_multi_aff_find_dim_by_id(multi, type_, id) };
563 let err = isl_rs_ctx.last_error();
564 if err != Error::None_ {
565 let err_msg = isl_rs_ctx.last_error_msg();
566 isl_rs_ctx.reset_error();
567 return Err(LibISLError::new(err, err_msg));
568 }
569 Ok(isl_rs_result)
570 }
571
572 pub fn find_dim_by_name(&self, type_: DimType, name: &str) -> Result<i32, LibISLError> {
574 let multi = self;
575 let isl_rs_ctx = multi.get_ctx();
576 let multi = multi.ptr;
577 let type_ = type_.to_i32();
578 let name = CString::new(name).unwrap();
579 let name = name.as_ptr();
580 let isl_rs_result = unsafe { isl_multi_aff_find_dim_by_name(multi, type_, name) };
581 let err = isl_rs_ctx.last_error();
582 if err != Error::None_ {
583 let err_msg = isl_rs_ctx.last_error_msg();
584 isl_rs_ctx.reset_error();
585 return Err(LibISLError::new(err, err_msg));
586 }
587 Ok(isl_rs_result)
588 }
589
590 pub fn flat_range_product(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
592 let multi1 = self;
593 let isl_rs_ctx = multi1.get_ctx();
594 let mut multi1 = multi1;
595 multi1.do_not_free_on_drop();
596 let multi1 = multi1.ptr;
597 let mut multi2 = multi2;
598 multi2.do_not_free_on_drop();
599 let multi2 = multi2.ptr;
600 let isl_rs_result = unsafe { isl_multi_aff_flat_range_product(multi1, multi2) };
601 let isl_rs_result = MultiAff { ptr: isl_rs_result,
602 should_free_on_drop: true };
603 let err = isl_rs_ctx.last_error();
604 if err != Error::None_ {
605 let err_msg = isl_rs_ctx.last_error_msg();
606 isl_rs_ctx.reset_error();
607 return Err(LibISLError::new(err, err_msg));
608 }
609 Ok(isl_rs_result)
610 }
611
612 pub fn flatten_domain(self) -> Result<MultiAff, LibISLError> {
614 let ma = self;
615 let isl_rs_ctx = ma.get_ctx();
616 let mut ma = ma;
617 ma.do_not_free_on_drop();
618 let ma = ma.ptr;
619 let isl_rs_result = unsafe { isl_multi_aff_flatten_domain(ma) };
620 let isl_rs_result = MultiAff { ptr: isl_rs_result,
621 should_free_on_drop: true };
622 let err = isl_rs_ctx.last_error();
623 if err != Error::None_ {
624 let err_msg = isl_rs_ctx.last_error_msg();
625 isl_rs_ctx.reset_error();
626 return Err(LibISLError::new(err, err_msg));
627 }
628 Ok(isl_rs_result)
629 }
630
631 pub fn flatten_range(self) -> Result<MultiAff, LibISLError> {
633 let multi = self;
634 let isl_rs_ctx = multi.get_ctx();
635 let mut multi = multi;
636 multi.do_not_free_on_drop();
637 let multi = multi.ptr;
638 let isl_rs_result = unsafe { isl_multi_aff_flatten_range(multi) };
639 let isl_rs_result = MultiAff { ptr: isl_rs_result,
640 should_free_on_drop: true };
641 let err = isl_rs_ctx.last_error();
642 if err != Error::None_ {
643 let err_msg = isl_rs_ctx.last_error_msg();
644 isl_rs_ctx.reset_error();
645 return Err(LibISLError::new(err, err_msg));
646 }
647 Ok(isl_rs_result)
648 }
649
650 pub fn floor(self) -> Result<MultiAff, LibISLError> {
652 let ma = self;
653 let isl_rs_ctx = ma.get_ctx();
654 let mut ma = ma;
655 ma.do_not_free_on_drop();
656 let ma = ma.ptr;
657 let isl_rs_result = unsafe { isl_multi_aff_floor(ma) };
658 let isl_rs_result = MultiAff { ptr: isl_rs_result,
659 should_free_on_drop: true };
660 let err = isl_rs_ctx.last_error();
661 if err != Error::None_ {
662 let err_msg = isl_rs_ctx.last_error_msg();
663 isl_rs_ctx.reset_error();
664 return Err(LibISLError::new(err, err_msg));
665 }
666 Ok(isl_rs_result)
667 }
668
669 pub fn free(self) -> Result<MultiAff, LibISLError> {
671 let multi = self;
672 let isl_rs_ctx = multi.get_ctx();
673 let mut multi = multi;
674 multi.do_not_free_on_drop();
675 let multi = multi.ptr;
676 let isl_rs_result = unsafe { isl_multi_aff_free(multi) };
677 let isl_rs_result = MultiAff { ptr: isl_rs_result,
678 should_free_on_drop: true };
679 let err = isl_rs_ctx.last_error();
680 if err != Error::None_ {
681 let err_msg = isl_rs_ctx.last_error_msg();
682 isl_rs_ctx.reset_error();
683 return Err(LibISLError::new(err, err_msg));
684 }
685 Ok(isl_rs_result)
686 }
687
688 pub fn from_aff(aff: Aff) -> Result<MultiAff, LibISLError> {
690 let isl_rs_ctx = aff.get_ctx();
691 let mut aff = aff;
692 aff.do_not_free_on_drop();
693 let aff = aff.ptr;
694 let isl_rs_result = unsafe { isl_multi_aff_from_aff(aff) };
695 let isl_rs_result = MultiAff { ptr: isl_rs_result,
696 should_free_on_drop: true };
697 let err = isl_rs_ctx.last_error();
698 if err != Error::None_ {
699 let err_msg = isl_rs_ctx.last_error_msg();
700 isl_rs_ctx.reset_error();
701 return Err(LibISLError::new(err, err_msg));
702 }
703 Ok(isl_rs_result)
704 }
705
706 pub fn from_aff_list(space: Space, list: AffList) -> Result<MultiAff, LibISLError> {
708 let isl_rs_ctx = space.get_ctx();
709 let mut space = space;
710 space.do_not_free_on_drop();
711 let space = space.ptr;
712 let mut list = list;
713 list.do_not_free_on_drop();
714 let list = list.ptr;
715 let isl_rs_result = unsafe { isl_multi_aff_from_aff_list(space, list) };
716 let isl_rs_result = MultiAff { ptr: isl_rs_result,
717 should_free_on_drop: true };
718 let err = isl_rs_ctx.last_error();
719 if err != Error::None_ {
720 let err_msg = isl_rs_ctx.last_error_msg();
721 isl_rs_ctx.reset_error();
722 return Err(LibISLError::new(err, err_msg));
723 }
724 Ok(isl_rs_result)
725 }
726
727 pub fn from_range(self) -> Result<MultiAff, LibISLError> {
729 let multi = self;
730 let isl_rs_ctx = multi.get_ctx();
731 let mut multi = multi;
732 multi.do_not_free_on_drop();
733 let multi = multi.ptr;
734 let isl_rs_result = unsafe { isl_multi_aff_from_range(multi) };
735 let isl_rs_result = MultiAff { ptr: isl_rs_result,
736 should_free_on_drop: true };
737 let err = isl_rs_ctx.last_error();
738 if err != Error::None_ {
739 let err_msg = isl_rs_ctx.last_error_msg();
740 isl_rs_ctx.reset_error();
741 return Err(LibISLError::new(err, err_msg));
742 }
743 Ok(isl_rs_result)
744 }
745
746 pub fn get_aff(&self, pos: i32) -> Result<Aff, LibISLError> {
748 let multi = self;
749 let isl_rs_ctx = multi.get_ctx();
750 let multi = multi.ptr;
751 let isl_rs_result = unsafe { isl_multi_aff_get_aff(multi, pos) };
752 let isl_rs_result = Aff { ptr: isl_rs_result,
753 should_free_on_drop: true };
754 let err = isl_rs_ctx.last_error();
755 if err != Error::None_ {
756 let err_msg = isl_rs_ctx.last_error_msg();
757 isl_rs_ctx.reset_error();
758 return Err(LibISLError::new(err, err_msg));
759 }
760 Ok(isl_rs_result)
761 }
762
763 pub fn get_at(&self, pos: i32) -> Result<Aff, 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_at(multi, pos) };
769 let isl_rs_result = Aff { ptr: isl_rs_result,
770 should_free_on_drop: true };
771 let err = isl_rs_ctx.last_error();
772 if err != Error::None_ {
773 let err_msg = isl_rs_ctx.last_error_msg();
774 isl_rs_ctx.reset_error();
775 return Err(LibISLError::new(err, err_msg));
776 }
777 Ok(isl_rs_result)
778 }
779
780 pub fn get_constant_multi_val(&self) -> Result<MultiVal, LibISLError> {
782 let ma = self;
783 let isl_rs_ctx = ma.get_ctx();
784 let ma = ma.ptr;
785 let isl_rs_result = unsafe { isl_multi_aff_get_constant_multi_val(ma) };
786 let isl_rs_result = MultiVal { ptr: isl_rs_result,
787 should_free_on_drop: true };
788 let err = isl_rs_ctx.last_error();
789 if err != Error::None_ {
790 let err_msg = isl_rs_ctx.last_error_msg();
791 isl_rs_ctx.reset_error();
792 return Err(LibISLError::new(err, err_msg));
793 }
794 Ok(isl_rs_result)
795 }
796
797 pub fn get_ctx(&self) -> Context {
799 let multi = self;
800 let multi = multi.ptr;
801 let isl_rs_result = unsafe { isl_multi_aff_get_ctx(multi) };
802 let isl_rs_result = Context { ptr: isl_rs_result,
803 should_free_on_drop: false };
804 isl_rs_result
805 }
806
807 pub fn get_dim_id(&self, type_: DimType, pos: u32) -> Result<Id, LibISLError> {
809 let multi = self;
810 let isl_rs_ctx = multi.get_ctx();
811 let multi = multi.ptr;
812 let type_ = type_.to_i32();
813 let isl_rs_result = unsafe { isl_multi_aff_get_dim_id(multi, type_, pos) };
814 let isl_rs_result = Id { ptr: isl_rs_result,
815 should_free_on_drop: true };
816 let err = isl_rs_ctx.last_error();
817 if err != Error::None_ {
818 let err_msg = isl_rs_ctx.last_error_msg();
819 isl_rs_ctx.reset_error();
820 return Err(LibISLError::new(err, err_msg));
821 }
822 Ok(isl_rs_result)
823 }
824
825 pub fn get_domain_space(&self) -> Result<Space, LibISLError> {
827 let multi = self;
828 let isl_rs_ctx = multi.get_ctx();
829 let multi = multi.ptr;
830 let isl_rs_result = unsafe { isl_multi_aff_get_domain_space(multi) };
831 let isl_rs_result = Space { ptr: isl_rs_result,
832 should_free_on_drop: true };
833 let err = isl_rs_ctx.last_error();
834 if err != Error::None_ {
835 let err_msg = isl_rs_ctx.last_error_msg();
836 isl_rs_ctx.reset_error();
837 return Err(LibISLError::new(err, err_msg));
838 }
839 Ok(isl_rs_result)
840 }
841
842 pub fn get_list(&self) -> Result<AffList, LibISLError> {
844 let multi = self;
845 let isl_rs_ctx = multi.get_ctx();
846 let multi = multi.ptr;
847 let isl_rs_result = unsafe { isl_multi_aff_get_list(multi) };
848 let isl_rs_result = AffList { ptr: isl_rs_result,
849 should_free_on_drop: true };
850 let err = isl_rs_ctx.last_error();
851 if err != Error::None_ {
852 let err_msg = isl_rs_ctx.last_error_msg();
853 isl_rs_ctx.reset_error();
854 return Err(LibISLError::new(err, err_msg));
855 }
856 Ok(isl_rs_result)
857 }
858
859 pub fn get_range_tuple_id(&self) -> Result<Id, LibISLError> {
861 let multi = self;
862 let isl_rs_ctx = multi.get_ctx();
863 let multi = multi.ptr;
864 let isl_rs_result = unsafe { isl_multi_aff_get_range_tuple_id(multi) };
865 let isl_rs_result = Id { ptr: isl_rs_result,
866 should_free_on_drop: true };
867 let err = isl_rs_ctx.last_error();
868 if err != Error::None_ {
869 let err_msg = isl_rs_ctx.last_error_msg();
870 isl_rs_ctx.reset_error();
871 return Err(LibISLError::new(err, err_msg));
872 }
873 Ok(isl_rs_result)
874 }
875
876 pub fn get_space(&self) -> Result<Space, LibISLError> {
878 let multi = self;
879 let isl_rs_ctx = multi.get_ctx();
880 let multi = multi.ptr;
881 let isl_rs_result = unsafe { isl_multi_aff_get_space(multi) };
882 let isl_rs_result = Space { ptr: isl_rs_result,
883 should_free_on_drop: true };
884 let err = isl_rs_ctx.last_error();
885 if err != Error::None_ {
886 let err_msg = isl_rs_ctx.last_error_msg();
887 isl_rs_ctx.reset_error();
888 return Err(LibISLError::new(err, err_msg));
889 }
890 Ok(isl_rs_result)
891 }
892
893 pub fn get_tuple_id(&self, type_: DimType) -> Result<Id, LibISLError> {
895 let multi = self;
896 let isl_rs_ctx = multi.get_ctx();
897 let multi = multi.ptr;
898 let type_ = type_.to_i32();
899 let isl_rs_result = unsafe { isl_multi_aff_get_tuple_id(multi, type_) };
900 let isl_rs_result = Id { ptr: isl_rs_result,
901 should_free_on_drop: true };
902 let err = isl_rs_ctx.last_error();
903 if err != Error::None_ {
904 let err_msg = isl_rs_ctx.last_error_msg();
905 isl_rs_ctx.reset_error();
906 return Err(LibISLError::new(err, err_msg));
907 }
908 Ok(isl_rs_result)
909 }
910
911 pub fn get_tuple_name(&self, type_: DimType) -> Result<&str, LibISLError> {
913 let multi = self;
914 let isl_rs_ctx = multi.get_ctx();
915 let multi = multi.ptr;
916 let type_ = type_.to_i32();
917 let isl_rs_result = unsafe { isl_multi_aff_get_tuple_name(multi, type_) };
918 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
919 let isl_rs_result = isl_rs_result.to_str().unwrap();
920 let err = isl_rs_ctx.last_error();
921 if err != Error::None_ {
922 let err_msg = isl_rs_ctx.last_error_msg();
923 isl_rs_ctx.reset_error();
924 return Err(LibISLError::new(err, err_msg));
925 }
926 Ok(isl_rs_result)
927 }
928
929 pub fn gist(self, context: Set) -> Result<MultiAff, LibISLError> {
931 let maff = self;
932 let isl_rs_ctx = maff.get_ctx();
933 let mut maff = maff;
934 maff.do_not_free_on_drop();
935 let maff = maff.ptr;
936 let mut context = context;
937 context.do_not_free_on_drop();
938 let context = context.ptr;
939 let isl_rs_result = unsafe { isl_multi_aff_gist(maff, context) };
940 let isl_rs_result = MultiAff { ptr: isl_rs_result,
941 should_free_on_drop: true };
942 let err = isl_rs_ctx.last_error();
943 if err != Error::None_ {
944 let err_msg = isl_rs_ctx.last_error_msg();
945 isl_rs_ctx.reset_error();
946 return Err(LibISLError::new(err, err_msg));
947 }
948 Ok(isl_rs_result)
949 }
950
951 pub fn gist_params(self, context: Set) -> Result<MultiAff, LibISLError> {
953 let maff = self;
954 let isl_rs_ctx = maff.get_ctx();
955 let mut maff = maff;
956 maff.do_not_free_on_drop();
957 let maff = maff.ptr;
958 let mut context = context;
959 context.do_not_free_on_drop();
960 let context = context.ptr;
961 let isl_rs_result = unsafe { isl_multi_aff_gist_params(maff, context) };
962 let isl_rs_result = MultiAff { ptr: isl_rs_result,
963 should_free_on_drop: true };
964 let err = isl_rs_ctx.last_error();
965 if err != Error::None_ {
966 let err_msg = isl_rs_ctx.last_error_msg();
967 isl_rs_ctx.reset_error();
968 return Err(LibISLError::new(err, err_msg));
969 }
970 Ok(isl_rs_result)
971 }
972
973 pub fn has_range_tuple_id(&self) -> Result<bool, LibISLError> {
975 let multi = self;
976 let isl_rs_ctx = multi.get_ctx();
977 let multi = multi.ptr;
978 let isl_rs_result = unsafe { isl_multi_aff_has_range_tuple_id(multi) };
979 let isl_rs_result = match isl_rs_result {
980 0 => false,
981 1 => true,
982 _ => {
983 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
984 }
985 };
986 let err = isl_rs_ctx.last_error();
987 if err != Error::None_ {
988 let err_msg = isl_rs_ctx.last_error_msg();
989 isl_rs_ctx.reset_error();
990 return Err(LibISLError::new(err, err_msg));
991 }
992 Ok(isl_rs_result)
993 }
994
995 pub fn has_tuple_id(&self, type_: DimType) -> Result<bool, LibISLError> {
997 let multi = self;
998 let isl_rs_ctx = multi.get_ctx();
999 let multi = multi.ptr;
1000 let type_ = type_.to_i32();
1001 let isl_rs_result = unsafe { isl_multi_aff_has_tuple_id(multi, type_) };
1002 let isl_rs_result = match isl_rs_result {
1003 0 => false,
1004 1 => true,
1005 _ => {
1006 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1007 }
1008 };
1009 let err = isl_rs_ctx.last_error();
1010 if err != Error::None_ {
1011 let err_msg = isl_rs_ctx.last_error_msg();
1012 isl_rs_ctx.reset_error();
1013 return Err(LibISLError::new(err, err_msg));
1014 }
1015 Ok(isl_rs_result)
1016 }
1017
1018 pub fn identity(space: Space) -> Result<MultiAff, LibISLError> {
1020 let isl_rs_ctx = space.get_ctx();
1021 let mut space = space;
1022 space.do_not_free_on_drop();
1023 let space = space.ptr;
1024 let isl_rs_result = unsafe { isl_multi_aff_identity(space) };
1025 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1026 should_free_on_drop: true };
1027 let err = isl_rs_ctx.last_error();
1028 if err != Error::None_ {
1029 let err_msg = isl_rs_ctx.last_error_msg();
1030 isl_rs_ctx.reset_error();
1031 return Err(LibISLError::new(err, err_msg));
1032 }
1033 Ok(isl_rs_result)
1034 }
1035
1036 pub fn identity_multi_aff(self) -> Result<MultiAff, LibISLError> {
1038 let multi = self;
1039 let isl_rs_ctx = multi.get_ctx();
1040 let mut multi = multi;
1041 multi.do_not_free_on_drop();
1042 let multi = multi.ptr;
1043 let isl_rs_result = unsafe { isl_multi_aff_identity_multi_aff(multi) };
1044 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1045 should_free_on_drop: true };
1046 let err = isl_rs_ctx.last_error();
1047 if err != Error::None_ {
1048 let err_msg = isl_rs_ctx.last_error_msg();
1049 isl_rs_ctx.reset_error();
1050 return Err(LibISLError::new(err, err_msg));
1051 }
1052 Ok(isl_rs_result)
1053 }
1054
1055 pub fn identity_on_domain_space(space: Space) -> Result<MultiAff, LibISLError> {
1057 let isl_rs_ctx = space.get_ctx();
1058 let mut space = space;
1059 space.do_not_free_on_drop();
1060 let space = space.ptr;
1061 let isl_rs_result = unsafe { isl_multi_aff_identity_on_domain_space(space) };
1062 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1063 should_free_on_drop: true };
1064 let err = isl_rs_ctx.last_error();
1065 if err != Error::None_ {
1066 let err_msg = isl_rs_ctx.last_error_msg();
1067 isl_rs_ctx.reset_error();
1068 return Err(LibISLError::new(err, err_msg));
1069 }
1070 Ok(isl_rs_result)
1071 }
1072
1073 pub fn insert_dims(self, type_: DimType, first: u32, n: u32) -> Result<MultiAff, LibISLError> {
1075 let multi = self;
1076 let isl_rs_ctx = multi.get_ctx();
1077 let mut multi = multi;
1078 multi.do_not_free_on_drop();
1079 let multi = multi.ptr;
1080 let type_ = type_.to_i32();
1081 let isl_rs_result = unsafe { isl_multi_aff_insert_dims(multi, type_, first, n) };
1082 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1083 should_free_on_drop: true };
1084 let err = isl_rs_ctx.last_error();
1085 if err != Error::None_ {
1086 let err_msg = isl_rs_ctx.last_error_msg();
1087 isl_rs_ctx.reset_error();
1088 return Err(LibISLError::new(err, err_msg));
1089 }
1090 Ok(isl_rs_result)
1091 }
1092
1093 pub fn insert_domain(self, domain: Space) -> Result<MultiAff, LibISLError> {
1095 let multi = self;
1096 let isl_rs_ctx = multi.get_ctx();
1097 let mut multi = multi;
1098 multi.do_not_free_on_drop();
1099 let multi = multi.ptr;
1100 let mut domain = domain;
1101 domain.do_not_free_on_drop();
1102 let domain = domain.ptr;
1103 let isl_rs_result = unsafe { isl_multi_aff_insert_domain(multi, domain) };
1104 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1105 should_free_on_drop: true };
1106 let err = isl_rs_ctx.last_error();
1107 if err != Error::None_ {
1108 let err_msg = isl_rs_ctx.last_error_msg();
1109 isl_rs_ctx.reset_error();
1110 return Err(LibISLError::new(err, err_msg));
1111 }
1112 Ok(isl_rs_result)
1113 }
1114
1115 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
1117 let multi = self;
1118 let isl_rs_ctx = multi.get_ctx();
1119 let multi = multi.ptr;
1120 let type_ = type_.to_i32();
1121 let isl_rs_result = unsafe { isl_multi_aff_involves_dims(multi, type_, first, n) };
1122 let isl_rs_result = match isl_rs_result {
1123 0 => false,
1124 1 => true,
1125 _ => {
1126 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1127 }
1128 };
1129 let err = isl_rs_ctx.last_error();
1130 if err != Error::None_ {
1131 let err_msg = isl_rs_ctx.last_error_msg();
1132 isl_rs_ctx.reset_error();
1133 return Err(LibISLError::new(err, err_msg));
1134 }
1135 Ok(isl_rs_result)
1136 }
1137
1138 pub fn involves_locals(&self) -> Result<bool, LibISLError> {
1140 let multi = self;
1141 let isl_rs_ctx = multi.get_ctx();
1142 let multi = multi.ptr;
1143 let isl_rs_result = unsafe { isl_multi_aff_involves_locals(multi) };
1144 let isl_rs_result = match isl_rs_result {
1145 0 => false,
1146 1 => true,
1147 _ => {
1148 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1149 }
1150 };
1151 let err = isl_rs_ctx.last_error();
1152 if err != Error::None_ {
1153 let err_msg = isl_rs_ctx.last_error_msg();
1154 isl_rs_ctx.reset_error();
1155 return Err(LibISLError::new(err, err_msg));
1156 }
1157 Ok(isl_rs_result)
1158 }
1159
1160 pub fn involves_nan(&self) -> Result<bool, LibISLError> {
1162 let multi = self;
1163 let isl_rs_ctx = multi.get_ctx();
1164 let multi = multi.ptr;
1165 let isl_rs_result = unsafe { isl_multi_aff_involves_nan(multi) };
1166 let isl_rs_result = match isl_rs_result {
1167 0 => false,
1168 1 => true,
1169 _ => {
1170 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1171 }
1172 };
1173 let err = isl_rs_ctx.last_error();
1174 if err != Error::None_ {
1175 let err_msg = isl_rs_ctx.last_error_msg();
1176 isl_rs_ctx.reset_error();
1177 return Err(LibISLError::new(err, err_msg));
1178 }
1179 Ok(isl_rs_result)
1180 }
1181
1182 pub fn lex_ge_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1184 let ma1 = self;
1185 let isl_rs_ctx = ma1.get_ctx();
1186 let mut ma1 = ma1;
1187 ma1.do_not_free_on_drop();
1188 let ma1 = ma1.ptr;
1189 let mut ma2 = ma2;
1190 ma2.do_not_free_on_drop();
1191 let ma2 = ma2.ptr;
1192 let isl_rs_result = unsafe { isl_multi_aff_lex_ge_set(ma1, ma2) };
1193 let isl_rs_result = Set { ptr: isl_rs_result,
1194 should_free_on_drop: true };
1195 let err = isl_rs_ctx.last_error();
1196 if err != Error::None_ {
1197 let err_msg = isl_rs_ctx.last_error_msg();
1198 isl_rs_ctx.reset_error();
1199 return Err(LibISLError::new(err, err_msg));
1200 }
1201 Ok(isl_rs_result)
1202 }
1203
1204 pub fn lex_gt_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1206 let ma1 = self;
1207 let isl_rs_ctx = ma1.get_ctx();
1208 let mut ma1 = ma1;
1209 ma1.do_not_free_on_drop();
1210 let ma1 = ma1.ptr;
1211 let mut ma2 = ma2;
1212 ma2.do_not_free_on_drop();
1213 let ma2 = ma2.ptr;
1214 let isl_rs_result = unsafe { isl_multi_aff_lex_gt_set(ma1, ma2) };
1215 let isl_rs_result = Set { ptr: isl_rs_result,
1216 should_free_on_drop: true };
1217 let err = isl_rs_ctx.last_error();
1218 if err != Error::None_ {
1219 let err_msg = isl_rs_ctx.last_error_msg();
1220 isl_rs_ctx.reset_error();
1221 return Err(LibISLError::new(err, err_msg));
1222 }
1223 Ok(isl_rs_result)
1224 }
1225
1226 pub fn lex_le_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1228 let ma1 = self;
1229 let isl_rs_ctx = ma1.get_ctx();
1230 let mut ma1 = ma1;
1231 ma1.do_not_free_on_drop();
1232 let ma1 = ma1.ptr;
1233 let mut ma2 = ma2;
1234 ma2.do_not_free_on_drop();
1235 let ma2 = ma2.ptr;
1236 let isl_rs_result = unsafe { isl_multi_aff_lex_le_set(ma1, ma2) };
1237 let isl_rs_result = Set { ptr: isl_rs_result,
1238 should_free_on_drop: true };
1239 let err = isl_rs_ctx.last_error();
1240 if err != Error::None_ {
1241 let err_msg = isl_rs_ctx.last_error_msg();
1242 isl_rs_ctx.reset_error();
1243 return Err(LibISLError::new(err, err_msg));
1244 }
1245 Ok(isl_rs_result)
1246 }
1247
1248 pub fn lex_lt_set(self, ma2: MultiAff) -> Result<Set, LibISLError> {
1250 let ma1 = self;
1251 let isl_rs_ctx = ma1.get_ctx();
1252 let mut ma1 = ma1;
1253 ma1.do_not_free_on_drop();
1254 let ma1 = ma1.ptr;
1255 let mut ma2 = ma2;
1256 ma2.do_not_free_on_drop();
1257 let ma2 = ma2.ptr;
1258 let isl_rs_result = unsafe { isl_multi_aff_lex_lt_set(ma1, ma2) };
1259 let isl_rs_result = Set { ptr: isl_rs_result,
1260 should_free_on_drop: true };
1261 let err = isl_rs_ctx.last_error();
1262 if err != Error::None_ {
1263 let err_msg = isl_rs_ctx.last_error_msg();
1264 isl_rs_ctx.reset_error();
1265 return Err(LibISLError::new(err, err_msg));
1266 }
1267 Ok(isl_rs_result)
1268 }
1269
1270 pub fn mod_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1272 let multi = self;
1273 let isl_rs_ctx = multi.get_ctx();
1274 let mut multi = multi;
1275 multi.do_not_free_on_drop();
1276 let multi = multi.ptr;
1277 let mut mv = mv;
1278 mv.do_not_free_on_drop();
1279 let mv = mv.ptr;
1280 let isl_rs_result = unsafe { isl_multi_aff_mod_multi_val(multi, mv) };
1281 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1282 should_free_on_drop: true };
1283 let err = isl_rs_ctx.last_error();
1284 if err != Error::None_ {
1285 let err_msg = isl_rs_ctx.last_error_msg();
1286 isl_rs_ctx.reset_error();
1287 return Err(LibISLError::new(err, err_msg));
1288 }
1289 Ok(isl_rs_result)
1290 }
1291
1292 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
1294 n: u32)
1295 -> Result<MultiAff, LibISLError> {
1296 let ma = self;
1297 let isl_rs_ctx = ma.get_ctx();
1298 let mut ma = ma;
1299 ma.do_not_free_on_drop();
1300 let ma = ma.ptr;
1301 let dst_type = dst_type.to_i32();
1302 let src_type = src_type.to_i32();
1303 let isl_rs_result =
1304 unsafe { isl_multi_aff_move_dims(ma, dst_type, dst_pos, src_type, src_pos, n) };
1305 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1306 should_free_on_drop: true };
1307 let err = isl_rs_ctx.last_error();
1308 if err != Error::None_ {
1309 let err_msg = isl_rs_ctx.last_error_msg();
1310 isl_rs_ctx.reset_error();
1311 return Err(LibISLError::new(err, err_msg));
1312 }
1313 Ok(isl_rs_result)
1314 }
1315
1316 pub fn multi_val_on_domain_space(space: Space, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1318 let isl_rs_ctx = space.get_ctx();
1319 let mut space = space;
1320 space.do_not_free_on_drop();
1321 let space = space.ptr;
1322 let mut mv = mv;
1323 mv.do_not_free_on_drop();
1324 let mv = mv.ptr;
1325 let isl_rs_result = unsafe { isl_multi_aff_multi_val_on_domain_space(space, mv) };
1326 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1327 should_free_on_drop: true };
1328 let err = isl_rs_ctx.last_error();
1329 if err != Error::None_ {
1330 let err_msg = isl_rs_ctx.last_error_msg();
1331 isl_rs_ctx.reset_error();
1332 return Err(LibISLError::new(err, err_msg));
1333 }
1334 Ok(isl_rs_result)
1335 }
1336
1337 pub fn multi_val_on_space(space: Space, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1339 let isl_rs_ctx = space.get_ctx();
1340 let mut space = space;
1341 space.do_not_free_on_drop();
1342 let space = space.ptr;
1343 let mut mv = mv;
1344 mv.do_not_free_on_drop();
1345 let mv = mv.ptr;
1346 let isl_rs_result = unsafe { isl_multi_aff_multi_val_on_space(space, mv) };
1347 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1348 should_free_on_drop: true };
1349 let err = isl_rs_ctx.last_error();
1350 if err != Error::None_ {
1351 let err_msg = isl_rs_ctx.last_error_msg();
1352 isl_rs_ctx.reset_error();
1353 return Err(LibISLError::new(err, err_msg));
1354 }
1355 Ok(isl_rs_result)
1356 }
1357
1358 pub fn neg(self) -> Result<MultiAff, LibISLError> {
1360 let multi = self;
1361 let isl_rs_ctx = multi.get_ctx();
1362 let mut multi = multi;
1363 multi.do_not_free_on_drop();
1364 let multi = multi.ptr;
1365 let isl_rs_result = unsafe { isl_multi_aff_neg(multi) };
1366 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1367 should_free_on_drop: true };
1368 let err = isl_rs_ctx.last_error();
1369 if err != Error::None_ {
1370 let err_msg = isl_rs_ctx.last_error_msg();
1371 isl_rs_ctx.reset_error();
1372 return Err(LibISLError::new(err, err_msg));
1373 }
1374 Ok(isl_rs_result)
1375 }
1376
1377 pub fn plain_cmp(&self, multi2: &MultiAff) -> Result<i32, LibISLError> {
1379 let multi1 = self;
1380 let isl_rs_ctx = multi1.get_ctx();
1381 let multi1 = multi1.ptr;
1382 let multi2 = multi2.ptr;
1383 let isl_rs_result = unsafe { isl_multi_aff_plain_cmp(multi1, multi2) };
1384 let err = isl_rs_ctx.last_error();
1385 if err != Error::None_ {
1386 let err_msg = isl_rs_ctx.last_error_msg();
1387 isl_rs_ctx.reset_error();
1388 return Err(LibISLError::new(err, err_msg));
1389 }
1390 Ok(isl_rs_result)
1391 }
1392
1393 pub fn plain_is_equal(&self, multi2: &MultiAff) -> Result<bool, LibISLError> {
1395 let multi1 = self;
1396 let isl_rs_ctx = multi1.get_ctx();
1397 let multi1 = multi1.ptr;
1398 let multi2 = multi2.ptr;
1399 let isl_rs_result = unsafe { isl_multi_aff_plain_is_equal(multi1, multi2) };
1400 let isl_rs_result = match isl_rs_result {
1401 0 => false,
1402 1 => true,
1403 _ => {
1404 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1405 }
1406 };
1407 let err = isl_rs_ctx.last_error();
1408 if err != Error::None_ {
1409 let err_msg = isl_rs_ctx.last_error_msg();
1410 isl_rs_ctx.reset_error();
1411 return Err(LibISLError::new(err, err_msg));
1412 }
1413 Ok(isl_rs_result)
1414 }
1415
1416 pub fn product(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1418 let multi1 = self;
1419 let isl_rs_ctx = multi1.get_ctx();
1420 let mut multi1 = multi1;
1421 multi1.do_not_free_on_drop();
1422 let multi1 = multi1.ptr;
1423 let mut multi2 = multi2;
1424 multi2.do_not_free_on_drop();
1425 let multi2 = multi2.ptr;
1426 let isl_rs_result = unsafe { isl_multi_aff_product(multi1, multi2) };
1427 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1428 should_free_on_drop: true };
1429 let err = isl_rs_ctx.last_error();
1430 if err != Error::None_ {
1431 let err_msg = isl_rs_ctx.last_error_msg();
1432 isl_rs_ctx.reset_error();
1433 return Err(LibISLError::new(err, err_msg));
1434 }
1435 Ok(isl_rs_result)
1436 }
1437
1438 pub fn project_domain_on_params(self) -> Result<MultiAff, LibISLError> {
1440 let multi = self;
1441 let isl_rs_ctx = multi.get_ctx();
1442 let mut multi = multi;
1443 multi.do_not_free_on_drop();
1444 let multi = multi.ptr;
1445 let isl_rs_result = unsafe { isl_multi_aff_project_domain_on_params(multi) };
1446 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1447 should_free_on_drop: true };
1448 let err = isl_rs_ctx.last_error();
1449 if err != Error::None_ {
1450 let err_msg = isl_rs_ctx.last_error_msg();
1451 isl_rs_ctx.reset_error();
1452 return Err(LibISLError::new(err, err_msg));
1453 }
1454 Ok(isl_rs_result)
1455 }
1456
1457 pub fn project_out_map(space: Space, type_: DimType, first: u32, n: u32)
1459 -> Result<MultiAff, LibISLError> {
1460 let isl_rs_ctx = space.get_ctx();
1461 let mut space = space;
1462 space.do_not_free_on_drop();
1463 let space = space.ptr;
1464 let type_ = type_.to_i32();
1465 let isl_rs_result = unsafe { isl_multi_aff_project_out_map(space, type_, first, n) };
1466 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1467 should_free_on_drop: true };
1468 let err = isl_rs_ctx.last_error();
1469 if err != Error::None_ {
1470 let err_msg = isl_rs_ctx.last_error_msg();
1471 isl_rs_ctx.reset_error();
1472 return Err(LibISLError::new(err, err_msg));
1473 }
1474 Ok(isl_rs_result)
1475 }
1476
1477 pub fn pullback_multi_aff(self, ma2: MultiAff) -> Result<MultiAff, LibISLError> {
1479 let ma1 = self;
1480 let isl_rs_ctx = ma1.get_ctx();
1481 let mut ma1 = ma1;
1482 ma1.do_not_free_on_drop();
1483 let ma1 = ma1.ptr;
1484 let mut ma2 = ma2;
1485 ma2.do_not_free_on_drop();
1486 let ma2 = ma2.ptr;
1487 let isl_rs_result = unsafe { isl_multi_aff_pullback_multi_aff(ma1, ma2) };
1488 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1489 should_free_on_drop: true };
1490 let err = isl_rs_ctx.last_error();
1491 if err != Error::None_ {
1492 let err_msg = isl_rs_ctx.last_error_msg();
1493 isl_rs_ctx.reset_error();
1494 return Err(LibISLError::new(err, err_msg));
1495 }
1496 Ok(isl_rs_result)
1497 }
1498
1499 pub fn range_factor_domain(self) -> Result<MultiAff, LibISLError> {
1501 let multi = self;
1502 let isl_rs_ctx = multi.get_ctx();
1503 let mut multi = multi;
1504 multi.do_not_free_on_drop();
1505 let multi = multi.ptr;
1506 let isl_rs_result = unsafe { isl_multi_aff_range_factor_domain(multi) };
1507 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1508 should_free_on_drop: true };
1509 let err = isl_rs_ctx.last_error();
1510 if err != Error::None_ {
1511 let err_msg = isl_rs_ctx.last_error_msg();
1512 isl_rs_ctx.reset_error();
1513 return Err(LibISLError::new(err, err_msg));
1514 }
1515 Ok(isl_rs_result)
1516 }
1517
1518 pub fn range_factor_range(self) -> Result<MultiAff, LibISLError> {
1520 let multi = self;
1521 let isl_rs_ctx = multi.get_ctx();
1522 let mut multi = multi;
1523 multi.do_not_free_on_drop();
1524 let multi = multi.ptr;
1525 let isl_rs_result = unsafe { isl_multi_aff_range_factor_range(multi) };
1526 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1527 should_free_on_drop: true };
1528 let err = isl_rs_ctx.last_error();
1529 if err != Error::None_ {
1530 let err_msg = isl_rs_ctx.last_error_msg();
1531 isl_rs_ctx.reset_error();
1532 return Err(LibISLError::new(err, err_msg));
1533 }
1534 Ok(isl_rs_result)
1535 }
1536
1537 pub fn range_is_wrapping(&self) -> Result<bool, LibISLError> {
1539 let multi = self;
1540 let isl_rs_ctx = multi.get_ctx();
1541 let multi = multi.ptr;
1542 let isl_rs_result = unsafe { isl_multi_aff_range_is_wrapping(multi) };
1543 let isl_rs_result = match isl_rs_result {
1544 0 => false,
1545 1 => true,
1546 _ => {
1547 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1548 }
1549 };
1550 let err = isl_rs_ctx.last_error();
1551 if err != Error::None_ {
1552 let err_msg = isl_rs_ctx.last_error_msg();
1553 isl_rs_ctx.reset_error();
1554 return Err(LibISLError::new(err, err_msg));
1555 }
1556 Ok(isl_rs_result)
1557 }
1558
1559 pub fn range_map(space: Space) -> Result<MultiAff, LibISLError> {
1561 let isl_rs_ctx = space.get_ctx();
1562 let mut space = space;
1563 space.do_not_free_on_drop();
1564 let space = space.ptr;
1565 let isl_rs_result = unsafe { isl_multi_aff_range_map(space) };
1566 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1567 should_free_on_drop: true };
1568 let err = isl_rs_ctx.last_error();
1569 if err != Error::None_ {
1570 let err_msg = isl_rs_ctx.last_error_msg();
1571 isl_rs_ctx.reset_error();
1572 return Err(LibISLError::new(err, err_msg));
1573 }
1574 Ok(isl_rs_result)
1575 }
1576
1577 pub fn range_product(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1579 let multi1 = self;
1580 let isl_rs_ctx = multi1.get_ctx();
1581 let mut multi1 = multi1;
1582 multi1.do_not_free_on_drop();
1583 let multi1 = multi1.ptr;
1584 let mut multi2 = multi2;
1585 multi2.do_not_free_on_drop();
1586 let multi2 = multi2.ptr;
1587 let isl_rs_result = unsafe { isl_multi_aff_range_product(multi1, multi2) };
1588 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1589 should_free_on_drop: true };
1590 let err = isl_rs_ctx.last_error();
1591 if err != Error::None_ {
1592 let err_msg = isl_rs_ctx.last_error_msg();
1593 isl_rs_ctx.reset_error();
1594 return Err(LibISLError::new(err, err_msg));
1595 }
1596 Ok(isl_rs_result)
1597 }
1598
1599 pub fn range_splice(self, pos: u32, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1601 let multi1 = self;
1602 let isl_rs_ctx = multi1.get_ctx();
1603 let mut multi1 = multi1;
1604 multi1.do_not_free_on_drop();
1605 let multi1 = multi1.ptr;
1606 let mut multi2 = multi2;
1607 multi2.do_not_free_on_drop();
1608 let multi2 = multi2.ptr;
1609 let isl_rs_result = unsafe { isl_multi_aff_range_splice(multi1, pos, multi2) };
1610 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1611 should_free_on_drop: true };
1612 let err = isl_rs_ctx.last_error();
1613 if err != Error::None_ {
1614 let err_msg = isl_rs_ctx.last_error_msg();
1615 isl_rs_ctx.reset_error();
1616 return Err(LibISLError::new(err, err_msg));
1617 }
1618 Ok(isl_rs_result)
1619 }
1620
1621 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<MultiAff, LibISLError> {
1623 let isl_rs_ctx = Context { ptr: ctx.ptr,
1624 should_free_on_drop: false };
1625 let ctx = ctx.ptr;
1626 let str_ = CString::new(str_).unwrap();
1627 let str_ = str_.as_ptr();
1628 let isl_rs_result = unsafe { isl_multi_aff_read_from_str(ctx, str_) };
1629 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1630 should_free_on_drop: true };
1631 let err = isl_rs_ctx.last_error();
1632 if err != Error::None_ {
1633 let err_msg = isl_rs_ctx.last_error_msg();
1634 isl_rs_ctx.reset_error();
1635 return Err(LibISLError::new(err, err_msg));
1636 }
1637 Ok(isl_rs_result)
1638 }
1639
1640 pub fn reset_range_tuple_id(self) -> Result<MultiAff, LibISLError> {
1642 let multi = self;
1643 let isl_rs_ctx = multi.get_ctx();
1644 let mut multi = multi;
1645 multi.do_not_free_on_drop();
1646 let multi = multi.ptr;
1647 let isl_rs_result = unsafe { isl_multi_aff_reset_range_tuple_id(multi) };
1648 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1649 should_free_on_drop: true };
1650 let err = isl_rs_ctx.last_error();
1651 if err != Error::None_ {
1652 let err_msg = isl_rs_ctx.last_error_msg();
1653 isl_rs_ctx.reset_error();
1654 return Err(LibISLError::new(err, err_msg));
1655 }
1656 Ok(isl_rs_result)
1657 }
1658
1659 pub fn reset_tuple_id(self, type_: DimType) -> Result<MultiAff, LibISLError> {
1661 let multi = self;
1662 let isl_rs_ctx = multi.get_ctx();
1663 let mut multi = multi;
1664 multi.do_not_free_on_drop();
1665 let multi = multi.ptr;
1666 let type_ = type_.to_i32();
1667 let isl_rs_result = unsafe { isl_multi_aff_reset_tuple_id(multi, type_) };
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 let err_msg = isl_rs_ctx.last_error_msg();
1673 isl_rs_ctx.reset_error();
1674 return Err(LibISLError::new(err, err_msg));
1675 }
1676 Ok(isl_rs_result)
1677 }
1678
1679 pub fn reset_user(self) -> Result<MultiAff, LibISLError> {
1681 let multi = self;
1682 let isl_rs_ctx = multi.get_ctx();
1683 let mut multi = multi;
1684 multi.do_not_free_on_drop();
1685 let multi = multi.ptr;
1686 let isl_rs_result = unsafe { isl_multi_aff_reset_user(multi) };
1687 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1688 should_free_on_drop: true };
1689 let err = isl_rs_ctx.last_error();
1690 if err != Error::None_ {
1691 let err_msg = isl_rs_ctx.last_error_msg();
1692 isl_rs_ctx.reset_error();
1693 return Err(LibISLError::new(err, err_msg));
1694 }
1695 Ok(isl_rs_result)
1696 }
1697
1698 pub fn scale_down_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1700 let multi = self;
1701 let isl_rs_ctx = multi.get_ctx();
1702 let mut multi = multi;
1703 multi.do_not_free_on_drop();
1704 let multi = multi.ptr;
1705 let mut mv = mv;
1706 mv.do_not_free_on_drop();
1707 let mv = mv.ptr;
1708 let isl_rs_result = unsafe { isl_multi_aff_scale_down_multi_val(multi, mv) };
1709 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1710 should_free_on_drop: true };
1711 let err = isl_rs_ctx.last_error();
1712 if err != Error::None_ {
1713 let err_msg = isl_rs_ctx.last_error_msg();
1714 isl_rs_ctx.reset_error();
1715 return Err(LibISLError::new(err, err_msg));
1716 }
1717 Ok(isl_rs_result)
1718 }
1719
1720 pub fn scale_down_val(self, v: Val) -> Result<MultiAff, LibISLError> {
1722 let multi = self;
1723 let isl_rs_ctx = multi.get_ctx();
1724 let mut multi = multi;
1725 multi.do_not_free_on_drop();
1726 let multi = multi.ptr;
1727 let mut v = v;
1728 v.do_not_free_on_drop();
1729 let v = v.ptr;
1730 let isl_rs_result = unsafe { isl_multi_aff_scale_down_val(multi, v) };
1731 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1732 should_free_on_drop: true };
1733 let err = isl_rs_ctx.last_error();
1734 if err != Error::None_ {
1735 let err_msg = isl_rs_ctx.last_error_msg();
1736 isl_rs_ctx.reset_error();
1737 return Err(LibISLError::new(err, err_msg));
1738 }
1739 Ok(isl_rs_result)
1740 }
1741
1742 pub fn scale_multi_val(self, mv: MultiVal) -> Result<MultiAff, LibISLError> {
1744 let multi = self;
1745 let isl_rs_ctx = multi.get_ctx();
1746 let mut multi = multi;
1747 multi.do_not_free_on_drop();
1748 let multi = multi.ptr;
1749 let mut mv = mv;
1750 mv.do_not_free_on_drop();
1751 let mv = mv.ptr;
1752 let isl_rs_result = unsafe { isl_multi_aff_scale_multi_val(multi, mv) };
1753 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1754 should_free_on_drop: true };
1755 let err = isl_rs_ctx.last_error();
1756 if err != Error::None_ {
1757 let err_msg = isl_rs_ctx.last_error_msg();
1758 isl_rs_ctx.reset_error();
1759 return Err(LibISLError::new(err, err_msg));
1760 }
1761 Ok(isl_rs_result)
1762 }
1763
1764 pub fn scale_val(self, v: Val) -> Result<MultiAff, LibISLError> {
1766 let multi = self;
1767 let isl_rs_ctx = multi.get_ctx();
1768 let mut multi = multi;
1769 multi.do_not_free_on_drop();
1770 let multi = multi.ptr;
1771 let mut v = v;
1772 v.do_not_free_on_drop();
1773 let v = v.ptr;
1774 let isl_rs_result = unsafe { isl_multi_aff_scale_val(multi, v) };
1775 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1776 should_free_on_drop: true };
1777 let err = isl_rs_ctx.last_error();
1778 if err != Error::None_ {
1779 let err_msg = isl_rs_ctx.last_error_msg();
1780 isl_rs_ctx.reset_error();
1781 return Err(LibISLError::new(err, err_msg));
1782 }
1783 Ok(isl_rs_result)
1784 }
1785
1786 pub fn set_aff(self, pos: i32, el: Aff) -> Result<MultiAff, LibISLError> {
1788 let multi = self;
1789 let isl_rs_ctx = multi.get_ctx();
1790 let mut multi = multi;
1791 multi.do_not_free_on_drop();
1792 let multi = multi.ptr;
1793 let mut el = el;
1794 el.do_not_free_on_drop();
1795 let el = el.ptr;
1796 let isl_rs_result = unsafe { isl_multi_aff_set_aff(multi, pos, el) };
1797 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1798 should_free_on_drop: true };
1799 let err = isl_rs_ctx.last_error();
1800 if err != Error::None_ {
1801 let err_msg = isl_rs_ctx.last_error_msg();
1802 isl_rs_ctx.reset_error();
1803 return Err(LibISLError::new(err, err_msg));
1804 }
1805 Ok(isl_rs_result)
1806 }
1807
1808 pub fn set_at(self, pos: i32, el: Aff) -> Result<MultiAff, LibISLError> {
1810 let multi = self;
1811 let isl_rs_ctx = multi.get_ctx();
1812 let mut multi = multi;
1813 multi.do_not_free_on_drop();
1814 let multi = multi.ptr;
1815 let mut el = el;
1816 el.do_not_free_on_drop();
1817 let el = el.ptr;
1818 let isl_rs_result = unsafe { isl_multi_aff_set_at(multi, pos, el) };
1819 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1820 should_free_on_drop: true };
1821 let err = isl_rs_ctx.last_error();
1822 if err != Error::None_ {
1823 let err_msg = isl_rs_ctx.last_error_msg();
1824 isl_rs_ctx.reset_error();
1825 return Err(LibISLError::new(err, err_msg));
1826 }
1827 Ok(isl_rs_result)
1828 }
1829
1830 pub fn set_dim_id(self, type_: DimType, pos: u32, id: Id) -> Result<MultiAff, LibISLError> {
1832 let multi = self;
1833 let isl_rs_ctx = multi.get_ctx();
1834 let mut multi = multi;
1835 multi.do_not_free_on_drop();
1836 let multi = multi.ptr;
1837 let type_ = type_.to_i32();
1838 let mut id = id;
1839 id.do_not_free_on_drop();
1840 let id = id.ptr;
1841 let isl_rs_result = unsafe { isl_multi_aff_set_dim_id(multi, type_, pos, id) };
1842 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1843 should_free_on_drop: true };
1844 let err = isl_rs_ctx.last_error();
1845 if err != Error::None_ {
1846 let err_msg = isl_rs_ctx.last_error_msg();
1847 isl_rs_ctx.reset_error();
1848 return Err(LibISLError::new(err, err_msg));
1849 }
1850 Ok(isl_rs_result)
1851 }
1852
1853 pub fn set_dim_name(self, type_: DimType, pos: u32, s: &str) -> Result<MultiAff, LibISLError> {
1855 let multi = self;
1856 let isl_rs_ctx = multi.get_ctx();
1857 let mut multi = multi;
1858 multi.do_not_free_on_drop();
1859 let multi = multi.ptr;
1860 let type_ = type_.to_i32();
1861 let s = CString::new(s).unwrap();
1862 let s = s.as_ptr();
1863 let isl_rs_result = unsafe { isl_multi_aff_set_dim_name(multi, type_, pos, s) };
1864 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1865 should_free_on_drop: true };
1866 let err = isl_rs_ctx.last_error();
1867 if err != Error::None_ {
1868 let err_msg = isl_rs_ctx.last_error_msg();
1869 isl_rs_ctx.reset_error();
1870 return Err(LibISLError::new(err, err_msg));
1871 }
1872 Ok(isl_rs_result)
1873 }
1874
1875 pub fn set_range_tuple_id(self, id: Id) -> Result<MultiAff, LibISLError> {
1877 let multi = self;
1878 let isl_rs_ctx = multi.get_ctx();
1879 let mut multi = multi;
1880 multi.do_not_free_on_drop();
1881 let multi = multi.ptr;
1882 let mut id = id;
1883 id.do_not_free_on_drop();
1884 let id = id.ptr;
1885 let isl_rs_result = unsafe { isl_multi_aff_set_range_tuple_id(multi, id) };
1886 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1887 should_free_on_drop: true };
1888 let err = isl_rs_ctx.last_error();
1889 if err != Error::None_ {
1890 let err_msg = isl_rs_ctx.last_error_msg();
1891 isl_rs_ctx.reset_error();
1892 return Err(LibISLError::new(err, err_msg));
1893 }
1894 Ok(isl_rs_result)
1895 }
1896
1897 pub fn set_tuple_id(self, type_: DimType, id: Id) -> Result<MultiAff, LibISLError> {
1899 let multi = self;
1900 let isl_rs_ctx = multi.get_ctx();
1901 let mut multi = multi;
1902 multi.do_not_free_on_drop();
1903 let multi = multi.ptr;
1904 let type_ = type_.to_i32();
1905 let mut id = id;
1906 id.do_not_free_on_drop();
1907 let id = id.ptr;
1908 let isl_rs_result = unsafe { isl_multi_aff_set_tuple_id(multi, type_, id) };
1909 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1910 should_free_on_drop: true };
1911 let err = isl_rs_ctx.last_error();
1912 if err != Error::None_ {
1913 let err_msg = isl_rs_ctx.last_error_msg();
1914 isl_rs_ctx.reset_error();
1915 return Err(LibISLError::new(err, err_msg));
1916 }
1917 Ok(isl_rs_result)
1918 }
1919
1920 pub fn set_tuple_name(self, type_: DimType, s: &str) -> Result<MultiAff, LibISLError> {
1922 let multi = self;
1923 let isl_rs_ctx = multi.get_ctx();
1924 let mut multi = multi;
1925 multi.do_not_free_on_drop();
1926 let multi = multi.ptr;
1927 let type_ = type_.to_i32();
1928 let s = CString::new(s).unwrap();
1929 let s = s.as_ptr();
1930 let isl_rs_result = unsafe { isl_multi_aff_set_tuple_name(multi, type_, s) };
1931 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1932 should_free_on_drop: true };
1933 let err = isl_rs_ctx.last_error();
1934 if err != Error::None_ {
1935 let err_msg = isl_rs_ctx.last_error_msg();
1936 isl_rs_ctx.reset_error();
1937 return Err(LibISLError::new(err, err_msg));
1938 }
1939 Ok(isl_rs_result)
1940 }
1941
1942 pub fn size(&self) -> Result<i32, LibISLError> {
1944 let multi = self;
1945 let isl_rs_ctx = multi.get_ctx();
1946 let multi = multi.ptr;
1947 let isl_rs_result = unsafe { isl_multi_aff_size(multi) };
1948 let err = isl_rs_ctx.last_error();
1949 if err != Error::None_ {
1950 let err_msg = isl_rs_ctx.last_error_msg();
1951 isl_rs_ctx.reset_error();
1952 return Err(LibISLError::new(err, err_msg));
1953 }
1954 Ok(isl_rs_result)
1955 }
1956
1957 pub fn splice(self, in_pos: u32, out_pos: u32, multi2: MultiAff)
1959 -> Result<MultiAff, LibISLError> {
1960 let multi1 = self;
1961 let isl_rs_ctx = multi1.get_ctx();
1962 let mut multi1 = multi1;
1963 multi1.do_not_free_on_drop();
1964 let multi1 = multi1.ptr;
1965 let mut multi2 = multi2;
1966 multi2.do_not_free_on_drop();
1967 let multi2 = multi2.ptr;
1968 let isl_rs_result = unsafe { isl_multi_aff_splice(multi1, in_pos, out_pos, multi2) };
1969 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1970 should_free_on_drop: true };
1971 let err = isl_rs_ctx.last_error();
1972 if err != Error::None_ {
1973 let err_msg = isl_rs_ctx.last_error_msg();
1974 isl_rs_ctx.reset_error();
1975 return Err(LibISLError::new(err, err_msg));
1976 }
1977 Ok(isl_rs_result)
1978 }
1979
1980 pub fn sub(self, multi2: MultiAff) -> Result<MultiAff, LibISLError> {
1982 let multi1 = self;
1983 let isl_rs_ctx = multi1.get_ctx();
1984 let mut multi1 = multi1;
1985 multi1.do_not_free_on_drop();
1986 let multi1 = multi1.ptr;
1987 let mut multi2 = multi2;
1988 multi2.do_not_free_on_drop();
1989 let multi2 = multi2.ptr;
1990 let isl_rs_result = unsafe { isl_multi_aff_sub(multi1, multi2) };
1991 let isl_rs_result = MultiAff { ptr: isl_rs_result,
1992 should_free_on_drop: true };
1993 let err = isl_rs_ctx.last_error();
1994 if err != Error::None_ {
1995 let err_msg = isl_rs_ctx.last_error_msg();
1996 isl_rs_ctx.reset_error();
1997 return Err(LibISLError::new(err, err_msg));
1998 }
1999 Ok(isl_rs_result)
2000 }
2001
2002 pub fn to_multi_pw_aff(self) -> Result<MultiPwAff, LibISLError> {
2004 let ma = self;
2005 let isl_rs_ctx = ma.get_ctx();
2006 let mut ma = ma;
2007 ma.do_not_free_on_drop();
2008 let ma = ma.ptr;
2009 let isl_rs_result = unsafe { isl_multi_aff_to_multi_pw_aff(ma) };
2010 let isl_rs_result = MultiPwAff { ptr: isl_rs_result,
2011 should_free_on_drop: true };
2012 let err = isl_rs_ctx.last_error();
2013 if err != Error::None_ {
2014 let err_msg = isl_rs_ctx.last_error_msg();
2015 isl_rs_ctx.reset_error();
2016 return Err(LibISLError::new(err, err_msg));
2017 }
2018 Ok(isl_rs_result)
2019 }
2020
2021 pub fn to_multi_union_pw_aff(self) -> Result<MultiUnionPwAff, LibISLError> {
2023 let ma = self;
2024 let isl_rs_ctx = ma.get_ctx();
2025 let mut ma = ma;
2026 ma.do_not_free_on_drop();
2027 let ma = ma.ptr;
2028 let isl_rs_result = unsafe { isl_multi_aff_to_multi_union_pw_aff(ma) };
2029 let isl_rs_result = MultiUnionPwAff { ptr: isl_rs_result,
2030 should_free_on_drop: true };
2031 let err = isl_rs_ctx.last_error();
2032 if err != Error::None_ {
2033 let err_msg = isl_rs_ctx.last_error_msg();
2034 isl_rs_ctx.reset_error();
2035 return Err(LibISLError::new(err, err_msg));
2036 }
2037 Ok(isl_rs_result)
2038 }
2039
2040 pub fn to_pw_multi_aff(self) -> Result<PwMultiAff, LibISLError> {
2042 let ma = self;
2043 let isl_rs_ctx = ma.get_ctx();
2044 let mut ma = ma;
2045 ma.do_not_free_on_drop();
2046 let ma = ma.ptr;
2047 let isl_rs_result = unsafe { isl_multi_aff_to_pw_multi_aff(ma) };
2048 let isl_rs_result = PwMultiAff { ptr: isl_rs_result,
2049 should_free_on_drop: true };
2050 let err = isl_rs_ctx.last_error();
2051 if err != Error::None_ {
2052 let err_msg = isl_rs_ctx.last_error_msg();
2053 isl_rs_ctx.reset_error();
2054 return Err(LibISLError::new(err, err_msg));
2055 }
2056 Ok(isl_rs_result)
2057 }
2058
2059 pub fn to_str(&self) -> Result<&str, LibISLError> {
2061 let ma = self;
2062 let isl_rs_ctx = ma.get_ctx();
2063 let ma = ma.ptr;
2064 let isl_rs_result = unsafe { isl_multi_aff_to_str(ma) };
2065 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
2066 let isl_rs_result = isl_rs_result.to_str().unwrap();
2067 let err = isl_rs_ctx.last_error();
2068 if err != Error::None_ {
2069 let err_msg = isl_rs_ctx.last_error_msg();
2070 isl_rs_ctx.reset_error();
2071 return Err(LibISLError::new(err, err_msg));
2072 }
2073 Ok(isl_rs_result)
2074 }
2075
2076 pub fn unbind_params_insert_domain(self, domain: MultiId) -> Result<MultiAff, LibISLError> {
2078 let multi = self;
2079 let isl_rs_ctx = multi.get_ctx();
2080 let mut multi = multi;
2081 multi.do_not_free_on_drop();
2082 let multi = multi.ptr;
2083 let mut domain = domain;
2084 domain.do_not_free_on_drop();
2085 let domain = domain.ptr;
2086 let isl_rs_result = unsafe { isl_multi_aff_unbind_params_insert_domain(multi, domain) };
2087 let isl_rs_result = MultiAff { ptr: isl_rs_result,
2088 should_free_on_drop: true };
2089 let err = isl_rs_ctx.last_error();
2090 if err != Error::None_ {
2091 let err_msg = isl_rs_ctx.last_error_msg();
2092 isl_rs_ctx.reset_error();
2093 return Err(LibISLError::new(err, err_msg));
2094 }
2095 Ok(isl_rs_result)
2096 }
2097
2098 pub fn zero(space: Space) -> Result<MultiAff, LibISLError> {
2100 let isl_rs_ctx = space.get_ctx();
2101 let mut space = space;
2102 space.do_not_free_on_drop();
2103 let space = space.ptr;
2104 let isl_rs_result = unsafe { isl_multi_aff_zero(space) };
2105 let isl_rs_result = MultiAff { ptr: isl_rs_result,
2106 should_free_on_drop: true };
2107 let err = isl_rs_ctx.last_error();
2108 if err != Error::None_ {
2109 let err_msg = isl_rs_ctx.last_error_msg();
2110 isl_rs_ctx.reset_error();
2111 return Err(LibISLError::new(err, err_msg));
2112 }
2113 Ok(isl_rs_result)
2114 }
2115
2116 pub fn do_not_free_on_drop(&mut self) {
2119 self.should_free_on_drop = false;
2120 }
2121}
2122
2123impl Drop for MultiAff {
2124 fn drop(&mut self) {
2125 if self.should_free_on_drop {
2126 unsafe {
2127 isl_multi_aff_free(self.ptr);
2128 }
2129 }
2130 }
2131}