1use super::{
5 Aff, AffList, BasicMapList, BasicSet, Constraint, ConstraintList, Context, DimType, Error, Id,
6 LibISLError, LocalSpace, Map, Mat, MultiAff, PwMultiAff, QPolynomial, Space, Val,
7};
8use libc::uintptr_t;
9use std::ffi::{CStr, CString};
10use std::os::raw::c_char;
11
12pub struct BasicMap {
14 pub ptr: uintptr_t,
15 pub should_free_on_drop: bool,
16}
17
18extern "C" {
19
20 fn isl_basic_map_add_constraint(bmap: uintptr_t, constraint: uintptr_t) -> uintptr_t;
21
22 fn isl_basic_map_add_dims(bmap: uintptr_t, type_: i32, n: u32) -> uintptr_t;
23
24 fn isl_basic_map_affine_hull(bmap: uintptr_t) -> uintptr_t;
25
26 fn isl_basic_map_align_params(bmap: uintptr_t, model: uintptr_t) -> uintptr_t;
27
28 fn isl_basic_map_apply_domain(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
29
30 fn isl_basic_map_apply_range(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
31
32 fn isl_basic_map_can_curry(bmap: uintptr_t) -> i32;
33
34 fn isl_basic_map_can_uncurry(bmap: uintptr_t) -> i32;
35
36 fn isl_basic_map_can_zip(bmap: uintptr_t) -> i32;
37
38 fn isl_basic_map_compute_divs(bmap: uintptr_t) -> uintptr_t;
39
40 fn isl_basic_map_copy(bmap: uintptr_t) -> uintptr_t;
41
42 fn isl_basic_map_curry(bmap: uintptr_t) -> uintptr_t;
43
44 fn isl_basic_map_deltas(bmap: uintptr_t) -> uintptr_t;
45
46 fn isl_basic_map_deltas_map(bmap: uintptr_t) -> uintptr_t;
47
48 fn isl_basic_map_detect_equalities(bmap: uintptr_t) -> uintptr_t;
49
50 fn isl_basic_map_dim(bmap: uintptr_t, type_: i32) -> i32;
51
52 fn isl_basic_map_domain(bmap: uintptr_t) -> uintptr_t;
53
54 fn isl_basic_map_domain_map(bmap: uintptr_t) -> uintptr_t;
55
56 fn isl_basic_map_domain_product(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
57
58 fn isl_basic_map_drop_constraints_involving_dims(bmap: uintptr_t, type_: i32, first: u32,
59 n: u32)
60 -> uintptr_t;
61
62 fn isl_basic_map_drop_constraints_not_involving_dims(bmap: uintptr_t, type_: i32, first: u32,
63 n: u32)
64 -> uintptr_t;
65
66 fn isl_basic_map_drop_unused_params(bmap: uintptr_t) -> uintptr_t;
67
68 fn isl_basic_map_dump(bmap: uintptr_t) -> ();
69
70 fn isl_basic_map_eliminate(bmap: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
71
72 fn isl_basic_map_empty(space: uintptr_t) -> uintptr_t;
73
74 fn isl_basic_map_equal(space: uintptr_t, n_equal: u32) -> uintptr_t;
75
76 fn isl_basic_map_equalities_matrix(bmap: uintptr_t, c1: i32, c2: i32, c3: i32, c4: i32,
77 c5: i32)
78 -> uintptr_t;
79
80 fn isl_basic_map_equate(bmap: uintptr_t, type1: i32, pos1: i32, type2: i32, pos2: i32)
81 -> uintptr_t;
82
83 fn isl_basic_map_find_dim_by_name(bmap: uintptr_t, type_: i32, name: *const c_char) -> i32;
84
85 fn isl_basic_map_fix_si(bmap: uintptr_t, type_: i32, pos: u32, value: i32) -> uintptr_t;
86
87 fn isl_basic_map_fix_val(bmap: uintptr_t, type_: i32, pos: u32, v: uintptr_t) -> uintptr_t;
88
89 fn isl_basic_map_flat_product(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
90
91 fn isl_basic_map_flat_range_product(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
92
93 fn isl_basic_map_flatten(bmap: uintptr_t) -> uintptr_t;
94
95 fn isl_basic_map_flatten_domain(bmap: uintptr_t) -> uintptr_t;
96
97 fn isl_basic_map_flatten_range(bmap: uintptr_t) -> uintptr_t;
98
99 fn isl_basic_map_free(bmap: uintptr_t) -> uintptr_t;
100
101 fn isl_basic_map_from_aff(aff: uintptr_t) -> uintptr_t;
102
103 fn isl_basic_map_from_aff_list(domain_space: uintptr_t, list: uintptr_t) -> uintptr_t;
104
105 fn isl_basic_map_from_constraint(constraint: uintptr_t) -> uintptr_t;
106
107 fn isl_basic_map_from_constraint_matrices(space: uintptr_t, eq: uintptr_t, ineq: uintptr_t,
108 c1: i32, c2: i32, c3: i32, c4: i32, c5: i32)
109 -> uintptr_t;
110
111 fn isl_basic_map_from_domain(bset: uintptr_t) -> uintptr_t;
112
113 fn isl_basic_map_from_domain_and_range(domain: uintptr_t, range: uintptr_t) -> uintptr_t;
114
115 fn isl_basic_map_from_multi_aff(maff: uintptr_t) -> uintptr_t;
116
117 fn isl_basic_map_from_qpolynomial(qp: uintptr_t) -> uintptr_t;
118
119 fn isl_basic_map_from_range(bset: uintptr_t) -> uintptr_t;
120
121 fn isl_basic_map_get_constraint_list(bmap: uintptr_t) -> uintptr_t;
122
123 fn isl_basic_map_get_ctx(bmap: uintptr_t) -> uintptr_t;
124
125 fn isl_basic_map_get_dim_name(bmap: uintptr_t, type_: i32, pos: u32) -> *const c_char;
126
127 fn isl_basic_map_get_div(bmap: uintptr_t, pos: i32) -> uintptr_t;
128
129 fn isl_basic_map_get_local_space(bmap: uintptr_t) -> uintptr_t;
130
131 fn isl_basic_map_get_space(bmap: uintptr_t) -> uintptr_t;
132
133 fn isl_basic_map_get_tuple_name(bmap: uintptr_t, type_: i32) -> *const c_char;
134
135 fn isl_basic_map_gist(bmap: uintptr_t, context: uintptr_t) -> uintptr_t;
136
137 fn isl_basic_map_gist_domain(bmap: uintptr_t, context: uintptr_t) -> uintptr_t;
138
139 fn isl_basic_map_has_dim_id(bmap: uintptr_t, type_: i32, pos: u32) -> i32;
140
141 fn isl_basic_map_identity(space: uintptr_t) -> uintptr_t;
142
143 fn isl_basic_map_image_is_bounded(bmap: uintptr_t) -> i32;
144
145 fn isl_basic_map_inequalities_matrix(bmap: uintptr_t, c1: i32, c2: i32, c3: i32, c4: i32,
146 c5: i32)
147 -> uintptr_t;
148
149 fn isl_basic_map_insert_dims(bmap: uintptr_t, type_: i32, pos: u32, n: u32) -> uintptr_t;
150
151 fn isl_basic_map_intersect(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
152
153 fn isl_basic_map_intersect_domain(bmap: uintptr_t, bset: uintptr_t) -> uintptr_t;
154
155 fn isl_basic_map_intersect_params(bmap: uintptr_t, bset: uintptr_t) -> uintptr_t;
156
157 fn isl_basic_map_intersect_range(bmap: uintptr_t, bset: uintptr_t) -> uintptr_t;
158
159 fn isl_basic_map_involves_dims(bmap: uintptr_t, type_: i32, first: u32, n: u32) -> i32;
160
161 fn isl_basic_map_is_disjoint(bmap1: uintptr_t, bmap2: uintptr_t) -> i32;
162
163 fn isl_basic_map_is_empty(bmap: uintptr_t) -> i32;
164
165 fn isl_basic_map_is_equal(bmap1: uintptr_t, bmap2: uintptr_t) -> i32;
166
167 fn isl_basic_map_is_rational(bmap: uintptr_t) -> i32;
168
169 fn isl_basic_map_is_single_valued(bmap: uintptr_t) -> i32;
170
171 fn isl_basic_map_is_strict_subset(bmap1: uintptr_t, bmap2: uintptr_t) -> i32;
172
173 fn isl_basic_map_is_subset(bmap1: uintptr_t, bmap2: uintptr_t) -> i32;
174
175 fn isl_basic_map_is_universe(bmap: uintptr_t) -> i32;
176
177 fn isl_basic_map_less_at(space: uintptr_t, pos: u32) -> uintptr_t;
178
179 fn isl_basic_map_lexmax(bmap: uintptr_t) -> uintptr_t;
180
181 fn isl_basic_map_lexmin(bmap: uintptr_t) -> uintptr_t;
182
183 fn isl_basic_map_lexmin_pw_multi_aff(bmap: uintptr_t) -> uintptr_t;
184
185 fn isl_basic_map_lower_bound_si(bmap: uintptr_t, type_: i32, pos: u32, value: i32)
186 -> uintptr_t;
187
188 fn isl_basic_map_more_at(space: uintptr_t, pos: u32) -> uintptr_t;
189
190 fn isl_basic_map_move_dims(bmap: uintptr_t, dst_type: i32, dst_pos: u32, src_type: i32,
191 src_pos: u32, n: u32)
192 -> uintptr_t;
193
194 fn isl_basic_map_n_constraint(bmap: uintptr_t) -> i32;
195
196 fn isl_basic_map_nat_universe(space: uintptr_t) -> uintptr_t;
197
198 fn isl_basic_map_neg(bmap: uintptr_t) -> uintptr_t;
199
200 fn isl_basic_map_order_ge(bmap: uintptr_t, type1: i32, pos1: i32, type2: i32, pos2: i32)
201 -> uintptr_t;
202
203 fn isl_basic_map_order_gt(bmap: uintptr_t, type1: i32, pos1: i32, type2: i32, pos2: i32)
204 -> uintptr_t;
205
206 fn isl_basic_map_plain_get_val_if_fixed(bmap: uintptr_t, type_: i32, pos: u32) -> uintptr_t;
207
208 fn isl_basic_map_plain_is_empty(bmap: uintptr_t) -> i32;
209
210 fn isl_basic_map_plain_is_universe(bmap: uintptr_t) -> i32;
211
212 fn isl_basic_map_preimage_domain_multi_aff(bmap: uintptr_t, ma: uintptr_t) -> uintptr_t;
213
214 fn isl_basic_map_preimage_range_multi_aff(bmap: uintptr_t, ma: uintptr_t) -> uintptr_t;
215
216 fn isl_basic_map_product(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
217
218 fn isl_basic_map_project_out(bmap: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
219
220 fn isl_basic_map_range(bmap: uintptr_t) -> uintptr_t;
221
222 fn isl_basic_map_range_map(bmap: uintptr_t) -> uintptr_t;
223
224 fn isl_basic_map_range_product(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
225
226 fn isl_basic_map_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
227
228 fn isl_basic_map_remove_dims(bmap: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
229
230 fn isl_basic_map_remove_divs(bmap: uintptr_t) -> uintptr_t;
231
232 fn isl_basic_map_remove_divs_involving_dims(bmap: uintptr_t, type_: i32, first: u32, n: u32)
233 -> uintptr_t;
234
235 fn isl_basic_map_remove_redundancies(bmap: uintptr_t) -> uintptr_t;
236
237 fn isl_basic_map_reverse(bmap: uintptr_t) -> uintptr_t;
238
239 fn isl_basic_map_sample(bmap: uintptr_t) -> uintptr_t;
240
241 fn isl_basic_map_set_dim_name(bmap: uintptr_t, type_: i32, pos: u32, s: *const c_char)
242 -> uintptr_t;
243
244 fn isl_basic_map_set_tuple_id(bmap: uintptr_t, type_: i32, id: uintptr_t) -> uintptr_t;
245
246 fn isl_basic_map_set_tuple_name(bmap: uintptr_t, type_: i32, s: *const c_char) -> uintptr_t;
247
248 fn isl_basic_map_sum(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
249
250 fn isl_basic_map_to_list(el: uintptr_t) -> uintptr_t;
251
252 fn isl_basic_map_to_str(bmap: uintptr_t) -> *const c_char;
253
254 fn isl_basic_map_total_dim(bmap: uintptr_t) -> i32;
255
256 fn isl_basic_map_uncurry(bmap: uintptr_t) -> uintptr_t;
257
258 fn isl_basic_map_union(bmap1: uintptr_t, bmap2: uintptr_t) -> uintptr_t;
259
260 fn isl_basic_map_universe(space: uintptr_t) -> uintptr_t;
261
262 fn isl_basic_map_upper_bound_si(bmap: uintptr_t, type_: i32, pos: u32, value: i32)
263 -> uintptr_t;
264
265 fn isl_basic_map_wrap(bmap: uintptr_t) -> uintptr_t;
266
267 fn isl_basic_map_zip(bmap: uintptr_t) -> uintptr_t;
268
269}
270
271impl BasicMap {
272 pub fn add_constraint(self, constraint: Constraint) -> Result<BasicMap, LibISLError> {
274 let bmap = self;
275 let isl_rs_ctx = bmap.get_ctx();
276 let mut bmap = bmap;
277 bmap.do_not_free_on_drop();
278 let bmap = bmap.ptr;
279 let mut constraint = constraint;
280 constraint.do_not_free_on_drop();
281 let constraint = constraint.ptr;
282 let isl_rs_result = unsafe { isl_basic_map_add_constraint(bmap, constraint) };
283 let isl_rs_result = BasicMap { ptr: isl_rs_result,
284 should_free_on_drop: true };
285 let err = isl_rs_ctx.last_error();
286 if err != Error::None_ {
287 let err_msg = isl_rs_ctx.last_error_msg();
288 isl_rs_ctx.reset_error();
289 return Err(LibISLError::new(err, err_msg));
290 }
291 Ok(isl_rs_result)
292 }
293
294 pub fn add_dims(self, type_: DimType, n: u32) -> Result<BasicMap, LibISLError> {
296 let bmap = self;
297 let isl_rs_ctx = bmap.get_ctx();
298 let mut bmap = bmap;
299 bmap.do_not_free_on_drop();
300 let bmap = bmap.ptr;
301 let type_ = type_.to_i32();
302 let isl_rs_result = unsafe { isl_basic_map_add_dims(bmap, type_, n) };
303 let isl_rs_result = BasicMap { ptr: isl_rs_result,
304 should_free_on_drop: true };
305 let err = isl_rs_ctx.last_error();
306 if err != Error::None_ {
307 let err_msg = isl_rs_ctx.last_error_msg();
308 isl_rs_ctx.reset_error();
309 return Err(LibISLError::new(err, err_msg));
310 }
311 Ok(isl_rs_result)
312 }
313
314 pub fn affine_hull(self) -> Result<BasicMap, LibISLError> {
316 let bmap = self;
317 let isl_rs_ctx = bmap.get_ctx();
318 let mut bmap = bmap;
319 bmap.do_not_free_on_drop();
320 let bmap = bmap.ptr;
321 let isl_rs_result = unsafe { isl_basic_map_affine_hull(bmap) };
322 let isl_rs_result = BasicMap { ptr: isl_rs_result,
323 should_free_on_drop: true };
324 let err = isl_rs_ctx.last_error();
325 if err != Error::None_ {
326 let err_msg = isl_rs_ctx.last_error_msg();
327 isl_rs_ctx.reset_error();
328 return Err(LibISLError::new(err, err_msg));
329 }
330 Ok(isl_rs_result)
331 }
332
333 pub fn align_params(self, model: Space) -> Result<BasicMap, LibISLError> {
335 let bmap = self;
336 let isl_rs_ctx = bmap.get_ctx();
337 let mut bmap = bmap;
338 bmap.do_not_free_on_drop();
339 let bmap = bmap.ptr;
340 let mut model = model;
341 model.do_not_free_on_drop();
342 let model = model.ptr;
343 let isl_rs_result = unsafe { isl_basic_map_align_params(bmap, model) };
344 let isl_rs_result = BasicMap { ptr: isl_rs_result,
345 should_free_on_drop: true };
346 let err = isl_rs_ctx.last_error();
347 if err != Error::None_ {
348 let err_msg = isl_rs_ctx.last_error_msg();
349 isl_rs_ctx.reset_error();
350 return Err(LibISLError::new(err, err_msg));
351 }
352 Ok(isl_rs_result)
353 }
354
355 pub fn apply_domain(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
357 let bmap1 = self;
358 let isl_rs_ctx = bmap1.get_ctx();
359 let mut bmap1 = bmap1;
360 bmap1.do_not_free_on_drop();
361 let bmap1 = bmap1.ptr;
362 let mut bmap2 = bmap2;
363 bmap2.do_not_free_on_drop();
364 let bmap2 = bmap2.ptr;
365 let isl_rs_result = unsafe { isl_basic_map_apply_domain(bmap1, bmap2) };
366 let isl_rs_result = BasicMap { ptr: isl_rs_result,
367 should_free_on_drop: true };
368 let err = isl_rs_ctx.last_error();
369 if err != Error::None_ {
370 let err_msg = isl_rs_ctx.last_error_msg();
371 isl_rs_ctx.reset_error();
372 return Err(LibISLError::new(err, err_msg));
373 }
374 Ok(isl_rs_result)
375 }
376
377 pub fn apply_range(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
379 let bmap1 = self;
380 let isl_rs_ctx = bmap1.get_ctx();
381 let mut bmap1 = bmap1;
382 bmap1.do_not_free_on_drop();
383 let bmap1 = bmap1.ptr;
384 let mut bmap2 = bmap2;
385 bmap2.do_not_free_on_drop();
386 let bmap2 = bmap2.ptr;
387 let isl_rs_result = unsafe { isl_basic_map_apply_range(bmap1, bmap2) };
388 let isl_rs_result = BasicMap { ptr: isl_rs_result,
389 should_free_on_drop: true };
390 let err = isl_rs_ctx.last_error();
391 if err != Error::None_ {
392 let err_msg = isl_rs_ctx.last_error_msg();
393 isl_rs_ctx.reset_error();
394 return Err(LibISLError::new(err, err_msg));
395 }
396 Ok(isl_rs_result)
397 }
398
399 pub fn can_curry(&self) -> Result<bool, LibISLError> {
401 let bmap = self;
402 let isl_rs_ctx = bmap.get_ctx();
403 let bmap = bmap.ptr;
404 let isl_rs_result = unsafe { isl_basic_map_can_curry(bmap) };
405 let isl_rs_result = match isl_rs_result {
406 0 => false,
407 1 => true,
408 _ => {
409 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
410 }
411 };
412 let err = isl_rs_ctx.last_error();
413 if err != Error::None_ {
414 let err_msg = isl_rs_ctx.last_error_msg();
415 isl_rs_ctx.reset_error();
416 return Err(LibISLError::new(err, err_msg));
417 }
418 Ok(isl_rs_result)
419 }
420
421 pub fn can_uncurry(&self) -> Result<bool, LibISLError> {
423 let bmap = self;
424 let isl_rs_ctx = bmap.get_ctx();
425 let bmap = bmap.ptr;
426 let isl_rs_result = unsafe { isl_basic_map_can_uncurry(bmap) };
427 let isl_rs_result = match isl_rs_result {
428 0 => false,
429 1 => true,
430 _ => {
431 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
432 }
433 };
434 let err = isl_rs_ctx.last_error();
435 if err != Error::None_ {
436 let err_msg = isl_rs_ctx.last_error_msg();
437 isl_rs_ctx.reset_error();
438 return Err(LibISLError::new(err, err_msg));
439 }
440 Ok(isl_rs_result)
441 }
442
443 pub fn can_zip(&self) -> Result<bool, LibISLError> {
445 let bmap = self;
446 let isl_rs_ctx = bmap.get_ctx();
447 let bmap = bmap.ptr;
448 let isl_rs_result = unsafe { isl_basic_map_can_zip(bmap) };
449 let isl_rs_result = match isl_rs_result {
450 0 => false,
451 1 => true,
452 _ => {
453 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
454 }
455 };
456 let err = isl_rs_ctx.last_error();
457 if err != Error::None_ {
458 let err_msg = isl_rs_ctx.last_error_msg();
459 isl_rs_ctx.reset_error();
460 return Err(LibISLError::new(err, err_msg));
461 }
462 Ok(isl_rs_result)
463 }
464
465 pub fn compute_divs(self) -> Result<Map, LibISLError> {
467 let bmap = self;
468 let isl_rs_ctx = bmap.get_ctx();
469 let mut bmap = bmap;
470 bmap.do_not_free_on_drop();
471 let bmap = bmap.ptr;
472 let isl_rs_result = unsafe { isl_basic_map_compute_divs(bmap) };
473 let isl_rs_result = Map { ptr: isl_rs_result,
474 should_free_on_drop: true };
475 let err = isl_rs_ctx.last_error();
476 if err != Error::None_ {
477 let err_msg = isl_rs_ctx.last_error_msg();
478 isl_rs_ctx.reset_error();
479 return Err(LibISLError::new(err, err_msg));
480 }
481 Ok(isl_rs_result)
482 }
483
484 pub fn copy(&self) -> Result<BasicMap, LibISLError> {
486 let bmap = self;
487 let isl_rs_ctx = bmap.get_ctx();
488 let bmap = bmap.ptr;
489 let isl_rs_result = unsafe { isl_basic_map_copy(bmap) };
490 let isl_rs_result = BasicMap { 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 curry(self) -> Result<BasicMap, LibISLError> {
503 let bmap = self;
504 let isl_rs_ctx = bmap.get_ctx();
505 let mut bmap = bmap;
506 bmap.do_not_free_on_drop();
507 let bmap = bmap.ptr;
508 let isl_rs_result = unsafe { isl_basic_map_curry(bmap) };
509 let isl_rs_result = BasicMap { ptr: isl_rs_result,
510 should_free_on_drop: true };
511 let err = isl_rs_ctx.last_error();
512 if err != Error::None_ {
513 let err_msg = isl_rs_ctx.last_error_msg();
514 isl_rs_ctx.reset_error();
515 return Err(LibISLError::new(err, err_msg));
516 }
517 Ok(isl_rs_result)
518 }
519
520 pub fn deltas(self) -> Result<BasicSet, LibISLError> {
522 let bmap = self;
523 let isl_rs_ctx = bmap.get_ctx();
524 let mut bmap = bmap;
525 bmap.do_not_free_on_drop();
526 let bmap = bmap.ptr;
527 let isl_rs_result = unsafe { isl_basic_map_deltas(bmap) };
528 let isl_rs_result = BasicSet { ptr: isl_rs_result,
529 should_free_on_drop: true };
530 let err = isl_rs_ctx.last_error();
531 if err != Error::None_ {
532 let err_msg = isl_rs_ctx.last_error_msg();
533 isl_rs_ctx.reset_error();
534 return Err(LibISLError::new(err, err_msg));
535 }
536 Ok(isl_rs_result)
537 }
538
539 pub fn deltas_map(self) -> Result<BasicMap, LibISLError> {
541 let bmap = self;
542 let isl_rs_ctx = bmap.get_ctx();
543 let mut bmap = bmap;
544 bmap.do_not_free_on_drop();
545 let bmap = bmap.ptr;
546 let isl_rs_result = unsafe { isl_basic_map_deltas_map(bmap) };
547 let isl_rs_result = BasicMap { ptr: isl_rs_result,
548 should_free_on_drop: true };
549 let err = isl_rs_ctx.last_error();
550 if err != Error::None_ {
551 let err_msg = isl_rs_ctx.last_error_msg();
552 isl_rs_ctx.reset_error();
553 return Err(LibISLError::new(err, err_msg));
554 }
555 Ok(isl_rs_result)
556 }
557
558 pub fn detect_equalities(self) -> Result<BasicMap, LibISLError> {
560 let bmap = self;
561 let isl_rs_ctx = bmap.get_ctx();
562 let mut bmap = bmap;
563 bmap.do_not_free_on_drop();
564 let bmap = bmap.ptr;
565 let isl_rs_result = unsafe { isl_basic_map_detect_equalities(bmap) };
566 let isl_rs_result = BasicMap { ptr: isl_rs_result,
567 should_free_on_drop: true };
568 let err = isl_rs_ctx.last_error();
569 if err != Error::None_ {
570 let err_msg = isl_rs_ctx.last_error_msg();
571 isl_rs_ctx.reset_error();
572 return Err(LibISLError::new(err, err_msg));
573 }
574 Ok(isl_rs_result)
575 }
576
577 pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
579 let bmap = self;
580 let isl_rs_ctx = bmap.get_ctx();
581 let bmap = bmap.ptr;
582 let type_ = type_.to_i32();
583 let isl_rs_result = unsafe { isl_basic_map_dim(bmap, type_) };
584 let err = isl_rs_ctx.last_error();
585 if err != Error::None_ {
586 let err_msg = isl_rs_ctx.last_error_msg();
587 isl_rs_ctx.reset_error();
588 return Err(LibISLError::new(err, err_msg));
589 }
590 Ok(isl_rs_result)
591 }
592
593 pub fn domain(self) -> Result<BasicSet, LibISLError> {
595 let bmap = self;
596 let isl_rs_ctx = bmap.get_ctx();
597 let mut bmap = bmap;
598 bmap.do_not_free_on_drop();
599 let bmap = bmap.ptr;
600 let isl_rs_result = unsafe { isl_basic_map_domain(bmap) };
601 let isl_rs_result = BasicSet { 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 domain_map(self) -> Result<BasicMap, LibISLError> {
614 let bmap = self;
615 let isl_rs_ctx = bmap.get_ctx();
616 let mut bmap = bmap;
617 bmap.do_not_free_on_drop();
618 let bmap = bmap.ptr;
619 let isl_rs_result = unsafe { isl_basic_map_domain_map(bmap) };
620 let isl_rs_result = BasicMap { 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 domain_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
633 let bmap1 = self;
634 let isl_rs_ctx = bmap1.get_ctx();
635 let mut bmap1 = bmap1;
636 bmap1.do_not_free_on_drop();
637 let bmap1 = bmap1.ptr;
638 let mut bmap2 = bmap2;
639 bmap2.do_not_free_on_drop();
640 let bmap2 = bmap2.ptr;
641 let isl_rs_result = unsafe { isl_basic_map_domain_product(bmap1, bmap2) };
642 let isl_rs_result = BasicMap { ptr: isl_rs_result,
643 should_free_on_drop: true };
644 let err = isl_rs_ctx.last_error();
645 if err != Error::None_ {
646 let err_msg = isl_rs_ctx.last_error_msg();
647 isl_rs_ctx.reset_error();
648 return Err(LibISLError::new(err, err_msg));
649 }
650 Ok(isl_rs_result)
651 }
652
653 pub fn drop_constraints_involving_dims(self, type_: DimType, first: u32, n: u32)
655 -> Result<BasicMap, LibISLError> {
656 let bmap = self;
657 let isl_rs_ctx = bmap.get_ctx();
658 let mut bmap = bmap;
659 bmap.do_not_free_on_drop();
660 let bmap = bmap.ptr;
661 let type_ = type_.to_i32();
662 let isl_rs_result =
663 unsafe { isl_basic_map_drop_constraints_involving_dims(bmap, type_, first, n) };
664 let isl_rs_result = BasicMap { ptr: isl_rs_result,
665 should_free_on_drop: true };
666 let err = isl_rs_ctx.last_error();
667 if err != Error::None_ {
668 let err_msg = isl_rs_ctx.last_error_msg();
669 isl_rs_ctx.reset_error();
670 return Err(LibISLError::new(err, err_msg));
671 }
672 Ok(isl_rs_result)
673 }
674
675 pub fn drop_constraints_not_involving_dims(self, type_: DimType, first: u32, n: u32)
677 -> Result<BasicMap, LibISLError> {
678 let bmap = self;
679 let isl_rs_ctx = bmap.get_ctx();
680 let mut bmap = bmap;
681 bmap.do_not_free_on_drop();
682 let bmap = bmap.ptr;
683 let type_ = type_.to_i32();
684 let isl_rs_result =
685 unsafe { isl_basic_map_drop_constraints_not_involving_dims(bmap, type_, first, n) };
686 let isl_rs_result = BasicMap { ptr: isl_rs_result,
687 should_free_on_drop: true };
688 let err = isl_rs_ctx.last_error();
689 if err != Error::None_ {
690 let err_msg = isl_rs_ctx.last_error_msg();
691 isl_rs_ctx.reset_error();
692 return Err(LibISLError::new(err, err_msg));
693 }
694 Ok(isl_rs_result)
695 }
696
697 pub fn drop_unused_params(self) -> Result<BasicMap, LibISLError> {
699 let bmap = self;
700 let isl_rs_ctx = bmap.get_ctx();
701 let mut bmap = bmap;
702 bmap.do_not_free_on_drop();
703 let bmap = bmap.ptr;
704 let isl_rs_result = unsafe { isl_basic_map_drop_unused_params(bmap) };
705 let isl_rs_result = BasicMap { ptr: isl_rs_result,
706 should_free_on_drop: true };
707 let err = isl_rs_ctx.last_error();
708 if err != Error::None_ {
709 let err_msg = isl_rs_ctx.last_error_msg();
710 isl_rs_ctx.reset_error();
711 return Err(LibISLError::new(err, err_msg));
712 }
713 Ok(isl_rs_result)
714 }
715
716 pub fn dump(&self) -> Result<(), LibISLError> {
718 let bmap = self;
719 let isl_rs_ctx = bmap.get_ctx();
720 let bmap = bmap.ptr;
721 let isl_rs_result = unsafe { isl_basic_map_dump(bmap) };
722 let err = isl_rs_ctx.last_error();
723 if err != Error::None_ {
724 let err_msg = isl_rs_ctx.last_error_msg();
725 isl_rs_ctx.reset_error();
726 return Err(LibISLError::new(err, err_msg));
727 }
728 Ok(isl_rs_result)
729 }
730
731 pub fn eliminate(self, type_: DimType, first: u32, n: u32) -> Result<BasicMap, LibISLError> {
733 let bmap = self;
734 let isl_rs_ctx = bmap.get_ctx();
735 let mut bmap = bmap;
736 bmap.do_not_free_on_drop();
737 let bmap = bmap.ptr;
738 let type_ = type_.to_i32();
739 let isl_rs_result = unsafe { isl_basic_map_eliminate(bmap, type_, first, n) };
740 let isl_rs_result = BasicMap { ptr: isl_rs_result,
741 should_free_on_drop: true };
742 let err = isl_rs_ctx.last_error();
743 if err != Error::None_ {
744 let err_msg = isl_rs_ctx.last_error_msg();
745 isl_rs_ctx.reset_error();
746 return Err(LibISLError::new(err, err_msg));
747 }
748 Ok(isl_rs_result)
749 }
750
751 pub fn empty(space: Space) -> Result<BasicMap, LibISLError> {
753 let isl_rs_ctx = space.get_ctx();
754 let mut space = space;
755 space.do_not_free_on_drop();
756 let space = space.ptr;
757 let isl_rs_result = unsafe { isl_basic_map_empty(space) };
758 let isl_rs_result = BasicMap { ptr: isl_rs_result,
759 should_free_on_drop: true };
760 let err = isl_rs_ctx.last_error();
761 if err != Error::None_ {
762 let err_msg = isl_rs_ctx.last_error_msg();
763 isl_rs_ctx.reset_error();
764 return Err(LibISLError::new(err, err_msg));
765 }
766 Ok(isl_rs_result)
767 }
768
769 pub fn equal(space: Space, n_equal: u32) -> Result<BasicMap, LibISLError> {
771 let isl_rs_ctx = space.get_ctx();
772 let mut space = space;
773 space.do_not_free_on_drop();
774 let space = space.ptr;
775 let isl_rs_result = unsafe { isl_basic_map_equal(space, n_equal) };
776 let isl_rs_result = BasicMap { ptr: isl_rs_result,
777 should_free_on_drop: true };
778 let err = isl_rs_ctx.last_error();
779 if err != Error::None_ {
780 let err_msg = isl_rs_ctx.last_error_msg();
781 isl_rs_ctx.reset_error();
782 return Err(LibISLError::new(err, err_msg));
783 }
784 Ok(isl_rs_result)
785 }
786
787 pub fn equalities_matrix(&self, c1: DimType, c2: DimType, c3: DimType, c4: DimType,
789 c5: DimType)
790 -> Result<Mat, LibISLError> {
791 let bmap = self;
792 let isl_rs_ctx = bmap.get_ctx();
793 let bmap = bmap.ptr;
794 let c1 = c1.to_i32();
795 let c2 = c2.to_i32();
796 let c3 = c3.to_i32();
797 let c4 = c4.to_i32();
798 let c5 = c5.to_i32();
799 let isl_rs_result = unsafe { isl_basic_map_equalities_matrix(bmap, c1, c2, c3, c4, c5) };
800 let isl_rs_result = Mat { ptr: isl_rs_result,
801 should_free_on_drop: true };
802 let err = isl_rs_ctx.last_error();
803 if err != Error::None_ {
804 let err_msg = isl_rs_ctx.last_error_msg();
805 isl_rs_ctx.reset_error();
806 return Err(LibISLError::new(err, err_msg));
807 }
808 Ok(isl_rs_result)
809 }
810
811 pub fn equate(self, type1: DimType, pos1: i32, type2: DimType, pos2: i32)
813 -> Result<BasicMap, LibISLError> {
814 let bmap = self;
815 let isl_rs_ctx = bmap.get_ctx();
816 let mut bmap = bmap;
817 bmap.do_not_free_on_drop();
818 let bmap = bmap.ptr;
819 let type1 = type1.to_i32();
820 let type2 = type2.to_i32();
821 let isl_rs_result = unsafe { isl_basic_map_equate(bmap, type1, pos1, type2, pos2) };
822 let isl_rs_result = BasicMap { ptr: isl_rs_result,
823 should_free_on_drop: true };
824 let err = isl_rs_ctx.last_error();
825 if err != Error::None_ {
826 let err_msg = isl_rs_ctx.last_error_msg();
827 isl_rs_ctx.reset_error();
828 return Err(LibISLError::new(err, err_msg));
829 }
830 Ok(isl_rs_result)
831 }
832
833 pub fn find_dim_by_name(&self, type_: DimType, name: &str) -> Result<i32, LibISLError> {
835 let bmap = self;
836 let isl_rs_ctx = bmap.get_ctx();
837 let bmap = bmap.ptr;
838 let type_ = type_.to_i32();
839 let name = CString::new(name).unwrap();
840 let name = name.as_ptr();
841 let isl_rs_result = unsafe { isl_basic_map_find_dim_by_name(bmap, type_, name) };
842 let err = isl_rs_ctx.last_error();
843 if err != Error::None_ {
844 let err_msg = isl_rs_ctx.last_error_msg();
845 isl_rs_ctx.reset_error();
846 return Err(LibISLError::new(err, err_msg));
847 }
848 Ok(isl_rs_result)
849 }
850
851 pub fn fix_si(self, type_: DimType, pos: u32, value: i32) -> Result<BasicMap, LibISLError> {
853 let bmap = self;
854 let isl_rs_ctx = bmap.get_ctx();
855 let mut bmap = bmap;
856 bmap.do_not_free_on_drop();
857 let bmap = bmap.ptr;
858 let type_ = type_.to_i32();
859 let isl_rs_result = unsafe { isl_basic_map_fix_si(bmap, type_, pos, value) };
860 let isl_rs_result = BasicMap { ptr: isl_rs_result,
861 should_free_on_drop: true };
862 let err = isl_rs_ctx.last_error();
863 if err != Error::None_ {
864 let err_msg = isl_rs_ctx.last_error_msg();
865 isl_rs_ctx.reset_error();
866 return Err(LibISLError::new(err, err_msg));
867 }
868 Ok(isl_rs_result)
869 }
870
871 pub fn fix_val(self, type_: DimType, pos: u32, v: Val) -> Result<BasicMap, LibISLError> {
873 let bmap = self;
874 let isl_rs_ctx = bmap.get_ctx();
875 let mut bmap = bmap;
876 bmap.do_not_free_on_drop();
877 let bmap = bmap.ptr;
878 let type_ = type_.to_i32();
879 let mut v = v;
880 v.do_not_free_on_drop();
881 let v = v.ptr;
882 let isl_rs_result = unsafe { isl_basic_map_fix_val(bmap, type_, pos, v) };
883 let isl_rs_result = BasicMap { ptr: isl_rs_result,
884 should_free_on_drop: true };
885 let err = isl_rs_ctx.last_error();
886 if err != Error::None_ {
887 let err_msg = isl_rs_ctx.last_error_msg();
888 isl_rs_ctx.reset_error();
889 return Err(LibISLError::new(err, err_msg));
890 }
891 Ok(isl_rs_result)
892 }
893
894 pub fn flat_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
896 let bmap1 = self;
897 let isl_rs_ctx = bmap1.get_ctx();
898 let mut bmap1 = bmap1;
899 bmap1.do_not_free_on_drop();
900 let bmap1 = bmap1.ptr;
901 let mut bmap2 = bmap2;
902 bmap2.do_not_free_on_drop();
903 let bmap2 = bmap2.ptr;
904 let isl_rs_result = unsafe { isl_basic_map_flat_product(bmap1, bmap2) };
905 let isl_rs_result = BasicMap { ptr: isl_rs_result,
906 should_free_on_drop: true };
907 let err = isl_rs_ctx.last_error();
908 if err != Error::None_ {
909 let err_msg = isl_rs_ctx.last_error_msg();
910 isl_rs_ctx.reset_error();
911 return Err(LibISLError::new(err, err_msg));
912 }
913 Ok(isl_rs_result)
914 }
915
916 pub fn flat_range_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
918 let bmap1 = self;
919 let isl_rs_ctx = bmap1.get_ctx();
920 let mut bmap1 = bmap1;
921 bmap1.do_not_free_on_drop();
922 let bmap1 = bmap1.ptr;
923 let mut bmap2 = bmap2;
924 bmap2.do_not_free_on_drop();
925 let bmap2 = bmap2.ptr;
926 let isl_rs_result = unsafe { isl_basic_map_flat_range_product(bmap1, bmap2) };
927 let isl_rs_result = BasicMap { ptr: isl_rs_result,
928 should_free_on_drop: true };
929 let err = isl_rs_ctx.last_error();
930 if err != Error::None_ {
931 let err_msg = isl_rs_ctx.last_error_msg();
932 isl_rs_ctx.reset_error();
933 return Err(LibISLError::new(err, err_msg));
934 }
935 Ok(isl_rs_result)
936 }
937
938 pub fn flatten(self) -> Result<BasicMap, LibISLError> {
940 let bmap = self;
941 let isl_rs_ctx = bmap.get_ctx();
942 let mut bmap = bmap;
943 bmap.do_not_free_on_drop();
944 let bmap = bmap.ptr;
945 let isl_rs_result = unsafe { isl_basic_map_flatten(bmap) };
946 let isl_rs_result = BasicMap { ptr: isl_rs_result,
947 should_free_on_drop: true };
948 let err = isl_rs_ctx.last_error();
949 if err != Error::None_ {
950 let err_msg = isl_rs_ctx.last_error_msg();
951 isl_rs_ctx.reset_error();
952 return Err(LibISLError::new(err, err_msg));
953 }
954 Ok(isl_rs_result)
955 }
956
957 pub fn flatten_domain(self) -> Result<BasicMap, LibISLError> {
959 let bmap = self;
960 let isl_rs_ctx = bmap.get_ctx();
961 let mut bmap = bmap;
962 bmap.do_not_free_on_drop();
963 let bmap = bmap.ptr;
964 let isl_rs_result = unsafe { isl_basic_map_flatten_domain(bmap) };
965 let isl_rs_result = BasicMap { ptr: isl_rs_result,
966 should_free_on_drop: true };
967 let err = isl_rs_ctx.last_error();
968 if err != Error::None_ {
969 let err_msg = isl_rs_ctx.last_error_msg();
970 isl_rs_ctx.reset_error();
971 return Err(LibISLError::new(err, err_msg));
972 }
973 Ok(isl_rs_result)
974 }
975
976 pub fn flatten_range(self) -> Result<BasicMap, LibISLError> {
978 let bmap = self;
979 let isl_rs_ctx = bmap.get_ctx();
980 let mut bmap = bmap;
981 bmap.do_not_free_on_drop();
982 let bmap = bmap.ptr;
983 let isl_rs_result = unsafe { isl_basic_map_flatten_range(bmap) };
984 let isl_rs_result = BasicMap { ptr: isl_rs_result,
985 should_free_on_drop: true };
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 free(self) -> Result<BasicMap, LibISLError> {
997 let bmap = self;
998 let isl_rs_ctx = bmap.get_ctx();
999 let mut bmap = bmap;
1000 bmap.do_not_free_on_drop();
1001 let bmap = bmap.ptr;
1002 let isl_rs_result = unsafe { isl_basic_map_free(bmap) };
1003 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1004 should_free_on_drop: true };
1005 let err = isl_rs_ctx.last_error();
1006 if err != Error::None_ {
1007 let err_msg = isl_rs_ctx.last_error_msg();
1008 isl_rs_ctx.reset_error();
1009 return Err(LibISLError::new(err, err_msg));
1010 }
1011 Ok(isl_rs_result)
1012 }
1013
1014 pub fn from_aff(aff: Aff) -> Result<BasicMap, LibISLError> {
1016 let isl_rs_ctx = aff.get_ctx();
1017 let mut aff = aff;
1018 aff.do_not_free_on_drop();
1019 let aff = aff.ptr;
1020 let isl_rs_result = unsafe { isl_basic_map_from_aff(aff) };
1021 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1022 should_free_on_drop: true };
1023 let err = isl_rs_ctx.last_error();
1024 if err != Error::None_ {
1025 let err_msg = isl_rs_ctx.last_error_msg();
1026 isl_rs_ctx.reset_error();
1027 return Err(LibISLError::new(err, err_msg));
1028 }
1029 Ok(isl_rs_result)
1030 }
1031
1032 pub fn from_aff_list(domain_space: Space, list: AffList) -> Result<BasicMap, LibISLError> {
1034 let isl_rs_ctx = domain_space.get_ctx();
1035 let mut domain_space = domain_space;
1036 domain_space.do_not_free_on_drop();
1037 let domain_space = domain_space.ptr;
1038 let mut list = list;
1039 list.do_not_free_on_drop();
1040 let list = list.ptr;
1041 let isl_rs_result = unsafe { isl_basic_map_from_aff_list(domain_space, list) };
1042 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1043 should_free_on_drop: true };
1044 let err = isl_rs_ctx.last_error();
1045 if err != Error::None_ {
1046 let err_msg = isl_rs_ctx.last_error_msg();
1047 isl_rs_ctx.reset_error();
1048 return Err(LibISLError::new(err, err_msg));
1049 }
1050 Ok(isl_rs_result)
1051 }
1052
1053 pub fn from_constraint(constraint: Constraint) -> Result<BasicMap, LibISLError> {
1055 let isl_rs_ctx = constraint.get_ctx();
1056 let mut constraint = constraint;
1057 constraint.do_not_free_on_drop();
1058 let constraint = constraint.ptr;
1059 let isl_rs_result = unsafe { isl_basic_map_from_constraint(constraint) };
1060 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1061 should_free_on_drop: true };
1062 let err = isl_rs_ctx.last_error();
1063 if err != Error::None_ {
1064 let err_msg = isl_rs_ctx.last_error_msg();
1065 isl_rs_ctx.reset_error();
1066 return Err(LibISLError::new(err, err_msg));
1067 }
1068 Ok(isl_rs_result)
1069 }
1070
1071 pub fn from_constraint_matrices(space: Space, eq: Mat, ineq: Mat, c1: DimType, c2: DimType,
1073 c3: DimType, c4: DimType, c5: DimType)
1074 -> Result<BasicMap, LibISLError> {
1075 let isl_rs_ctx = space.get_ctx();
1076 let mut space = space;
1077 space.do_not_free_on_drop();
1078 let space = space.ptr;
1079 let mut eq = eq;
1080 eq.do_not_free_on_drop();
1081 let eq = eq.ptr;
1082 let mut ineq = ineq;
1083 ineq.do_not_free_on_drop();
1084 let ineq = ineq.ptr;
1085 let c1 = c1.to_i32();
1086 let c2 = c2.to_i32();
1087 let c3 = c3.to_i32();
1088 let c4 = c4.to_i32();
1089 let c5 = c5.to_i32();
1090 let isl_rs_result =
1091 unsafe { isl_basic_map_from_constraint_matrices(space, eq, ineq, c1, c2, c3, c4, c5) };
1092 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1093 should_free_on_drop: true };
1094 let err = isl_rs_ctx.last_error();
1095 if err != Error::None_ {
1096 let err_msg = isl_rs_ctx.last_error_msg();
1097 isl_rs_ctx.reset_error();
1098 return Err(LibISLError::new(err, err_msg));
1099 }
1100 Ok(isl_rs_result)
1101 }
1102
1103 pub fn from_domain(bset: BasicSet) -> Result<BasicMap, LibISLError> {
1105 let isl_rs_ctx = bset.get_ctx();
1106 let mut bset = bset;
1107 bset.do_not_free_on_drop();
1108 let bset = bset.ptr;
1109 let isl_rs_result = unsafe { isl_basic_map_from_domain(bset) };
1110 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1111 should_free_on_drop: true };
1112 let err = isl_rs_ctx.last_error();
1113 if err != Error::None_ {
1114 let err_msg = isl_rs_ctx.last_error_msg();
1115 isl_rs_ctx.reset_error();
1116 return Err(LibISLError::new(err, err_msg));
1117 }
1118 Ok(isl_rs_result)
1119 }
1120
1121 pub fn from_domain_and_range(domain: BasicSet, range: BasicSet)
1123 -> Result<BasicMap, LibISLError> {
1124 let isl_rs_ctx = domain.get_ctx();
1125 let mut domain = domain;
1126 domain.do_not_free_on_drop();
1127 let domain = domain.ptr;
1128 let mut range = range;
1129 range.do_not_free_on_drop();
1130 let range = range.ptr;
1131 let isl_rs_result = unsafe { isl_basic_map_from_domain_and_range(domain, range) };
1132 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1133 should_free_on_drop: true };
1134 let err = isl_rs_ctx.last_error();
1135 if err != Error::None_ {
1136 let err_msg = isl_rs_ctx.last_error_msg();
1137 isl_rs_ctx.reset_error();
1138 return Err(LibISLError::new(err, err_msg));
1139 }
1140 Ok(isl_rs_result)
1141 }
1142
1143 pub fn from_multi_aff(maff: MultiAff) -> Result<BasicMap, LibISLError> {
1145 let isl_rs_ctx = maff.get_ctx();
1146 let mut maff = maff;
1147 maff.do_not_free_on_drop();
1148 let maff = maff.ptr;
1149 let isl_rs_result = unsafe { isl_basic_map_from_multi_aff(maff) };
1150 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1151 should_free_on_drop: true };
1152 let err = isl_rs_ctx.last_error();
1153 if err != Error::None_ {
1154 let err_msg = isl_rs_ctx.last_error_msg();
1155 isl_rs_ctx.reset_error();
1156 return Err(LibISLError::new(err, err_msg));
1157 }
1158 Ok(isl_rs_result)
1159 }
1160
1161 pub fn from_qpolynomial(qp: QPolynomial) -> Result<BasicMap, LibISLError> {
1163 let isl_rs_ctx = qp.get_ctx();
1164 let mut qp = qp;
1165 qp.do_not_free_on_drop();
1166 let qp = qp.ptr;
1167 let isl_rs_result = unsafe { isl_basic_map_from_qpolynomial(qp) };
1168 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1169 should_free_on_drop: true };
1170 let err = isl_rs_ctx.last_error();
1171 if err != Error::None_ {
1172 let err_msg = isl_rs_ctx.last_error_msg();
1173 isl_rs_ctx.reset_error();
1174 return Err(LibISLError::new(err, err_msg));
1175 }
1176 Ok(isl_rs_result)
1177 }
1178
1179 pub fn from_range(bset: BasicSet) -> Result<BasicMap, LibISLError> {
1181 let isl_rs_ctx = bset.get_ctx();
1182 let mut bset = bset;
1183 bset.do_not_free_on_drop();
1184 let bset = bset.ptr;
1185 let isl_rs_result = unsafe { isl_basic_map_from_range(bset) };
1186 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1187 should_free_on_drop: true };
1188 let err = isl_rs_ctx.last_error();
1189 if err != Error::None_ {
1190 let err_msg = isl_rs_ctx.last_error_msg();
1191 isl_rs_ctx.reset_error();
1192 return Err(LibISLError::new(err, err_msg));
1193 }
1194 Ok(isl_rs_result)
1195 }
1196
1197 pub fn get_constraint_list(&self) -> Result<ConstraintList, LibISLError> {
1199 let bmap = self;
1200 let isl_rs_ctx = bmap.get_ctx();
1201 let bmap = bmap.ptr;
1202 let isl_rs_result = unsafe { isl_basic_map_get_constraint_list(bmap) };
1203 let isl_rs_result = ConstraintList { ptr: isl_rs_result,
1204 should_free_on_drop: true };
1205 let err = isl_rs_ctx.last_error();
1206 if err != Error::None_ {
1207 let err_msg = isl_rs_ctx.last_error_msg();
1208 isl_rs_ctx.reset_error();
1209 return Err(LibISLError::new(err, err_msg));
1210 }
1211 Ok(isl_rs_result)
1212 }
1213
1214 pub fn get_ctx(&self) -> Context {
1216 let bmap = self;
1217 let bmap = bmap.ptr;
1218 let isl_rs_result = unsafe { isl_basic_map_get_ctx(bmap) };
1219 let isl_rs_result = Context { ptr: isl_rs_result,
1220 should_free_on_drop: false };
1221 isl_rs_result
1222 }
1223
1224 pub fn get_dim_name(&self, type_: DimType, pos: u32) -> Result<&str, LibISLError> {
1226 let bmap = self;
1227 let isl_rs_ctx = bmap.get_ctx();
1228 let bmap = bmap.ptr;
1229 let type_ = type_.to_i32();
1230 let isl_rs_result = unsafe { isl_basic_map_get_dim_name(bmap, type_, pos) };
1231 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1232 let isl_rs_result = isl_rs_result.to_str().unwrap();
1233 let err = isl_rs_ctx.last_error();
1234 if err != Error::None_ {
1235 let err_msg = isl_rs_ctx.last_error_msg();
1236 isl_rs_ctx.reset_error();
1237 return Err(LibISLError::new(err, err_msg));
1238 }
1239 Ok(isl_rs_result)
1240 }
1241
1242 pub fn get_div(&self, pos: i32) -> Result<Aff, LibISLError> {
1244 let bmap = self;
1245 let isl_rs_ctx = bmap.get_ctx();
1246 let bmap = bmap.ptr;
1247 let isl_rs_result = unsafe { isl_basic_map_get_div(bmap, pos) };
1248 let isl_rs_result = Aff { ptr: isl_rs_result,
1249 should_free_on_drop: true };
1250 let err = isl_rs_ctx.last_error();
1251 if err != Error::None_ {
1252 let err_msg = isl_rs_ctx.last_error_msg();
1253 isl_rs_ctx.reset_error();
1254 return Err(LibISLError::new(err, err_msg));
1255 }
1256 Ok(isl_rs_result)
1257 }
1258
1259 pub fn get_local_space(&self) -> Result<LocalSpace, LibISLError> {
1261 let bmap = self;
1262 let isl_rs_ctx = bmap.get_ctx();
1263 let bmap = bmap.ptr;
1264 let isl_rs_result = unsafe { isl_basic_map_get_local_space(bmap) };
1265 let isl_rs_result = LocalSpace { ptr: isl_rs_result,
1266 should_free_on_drop: true };
1267 let err = isl_rs_ctx.last_error();
1268 if err != Error::None_ {
1269 let err_msg = isl_rs_ctx.last_error_msg();
1270 isl_rs_ctx.reset_error();
1271 return Err(LibISLError::new(err, err_msg));
1272 }
1273 Ok(isl_rs_result)
1274 }
1275
1276 pub fn get_space(&self) -> Result<Space, LibISLError> {
1278 let bmap = self;
1279 let isl_rs_ctx = bmap.get_ctx();
1280 let bmap = bmap.ptr;
1281 let isl_rs_result = unsafe { isl_basic_map_get_space(bmap) };
1282 let isl_rs_result = Space { ptr: isl_rs_result,
1283 should_free_on_drop: true };
1284 let err = isl_rs_ctx.last_error();
1285 if err != Error::None_ {
1286 let err_msg = isl_rs_ctx.last_error_msg();
1287 isl_rs_ctx.reset_error();
1288 return Err(LibISLError::new(err, err_msg));
1289 }
1290 Ok(isl_rs_result)
1291 }
1292
1293 pub fn get_tuple_name(&self, type_: DimType) -> Result<&str, LibISLError> {
1295 let bmap = self;
1296 let isl_rs_ctx = bmap.get_ctx();
1297 let bmap = bmap.ptr;
1298 let type_ = type_.to_i32();
1299 let isl_rs_result = unsafe { isl_basic_map_get_tuple_name(bmap, type_) };
1300 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1301 let isl_rs_result = isl_rs_result.to_str().unwrap();
1302 let err = isl_rs_ctx.last_error();
1303 if err != Error::None_ {
1304 let err_msg = isl_rs_ctx.last_error_msg();
1305 isl_rs_ctx.reset_error();
1306 return Err(LibISLError::new(err, err_msg));
1307 }
1308 Ok(isl_rs_result)
1309 }
1310
1311 pub fn gist(self, context: BasicMap) -> Result<BasicMap, LibISLError> {
1313 let bmap = self;
1314 let isl_rs_ctx = bmap.get_ctx();
1315 let mut bmap = bmap;
1316 bmap.do_not_free_on_drop();
1317 let bmap = bmap.ptr;
1318 let mut context = context;
1319 context.do_not_free_on_drop();
1320 let context = context.ptr;
1321 let isl_rs_result = unsafe { isl_basic_map_gist(bmap, context) };
1322 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1323 should_free_on_drop: true };
1324 let err = isl_rs_ctx.last_error();
1325 if err != Error::None_ {
1326 let err_msg = isl_rs_ctx.last_error_msg();
1327 isl_rs_ctx.reset_error();
1328 return Err(LibISLError::new(err, err_msg));
1329 }
1330 Ok(isl_rs_result)
1331 }
1332
1333 pub fn gist_domain(self, context: BasicSet) -> Result<BasicMap, LibISLError> {
1335 let bmap = self;
1336 let isl_rs_ctx = bmap.get_ctx();
1337 let mut bmap = bmap;
1338 bmap.do_not_free_on_drop();
1339 let bmap = bmap.ptr;
1340 let mut context = context;
1341 context.do_not_free_on_drop();
1342 let context = context.ptr;
1343 let isl_rs_result = unsafe { isl_basic_map_gist_domain(bmap, context) };
1344 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1345 should_free_on_drop: true };
1346 let err = isl_rs_ctx.last_error();
1347 if err != Error::None_ {
1348 let err_msg = isl_rs_ctx.last_error_msg();
1349 isl_rs_ctx.reset_error();
1350 return Err(LibISLError::new(err, err_msg));
1351 }
1352 Ok(isl_rs_result)
1353 }
1354
1355 pub fn has_dim_id(&self, type_: DimType, pos: u32) -> Result<bool, LibISLError> {
1357 let bmap = self;
1358 let isl_rs_ctx = bmap.get_ctx();
1359 let bmap = bmap.ptr;
1360 let type_ = type_.to_i32();
1361 let isl_rs_result = unsafe { isl_basic_map_has_dim_id(bmap, type_, pos) };
1362 let isl_rs_result = match isl_rs_result {
1363 0 => false,
1364 1 => true,
1365 _ => {
1366 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1367 }
1368 };
1369 let err = isl_rs_ctx.last_error();
1370 if err != Error::None_ {
1371 let err_msg = isl_rs_ctx.last_error_msg();
1372 isl_rs_ctx.reset_error();
1373 return Err(LibISLError::new(err, err_msg));
1374 }
1375 Ok(isl_rs_result)
1376 }
1377
1378 pub fn identity(space: Space) -> Result<BasicMap, LibISLError> {
1380 let isl_rs_ctx = space.get_ctx();
1381 let mut space = space;
1382 space.do_not_free_on_drop();
1383 let space = space.ptr;
1384 let isl_rs_result = unsafe { isl_basic_map_identity(space) };
1385 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1386 should_free_on_drop: true };
1387 let err = isl_rs_ctx.last_error();
1388 if err != Error::None_ {
1389 let err_msg = isl_rs_ctx.last_error_msg();
1390 isl_rs_ctx.reset_error();
1391 return Err(LibISLError::new(err, err_msg));
1392 }
1393 Ok(isl_rs_result)
1394 }
1395
1396 pub fn image_is_bounded(&self) -> Result<bool, LibISLError> {
1398 let bmap = self;
1399 let isl_rs_ctx = bmap.get_ctx();
1400 let bmap = bmap.ptr;
1401 let isl_rs_result = unsafe { isl_basic_map_image_is_bounded(bmap) };
1402 let isl_rs_result = match isl_rs_result {
1403 0 => false,
1404 1 => true,
1405 _ => {
1406 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1407 }
1408 };
1409 let err = isl_rs_ctx.last_error();
1410 if err != Error::None_ {
1411 let err_msg = isl_rs_ctx.last_error_msg();
1412 isl_rs_ctx.reset_error();
1413 return Err(LibISLError::new(err, err_msg));
1414 }
1415 Ok(isl_rs_result)
1416 }
1417
1418 pub fn inequalities_matrix(&self, c1: DimType, c2: DimType, c3: DimType, c4: DimType,
1420 c5: DimType)
1421 -> Result<Mat, LibISLError> {
1422 let bmap = self;
1423 let isl_rs_ctx = bmap.get_ctx();
1424 let bmap = bmap.ptr;
1425 let c1 = c1.to_i32();
1426 let c2 = c2.to_i32();
1427 let c3 = c3.to_i32();
1428 let c4 = c4.to_i32();
1429 let c5 = c5.to_i32();
1430 let isl_rs_result = unsafe { isl_basic_map_inequalities_matrix(bmap, c1, c2, c3, c4, c5) };
1431 let isl_rs_result = Mat { ptr: isl_rs_result,
1432 should_free_on_drop: true };
1433 let err = isl_rs_ctx.last_error();
1434 if err != Error::None_ {
1435 let err_msg = isl_rs_ctx.last_error_msg();
1436 isl_rs_ctx.reset_error();
1437 return Err(LibISLError::new(err, err_msg));
1438 }
1439 Ok(isl_rs_result)
1440 }
1441
1442 pub fn insert_dims(self, type_: DimType, pos: u32, n: u32) -> Result<BasicMap, LibISLError> {
1444 let bmap = self;
1445 let isl_rs_ctx = bmap.get_ctx();
1446 let mut bmap = bmap;
1447 bmap.do_not_free_on_drop();
1448 let bmap = bmap.ptr;
1449 let type_ = type_.to_i32();
1450 let isl_rs_result = unsafe { isl_basic_map_insert_dims(bmap, type_, pos, n) };
1451 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1452 should_free_on_drop: true };
1453 let err = isl_rs_ctx.last_error();
1454 if err != Error::None_ {
1455 let err_msg = isl_rs_ctx.last_error_msg();
1456 isl_rs_ctx.reset_error();
1457 return Err(LibISLError::new(err, err_msg));
1458 }
1459 Ok(isl_rs_result)
1460 }
1461
1462 pub fn intersect(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
1464 let bmap1 = self;
1465 let isl_rs_ctx = bmap1.get_ctx();
1466 let mut bmap1 = bmap1;
1467 bmap1.do_not_free_on_drop();
1468 let bmap1 = bmap1.ptr;
1469 let mut bmap2 = bmap2;
1470 bmap2.do_not_free_on_drop();
1471 let bmap2 = bmap2.ptr;
1472 let isl_rs_result = unsafe { isl_basic_map_intersect(bmap1, bmap2) };
1473 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1474 should_free_on_drop: true };
1475 let err = isl_rs_ctx.last_error();
1476 if err != Error::None_ {
1477 let err_msg = isl_rs_ctx.last_error_msg();
1478 isl_rs_ctx.reset_error();
1479 return Err(LibISLError::new(err, err_msg));
1480 }
1481 Ok(isl_rs_result)
1482 }
1483
1484 pub fn intersect_domain(self, bset: BasicSet) -> Result<BasicMap, LibISLError> {
1486 let bmap = self;
1487 let isl_rs_ctx = bmap.get_ctx();
1488 let mut bmap = bmap;
1489 bmap.do_not_free_on_drop();
1490 let bmap = bmap.ptr;
1491 let mut bset = bset;
1492 bset.do_not_free_on_drop();
1493 let bset = bset.ptr;
1494 let isl_rs_result = unsafe { isl_basic_map_intersect_domain(bmap, bset) };
1495 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1496 should_free_on_drop: true };
1497 let err = isl_rs_ctx.last_error();
1498 if err != Error::None_ {
1499 let err_msg = isl_rs_ctx.last_error_msg();
1500 isl_rs_ctx.reset_error();
1501 return Err(LibISLError::new(err, err_msg));
1502 }
1503 Ok(isl_rs_result)
1504 }
1505
1506 pub fn intersect_params(self, bset: BasicSet) -> Result<BasicMap, LibISLError> {
1508 let bmap = self;
1509 let isl_rs_ctx = bmap.get_ctx();
1510 let mut bmap = bmap;
1511 bmap.do_not_free_on_drop();
1512 let bmap = bmap.ptr;
1513 let mut bset = bset;
1514 bset.do_not_free_on_drop();
1515 let bset = bset.ptr;
1516 let isl_rs_result = unsafe { isl_basic_map_intersect_params(bmap, bset) };
1517 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1518 should_free_on_drop: true };
1519 let err = isl_rs_ctx.last_error();
1520 if err != Error::None_ {
1521 let err_msg = isl_rs_ctx.last_error_msg();
1522 isl_rs_ctx.reset_error();
1523 return Err(LibISLError::new(err, err_msg));
1524 }
1525 Ok(isl_rs_result)
1526 }
1527
1528 pub fn intersect_range(self, bset: BasicSet) -> Result<BasicMap, LibISLError> {
1530 let bmap = self;
1531 let isl_rs_ctx = bmap.get_ctx();
1532 let mut bmap = bmap;
1533 bmap.do_not_free_on_drop();
1534 let bmap = bmap.ptr;
1535 let mut bset = bset;
1536 bset.do_not_free_on_drop();
1537 let bset = bset.ptr;
1538 let isl_rs_result = unsafe { isl_basic_map_intersect_range(bmap, bset) };
1539 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1540 should_free_on_drop: true };
1541 let err = isl_rs_ctx.last_error();
1542 if err != Error::None_ {
1543 let err_msg = isl_rs_ctx.last_error_msg();
1544 isl_rs_ctx.reset_error();
1545 return Err(LibISLError::new(err, err_msg));
1546 }
1547 Ok(isl_rs_result)
1548 }
1549
1550 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
1552 let bmap = self;
1553 let isl_rs_ctx = bmap.get_ctx();
1554 let bmap = bmap.ptr;
1555 let type_ = type_.to_i32();
1556 let isl_rs_result = unsafe { isl_basic_map_involves_dims(bmap, type_, first, n) };
1557 let isl_rs_result = match isl_rs_result {
1558 0 => false,
1559 1 => true,
1560 _ => {
1561 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1562 }
1563 };
1564 let err = isl_rs_ctx.last_error();
1565 if err != Error::None_ {
1566 let err_msg = isl_rs_ctx.last_error_msg();
1567 isl_rs_ctx.reset_error();
1568 return Err(LibISLError::new(err, err_msg));
1569 }
1570 Ok(isl_rs_result)
1571 }
1572
1573 pub fn is_disjoint(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1575 let bmap1 = self;
1576 let isl_rs_ctx = bmap1.get_ctx();
1577 let bmap1 = bmap1.ptr;
1578 let bmap2 = bmap2.ptr;
1579 let isl_rs_result = unsafe { isl_basic_map_is_disjoint(bmap1, bmap2) };
1580 let isl_rs_result = match isl_rs_result {
1581 0 => false,
1582 1 => true,
1583 _ => {
1584 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1585 }
1586 };
1587 let err = isl_rs_ctx.last_error();
1588 if err != Error::None_ {
1589 let err_msg = isl_rs_ctx.last_error_msg();
1590 isl_rs_ctx.reset_error();
1591 return Err(LibISLError::new(err, err_msg));
1592 }
1593 Ok(isl_rs_result)
1594 }
1595
1596 pub fn is_empty(&self) -> Result<bool, LibISLError> {
1598 let bmap = self;
1599 let isl_rs_ctx = bmap.get_ctx();
1600 let bmap = bmap.ptr;
1601 let isl_rs_result = unsafe { isl_basic_map_is_empty(bmap) };
1602 let isl_rs_result = match isl_rs_result {
1603 0 => false,
1604 1 => true,
1605 _ => {
1606 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1607 }
1608 };
1609 let err = isl_rs_ctx.last_error();
1610 if err != Error::None_ {
1611 let err_msg = isl_rs_ctx.last_error_msg();
1612 isl_rs_ctx.reset_error();
1613 return Err(LibISLError::new(err, err_msg));
1614 }
1615 Ok(isl_rs_result)
1616 }
1617
1618 pub fn is_equal(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1620 let bmap1 = self;
1621 let isl_rs_ctx = bmap1.get_ctx();
1622 let bmap1 = bmap1.ptr;
1623 let bmap2 = bmap2.ptr;
1624 let isl_rs_result = unsafe { isl_basic_map_is_equal(bmap1, bmap2) };
1625 let isl_rs_result = match isl_rs_result {
1626 0 => false,
1627 1 => true,
1628 _ => {
1629 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1630 }
1631 };
1632 let err = isl_rs_ctx.last_error();
1633 if err != Error::None_ {
1634 let err_msg = isl_rs_ctx.last_error_msg();
1635 isl_rs_ctx.reset_error();
1636 return Err(LibISLError::new(err, err_msg));
1637 }
1638 Ok(isl_rs_result)
1639 }
1640
1641 pub fn is_rational(&self) -> Result<bool, LibISLError> {
1643 let bmap = self;
1644 let isl_rs_ctx = bmap.get_ctx();
1645 let bmap = bmap.ptr;
1646 let isl_rs_result = unsafe { isl_basic_map_is_rational(bmap) };
1647 let isl_rs_result = match isl_rs_result {
1648 0 => false,
1649 1 => true,
1650 _ => {
1651 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1652 }
1653 };
1654 let err = isl_rs_ctx.last_error();
1655 if err != Error::None_ {
1656 let err_msg = isl_rs_ctx.last_error_msg();
1657 isl_rs_ctx.reset_error();
1658 return Err(LibISLError::new(err, err_msg));
1659 }
1660 Ok(isl_rs_result)
1661 }
1662
1663 pub fn is_single_valued(&self) -> Result<bool, LibISLError> {
1665 let bmap = self;
1666 let isl_rs_ctx = bmap.get_ctx();
1667 let bmap = bmap.ptr;
1668 let isl_rs_result = unsafe { isl_basic_map_is_single_valued(bmap) };
1669 let isl_rs_result = match isl_rs_result {
1670 0 => false,
1671 1 => true,
1672 _ => {
1673 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1674 }
1675 };
1676 let err = isl_rs_ctx.last_error();
1677 if err != Error::None_ {
1678 let err_msg = isl_rs_ctx.last_error_msg();
1679 isl_rs_ctx.reset_error();
1680 return Err(LibISLError::new(err, err_msg));
1681 }
1682 Ok(isl_rs_result)
1683 }
1684
1685 pub fn is_strict_subset(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1687 let bmap1 = self;
1688 let isl_rs_ctx = bmap1.get_ctx();
1689 let bmap1 = bmap1.ptr;
1690 let bmap2 = bmap2.ptr;
1691 let isl_rs_result = unsafe { isl_basic_map_is_strict_subset(bmap1, bmap2) };
1692 let isl_rs_result = match isl_rs_result {
1693 0 => false,
1694 1 => true,
1695 _ => {
1696 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1697 }
1698 };
1699 let err = isl_rs_ctx.last_error();
1700 if err != Error::None_ {
1701 let err_msg = isl_rs_ctx.last_error_msg();
1702 isl_rs_ctx.reset_error();
1703 return Err(LibISLError::new(err, err_msg));
1704 }
1705 Ok(isl_rs_result)
1706 }
1707
1708 pub fn is_subset(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1710 let bmap1 = self;
1711 let isl_rs_ctx = bmap1.get_ctx();
1712 let bmap1 = bmap1.ptr;
1713 let bmap2 = bmap2.ptr;
1714 let isl_rs_result = unsafe { isl_basic_map_is_subset(bmap1, bmap2) };
1715 let isl_rs_result = match isl_rs_result {
1716 0 => false,
1717 1 => true,
1718 _ => {
1719 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1720 }
1721 };
1722 let err = isl_rs_ctx.last_error();
1723 if err != Error::None_ {
1724 let err_msg = isl_rs_ctx.last_error_msg();
1725 isl_rs_ctx.reset_error();
1726 return Err(LibISLError::new(err, err_msg));
1727 }
1728 Ok(isl_rs_result)
1729 }
1730
1731 pub fn is_universe(&self) -> Result<bool, LibISLError> {
1733 let bmap = self;
1734 let isl_rs_ctx = bmap.get_ctx();
1735 let bmap = bmap.ptr;
1736 let isl_rs_result = unsafe { isl_basic_map_is_universe(bmap) };
1737 let isl_rs_result = match isl_rs_result {
1738 0 => false,
1739 1 => true,
1740 _ => {
1741 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
1742 }
1743 };
1744 let err = isl_rs_ctx.last_error();
1745 if err != Error::None_ {
1746 let err_msg = isl_rs_ctx.last_error_msg();
1747 isl_rs_ctx.reset_error();
1748 return Err(LibISLError::new(err, err_msg));
1749 }
1750 Ok(isl_rs_result)
1751 }
1752
1753 pub fn less_at(space: Space, pos: u32) -> Result<BasicMap, LibISLError> {
1755 let isl_rs_ctx = space.get_ctx();
1756 let mut space = space;
1757 space.do_not_free_on_drop();
1758 let space = space.ptr;
1759 let isl_rs_result = unsafe { isl_basic_map_less_at(space, pos) };
1760 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1761 should_free_on_drop: true };
1762 let err = isl_rs_ctx.last_error();
1763 if err != Error::None_ {
1764 let err_msg = isl_rs_ctx.last_error_msg();
1765 isl_rs_ctx.reset_error();
1766 return Err(LibISLError::new(err, err_msg));
1767 }
1768 Ok(isl_rs_result)
1769 }
1770
1771 pub fn lexmax(self) -> Result<Map, LibISLError> {
1773 let bmap = self;
1774 let isl_rs_ctx = bmap.get_ctx();
1775 let mut bmap = bmap;
1776 bmap.do_not_free_on_drop();
1777 let bmap = bmap.ptr;
1778 let isl_rs_result = unsafe { isl_basic_map_lexmax(bmap) };
1779 let isl_rs_result = Map { ptr: isl_rs_result,
1780 should_free_on_drop: true };
1781 let err = isl_rs_ctx.last_error();
1782 if err != Error::None_ {
1783 let err_msg = isl_rs_ctx.last_error_msg();
1784 isl_rs_ctx.reset_error();
1785 return Err(LibISLError::new(err, err_msg));
1786 }
1787 Ok(isl_rs_result)
1788 }
1789
1790 pub fn lexmin(self) -> Result<Map, LibISLError> {
1792 let bmap = self;
1793 let isl_rs_ctx = bmap.get_ctx();
1794 let mut bmap = bmap;
1795 bmap.do_not_free_on_drop();
1796 let bmap = bmap.ptr;
1797 let isl_rs_result = unsafe { isl_basic_map_lexmin(bmap) };
1798 let isl_rs_result = Map { ptr: isl_rs_result,
1799 should_free_on_drop: true };
1800 let err = isl_rs_ctx.last_error();
1801 if err != Error::None_ {
1802 let err_msg = isl_rs_ctx.last_error_msg();
1803 isl_rs_ctx.reset_error();
1804 return Err(LibISLError::new(err, err_msg));
1805 }
1806 Ok(isl_rs_result)
1807 }
1808
1809 pub fn lexmin_pw_multi_aff(self) -> Result<PwMultiAff, LibISLError> {
1811 let bmap = self;
1812 let isl_rs_ctx = bmap.get_ctx();
1813 let mut bmap = bmap;
1814 bmap.do_not_free_on_drop();
1815 let bmap = bmap.ptr;
1816 let isl_rs_result = unsafe { isl_basic_map_lexmin_pw_multi_aff(bmap) };
1817 let isl_rs_result = PwMultiAff { ptr: isl_rs_result,
1818 should_free_on_drop: true };
1819 let err = isl_rs_ctx.last_error();
1820 if err != Error::None_ {
1821 let err_msg = isl_rs_ctx.last_error_msg();
1822 isl_rs_ctx.reset_error();
1823 return Err(LibISLError::new(err, err_msg));
1824 }
1825 Ok(isl_rs_result)
1826 }
1827
1828 pub fn lower_bound_si(self, type_: DimType, pos: u32, value: i32)
1830 -> Result<BasicMap, LibISLError> {
1831 let bmap = self;
1832 let isl_rs_ctx = bmap.get_ctx();
1833 let mut bmap = bmap;
1834 bmap.do_not_free_on_drop();
1835 let bmap = bmap.ptr;
1836 let type_ = type_.to_i32();
1837 let isl_rs_result = unsafe { isl_basic_map_lower_bound_si(bmap, type_, pos, value) };
1838 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1839 should_free_on_drop: true };
1840 let err = isl_rs_ctx.last_error();
1841 if err != Error::None_ {
1842 let err_msg = isl_rs_ctx.last_error_msg();
1843 isl_rs_ctx.reset_error();
1844 return Err(LibISLError::new(err, err_msg));
1845 }
1846 Ok(isl_rs_result)
1847 }
1848
1849 pub fn more_at(space: Space, pos: u32) -> Result<BasicMap, LibISLError> {
1851 let isl_rs_ctx = space.get_ctx();
1852 let mut space = space;
1853 space.do_not_free_on_drop();
1854 let space = space.ptr;
1855 let isl_rs_result = unsafe { isl_basic_map_more_at(space, pos) };
1856 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1857 should_free_on_drop: true };
1858 let err = isl_rs_ctx.last_error();
1859 if err != Error::None_ {
1860 let err_msg = isl_rs_ctx.last_error_msg();
1861 isl_rs_ctx.reset_error();
1862 return Err(LibISLError::new(err, err_msg));
1863 }
1864 Ok(isl_rs_result)
1865 }
1866
1867 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
1869 n: u32)
1870 -> Result<BasicMap, LibISLError> {
1871 let bmap = self;
1872 let isl_rs_ctx = bmap.get_ctx();
1873 let mut bmap = bmap;
1874 bmap.do_not_free_on_drop();
1875 let bmap = bmap.ptr;
1876 let dst_type = dst_type.to_i32();
1877 let src_type = src_type.to_i32();
1878 let isl_rs_result =
1879 unsafe { isl_basic_map_move_dims(bmap, dst_type, dst_pos, src_type, src_pos, n) };
1880 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1881 should_free_on_drop: true };
1882 let err = isl_rs_ctx.last_error();
1883 if err != Error::None_ {
1884 let err_msg = isl_rs_ctx.last_error_msg();
1885 isl_rs_ctx.reset_error();
1886 return Err(LibISLError::new(err, err_msg));
1887 }
1888 Ok(isl_rs_result)
1889 }
1890
1891 pub fn n_constraint(&self) -> Result<i32, LibISLError> {
1893 let bmap = self;
1894 let isl_rs_ctx = bmap.get_ctx();
1895 let bmap = bmap.ptr;
1896 let isl_rs_result = unsafe { isl_basic_map_n_constraint(bmap) };
1897 let err = isl_rs_ctx.last_error();
1898 if err != Error::None_ {
1899 let err_msg = isl_rs_ctx.last_error_msg();
1900 isl_rs_ctx.reset_error();
1901 return Err(LibISLError::new(err, err_msg));
1902 }
1903 Ok(isl_rs_result)
1904 }
1905
1906 pub fn nat_universe(space: Space) -> Result<BasicMap, LibISLError> {
1908 let isl_rs_ctx = space.get_ctx();
1909 let mut space = space;
1910 space.do_not_free_on_drop();
1911 let space = space.ptr;
1912 let isl_rs_result = unsafe { isl_basic_map_nat_universe(space) };
1913 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1914 should_free_on_drop: true };
1915 let err = isl_rs_ctx.last_error();
1916 if err != Error::None_ {
1917 let err_msg = isl_rs_ctx.last_error_msg();
1918 isl_rs_ctx.reset_error();
1919 return Err(LibISLError::new(err, err_msg));
1920 }
1921 Ok(isl_rs_result)
1922 }
1923
1924 pub fn neg(self) -> Result<BasicMap, LibISLError> {
1926 let bmap = self;
1927 let isl_rs_ctx = bmap.get_ctx();
1928 let mut bmap = bmap;
1929 bmap.do_not_free_on_drop();
1930 let bmap = bmap.ptr;
1931 let isl_rs_result = unsafe { isl_basic_map_neg(bmap) };
1932 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1933 should_free_on_drop: true };
1934 let err = isl_rs_ctx.last_error();
1935 if err != Error::None_ {
1936 let err_msg = isl_rs_ctx.last_error_msg();
1937 isl_rs_ctx.reset_error();
1938 return Err(LibISLError::new(err, err_msg));
1939 }
1940 Ok(isl_rs_result)
1941 }
1942
1943 pub fn order_ge(self, type1: DimType, pos1: i32, type2: DimType, pos2: i32)
1945 -> Result<BasicMap, LibISLError> {
1946 let bmap = self;
1947 let isl_rs_ctx = bmap.get_ctx();
1948 let mut bmap = bmap;
1949 bmap.do_not_free_on_drop();
1950 let bmap = bmap.ptr;
1951 let type1 = type1.to_i32();
1952 let type2 = type2.to_i32();
1953 let isl_rs_result = unsafe { isl_basic_map_order_ge(bmap, type1, pos1, type2, pos2) };
1954 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1955 should_free_on_drop: true };
1956 let err = isl_rs_ctx.last_error();
1957 if err != Error::None_ {
1958 let err_msg = isl_rs_ctx.last_error_msg();
1959 isl_rs_ctx.reset_error();
1960 return Err(LibISLError::new(err, err_msg));
1961 }
1962 Ok(isl_rs_result)
1963 }
1964
1965 pub fn order_gt(self, type1: DimType, pos1: i32, type2: DimType, pos2: i32)
1967 -> Result<BasicMap, LibISLError> {
1968 let bmap = self;
1969 let isl_rs_ctx = bmap.get_ctx();
1970 let mut bmap = bmap;
1971 bmap.do_not_free_on_drop();
1972 let bmap = bmap.ptr;
1973 let type1 = type1.to_i32();
1974 let type2 = type2.to_i32();
1975 let isl_rs_result = unsafe { isl_basic_map_order_gt(bmap, type1, pos1, type2, pos2) };
1976 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1977 should_free_on_drop: true };
1978 let err = isl_rs_ctx.last_error();
1979 if err != Error::None_ {
1980 let err_msg = isl_rs_ctx.last_error_msg();
1981 isl_rs_ctx.reset_error();
1982 return Err(LibISLError::new(err, err_msg));
1983 }
1984 Ok(isl_rs_result)
1985 }
1986
1987 pub fn plain_get_val_if_fixed(&self, type_: DimType, pos: u32) -> Result<Val, LibISLError> {
1989 let bmap = self;
1990 let isl_rs_ctx = bmap.get_ctx();
1991 let bmap = bmap.ptr;
1992 let type_ = type_.to_i32();
1993 let isl_rs_result = unsafe { isl_basic_map_plain_get_val_if_fixed(bmap, type_, pos) };
1994 let isl_rs_result = Val { ptr: isl_rs_result,
1995 should_free_on_drop: true };
1996 let err = isl_rs_ctx.last_error();
1997 if err != Error::None_ {
1998 let err_msg = isl_rs_ctx.last_error_msg();
1999 isl_rs_ctx.reset_error();
2000 return Err(LibISLError::new(err, err_msg));
2001 }
2002 Ok(isl_rs_result)
2003 }
2004
2005 pub fn plain_is_empty(&self) -> Result<bool, LibISLError> {
2007 let bmap = self;
2008 let isl_rs_ctx = bmap.get_ctx();
2009 let bmap = bmap.ptr;
2010 let isl_rs_result = unsafe { isl_basic_map_plain_is_empty(bmap) };
2011 let isl_rs_result = match isl_rs_result {
2012 0 => false,
2013 1 => true,
2014 _ => {
2015 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
2016 }
2017 };
2018 let err = isl_rs_ctx.last_error();
2019 if err != Error::None_ {
2020 let err_msg = isl_rs_ctx.last_error_msg();
2021 isl_rs_ctx.reset_error();
2022 return Err(LibISLError::new(err, err_msg));
2023 }
2024 Ok(isl_rs_result)
2025 }
2026
2027 pub fn plain_is_universe(&self) -> Result<bool, LibISLError> {
2029 let bmap = self;
2030 let isl_rs_ctx = bmap.get_ctx();
2031 let bmap = bmap.ptr;
2032 let isl_rs_result = unsafe { isl_basic_map_plain_is_universe(bmap) };
2033 let isl_rs_result = match isl_rs_result {
2034 0 => false,
2035 1 => true,
2036 _ => {
2037 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
2038 }
2039 };
2040 let err = isl_rs_ctx.last_error();
2041 if err != Error::None_ {
2042 let err_msg = isl_rs_ctx.last_error_msg();
2043 isl_rs_ctx.reset_error();
2044 return Err(LibISLError::new(err, err_msg));
2045 }
2046 Ok(isl_rs_result)
2047 }
2048
2049 pub fn preimage_domain_multi_aff(self, ma: MultiAff) -> Result<BasicMap, LibISLError> {
2051 let bmap = self;
2052 let isl_rs_ctx = bmap.get_ctx();
2053 let mut bmap = bmap;
2054 bmap.do_not_free_on_drop();
2055 let bmap = bmap.ptr;
2056 let mut ma = ma;
2057 ma.do_not_free_on_drop();
2058 let ma = ma.ptr;
2059 let isl_rs_result = unsafe { isl_basic_map_preimage_domain_multi_aff(bmap, ma) };
2060 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2061 should_free_on_drop: true };
2062 let err = isl_rs_ctx.last_error();
2063 if err != Error::None_ {
2064 let err_msg = isl_rs_ctx.last_error_msg();
2065 isl_rs_ctx.reset_error();
2066 return Err(LibISLError::new(err, err_msg));
2067 }
2068 Ok(isl_rs_result)
2069 }
2070
2071 pub fn preimage_range_multi_aff(self, ma: MultiAff) -> Result<BasicMap, LibISLError> {
2073 let bmap = self;
2074 let isl_rs_ctx = bmap.get_ctx();
2075 let mut bmap = bmap;
2076 bmap.do_not_free_on_drop();
2077 let bmap = bmap.ptr;
2078 let mut ma = ma;
2079 ma.do_not_free_on_drop();
2080 let ma = ma.ptr;
2081 let isl_rs_result = unsafe { isl_basic_map_preimage_range_multi_aff(bmap, ma) };
2082 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2083 should_free_on_drop: true };
2084 let err = isl_rs_ctx.last_error();
2085 if err != Error::None_ {
2086 let err_msg = isl_rs_ctx.last_error_msg();
2087 isl_rs_ctx.reset_error();
2088 return Err(LibISLError::new(err, err_msg));
2089 }
2090 Ok(isl_rs_result)
2091 }
2092
2093 pub fn product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
2095 let bmap1 = self;
2096 let isl_rs_ctx = bmap1.get_ctx();
2097 let mut bmap1 = bmap1;
2098 bmap1.do_not_free_on_drop();
2099 let bmap1 = bmap1.ptr;
2100 let mut bmap2 = bmap2;
2101 bmap2.do_not_free_on_drop();
2102 let bmap2 = bmap2.ptr;
2103 let isl_rs_result = unsafe { isl_basic_map_product(bmap1, bmap2) };
2104 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2105 should_free_on_drop: true };
2106 let err = isl_rs_ctx.last_error();
2107 if err != Error::None_ {
2108 let err_msg = isl_rs_ctx.last_error_msg();
2109 isl_rs_ctx.reset_error();
2110 return Err(LibISLError::new(err, err_msg));
2111 }
2112 Ok(isl_rs_result)
2113 }
2114
2115 pub fn project_out(self, type_: DimType, first: u32, n: u32) -> Result<BasicMap, LibISLError> {
2117 let bmap = self;
2118 let isl_rs_ctx = bmap.get_ctx();
2119 let mut bmap = bmap;
2120 bmap.do_not_free_on_drop();
2121 let bmap = bmap.ptr;
2122 let type_ = type_.to_i32();
2123 let isl_rs_result = unsafe { isl_basic_map_project_out(bmap, type_, first, n) };
2124 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2125 should_free_on_drop: true };
2126 let err = isl_rs_ctx.last_error();
2127 if err != Error::None_ {
2128 let err_msg = isl_rs_ctx.last_error_msg();
2129 isl_rs_ctx.reset_error();
2130 return Err(LibISLError::new(err, err_msg));
2131 }
2132 Ok(isl_rs_result)
2133 }
2134
2135 pub fn range(self) -> Result<BasicSet, LibISLError> {
2137 let bmap = self;
2138 let isl_rs_ctx = bmap.get_ctx();
2139 let mut bmap = bmap;
2140 bmap.do_not_free_on_drop();
2141 let bmap = bmap.ptr;
2142 let isl_rs_result = unsafe { isl_basic_map_range(bmap) };
2143 let isl_rs_result = BasicSet { ptr: isl_rs_result,
2144 should_free_on_drop: true };
2145 let err = isl_rs_ctx.last_error();
2146 if err != Error::None_ {
2147 let err_msg = isl_rs_ctx.last_error_msg();
2148 isl_rs_ctx.reset_error();
2149 return Err(LibISLError::new(err, err_msg));
2150 }
2151 Ok(isl_rs_result)
2152 }
2153
2154 pub fn range_map(self) -> Result<BasicMap, LibISLError> {
2156 let bmap = self;
2157 let isl_rs_ctx = bmap.get_ctx();
2158 let mut bmap = bmap;
2159 bmap.do_not_free_on_drop();
2160 let bmap = bmap.ptr;
2161 let isl_rs_result = unsafe { isl_basic_map_range_map(bmap) };
2162 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2163 should_free_on_drop: true };
2164 let err = isl_rs_ctx.last_error();
2165 if err != Error::None_ {
2166 let err_msg = isl_rs_ctx.last_error_msg();
2167 isl_rs_ctx.reset_error();
2168 return Err(LibISLError::new(err, err_msg));
2169 }
2170 Ok(isl_rs_result)
2171 }
2172
2173 pub fn range_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
2175 let bmap1 = self;
2176 let isl_rs_ctx = bmap1.get_ctx();
2177 let mut bmap1 = bmap1;
2178 bmap1.do_not_free_on_drop();
2179 let bmap1 = bmap1.ptr;
2180 let mut bmap2 = bmap2;
2181 bmap2.do_not_free_on_drop();
2182 let bmap2 = bmap2.ptr;
2183 let isl_rs_result = unsafe { isl_basic_map_range_product(bmap1, bmap2) };
2184 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2185 should_free_on_drop: true };
2186 let err = isl_rs_ctx.last_error();
2187 if err != Error::None_ {
2188 let err_msg = isl_rs_ctx.last_error_msg();
2189 isl_rs_ctx.reset_error();
2190 return Err(LibISLError::new(err, err_msg));
2191 }
2192 Ok(isl_rs_result)
2193 }
2194
2195 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<BasicMap, LibISLError> {
2197 let isl_rs_ctx = Context { ptr: ctx.ptr,
2198 should_free_on_drop: false };
2199 let ctx = ctx.ptr;
2200 let str_ = CString::new(str_).unwrap();
2201 let str_ = str_.as_ptr();
2202 let isl_rs_result = unsafe { isl_basic_map_read_from_str(ctx, str_) };
2203 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2204 should_free_on_drop: true };
2205 let err = isl_rs_ctx.last_error();
2206 if err != Error::None_ {
2207 let err_msg = isl_rs_ctx.last_error_msg();
2208 isl_rs_ctx.reset_error();
2209 return Err(LibISLError::new(err, err_msg));
2210 }
2211 Ok(isl_rs_result)
2212 }
2213
2214 pub fn remove_dims(self, type_: DimType, first: u32, n: u32) -> Result<BasicMap, LibISLError> {
2216 let bmap = self;
2217 let isl_rs_ctx = bmap.get_ctx();
2218 let mut bmap = bmap;
2219 bmap.do_not_free_on_drop();
2220 let bmap = bmap.ptr;
2221 let type_ = type_.to_i32();
2222 let isl_rs_result = unsafe { isl_basic_map_remove_dims(bmap, type_, first, n) };
2223 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2224 should_free_on_drop: true };
2225 let err = isl_rs_ctx.last_error();
2226 if err != Error::None_ {
2227 let err_msg = isl_rs_ctx.last_error_msg();
2228 isl_rs_ctx.reset_error();
2229 return Err(LibISLError::new(err, err_msg));
2230 }
2231 Ok(isl_rs_result)
2232 }
2233
2234 pub fn remove_divs(self) -> Result<BasicMap, LibISLError> {
2236 let bmap = self;
2237 let isl_rs_ctx = bmap.get_ctx();
2238 let mut bmap = bmap;
2239 bmap.do_not_free_on_drop();
2240 let bmap = bmap.ptr;
2241 let isl_rs_result = unsafe { isl_basic_map_remove_divs(bmap) };
2242 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2243 should_free_on_drop: true };
2244 let err = isl_rs_ctx.last_error();
2245 if err != Error::None_ {
2246 let err_msg = isl_rs_ctx.last_error_msg();
2247 isl_rs_ctx.reset_error();
2248 return Err(LibISLError::new(err, err_msg));
2249 }
2250 Ok(isl_rs_result)
2251 }
2252
2253 pub fn remove_divs_involving_dims(self, type_: DimType, first: u32, n: u32)
2255 -> Result<BasicMap, LibISLError> {
2256 let bmap = self;
2257 let isl_rs_ctx = bmap.get_ctx();
2258 let mut bmap = bmap;
2259 bmap.do_not_free_on_drop();
2260 let bmap = bmap.ptr;
2261 let type_ = type_.to_i32();
2262 let isl_rs_result =
2263 unsafe { isl_basic_map_remove_divs_involving_dims(bmap, type_, first, n) };
2264 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2265 should_free_on_drop: true };
2266 let err = isl_rs_ctx.last_error();
2267 if err != Error::None_ {
2268 let err_msg = isl_rs_ctx.last_error_msg();
2269 isl_rs_ctx.reset_error();
2270 return Err(LibISLError::new(err, err_msg));
2271 }
2272 Ok(isl_rs_result)
2273 }
2274
2275 pub fn remove_redundancies(self) -> Result<BasicMap, LibISLError> {
2277 let bmap = self;
2278 let isl_rs_ctx = bmap.get_ctx();
2279 let mut bmap = bmap;
2280 bmap.do_not_free_on_drop();
2281 let bmap = bmap.ptr;
2282 let isl_rs_result = unsafe { isl_basic_map_remove_redundancies(bmap) };
2283 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2284 should_free_on_drop: true };
2285 let err = isl_rs_ctx.last_error();
2286 if err != Error::None_ {
2287 let err_msg = isl_rs_ctx.last_error_msg();
2288 isl_rs_ctx.reset_error();
2289 return Err(LibISLError::new(err, err_msg));
2290 }
2291 Ok(isl_rs_result)
2292 }
2293
2294 pub fn reverse(self) -> Result<BasicMap, LibISLError> {
2296 let bmap = self;
2297 let isl_rs_ctx = bmap.get_ctx();
2298 let mut bmap = bmap;
2299 bmap.do_not_free_on_drop();
2300 let bmap = bmap.ptr;
2301 let isl_rs_result = unsafe { isl_basic_map_reverse(bmap) };
2302 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2303 should_free_on_drop: true };
2304 let err = isl_rs_ctx.last_error();
2305 if err != Error::None_ {
2306 let err_msg = isl_rs_ctx.last_error_msg();
2307 isl_rs_ctx.reset_error();
2308 return Err(LibISLError::new(err, err_msg));
2309 }
2310 Ok(isl_rs_result)
2311 }
2312
2313 pub fn sample(self) -> Result<BasicMap, LibISLError> {
2315 let bmap = self;
2316 let isl_rs_ctx = bmap.get_ctx();
2317 let mut bmap = bmap;
2318 bmap.do_not_free_on_drop();
2319 let bmap = bmap.ptr;
2320 let isl_rs_result = unsafe { isl_basic_map_sample(bmap) };
2321 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2322 should_free_on_drop: true };
2323 let err = isl_rs_ctx.last_error();
2324 if err != Error::None_ {
2325 let err_msg = isl_rs_ctx.last_error_msg();
2326 isl_rs_ctx.reset_error();
2327 return Err(LibISLError::new(err, err_msg));
2328 }
2329 Ok(isl_rs_result)
2330 }
2331
2332 pub fn set_dim_name(self, type_: DimType, pos: u32, s: &str) -> Result<BasicMap, LibISLError> {
2334 let bmap = self;
2335 let isl_rs_ctx = bmap.get_ctx();
2336 let mut bmap = bmap;
2337 bmap.do_not_free_on_drop();
2338 let bmap = bmap.ptr;
2339 let type_ = type_.to_i32();
2340 let s = CString::new(s).unwrap();
2341 let s = s.as_ptr();
2342 let isl_rs_result = unsafe { isl_basic_map_set_dim_name(bmap, type_, pos, s) };
2343 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2344 should_free_on_drop: true };
2345 let err = isl_rs_ctx.last_error();
2346 if err != Error::None_ {
2347 let err_msg = isl_rs_ctx.last_error_msg();
2348 isl_rs_ctx.reset_error();
2349 return Err(LibISLError::new(err, err_msg));
2350 }
2351 Ok(isl_rs_result)
2352 }
2353
2354 pub fn set_tuple_id(self, type_: DimType, id: Id) -> Result<BasicMap, LibISLError> {
2356 let bmap = self;
2357 let isl_rs_ctx = bmap.get_ctx();
2358 let mut bmap = bmap;
2359 bmap.do_not_free_on_drop();
2360 let bmap = bmap.ptr;
2361 let type_ = type_.to_i32();
2362 let mut id = id;
2363 id.do_not_free_on_drop();
2364 let id = id.ptr;
2365 let isl_rs_result = unsafe { isl_basic_map_set_tuple_id(bmap, type_, id) };
2366 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2367 should_free_on_drop: true };
2368 let err = isl_rs_ctx.last_error();
2369 if err != Error::None_ {
2370 let err_msg = isl_rs_ctx.last_error_msg();
2371 isl_rs_ctx.reset_error();
2372 return Err(LibISLError::new(err, err_msg));
2373 }
2374 Ok(isl_rs_result)
2375 }
2376
2377 pub fn set_tuple_name(self, type_: DimType, s: &str) -> Result<BasicMap, LibISLError> {
2379 let bmap = self;
2380 let isl_rs_ctx = bmap.get_ctx();
2381 let mut bmap = bmap;
2382 bmap.do_not_free_on_drop();
2383 let bmap = bmap.ptr;
2384 let type_ = type_.to_i32();
2385 let s = CString::new(s).unwrap();
2386 let s = s.as_ptr();
2387 let isl_rs_result = unsafe { isl_basic_map_set_tuple_name(bmap, type_, s) };
2388 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2389 should_free_on_drop: true };
2390 let err = isl_rs_ctx.last_error();
2391 if err != Error::None_ {
2392 let err_msg = isl_rs_ctx.last_error_msg();
2393 isl_rs_ctx.reset_error();
2394 return Err(LibISLError::new(err, err_msg));
2395 }
2396 Ok(isl_rs_result)
2397 }
2398
2399 pub fn sum(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
2401 let bmap1 = self;
2402 let isl_rs_ctx = bmap1.get_ctx();
2403 let mut bmap1 = bmap1;
2404 bmap1.do_not_free_on_drop();
2405 let bmap1 = bmap1.ptr;
2406 let mut bmap2 = bmap2;
2407 bmap2.do_not_free_on_drop();
2408 let bmap2 = bmap2.ptr;
2409 let isl_rs_result = unsafe { isl_basic_map_sum(bmap1, bmap2) };
2410 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2411 should_free_on_drop: true };
2412 let err = isl_rs_ctx.last_error();
2413 if err != Error::None_ {
2414 let err_msg = isl_rs_ctx.last_error_msg();
2415 isl_rs_ctx.reset_error();
2416 return Err(LibISLError::new(err, err_msg));
2417 }
2418 Ok(isl_rs_result)
2419 }
2420
2421 pub fn to_list(self) -> Result<BasicMapList, LibISLError> {
2423 let el = self;
2424 let isl_rs_ctx = el.get_ctx();
2425 let mut el = el;
2426 el.do_not_free_on_drop();
2427 let el = el.ptr;
2428 let isl_rs_result = unsafe { isl_basic_map_to_list(el) };
2429 let isl_rs_result = BasicMapList { ptr: isl_rs_result,
2430 should_free_on_drop: true };
2431 let err = isl_rs_ctx.last_error();
2432 if err != Error::None_ {
2433 let err_msg = isl_rs_ctx.last_error_msg();
2434 isl_rs_ctx.reset_error();
2435 return Err(LibISLError::new(err, err_msg));
2436 }
2437 Ok(isl_rs_result)
2438 }
2439
2440 pub fn to_str(&self) -> Result<&str, LibISLError> {
2442 let bmap = self;
2443 let isl_rs_ctx = bmap.get_ctx();
2444 let bmap = bmap.ptr;
2445 let isl_rs_result = unsafe { isl_basic_map_to_str(bmap) };
2446 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
2447 let isl_rs_result = isl_rs_result.to_str().unwrap();
2448 let err = isl_rs_ctx.last_error();
2449 if err != Error::None_ {
2450 let err_msg = isl_rs_ctx.last_error_msg();
2451 isl_rs_ctx.reset_error();
2452 return Err(LibISLError::new(err, err_msg));
2453 }
2454 Ok(isl_rs_result)
2455 }
2456
2457 pub fn total_dim(&self) -> Result<i32, LibISLError> {
2459 let bmap = self;
2460 let isl_rs_ctx = bmap.get_ctx();
2461 let bmap = bmap.ptr;
2462 let isl_rs_result = unsafe { isl_basic_map_total_dim(bmap) };
2463 let err = isl_rs_ctx.last_error();
2464 if err != Error::None_ {
2465 let err_msg = isl_rs_ctx.last_error_msg();
2466 isl_rs_ctx.reset_error();
2467 return Err(LibISLError::new(err, err_msg));
2468 }
2469 Ok(isl_rs_result)
2470 }
2471
2472 pub fn uncurry(self) -> Result<BasicMap, LibISLError> {
2474 let bmap = self;
2475 let isl_rs_ctx = bmap.get_ctx();
2476 let mut bmap = bmap;
2477 bmap.do_not_free_on_drop();
2478 let bmap = bmap.ptr;
2479 let isl_rs_result = unsafe { isl_basic_map_uncurry(bmap) };
2480 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2481 should_free_on_drop: true };
2482 let err = isl_rs_ctx.last_error();
2483 if err != Error::None_ {
2484 let err_msg = isl_rs_ctx.last_error_msg();
2485 isl_rs_ctx.reset_error();
2486 return Err(LibISLError::new(err, err_msg));
2487 }
2488 Ok(isl_rs_result)
2489 }
2490
2491 pub fn union(self, bmap2: BasicMap) -> Result<Map, LibISLError> {
2493 let bmap1 = self;
2494 let isl_rs_ctx = bmap1.get_ctx();
2495 let mut bmap1 = bmap1;
2496 bmap1.do_not_free_on_drop();
2497 let bmap1 = bmap1.ptr;
2498 let mut bmap2 = bmap2;
2499 bmap2.do_not_free_on_drop();
2500 let bmap2 = bmap2.ptr;
2501 let isl_rs_result = unsafe { isl_basic_map_union(bmap1, bmap2) };
2502 let isl_rs_result = Map { ptr: isl_rs_result,
2503 should_free_on_drop: true };
2504 let err = isl_rs_ctx.last_error();
2505 if err != Error::None_ {
2506 let err_msg = isl_rs_ctx.last_error_msg();
2507 isl_rs_ctx.reset_error();
2508 return Err(LibISLError::new(err, err_msg));
2509 }
2510 Ok(isl_rs_result)
2511 }
2512
2513 pub fn universe(space: Space) -> Result<BasicMap, LibISLError> {
2515 let isl_rs_ctx = space.get_ctx();
2516 let mut space = space;
2517 space.do_not_free_on_drop();
2518 let space = space.ptr;
2519 let isl_rs_result = unsafe { isl_basic_map_universe(space) };
2520 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2521 should_free_on_drop: true };
2522 let err = isl_rs_ctx.last_error();
2523 if err != Error::None_ {
2524 let err_msg = isl_rs_ctx.last_error_msg();
2525 isl_rs_ctx.reset_error();
2526 return Err(LibISLError::new(err, err_msg));
2527 }
2528 Ok(isl_rs_result)
2529 }
2530
2531 pub fn upper_bound_si(self, type_: DimType, pos: u32, value: i32)
2533 -> Result<BasicMap, LibISLError> {
2534 let bmap = self;
2535 let isl_rs_ctx = bmap.get_ctx();
2536 let mut bmap = bmap;
2537 bmap.do_not_free_on_drop();
2538 let bmap = bmap.ptr;
2539 let type_ = type_.to_i32();
2540 let isl_rs_result = unsafe { isl_basic_map_upper_bound_si(bmap, type_, pos, value) };
2541 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2542 should_free_on_drop: true };
2543 let err = isl_rs_ctx.last_error();
2544 if err != Error::None_ {
2545 let err_msg = isl_rs_ctx.last_error_msg();
2546 isl_rs_ctx.reset_error();
2547 return Err(LibISLError::new(err, err_msg));
2548 }
2549 Ok(isl_rs_result)
2550 }
2551
2552 pub fn wrap(self) -> Result<BasicSet, LibISLError> {
2554 let bmap = self;
2555 let isl_rs_ctx = bmap.get_ctx();
2556 let mut bmap = bmap;
2557 bmap.do_not_free_on_drop();
2558 let bmap = bmap.ptr;
2559 let isl_rs_result = unsafe { isl_basic_map_wrap(bmap) };
2560 let isl_rs_result = BasicSet { ptr: isl_rs_result,
2561 should_free_on_drop: true };
2562 let err = isl_rs_ctx.last_error();
2563 if err != Error::None_ {
2564 let err_msg = isl_rs_ctx.last_error_msg();
2565 isl_rs_ctx.reset_error();
2566 return Err(LibISLError::new(err, err_msg));
2567 }
2568 Ok(isl_rs_result)
2569 }
2570
2571 pub fn zip(self) -> Result<BasicMap, LibISLError> {
2573 let bmap = self;
2574 let isl_rs_ctx = bmap.get_ctx();
2575 let mut bmap = bmap;
2576 bmap.do_not_free_on_drop();
2577 let bmap = bmap.ptr;
2578 let isl_rs_result = unsafe { isl_basic_map_zip(bmap) };
2579 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2580 should_free_on_drop: true };
2581 let err = isl_rs_ctx.last_error();
2582 if err != Error::None_ {
2583 let err_msg = isl_rs_ctx.last_error_msg();
2584 isl_rs_ctx.reset_error();
2585 return Err(LibISLError::new(err, err_msg));
2586 }
2587 Ok(isl_rs_result)
2588 }
2589
2590 pub fn do_not_free_on_drop(&mut self) {
2593 self.should_free_on_drop = false;
2594 }
2595}
2596
2597impl Drop for BasicMap {
2598 fn drop(&mut self) {
2599 if self.should_free_on_drop {
2600 unsafe {
2601 isl_basic_map_free(self.ptr);
2602 }
2603 }
2604 }
2605}