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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
288 }
289 Ok(isl_rs_result)
290 }
291
292 pub fn add_dims(self, type_: DimType, n: u32) -> Result<BasicMap, LibISLError> {
294 let bmap = self;
295 let isl_rs_ctx = bmap.get_ctx();
296 let mut bmap = bmap;
297 bmap.do_not_free_on_drop();
298 let bmap = bmap.ptr;
299 let type_ = type_.to_i32();
300 let isl_rs_result = unsafe { isl_basic_map_add_dims(bmap, type_, n) };
301 let isl_rs_result = BasicMap { ptr: isl_rs_result,
302 should_free_on_drop: true };
303 let err = isl_rs_ctx.last_error();
304 if err != Error::None_ {
305 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
306 }
307 Ok(isl_rs_result)
308 }
309
310 pub fn affine_hull(self) -> Result<BasicMap, LibISLError> {
312 let bmap = self;
313 let isl_rs_ctx = bmap.get_ctx();
314 let mut bmap = bmap;
315 bmap.do_not_free_on_drop();
316 let bmap = bmap.ptr;
317 let isl_rs_result = unsafe { isl_basic_map_affine_hull(bmap) };
318 let isl_rs_result = BasicMap { ptr: isl_rs_result,
319 should_free_on_drop: true };
320 let err = isl_rs_ctx.last_error();
321 if err != Error::None_ {
322 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
323 }
324 Ok(isl_rs_result)
325 }
326
327 pub fn align_params(self, model: Space) -> Result<BasicMap, LibISLError> {
329 let bmap = self;
330 let isl_rs_ctx = bmap.get_ctx();
331 let mut bmap = bmap;
332 bmap.do_not_free_on_drop();
333 let bmap = bmap.ptr;
334 let mut model = model;
335 model.do_not_free_on_drop();
336 let model = model.ptr;
337 let isl_rs_result = unsafe { isl_basic_map_align_params(bmap, model) };
338 let isl_rs_result = BasicMap { ptr: isl_rs_result,
339 should_free_on_drop: true };
340 let err = isl_rs_ctx.last_error();
341 if err != Error::None_ {
342 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
343 }
344 Ok(isl_rs_result)
345 }
346
347 pub fn apply_domain(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
349 let bmap1 = self;
350 let isl_rs_ctx = bmap1.get_ctx();
351 let mut bmap1 = bmap1;
352 bmap1.do_not_free_on_drop();
353 let bmap1 = bmap1.ptr;
354 let mut bmap2 = bmap2;
355 bmap2.do_not_free_on_drop();
356 let bmap2 = bmap2.ptr;
357 let isl_rs_result = unsafe { isl_basic_map_apply_domain(bmap1, bmap2) };
358 let isl_rs_result = BasicMap { ptr: isl_rs_result,
359 should_free_on_drop: true };
360 let err = isl_rs_ctx.last_error();
361 if err != Error::None_ {
362 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
363 }
364 Ok(isl_rs_result)
365 }
366
367 pub fn apply_range(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
369 let bmap1 = self;
370 let isl_rs_ctx = bmap1.get_ctx();
371 let mut bmap1 = bmap1;
372 bmap1.do_not_free_on_drop();
373 let bmap1 = bmap1.ptr;
374 let mut bmap2 = bmap2;
375 bmap2.do_not_free_on_drop();
376 let bmap2 = bmap2.ptr;
377 let isl_rs_result = unsafe { isl_basic_map_apply_range(bmap1, bmap2) };
378 let isl_rs_result = BasicMap { ptr: isl_rs_result,
379 should_free_on_drop: true };
380 let err = isl_rs_ctx.last_error();
381 if err != Error::None_ {
382 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
383 }
384 Ok(isl_rs_result)
385 }
386
387 pub fn can_curry(&self) -> Result<bool, LibISLError> {
389 let bmap = self;
390 let isl_rs_ctx = bmap.get_ctx();
391 let bmap = bmap.ptr;
392 let isl_rs_result = unsafe { isl_basic_map_can_curry(bmap) };
393 let isl_rs_result = match isl_rs_result {
394 0 => false,
395 1 => true,
396 _ => panic!("Got isl_bool = -1"),
397 };
398 let err = isl_rs_ctx.last_error();
399 if err != Error::None_ {
400 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
401 }
402 Ok(isl_rs_result)
403 }
404
405 pub fn can_uncurry(&self) -> Result<bool, LibISLError> {
407 let bmap = self;
408 let isl_rs_ctx = bmap.get_ctx();
409 let bmap = bmap.ptr;
410 let isl_rs_result = unsafe { isl_basic_map_can_uncurry(bmap) };
411 let isl_rs_result = match isl_rs_result {
412 0 => false,
413 1 => true,
414 _ => panic!("Got isl_bool = -1"),
415 };
416 let err = isl_rs_ctx.last_error();
417 if err != Error::None_ {
418 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
419 }
420 Ok(isl_rs_result)
421 }
422
423 pub fn can_zip(&self) -> Result<bool, LibISLError> {
425 let bmap = self;
426 let isl_rs_ctx = bmap.get_ctx();
427 let bmap = bmap.ptr;
428 let isl_rs_result = unsafe { isl_basic_map_can_zip(bmap) };
429 let isl_rs_result = match isl_rs_result {
430 0 => false,
431 1 => true,
432 _ => panic!("Got isl_bool = -1"),
433 };
434 let err = isl_rs_ctx.last_error();
435 if err != Error::None_ {
436 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
437 }
438 Ok(isl_rs_result)
439 }
440
441 pub fn compute_divs(self) -> Result<Map, LibISLError> {
443 let bmap = self;
444 let isl_rs_ctx = bmap.get_ctx();
445 let mut bmap = bmap;
446 bmap.do_not_free_on_drop();
447 let bmap = bmap.ptr;
448 let isl_rs_result = unsafe { isl_basic_map_compute_divs(bmap) };
449 let isl_rs_result = Map { ptr: isl_rs_result,
450 should_free_on_drop: true };
451 let err = isl_rs_ctx.last_error();
452 if err != Error::None_ {
453 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
454 }
455 Ok(isl_rs_result)
456 }
457
458 pub fn copy(&self) -> Result<BasicMap, LibISLError> {
460 let bmap = self;
461 let isl_rs_ctx = bmap.get_ctx();
462 let bmap = bmap.ptr;
463 let isl_rs_result = unsafe { isl_basic_map_copy(bmap) };
464 let isl_rs_result = BasicMap { ptr: isl_rs_result,
465 should_free_on_drop: true };
466 let err = isl_rs_ctx.last_error();
467 if err != Error::None_ {
468 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
469 }
470 Ok(isl_rs_result)
471 }
472
473 pub fn curry(self) -> Result<BasicMap, LibISLError> {
475 let bmap = self;
476 let isl_rs_ctx = bmap.get_ctx();
477 let mut bmap = bmap;
478 bmap.do_not_free_on_drop();
479 let bmap = bmap.ptr;
480 let isl_rs_result = unsafe { isl_basic_map_curry(bmap) };
481 let isl_rs_result = BasicMap { ptr: isl_rs_result,
482 should_free_on_drop: true };
483 let err = isl_rs_ctx.last_error();
484 if err != Error::None_ {
485 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
486 }
487 Ok(isl_rs_result)
488 }
489
490 pub fn deltas(self) -> Result<BasicSet, LibISLError> {
492 let bmap = self;
493 let isl_rs_ctx = bmap.get_ctx();
494 let mut bmap = bmap;
495 bmap.do_not_free_on_drop();
496 let bmap = bmap.ptr;
497 let isl_rs_result = unsafe { isl_basic_map_deltas(bmap) };
498 let isl_rs_result = BasicSet { ptr: isl_rs_result,
499 should_free_on_drop: true };
500 let err = isl_rs_ctx.last_error();
501 if err != Error::None_ {
502 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
503 }
504 Ok(isl_rs_result)
505 }
506
507 pub fn deltas_map(self) -> Result<BasicMap, LibISLError> {
509 let bmap = self;
510 let isl_rs_ctx = bmap.get_ctx();
511 let mut bmap = bmap;
512 bmap.do_not_free_on_drop();
513 let bmap = bmap.ptr;
514 let isl_rs_result = unsafe { isl_basic_map_deltas_map(bmap) };
515 let isl_rs_result = BasicMap { ptr: isl_rs_result,
516 should_free_on_drop: true };
517 let err = isl_rs_ctx.last_error();
518 if err != Error::None_ {
519 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
520 }
521 Ok(isl_rs_result)
522 }
523
524 pub fn detect_equalities(self) -> Result<BasicMap, LibISLError> {
526 let bmap = self;
527 let isl_rs_ctx = bmap.get_ctx();
528 let mut bmap = bmap;
529 bmap.do_not_free_on_drop();
530 let bmap = bmap.ptr;
531 let isl_rs_result = unsafe { isl_basic_map_detect_equalities(bmap) };
532 let isl_rs_result = BasicMap { ptr: isl_rs_result,
533 should_free_on_drop: true };
534 let err = isl_rs_ctx.last_error();
535 if err != Error::None_ {
536 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
537 }
538 Ok(isl_rs_result)
539 }
540
541 pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
543 let bmap = self;
544 let isl_rs_ctx = bmap.get_ctx();
545 let bmap = bmap.ptr;
546 let type_ = type_.to_i32();
547 let isl_rs_result = unsafe { isl_basic_map_dim(bmap, type_) };
548 let err = isl_rs_ctx.last_error();
549 if err != Error::None_ {
550 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
551 }
552 Ok(isl_rs_result)
553 }
554
555 pub fn domain(self) -> Result<BasicSet, LibISLError> {
557 let bmap = self;
558 let isl_rs_ctx = bmap.get_ctx();
559 let mut bmap = bmap;
560 bmap.do_not_free_on_drop();
561 let bmap = bmap.ptr;
562 let isl_rs_result = unsafe { isl_basic_map_domain(bmap) };
563 let isl_rs_result = BasicSet { ptr: isl_rs_result,
564 should_free_on_drop: true };
565 let err = isl_rs_ctx.last_error();
566 if err != Error::None_ {
567 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
568 }
569 Ok(isl_rs_result)
570 }
571
572 pub fn domain_map(self) -> Result<BasicMap, LibISLError> {
574 let bmap = self;
575 let isl_rs_ctx = bmap.get_ctx();
576 let mut bmap = bmap;
577 bmap.do_not_free_on_drop();
578 let bmap = bmap.ptr;
579 let isl_rs_result = unsafe { isl_basic_map_domain_map(bmap) };
580 let isl_rs_result = BasicMap { ptr: isl_rs_result,
581 should_free_on_drop: true };
582 let err = isl_rs_ctx.last_error();
583 if err != Error::None_ {
584 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
585 }
586 Ok(isl_rs_result)
587 }
588
589 pub fn domain_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
591 let bmap1 = self;
592 let isl_rs_ctx = bmap1.get_ctx();
593 let mut bmap1 = bmap1;
594 bmap1.do_not_free_on_drop();
595 let bmap1 = bmap1.ptr;
596 let mut bmap2 = bmap2;
597 bmap2.do_not_free_on_drop();
598 let bmap2 = bmap2.ptr;
599 let isl_rs_result = unsafe { isl_basic_map_domain_product(bmap1, bmap2) };
600 let isl_rs_result = BasicMap { ptr: isl_rs_result,
601 should_free_on_drop: true };
602 let err = isl_rs_ctx.last_error();
603 if err != Error::None_ {
604 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
605 }
606 Ok(isl_rs_result)
607 }
608
609 pub fn drop_constraints_involving_dims(self, type_: DimType, first: u32, n: u32)
611 -> Result<BasicMap, LibISLError> {
612 let bmap = self;
613 let isl_rs_ctx = bmap.get_ctx();
614 let mut bmap = bmap;
615 bmap.do_not_free_on_drop();
616 let bmap = bmap.ptr;
617 let type_ = type_.to_i32();
618 let isl_rs_result =
619 unsafe { isl_basic_map_drop_constraints_involving_dims(bmap, type_, first, n) };
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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
625 }
626 Ok(isl_rs_result)
627 }
628
629 pub fn drop_constraints_not_involving_dims(self, type_: DimType, first: u32, n: u32)
631 -> Result<BasicMap, LibISLError> {
632 let bmap = self;
633 let isl_rs_ctx = bmap.get_ctx();
634 let mut bmap = bmap;
635 bmap.do_not_free_on_drop();
636 let bmap = bmap.ptr;
637 let type_ = type_.to_i32();
638 let isl_rs_result =
639 unsafe { isl_basic_map_drop_constraints_not_involving_dims(bmap, type_, first, n) };
640 let isl_rs_result = BasicMap { ptr: isl_rs_result,
641 should_free_on_drop: true };
642 let err = isl_rs_ctx.last_error();
643 if err != Error::None_ {
644 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
645 }
646 Ok(isl_rs_result)
647 }
648
649 pub fn drop_unused_params(self) -> Result<BasicMap, LibISLError> {
651 let bmap = self;
652 let isl_rs_ctx = bmap.get_ctx();
653 let mut bmap = bmap;
654 bmap.do_not_free_on_drop();
655 let bmap = bmap.ptr;
656 let isl_rs_result = unsafe { isl_basic_map_drop_unused_params(bmap) };
657 let isl_rs_result = BasicMap { ptr: isl_rs_result,
658 should_free_on_drop: true };
659 let err = isl_rs_ctx.last_error();
660 if err != Error::None_ {
661 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
662 }
663 Ok(isl_rs_result)
664 }
665
666 pub fn dump(&self) -> Result<(), LibISLError> {
668 let bmap = self;
669 let isl_rs_ctx = bmap.get_ctx();
670 let bmap = bmap.ptr;
671 let isl_rs_result = unsafe { isl_basic_map_dump(bmap) };
672 let err = isl_rs_ctx.last_error();
673 if err != Error::None_ {
674 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
675 }
676 Ok(isl_rs_result)
677 }
678
679 pub fn eliminate(self, type_: DimType, first: u32, n: u32) -> Result<BasicMap, LibISLError> {
681 let bmap = self;
682 let isl_rs_ctx = bmap.get_ctx();
683 let mut bmap = bmap;
684 bmap.do_not_free_on_drop();
685 let bmap = bmap.ptr;
686 let type_ = type_.to_i32();
687 let isl_rs_result = unsafe { isl_basic_map_eliminate(bmap, type_, first, n) };
688 let isl_rs_result = BasicMap { ptr: isl_rs_result,
689 should_free_on_drop: true };
690 let err = isl_rs_ctx.last_error();
691 if err != Error::None_ {
692 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
693 }
694 Ok(isl_rs_result)
695 }
696
697 pub fn empty(space: Space) -> Result<BasicMap, LibISLError> {
699 let isl_rs_ctx = space.get_ctx();
700 let mut space = space;
701 space.do_not_free_on_drop();
702 let space = space.ptr;
703 let isl_rs_result = unsafe { isl_basic_map_empty(space) };
704 let isl_rs_result = BasicMap { ptr: isl_rs_result,
705 should_free_on_drop: true };
706 let err = isl_rs_ctx.last_error();
707 if err != Error::None_ {
708 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
709 }
710 Ok(isl_rs_result)
711 }
712
713 pub fn equal(space: Space, n_equal: u32) -> Result<BasicMap, LibISLError> {
715 let isl_rs_ctx = space.get_ctx();
716 let mut space = space;
717 space.do_not_free_on_drop();
718 let space = space.ptr;
719 let isl_rs_result = unsafe { isl_basic_map_equal(space, n_equal) };
720 let isl_rs_result = BasicMap { ptr: isl_rs_result,
721 should_free_on_drop: true };
722 let err = isl_rs_ctx.last_error();
723 if err != Error::None_ {
724 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
725 }
726 Ok(isl_rs_result)
727 }
728
729 pub fn equalities_matrix(&self, c1: DimType, c2: DimType, c3: DimType, c4: DimType,
731 c5: DimType)
732 -> Result<Mat, LibISLError> {
733 let bmap = self;
734 let isl_rs_ctx = bmap.get_ctx();
735 let bmap = bmap.ptr;
736 let c1 = c1.to_i32();
737 let c2 = c2.to_i32();
738 let c3 = c3.to_i32();
739 let c4 = c4.to_i32();
740 let c5 = c5.to_i32();
741 let isl_rs_result = unsafe { isl_basic_map_equalities_matrix(bmap, c1, c2, c3, c4, c5) };
742 let isl_rs_result = Mat { ptr: isl_rs_result,
743 should_free_on_drop: true };
744 let err = isl_rs_ctx.last_error();
745 if err != Error::None_ {
746 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
747 }
748 Ok(isl_rs_result)
749 }
750
751 pub fn equate(self, type1: DimType, pos1: i32, type2: DimType, pos2: i32)
753 -> Result<BasicMap, LibISLError> {
754 let bmap = self;
755 let isl_rs_ctx = bmap.get_ctx();
756 let mut bmap = bmap;
757 bmap.do_not_free_on_drop();
758 let bmap = bmap.ptr;
759 let type1 = type1.to_i32();
760 let type2 = type2.to_i32();
761 let isl_rs_result = unsafe { isl_basic_map_equate(bmap, type1, pos1, type2, pos2) };
762 let isl_rs_result = BasicMap { ptr: isl_rs_result,
763 should_free_on_drop: true };
764 let err = isl_rs_ctx.last_error();
765 if err != Error::None_ {
766 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
767 }
768 Ok(isl_rs_result)
769 }
770
771 pub fn find_dim_by_name(&self, type_: DimType, name: &str) -> Result<i32, LibISLError> {
773 let bmap = self;
774 let isl_rs_ctx = bmap.get_ctx();
775 let bmap = bmap.ptr;
776 let type_ = type_.to_i32();
777 let name = CString::new(name).unwrap();
778 let name = name.as_ptr();
779 let isl_rs_result = unsafe { isl_basic_map_find_dim_by_name(bmap, type_, name) };
780 let err = isl_rs_ctx.last_error();
781 if err != Error::None_ {
782 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
783 }
784 Ok(isl_rs_result)
785 }
786
787 pub fn fix_si(self, type_: DimType, pos: u32, value: i32) -> Result<BasicMap, LibISLError> {
789 let bmap = self;
790 let isl_rs_ctx = bmap.get_ctx();
791 let mut bmap = bmap;
792 bmap.do_not_free_on_drop();
793 let bmap = bmap.ptr;
794 let type_ = type_.to_i32();
795 let isl_rs_result = unsafe { isl_basic_map_fix_si(bmap, type_, pos, value) };
796 let isl_rs_result = BasicMap { ptr: isl_rs_result,
797 should_free_on_drop: true };
798 let err = isl_rs_ctx.last_error();
799 if err != Error::None_ {
800 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
801 }
802 Ok(isl_rs_result)
803 }
804
805 pub fn fix_val(self, type_: DimType, pos: u32, v: Val) -> Result<BasicMap, LibISLError> {
807 let bmap = self;
808 let isl_rs_ctx = bmap.get_ctx();
809 let mut bmap = bmap;
810 bmap.do_not_free_on_drop();
811 let bmap = bmap.ptr;
812 let type_ = type_.to_i32();
813 let mut v = v;
814 v.do_not_free_on_drop();
815 let v = v.ptr;
816 let isl_rs_result = unsafe { isl_basic_map_fix_val(bmap, type_, pos, v) };
817 let isl_rs_result = BasicMap { ptr: isl_rs_result,
818 should_free_on_drop: true };
819 let err = isl_rs_ctx.last_error();
820 if err != Error::None_ {
821 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
822 }
823 Ok(isl_rs_result)
824 }
825
826 pub fn flat_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
828 let bmap1 = self;
829 let isl_rs_ctx = bmap1.get_ctx();
830 let mut bmap1 = bmap1;
831 bmap1.do_not_free_on_drop();
832 let bmap1 = bmap1.ptr;
833 let mut bmap2 = bmap2;
834 bmap2.do_not_free_on_drop();
835 let bmap2 = bmap2.ptr;
836 let isl_rs_result = unsafe { isl_basic_map_flat_product(bmap1, bmap2) };
837 let isl_rs_result = BasicMap { ptr: isl_rs_result,
838 should_free_on_drop: true };
839 let err = isl_rs_ctx.last_error();
840 if err != Error::None_ {
841 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
842 }
843 Ok(isl_rs_result)
844 }
845
846 pub fn flat_range_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
848 let bmap1 = self;
849 let isl_rs_ctx = bmap1.get_ctx();
850 let mut bmap1 = bmap1;
851 bmap1.do_not_free_on_drop();
852 let bmap1 = bmap1.ptr;
853 let mut bmap2 = bmap2;
854 bmap2.do_not_free_on_drop();
855 let bmap2 = bmap2.ptr;
856 let isl_rs_result = unsafe { isl_basic_map_flat_range_product(bmap1, bmap2) };
857 let isl_rs_result = BasicMap { ptr: isl_rs_result,
858 should_free_on_drop: true };
859 let err = isl_rs_ctx.last_error();
860 if err != Error::None_ {
861 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
862 }
863 Ok(isl_rs_result)
864 }
865
866 pub fn flatten(self) -> Result<BasicMap, LibISLError> {
868 let bmap = self;
869 let isl_rs_ctx = bmap.get_ctx();
870 let mut bmap = bmap;
871 bmap.do_not_free_on_drop();
872 let bmap = bmap.ptr;
873 let isl_rs_result = unsafe { isl_basic_map_flatten(bmap) };
874 let isl_rs_result = BasicMap { ptr: isl_rs_result,
875 should_free_on_drop: true };
876 let err = isl_rs_ctx.last_error();
877 if err != Error::None_ {
878 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
879 }
880 Ok(isl_rs_result)
881 }
882
883 pub fn flatten_domain(self) -> Result<BasicMap, LibISLError> {
885 let bmap = self;
886 let isl_rs_ctx = bmap.get_ctx();
887 let mut bmap = bmap;
888 bmap.do_not_free_on_drop();
889 let bmap = bmap.ptr;
890 let isl_rs_result = unsafe { isl_basic_map_flatten_domain(bmap) };
891 let isl_rs_result = BasicMap { ptr: isl_rs_result,
892 should_free_on_drop: true };
893 let err = isl_rs_ctx.last_error();
894 if err != Error::None_ {
895 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
896 }
897 Ok(isl_rs_result)
898 }
899
900 pub fn flatten_range(self) -> Result<BasicMap, LibISLError> {
902 let bmap = self;
903 let isl_rs_ctx = bmap.get_ctx();
904 let mut bmap = bmap;
905 bmap.do_not_free_on_drop();
906 let bmap = bmap.ptr;
907 let isl_rs_result = unsafe { isl_basic_map_flatten_range(bmap) };
908 let isl_rs_result = BasicMap { ptr: isl_rs_result,
909 should_free_on_drop: true };
910 let err = isl_rs_ctx.last_error();
911 if err != Error::None_ {
912 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
913 }
914 Ok(isl_rs_result)
915 }
916
917 pub fn free(self) -> Result<BasicMap, LibISLError> {
919 let bmap = self;
920 let isl_rs_ctx = bmap.get_ctx();
921 let mut bmap = bmap;
922 bmap.do_not_free_on_drop();
923 let bmap = bmap.ptr;
924 let isl_rs_result = unsafe { isl_basic_map_free(bmap) };
925 let isl_rs_result = BasicMap { ptr: isl_rs_result,
926 should_free_on_drop: true };
927 let err = isl_rs_ctx.last_error();
928 if err != Error::None_ {
929 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
930 }
931 Ok(isl_rs_result)
932 }
933
934 pub fn from_aff(aff: Aff) -> Result<BasicMap, LibISLError> {
936 let isl_rs_ctx = aff.get_ctx();
937 let mut aff = aff;
938 aff.do_not_free_on_drop();
939 let aff = aff.ptr;
940 let isl_rs_result = unsafe { isl_basic_map_from_aff(aff) };
941 let isl_rs_result = BasicMap { ptr: isl_rs_result,
942 should_free_on_drop: true };
943 let err = isl_rs_ctx.last_error();
944 if err != Error::None_ {
945 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
946 }
947 Ok(isl_rs_result)
948 }
949
950 pub fn from_aff_list(domain_space: Space, list: AffList) -> Result<BasicMap, LibISLError> {
952 let isl_rs_ctx = domain_space.get_ctx();
953 let mut domain_space = domain_space;
954 domain_space.do_not_free_on_drop();
955 let domain_space = domain_space.ptr;
956 let mut list = list;
957 list.do_not_free_on_drop();
958 let list = list.ptr;
959 let isl_rs_result = unsafe { isl_basic_map_from_aff_list(domain_space, list) };
960 let isl_rs_result = BasicMap { ptr: isl_rs_result,
961 should_free_on_drop: true };
962 let err = isl_rs_ctx.last_error();
963 if err != Error::None_ {
964 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
965 }
966 Ok(isl_rs_result)
967 }
968
969 pub fn from_constraint(constraint: Constraint) -> Result<BasicMap, LibISLError> {
971 let isl_rs_ctx = constraint.get_ctx();
972 let mut constraint = constraint;
973 constraint.do_not_free_on_drop();
974 let constraint = constraint.ptr;
975 let isl_rs_result = unsafe { isl_basic_map_from_constraint(constraint) };
976 let isl_rs_result = BasicMap { ptr: isl_rs_result,
977 should_free_on_drop: true };
978 let err = isl_rs_ctx.last_error();
979 if err != Error::None_ {
980 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
981 }
982 Ok(isl_rs_result)
983 }
984
985 pub fn from_constraint_matrices(space: Space, eq: Mat, ineq: Mat, c1: DimType, c2: DimType,
987 c3: DimType, c4: DimType, c5: DimType)
988 -> Result<BasicMap, LibISLError> {
989 let isl_rs_ctx = space.get_ctx();
990 let mut space = space;
991 space.do_not_free_on_drop();
992 let space = space.ptr;
993 let mut eq = eq;
994 eq.do_not_free_on_drop();
995 let eq = eq.ptr;
996 let mut ineq = ineq;
997 ineq.do_not_free_on_drop();
998 let ineq = ineq.ptr;
999 let c1 = c1.to_i32();
1000 let c2 = c2.to_i32();
1001 let c3 = c3.to_i32();
1002 let c4 = c4.to_i32();
1003 let c5 = c5.to_i32();
1004 let isl_rs_result =
1005 unsafe { isl_basic_map_from_constraint_matrices(space, eq, ineq, c1, c2, c3, c4, c5) };
1006 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1007 should_free_on_drop: true };
1008 let err = isl_rs_ctx.last_error();
1009 if err != Error::None_ {
1010 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1011 }
1012 Ok(isl_rs_result)
1013 }
1014
1015 pub fn from_domain(bset: BasicSet) -> Result<BasicMap, LibISLError> {
1017 let isl_rs_ctx = bset.get_ctx();
1018 let mut bset = bset;
1019 bset.do_not_free_on_drop();
1020 let bset = bset.ptr;
1021 let isl_rs_result = unsafe { isl_basic_map_from_domain(bset) };
1022 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1023 should_free_on_drop: true };
1024 let err = isl_rs_ctx.last_error();
1025 if err != Error::None_ {
1026 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1027 }
1028 Ok(isl_rs_result)
1029 }
1030
1031 pub fn from_domain_and_range(domain: BasicSet, range: BasicSet)
1033 -> Result<BasicMap, LibISLError> {
1034 let isl_rs_ctx = domain.get_ctx();
1035 let mut domain = domain;
1036 domain.do_not_free_on_drop();
1037 let domain = domain.ptr;
1038 let mut range = range;
1039 range.do_not_free_on_drop();
1040 let range = range.ptr;
1041 let isl_rs_result = unsafe { isl_basic_map_from_domain_and_range(domain, range) };
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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1047 }
1048 Ok(isl_rs_result)
1049 }
1050
1051 pub fn from_multi_aff(maff: MultiAff) -> Result<BasicMap, LibISLError> {
1053 let isl_rs_ctx = maff.get_ctx();
1054 let mut maff = maff;
1055 maff.do_not_free_on_drop();
1056 let maff = maff.ptr;
1057 let isl_rs_result = unsafe { isl_basic_map_from_multi_aff(maff) };
1058 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1059 should_free_on_drop: true };
1060 let err = isl_rs_ctx.last_error();
1061 if err != Error::None_ {
1062 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1063 }
1064 Ok(isl_rs_result)
1065 }
1066
1067 pub fn from_qpolynomial(qp: QPolynomial) -> Result<BasicMap, LibISLError> {
1069 let isl_rs_ctx = qp.get_ctx();
1070 let mut qp = qp;
1071 qp.do_not_free_on_drop();
1072 let qp = qp.ptr;
1073 let isl_rs_result = unsafe { isl_basic_map_from_qpolynomial(qp) };
1074 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1075 should_free_on_drop: true };
1076 let err = isl_rs_ctx.last_error();
1077 if err != Error::None_ {
1078 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1079 }
1080 Ok(isl_rs_result)
1081 }
1082
1083 pub fn from_range(bset: BasicSet) -> Result<BasicMap, LibISLError> {
1085 let isl_rs_ctx = bset.get_ctx();
1086 let mut bset = bset;
1087 bset.do_not_free_on_drop();
1088 let bset = bset.ptr;
1089 let isl_rs_result = unsafe { isl_basic_map_from_range(bset) };
1090 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1091 should_free_on_drop: true };
1092 let err = isl_rs_ctx.last_error();
1093 if err != Error::None_ {
1094 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1095 }
1096 Ok(isl_rs_result)
1097 }
1098
1099 pub fn get_constraint_list(&self) -> Result<ConstraintList, LibISLError> {
1101 let bmap = self;
1102 let isl_rs_ctx = bmap.get_ctx();
1103 let bmap = bmap.ptr;
1104 let isl_rs_result = unsafe { isl_basic_map_get_constraint_list(bmap) };
1105 let isl_rs_result = ConstraintList { ptr: isl_rs_result,
1106 should_free_on_drop: true };
1107 let err = isl_rs_ctx.last_error();
1108 if err != Error::None_ {
1109 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1110 }
1111 Ok(isl_rs_result)
1112 }
1113
1114 pub fn get_ctx(&self) -> Context {
1116 let bmap = self;
1117 let bmap = bmap.ptr;
1118 let isl_rs_result = unsafe { isl_basic_map_get_ctx(bmap) };
1119 let isl_rs_result = Context { ptr: isl_rs_result,
1120 should_free_on_drop: false };
1121 isl_rs_result
1122 }
1123
1124 pub fn get_dim_name(&self, type_: DimType, pos: u32) -> Result<&str, LibISLError> {
1126 let bmap = self;
1127 let isl_rs_ctx = bmap.get_ctx();
1128 let bmap = bmap.ptr;
1129 let type_ = type_.to_i32();
1130 let isl_rs_result = unsafe { isl_basic_map_get_dim_name(bmap, type_, pos) };
1131 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1132 let isl_rs_result = isl_rs_result.to_str().unwrap();
1133 let err = isl_rs_ctx.last_error();
1134 if err != Error::None_ {
1135 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1136 }
1137 Ok(isl_rs_result)
1138 }
1139
1140 pub fn get_div(&self, pos: i32) -> Result<Aff, LibISLError> {
1142 let bmap = self;
1143 let isl_rs_ctx = bmap.get_ctx();
1144 let bmap = bmap.ptr;
1145 let isl_rs_result = unsafe { isl_basic_map_get_div(bmap, pos) };
1146 let isl_rs_result = Aff { ptr: isl_rs_result,
1147 should_free_on_drop: true };
1148 let err = isl_rs_ctx.last_error();
1149 if err != Error::None_ {
1150 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1151 }
1152 Ok(isl_rs_result)
1153 }
1154
1155 pub fn get_local_space(&self) -> Result<LocalSpace, LibISLError> {
1157 let bmap = self;
1158 let isl_rs_ctx = bmap.get_ctx();
1159 let bmap = bmap.ptr;
1160 let isl_rs_result = unsafe { isl_basic_map_get_local_space(bmap) };
1161 let isl_rs_result = LocalSpace { ptr: isl_rs_result,
1162 should_free_on_drop: true };
1163 let err = isl_rs_ctx.last_error();
1164 if err != Error::None_ {
1165 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1166 }
1167 Ok(isl_rs_result)
1168 }
1169
1170 pub fn get_space(&self) -> Result<Space, LibISLError> {
1172 let bmap = self;
1173 let isl_rs_ctx = bmap.get_ctx();
1174 let bmap = bmap.ptr;
1175 let isl_rs_result = unsafe { isl_basic_map_get_space(bmap) };
1176 let isl_rs_result = Space { ptr: isl_rs_result,
1177 should_free_on_drop: true };
1178 let err = isl_rs_ctx.last_error();
1179 if err != Error::None_ {
1180 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1181 }
1182 Ok(isl_rs_result)
1183 }
1184
1185 pub fn get_tuple_name(&self, type_: DimType) -> Result<&str, LibISLError> {
1187 let bmap = self;
1188 let isl_rs_ctx = bmap.get_ctx();
1189 let bmap = bmap.ptr;
1190 let type_ = type_.to_i32();
1191 let isl_rs_result = unsafe { isl_basic_map_get_tuple_name(bmap, type_) };
1192 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1193 let isl_rs_result = isl_rs_result.to_str().unwrap();
1194 let err = isl_rs_ctx.last_error();
1195 if err != Error::None_ {
1196 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1197 }
1198 Ok(isl_rs_result)
1199 }
1200
1201 pub fn gist(self, context: BasicMap) -> Result<BasicMap, LibISLError> {
1203 let bmap = self;
1204 let isl_rs_ctx = bmap.get_ctx();
1205 let mut bmap = bmap;
1206 bmap.do_not_free_on_drop();
1207 let bmap = bmap.ptr;
1208 let mut context = context;
1209 context.do_not_free_on_drop();
1210 let context = context.ptr;
1211 let isl_rs_result = unsafe { isl_basic_map_gist(bmap, context) };
1212 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1213 should_free_on_drop: true };
1214 let err = isl_rs_ctx.last_error();
1215 if err != Error::None_ {
1216 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1217 }
1218 Ok(isl_rs_result)
1219 }
1220
1221 pub fn gist_domain(self, context: BasicSet) -> Result<BasicMap, LibISLError> {
1223 let bmap = self;
1224 let isl_rs_ctx = bmap.get_ctx();
1225 let mut bmap = bmap;
1226 bmap.do_not_free_on_drop();
1227 let bmap = bmap.ptr;
1228 let mut context = context;
1229 context.do_not_free_on_drop();
1230 let context = context.ptr;
1231 let isl_rs_result = unsafe { isl_basic_map_gist_domain(bmap, context) };
1232 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1233 should_free_on_drop: true };
1234 let err = isl_rs_ctx.last_error();
1235 if err != Error::None_ {
1236 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1237 }
1238 Ok(isl_rs_result)
1239 }
1240
1241 pub fn has_dim_id(&self, type_: DimType, pos: u32) -> Result<bool, LibISLError> {
1243 let bmap = self;
1244 let isl_rs_ctx = bmap.get_ctx();
1245 let bmap = bmap.ptr;
1246 let type_ = type_.to_i32();
1247 let isl_rs_result = unsafe { isl_basic_map_has_dim_id(bmap, type_, pos) };
1248 let isl_rs_result = match isl_rs_result {
1249 0 => false,
1250 1 => true,
1251 _ => panic!("Got isl_bool = -1"),
1252 };
1253 let err = isl_rs_ctx.last_error();
1254 if err != Error::None_ {
1255 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1256 }
1257 Ok(isl_rs_result)
1258 }
1259
1260 pub fn identity(space: Space) -> Result<BasicMap, LibISLError> {
1262 let isl_rs_ctx = space.get_ctx();
1263 let mut space = space;
1264 space.do_not_free_on_drop();
1265 let space = space.ptr;
1266 let isl_rs_result = unsafe { isl_basic_map_identity(space) };
1267 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1268 should_free_on_drop: true };
1269 let err = isl_rs_ctx.last_error();
1270 if err != Error::None_ {
1271 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1272 }
1273 Ok(isl_rs_result)
1274 }
1275
1276 pub fn image_is_bounded(&self) -> Result<bool, 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_image_is_bounded(bmap) };
1282 let isl_rs_result = match isl_rs_result {
1283 0 => false,
1284 1 => true,
1285 _ => panic!("Got isl_bool = -1"),
1286 };
1287 let err = isl_rs_ctx.last_error();
1288 if err != Error::None_ {
1289 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1290 }
1291 Ok(isl_rs_result)
1292 }
1293
1294 pub fn inequalities_matrix(&self, c1: DimType, c2: DimType, c3: DimType, c4: DimType,
1296 c5: DimType)
1297 -> Result<Mat, LibISLError> {
1298 let bmap = self;
1299 let isl_rs_ctx = bmap.get_ctx();
1300 let bmap = bmap.ptr;
1301 let c1 = c1.to_i32();
1302 let c2 = c2.to_i32();
1303 let c3 = c3.to_i32();
1304 let c4 = c4.to_i32();
1305 let c5 = c5.to_i32();
1306 let isl_rs_result = unsafe { isl_basic_map_inequalities_matrix(bmap, c1, c2, c3, c4, c5) };
1307 let isl_rs_result = Mat { ptr: isl_rs_result,
1308 should_free_on_drop: true };
1309 let err = isl_rs_ctx.last_error();
1310 if err != Error::None_ {
1311 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1312 }
1313 Ok(isl_rs_result)
1314 }
1315
1316 pub fn insert_dims(self, type_: DimType, pos: u32, n: u32) -> Result<BasicMap, LibISLError> {
1318 let bmap = self;
1319 let isl_rs_ctx = bmap.get_ctx();
1320 let mut bmap = bmap;
1321 bmap.do_not_free_on_drop();
1322 let bmap = bmap.ptr;
1323 let type_ = type_.to_i32();
1324 let isl_rs_result = unsafe { isl_basic_map_insert_dims(bmap, type_, pos, n) };
1325 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1326 should_free_on_drop: true };
1327 let err = isl_rs_ctx.last_error();
1328 if err != Error::None_ {
1329 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1330 }
1331 Ok(isl_rs_result)
1332 }
1333
1334 pub fn intersect(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
1336 let bmap1 = self;
1337 let isl_rs_ctx = bmap1.get_ctx();
1338 let mut bmap1 = bmap1;
1339 bmap1.do_not_free_on_drop();
1340 let bmap1 = bmap1.ptr;
1341 let mut bmap2 = bmap2;
1342 bmap2.do_not_free_on_drop();
1343 let bmap2 = bmap2.ptr;
1344 let isl_rs_result = unsafe { isl_basic_map_intersect(bmap1, bmap2) };
1345 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1346 should_free_on_drop: true };
1347 let err = isl_rs_ctx.last_error();
1348 if err != Error::None_ {
1349 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1350 }
1351 Ok(isl_rs_result)
1352 }
1353
1354 pub fn intersect_domain(self, bset: BasicSet) -> Result<BasicMap, LibISLError> {
1356 let bmap = self;
1357 let isl_rs_ctx = bmap.get_ctx();
1358 let mut bmap = bmap;
1359 bmap.do_not_free_on_drop();
1360 let bmap = bmap.ptr;
1361 let mut bset = bset;
1362 bset.do_not_free_on_drop();
1363 let bset = bset.ptr;
1364 let isl_rs_result = unsafe { isl_basic_map_intersect_domain(bmap, bset) };
1365 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1366 should_free_on_drop: true };
1367 let err = isl_rs_ctx.last_error();
1368 if err != Error::None_ {
1369 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1370 }
1371 Ok(isl_rs_result)
1372 }
1373
1374 pub fn intersect_params(self, bset: BasicSet) -> Result<BasicMap, LibISLError> {
1376 let bmap = self;
1377 let isl_rs_ctx = bmap.get_ctx();
1378 let mut bmap = bmap;
1379 bmap.do_not_free_on_drop();
1380 let bmap = bmap.ptr;
1381 let mut bset = bset;
1382 bset.do_not_free_on_drop();
1383 let bset = bset.ptr;
1384 let isl_rs_result = unsafe { isl_basic_map_intersect_params(bmap, bset) };
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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1390 }
1391 Ok(isl_rs_result)
1392 }
1393
1394 pub fn intersect_range(self, bset: BasicSet) -> Result<BasicMap, LibISLError> {
1396 let bmap = self;
1397 let isl_rs_ctx = bmap.get_ctx();
1398 let mut bmap = bmap;
1399 bmap.do_not_free_on_drop();
1400 let bmap = bmap.ptr;
1401 let mut bset = bset;
1402 bset.do_not_free_on_drop();
1403 let bset = bset.ptr;
1404 let isl_rs_result = unsafe { isl_basic_map_intersect_range(bmap, bset) };
1405 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1406 should_free_on_drop: true };
1407 let err = isl_rs_ctx.last_error();
1408 if err != Error::None_ {
1409 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1410 }
1411 Ok(isl_rs_result)
1412 }
1413
1414 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
1416 let bmap = self;
1417 let isl_rs_ctx = bmap.get_ctx();
1418 let bmap = bmap.ptr;
1419 let type_ = type_.to_i32();
1420 let isl_rs_result = unsafe { isl_basic_map_involves_dims(bmap, type_, first, n) };
1421 let isl_rs_result = match isl_rs_result {
1422 0 => false,
1423 1 => true,
1424 _ => panic!("Got isl_bool = -1"),
1425 };
1426 let err = isl_rs_ctx.last_error();
1427 if err != Error::None_ {
1428 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1429 }
1430 Ok(isl_rs_result)
1431 }
1432
1433 pub fn is_disjoint(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1435 let bmap1 = self;
1436 let isl_rs_ctx = bmap1.get_ctx();
1437 let bmap1 = bmap1.ptr;
1438 let bmap2 = bmap2.ptr;
1439 let isl_rs_result = unsafe { isl_basic_map_is_disjoint(bmap1, bmap2) };
1440 let isl_rs_result = match isl_rs_result {
1441 0 => false,
1442 1 => true,
1443 _ => panic!("Got isl_bool = -1"),
1444 };
1445 let err = isl_rs_ctx.last_error();
1446 if err != Error::None_ {
1447 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1448 }
1449 Ok(isl_rs_result)
1450 }
1451
1452 pub fn is_empty(&self) -> Result<bool, LibISLError> {
1454 let bmap = self;
1455 let isl_rs_ctx = bmap.get_ctx();
1456 let bmap = bmap.ptr;
1457 let isl_rs_result = unsafe { isl_basic_map_is_empty(bmap) };
1458 let isl_rs_result = match isl_rs_result {
1459 0 => false,
1460 1 => true,
1461 _ => panic!("Got isl_bool = -1"),
1462 };
1463 let err = isl_rs_ctx.last_error();
1464 if err != Error::None_ {
1465 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1466 }
1467 Ok(isl_rs_result)
1468 }
1469
1470 pub fn is_equal(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1472 let bmap1 = self;
1473 let isl_rs_ctx = bmap1.get_ctx();
1474 let bmap1 = bmap1.ptr;
1475 let bmap2 = bmap2.ptr;
1476 let isl_rs_result = unsafe { isl_basic_map_is_equal(bmap1, bmap2) };
1477 let isl_rs_result = match isl_rs_result {
1478 0 => false,
1479 1 => true,
1480 _ => panic!("Got isl_bool = -1"),
1481 };
1482 let err = isl_rs_ctx.last_error();
1483 if err != Error::None_ {
1484 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1485 }
1486 Ok(isl_rs_result)
1487 }
1488
1489 pub fn is_rational(&self) -> Result<bool, LibISLError> {
1491 let bmap = self;
1492 let isl_rs_ctx = bmap.get_ctx();
1493 let bmap = bmap.ptr;
1494 let isl_rs_result = unsafe { isl_basic_map_is_rational(bmap) };
1495 let isl_rs_result = match isl_rs_result {
1496 0 => false,
1497 1 => true,
1498 _ => panic!("Got isl_bool = -1"),
1499 };
1500 let err = isl_rs_ctx.last_error();
1501 if err != Error::None_ {
1502 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1503 }
1504 Ok(isl_rs_result)
1505 }
1506
1507 pub fn is_single_valued(&self) -> Result<bool, LibISLError> {
1509 let bmap = self;
1510 let isl_rs_ctx = bmap.get_ctx();
1511 let bmap = bmap.ptr;
1512 let isl_rs_result = unsafe { isl_basic_map_is_single_valued(bmap) };
1513 let isl_rs_result = match isl_rs_result {
1514 0 => false,
1515 1 => true,
1516 _ => panic!("Got isl_bool = -1"),
1517 };
1518 let err = isl_rs_ctx.last_error();
1519 if err != Error::None_ {
1520 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1521 }
1522 Ok(isl_rs_result)
1523 }
1524
1525 pub fn is_strict_subset(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1527 let bmap1 = self;
1528 let isl_rs_ctx = bmap1.get_ctx();
1529 let bmap1 = bmap1.ptr;
1530 let bmap2 = bmap2.ptr;
1531 let isl_rs_result = unsafe { isl_basic_map_is_strict_subset(bmap1, bmap2) };
1532 let isl_rs_result = match isl_rs_result {
1533 0 => false,
1534 1 => true,
1535 _ => panic!("Got isl_bool = -1"),
1536 };
1537 let err = isl_rs_ctx.last_error();
1538 if err != Error::None_ {
1539 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1540 }
1541 Ok(isl_rs_result)
1542 }
1543
1544 pub fn is_subset(&self, bmap2: &BasicMap) -> Result<bool, LibISLError> {
1546 let bmap1 = self;
1547 let isl_rs_ctx = bmap1.get_ctx();
1548 let bmap1 = bmap1.ptr;
1549 let bmap2 = bmap2.ptr;
1550 let isl_rs_result = unsafe { isl_basic_map_is_subset(bmap1, bmap2) };
1551 let isl_rs_result = match isl_rs_result {
1552 0 => false,
1553 1 => true,
1554 _ => panic!("Got isl_bool = -1"),
1555 };
1556 let err = isl_rs_ctx.last_error();
1557 if err != Error::None_ {
1558 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1559 }
1560 Ok(isl_rs_result)
1561 }
1562
1563 pub fn is_universe(&self) -> Result<bool, LibISLError> {
1565 let bmap = self;
1566 let isl_rs_ctx = bmap.get_ctx();
1567 let bmap = bmap.ptr;
1568 let isl_rs_result = unsafe { isl_basic_map_is_universe(bmap) };
1569 let isl_rs_result = match isl_rs_result {
1570 0 => false,
1571 1 => true,
1572 _ => panic!("Got isl_bool = -1"),
1573 };
1574 let err = isl_rs_ctx.last_error();
1575 if err != Error::None_ {
1576 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1577 }
1578 Ok(isl_rs_result)
1579 }
1580
1581 pub fn less_at(space: Space, pos: u32) -> Result<BasicMap, LibISLError> {
1583 let isl_rs_ctx = space.get_ctx();
1584 let mut space = space;
1585 space.do_not_free_on_drop();
1586 let space = space.ptr;
1587 let isl_rs_result = unsafe { isl_basic_map_less_at(space, pos) };
1588 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1589 should_free_on_drop: true };
1590 let err = isl_rs_ctx.last_error();
1591 if err != Error::None_ {
1592 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1593 }
1594 Ok(isl_rs_result)
1595 }
1596
1597 pub fn lexmax(self) -> Result<Map, LibISLError> {
1599 let bmap = self;
1600 let isl_rs_ctx = bmap.get_ctx();
1601 let mut bmap = bmap;
1602 bmap.do_not_free_on_drop();
1603 let bmap = bmap.ptr;
1604 let isl_rs_result = unsafe { isl_basic_map_lexmax(bmap) };
1605 let isl_rs_result = Map { ptr: isl_rs_result,
1606 should_free_on_drop: true };
1607 let err = isl_rs_ctx.last_error();
1608 if err != Error::None_ {
1609 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1610 }
1611 Ok(isl_rs_result)
1612 }
1613
1614 pub fn lexmin(self) -> Result<Map, LibISLError> {
1616 let bmap = self;
1617 let isl_rs_ctx = bmap.get_ctx();
1618 let mut bmap = bmap;
1619 bmap.do_not_free_on_drop();
1620 let bmap = bmap.ptr;
1621 let isl_rs_result = unsafe { isl_basic_map_lexmin(bmap) };
1622 let isl_rs_result = Map { ptr: isl_rs_result,
1623 should_free_on_drop: true };
1624 let err = isl_rs_ctx.last_error();
1625 if err != Error::None_ {
1626 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1627 }
1628 Ok(isl_rs_result)
1629 }
1630
1631 pub fn lexmin_pw_multi_aff(self) -> Result<PwMultiAff, LibISLError> {
1633 let bmap = self;
1634 let isl_rs_ctx = bmap.get_ctx();
1635 let mut bmap = bmap;
1636 bmap.do_not_free_on_drop();
1637 let bmap = bmap.ptr;
1638 let isl_rs_result = unsafe { isl_basic_map_lexmin_pw_multi_aff(bmap) };
1639 let isl_rs_result = PwMultiAff { ptr: isl_rs_result,
1640 should_free_on_drop: true };
1641 let err = isl_rs_ctx.last_error();
1642 if err != Error::None_ {
1643 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1644 }
1645 Ok(isl_rs_result)
1646 }
1647
1648 pub fn lower_bound_si(self, type_: DimType, pos: u32, value: i32)
1650 -> Result<BasicMap, LibISLError> {
1651 let bmap = self;
1652 let isl_rs_ctx = bmap.get_ctx();
1653 let mut bmap = bmap;
1654 bmap.do_not_free_on_drop();
1655 let bmap = bmap.ptr;
1656 let type_ = type_.to_i32();
1657 let isl_rs_result = unsafe { isl_basic_map_lower_bound_si(bmap, type_, pos, value) };
1658 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1659 should_free_on_drop: true };
1660 let err = isl_rs_ctx.last_error();
1661 if err != Error::None_ {
1662 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1663 }
1664 Ok(isl_rs_result)
1665 }
1666
1667 pub fn more_at(space: Space, pos: u32) -> Result<BasicMap, LibISLError> {
1669 let isl_rs_ctx = space.get_ctx();
1670 let mut space = space;
1671 space.do_not_free_on_drop();
1672 let space = space.ptr;
1673 let isl_rs_result = unsafe { isl_basic_map_more_at(space, pos) };
1674 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1675 should_free_on_drop: true };
1676 let err = isl_rs_ctx.last_error();
1677 if err != Error::None_ {
1678 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1679 }
1680 Ok(isl_rs_result)
1681 }
1682
1683 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
1685 n: u32)
1686 -> Result<BasicMap, LibISLError> {
1687 let bmap = self;
1688 let isl_rs_ctx = bmap.get_ctx();
1689 let mut bmap = bmap;
1690 bmap.do_not_free_on_drop();
1691 let bmap = bmap.ptr;
1692 let dst_type = dst_type.to_i32();
1693 let src_type = src_type.to_i32();
1694 let isl_rs_result =
1695 unsafe { isl_basic_map_move_dims(bmap, dst_type, dst_pos, src_type, src_pos, n) };
1696 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1697 should_free_on_drop: true };
1698 let err = isl_rs_ctx.last_error();
1699 if err != Error::None_ {
1700 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1701 }
1702 Ok(isl_rs_result)
1703 }
1704
1705 pub fn n_constraint(&self) -> Result<i32, LibISLError> {
1707 let bmap = self;
1708 let isl_rs_ctx = bmap.get_ctx();
1709 let bmap = bmap.ptr;
1710 let isl_rs_result = unsafe { isl_basic_map_n_constraint(bmap) };
1711 let err = isl_rs_ctx.last_error();
1712 if err != Error::None_ {
1713 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1714 }
1715 Ok(isl_rs_result)
1716 }
1717
1718 pub fn nat_universe(space: Space) -> Result<BasicMap, LibISLError> {
1720 let isl_rs_ctx = space.get_ctx();
1721 let mut space = space;
1722 space.do_not_free_on_drop();
1723 let space = space.ptr;
1724 let isl_rs_result = unsafe { isl_basic_map_nat_universe(space) };
1725 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1726 should_free_on_drop: true };
1727 let err = isl_rs_ctx.last_error();
1728 if err != Error::None_ {
1729 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1730 }
1731 Ok(isl_rs_result)
1732 }
1733
1734 pub fn neg(self) -> Result<BasicMap, LibISLError> {
1736 let bmap = self;
1737 let isl_rs_ctx = bmap.get_ctx();
1738 let mut bmap = bmap;
1739 bmap.do_not_free_on_drop();
1740 let bmap = bmap.ptr;
1741 let isl_rs_result = unsafe { isl_basic_map_neg(bmap) };
1742 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1743 should_free_on_drop: true };
1744 let err = isl_rs_ctx.last_error();
1745 if err != Error::None_ {
1746 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1747 }
1748 Ok(isl_rs_result)
1749 }
1750
1751 pub fn order_ge(self, type1: DimType, pos1: i32, type2: DimType, pos2: i32)
1753 -> Result<BasicMap, LibISLError> {
1754 let bmap = self;
1755 let isl_rs_ctx = bmap.get_ctx();
1756 let mut bmap = bmap;
1757 bmap.do_not_free_on_drop();
1758 let bmap = bmap.ptr;
1759 let type1 = type1.to_i32();
1760 let type2 = type2.to_i32();
1761 let isl_rs_result = unsafe { isl_basic_map_order_ge(bmap, type1, pos1, type2, pos2) };
1762 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1763 should_free_on_drop: true };
1764 let err = isl_rs_ctx.last_error();
1765 if err != Error::None_ {
1766 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1767 }
1768 Ok(isl_rs_result)
1769 }
1770
1771 pub fn order_gt(self, type1: DimType, pos1: i32, type2: DimType, pos2: i32)
1773 -> Result<BasicMap, LibISLError> {
1774 let bmap = self;
1775 let isl_rs_ctx = bmap.get_ctx();
1776 let mut bmap = bmap;
1777 bmap.do_not_free_on_drop();
1778 let bmap = bmap.ptr;
1779 let type1 = type1.to_i32();
1780 let type2 = type2.to_i32();
1781 let isl_rs_result = unsafe { isl_basic_map_order_gt(bmap, type1, pos1, type2, pos2) };
1782 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1783 should_free_on_drop: true };
1784 let err = isl_rs_ctx.last_error();
1785 if err != Error::None_ {
1786 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1787 }
1788 Ok(isl_rs_result)
1789 }
1790
1791 pub fn plain_get_val_if_fixed(&self, type_: DimType, pos: u32) -> Result<Val, LibISLError> {
1793 let bmap = self;
1794 let isl_rs_ctx = bmap.get_ctx();
1795 let bmap = bmap.ptr;
1796 let type_ = type_.to_i32();
1797 let isl_rs_result = unsafe { isl_basic_map_plain_get_val_if_fixed(bmap, type_, pos) };
1798 let isl_rs_result = Val { ptr: isl_rs_result,
1799 should_free_on_drop: true };
1800 let err = isl_rs_ctx.last_error();
1801 if err != Error::None_ {
1802 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1803 }
1804 Ok(isl_rs_result)
1805 }
1806
1807 pub fn plain_is_empty(&self) -> Result<bool, LibISLError> {
1809 let bmap = self;
1810 let isl_rs_ctx = bmap.get_ctx();
1811 let bmap = bmap.ptr;
1812 let isl_rs_result = unsafe { isl_basic_map_plain_is_empty(bmap) };
1813 let isl_rs_result = match isl_rs_result {
1814 0 => false,
1815 1 => true,
1816 _ => panic!("Got isl_bool = -1"),
1817 };
1818 let err = isl_rs_ctx.last_error();
1819 if err != Error::None_ {
1820 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1821 }
1822 Ok(isl_rs_result)
1823 }
1824
1825 pub fn plain_is_universe(&self) -> Result<bool, LibISLError> {
1827 let bmap = self;
1828 let isl_rs_ctx = bmap.get_ctx();
1829 let bmap = bmap.ptr;
1830 let isl_rs_result = unsafe { isl_basic_map_plain_is_universe(bmap) };
1831 let isl_rs_result = match isl_rs_result {
1832 0 => false,
1833 1 => true,
1834 _ => panic!("Got isl_bool = -1"),
1835 };
1836 let err = isl_rs_ctx.last_error();
1837 if err != Error::None_ {
1838 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1839 }
1840 Ok(isl_rs_result)
1841 }
1842
1843 pub fn preimage_domain_multi_aff(self, ma: MultiAff) -> Result<BasicMap, LibISLError> {
1845 let bmap = self;
1846 let isl_rs_ctx = bmap.get_ctx();
1847 let mut bmap = bmap;
1848 bmap.do_not_free_on_drop();
1849 let bmap = bmap.ptr;
1850 let mut ma = ma;
1851 ma.do_not_free_on_drop();
1852 let ma = ma.ptr;
1853 let isl_rs_result = unsafe { isl_basic_map_preimage_domain_multi_aff(bmap, ma) };
1854 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1855 should_free_on_drop: true };
1856 let err = isl_rs_ctx.last_error();
1857 if err != Error::None_ {
1858 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1859 }
1860 Ok(isl_rs_result)
1861 }
1862
1863 pub fn preimage_range_multi_aff(self, ma: MultiAff) -> Result<BasicMap, LibISLError> {
1865 let bmap = self;
1866 let isl_rs_ctx = bmap.get_ctx();
1867 let mut bmap = bmap;
1868 bmap.do_not_free_on_drop();
1869 let bmap = bmap.ptr;
1870 let mut ma = ma;
1871 ma.do_not_free_on_drop();
1872 let ma = ma.ptr;
1873 let isl_rs_result = unsafe { isl_basic_map_preimage_range_multi_aff(bmap, ma) };
1874 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1875 should_free_on_drop: true };
1876 let err = isl_rs_ctx.last_error();
1877 if err != Error::None_ {
1878 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1879 }
1880 Ok(isl_rs_result)
1881 }
1882
1883 pub fn product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
1885 let bmap1 = self;
1886 let isl_rs_ctx = bmap1.get_ctx();
1887 let mut bmap1 = bmap1;
1888 bmap1.do_not_free_on_drop();
1889 let bmap1 = bmap1.ptr;
1890 let mut bmap2 = bmap2;
1891 bmap2.do_not_free_on_drop();
1892 let bmap2 = bmap2.ptr;
1893 let isl_rs_result = unsafe { isl_basic_map_product(bmap1, bmap2) };
1894 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1895 should_free_on_drop: true };
1896 let err = isl_rs_ctx.last_error();
1897 if err != Error::None_ {
1898 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1899 }
1900 Ok(isl_rs_result)
1901 }
1902
1903 pub fn project_out(self, type_: DimType, first: u32, n: u32) -> Result<BasicMap, LibISLError> {
1905 let bmap = self;
1906 let isl_rs_ctx = bmap.get_ctx();
1907 let mut bmap = bmap;
1908 bmap.do_not_free_on_drop();
1909 let bmap = bmap.ptr;
1910 let type_ = type_.to_i32();
1911 let isl_rs_result = unsafe { isl_basic_map_project_out(bmap, type_, first, n) };
1912 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1913 should_free_on_drop: true };
1914 let err = isl_rs_ctx.last_error();
1915 if err != Error::None_ {
1916 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1917 }
1918 Ok(isl_rs_result)
1919 }
1920
1921 pub fn range(self) -> Result<BasicSet, LibISLError> {
1923 let bmap = self;
1924 let isl_rs_ctx = bmap.get_ctx();
1925 let mut bmap = bmap;
1926 bmap.do_not_free_on_drop();
1927 let bmap = bmap.ptr;
1928 let isl_rs_result = unsafe { isl_basic_map_range(bmap) };
1929 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1930 should_free_on_drop: true };
1931 let err = isl_rs_ctx.last_error();
1932 if err != Error::None_ {
1933 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1934 }
1935 Ok(isl_rs_result)
1936 }
1937
1938 pub fn range_map(self) -> Result<BasicMap, LibISLError> {
1940 let bmap = self;
1941 let isl_rs_ctx = bmap.get_ctx();
1942 let mut bmap = bmap;
1943 bmap.do_not_free_on_drop();
1944 let bmap = bmap.ptr;
1945 let isl_rs_result = unsafe { isl_basic_map_range_map(bmap) };
1946 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1947 should_free_on_drop: true };
1948 let err = isl_rs_ctx.last_error();
1949 if err != Error::None_ {
1950 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1951 }
1952 Ok(isl_rs_result)
1953 }
1954
1955 pub fn range_product(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
1957 let bmap1 = self;
1958 let isl_rs_ctx = bmap1.get_ctx();
1959 let mut bmap1 = bmap1;
1960 bmap1.do_not_free_on_drop();
1961 let bmap1 = bmap1.ptr;
1962 let mut bmap2 = bmap2;
1963 bmap2.do_not_free_on_drop();
1964 let bmap2 = bmap2.ptr;
1965 let isl_rs_result = unsafe { isl_basic_map_range_product(bmap1, bmap2) };
1966 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1967 should_free_on_drop: true };
1968 let err = isl_rs_ctx.last_error();
1969 if err != Error::None_ {
1970 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1971 }
1972 Ok(isl_rs_result)
1973 }
1974
1975 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<BasicMap, LibISLError> {
1977 let isl_rs_ctx = Context { ptr: ctx.ptr,
1978 should_free_on_drop: false };
1979 let ctx = ctx.ptr;
1980 let str_ = CString::new(str_).unwrap();
1981 let str_ = str_.as_ptr();
1982 let isl_rs_result = unsafe { isl_basic_map_read_from_str(ctx, str_) };
1983 let isl_rs_result = BasicMap { ptr: isl_rs_result,
1984 should_free_on_drop: true };
1985 let err = isl_rs_ctx.last_error();
1986 if err != Error::None_ {
1987 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1988 }
1989 Ok(isl_rs_result)
1990 }
1991
1992 pub fn remove_dims(self, type_: DimType, first: u32, n: u32) -> Result<BasicMap, LibISLError> {
1994 let bmap = self;
1995 let isl_rs_ctx = bmap.get_ctx();
1996 let mut bmap = bmap;
1997 bmap.do_not_free_on_drop();
1998 let bmap = bmap.ptr;
1999 let type_ = type_.to_i32();
2000 let isl_rs_result = unsafe { isl_basic_map_remove_dims(bmap, type_, first, n) };
2001 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2002 should_free_on_drop: true };
2003 let err = isl_rs_ctx.last_error();
2004 if err != Error::None_ {
2005 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2006 }
2007 Ok(isl_rs_result)
2008 }
2009
2010 pub fn remove_divs(self) -> Result<BasicMap, LibISLError> {
2012 let bmap = self;
2013 let isl_rs_ctx = bmap.get_ctx();
2014 let mut bmap = bmap;
2015 bmap.do_not_free_on_drop();
2016 let bmap = bmap.ptr;
2017 let isl_rs_result = unsafe { isl_basic_map_remove_divs(bmap) };
2018 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2019 should_free_on_drop: true };
2020 let err = isl_rs_ctx.last_error();
2021 if err != Error::None_ {
2022 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2023 }
2024 Ok(isl_rs_result)
2025 }
2026
2027 pub fn remove_divs_involving_dims(self, type_: DimType, first: u32, n: u32)
2029 -> Result<BasicMap, LibISLError> {
2030 let bmap = self;
2031 let isl_rs_ctx = bmap.get_ctx();
2032 let mut bmap = bmap;
2033 bmap.do_not_free_on_drop();
2034 let bmap = bmap.ptr;
2035 let type_ = type_.to_i32();
2036 let isl_rs_result =
2037 unsafe { isl_basic_map_remove_divs_involving_dims(bmap, type_, first, n) };
2038 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2039 should_free_on_drop: true };
2040 let err = isl_rs_ctx.last_error();
2041 if err != Error::None_ {
2042 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2043 }
2044 Ok(isl_rs_result)
2045 }
2046
2047 pub fn remove_redundancies(self) -> Result<BasicMap, LibISLError> {
2049 let bmap = self;
2050 let isl_rs_ctx = bmap.get_ctx();
2051 let mut bmap = bmap;
2052 bmap.do_not_free_on_drop();
2053 let bmap = bmap.ptr;
2054 let isl_rs_result = unsafe { isl_basic_map_remove_redundancies(bmap) };
2055 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2056 should_free_on_drop: true };
2057 let err = isl_rs_ctx.last_error();
2058 if err != Error::None_ {
2059 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2060 }
2061 Ok(isl_rs_result)
2062 }
2063
2064 pub fn reverse(self) -> Result<BasicMap, LibISLError> {
2066 let bmap = self;
2067 let isl_rs_ctx = bmap.get_ctx();
2068 let mut bmap = bmap;
2069 bmap.do_not_free_on_drop();
2070 let bmap = bmap.ptr;
2071 let isl_rs_result = unsafe { isl_basic_map_reverse(bmap) };
2072 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2073 should_free_on_drop: true };
2074 let err = isl_rs_ctx.last_error();
2075 if err != Error::None_ {
2076 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2077 }
2078 Ok(isl_rs_result)
2079 }
2080
2081 pub fn sample(self) -> Result<BasicMap, LibISLError> {
2083 let bmap = self;
2084 let isl_rs_ctx = bmap.get_ctx();
2085 let mut bmap = bmap;
2086 bmap.do_not_free_on_drop();
2087 let bmap = bmap.ptr;
2088 let isl_rs_result = unsafe { isl_basic_map_sample(bmap) };
2089 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2090 should_free_on_drop: true };
2091 let err = isl_rs_ctx.last_error();
2092 if err != Error::None_ {
2093 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2094 }
2095 Ok(isl_rs_result)
2096 }
2097
2098 pub fn set_dim_name(self, type_: DimType, pos: u32, s: &str) -> Result<BasicMap, LibISLError> {
2100 let bmap = self;
2101 let isl_rs_ctx = bmap.get_ctx();
2102 let mut bmap = bmap;
2103 bmap.do_not_free_on_drop();
2104 let bmap = bmap.ptr;
2105 let type_ = type_.to_i32();
2106 let s = CString::new(s).unwrap();
2107 let s = s.as_ptr();
2108 let isl_rs_result = unsafe { isl_basic_map_set_dim_name(bmap, type_, pos, s) };
2109 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2110 should_free_on_drop: true };
2111 let err = isl_rs_ctx.last_error();
2112 if err != Error::None_ {
2113 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2114 }
2115 Ok(isl_rs_result)
2116 }
2117
2118 pub fn set_tuple_id(self, type_: DimType, id: Id) -> Result<BasicMap, LibISLError> {
2120 let bmap = self;
2121 let isl_rs_ctx = bmap.get_ctx();
2122 let mut bmap = bmap;
2123 bmap.do_not_free_on_drop();
2124 let bmap = bmap.ptr;
2125 let type_ = type_.to_i32();
2126 let mut id = id;
2127 id.do_not_free_on_drop();
2128 let id = id.ptr;
2129 let isl_rs_result = unsafe { isl_basic_map_set_tuple_id(bmap, type_, id) };
2130 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2131 should_free_on_drop: true };
2132 let err = isl_rs_ctx.last_error();
2133 if err != Error::None_ {
2134 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2135 }
2136 Ok(isl_rs_result)
2137 }
2138
2139 pub fn set_tuple_name(self, type_: DimType, s: &str) -> Result<BasicMap, LibISLError> {
2141 let bmap = self;
2142 let isl_rs_ctx = bmap.get_ctx();
2143 let mut bmap = bmap;
2144 bmap.do_not_free_on_drop();
2145 let bmap = bmap.ptr;
2146 let type_ = type_.to_i32();
2147 let s = CString::new(s).unwrap();
2148 let s = s.as_ptr();
2149 let isl_rs_result = unsafe { isl_basic_map_set_tuple_name(bmap, type_, s) };
2150 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2151 should_free_on_drop: true };
2152 let err = isl_rs_ctx.last_error();
2153 if err != Error::None_ {
2154 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2155 }
2156 Ok(isl_rs_result)
2157 }
2158
2159 pub fn sum(self, bmap2: BasicMap) -> Result<BasicMap, LibISLError> {
2161 let bmap1 = self;
2162 let isl_rs_ctx = bmap1.get_ctx();
2163 let mut bmap1 = bmap1;
2164 bmap1.do_not_free_on_drop();
2165 let bmap1 = bmap1.ptr;
2166 let mut bmap2 = bmap2;
2167 bmap2.do_not_free_on_drop();
2168 let bmap2 = bmap2.ptr;
2169 let isl_rs_result = unsafe { isl_basic_map_sum(bmap1, bmap2) };
2170 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2171 should_free_on_drop: true };
2172 let err = isl_rs_ctx.last_error();
2173 if err != Error::None_ {
2174 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2175 }
2176 Ok(isl_rs_result)
2177 }
2178
2179 pub fn to_list(self) -> Result<BasicMapList, LibISLError> {
2181 let el = self;
2182 let isl_rs_ctx = el.get_ctx();
2183 let mut el = el;
2184 el.do_not_free_on_drop();
2185 let el = el.ptr;
2186 let isl_rs_result = unsafe { isl_basic_map_to_list(el) };
2187 let isl_rs_result = BasicMapList { ptr: isl_rs_result,
2188 should_free_on_drop: true };
2189 let err = isl_rs_ctx.last_error();
2190 if err != Error::None_ {
2191 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2192 }
2193 Ok(isl_rs_result)
2194 }
2195
2196 pub fn to_str(&self) -> Result<&str, LibISLError> {
2198 let bmap = self;
2199 let isl_rs_ctx = bmap.get_ctx();
2200 let bmap = bmap.ptr;
2201 let isl_rs_result = unsafe { isl_basic_map_to_str(bmap) };
2202 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
2203 let isl_rs_result = isl_rs_result.to_str().unwrap();
2204 let err = isl_rs_ctx.last_error();
2205 if err != Error::None_ {
2206 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2207 }
2208 Ok(isl_rs_result)
2209 }
2210
2211 pub fn total_dim(&self) -> Result<i32, LibISLError> {
2213 let bmap = self;
2214 let isl_rs_ctx = bmap.get_ctx();
2215 let bmap = bmap.ptr;
2216 let isl_rs_result = unsafe { isl_basic_map_total_dim(bmap) };
2217 let err = isl_rs_ctx.last_error();
2218 if err != Error::None_ {
2219 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2220 }
2221 Ok(isl_rs_result)
2222 }
2223
2224 pub fn uncurry(self) -> Result<BasicMap, LibISLError> {
2226 let bmap = self;
2227 let isl_rs_ctx = bmap.get_ctx();
2228 let mut bmap = bmap;
2229 bmap.do_not_free_on_drop();
2230 let bmap = bmap.ptr;
2231 let isl_rs_result = unsafe { isl_basic_map_uncurry(bmap) };
2232 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2233 should_free_on_drop: true };
2234 let err = isl_rs_ctx.last_error();
2235 if err != Error::None_ {
2236 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2237 }
2238 Ok(isl_rs_result)
2239 }
2240
2241 pub fn union(self, bmap2: BasicMap) -> Result<Map, LibISLError> {
2243 let bmap1 = self;
2244 let isl_rs_ctx = bmap1.get_ctx();
2245 let mut bmap1 = bmap1;
2246 bmap1.do_not_free_on_drop();
2247 let bmap1 = bmap1.ptr;
2248 let mut bmap2 = bmap2;
2249 bmap2.do_not_free_on_drop();
2250 let bmap2 = bmap2.ptr;
2251 let isl_rs_result = unsafe { isl_basic_map_union(bmap1, bmap2) };
2252 let isl_rs_result = Map { ptr: isl_rs_result,
2253 should_free_on_drop: true };
2254 let err = isl_rs_ctx.last_error();
2255 if err != Error::None_ {
2256 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2257 }
2258 Ok(isl_rs_result)
2259 }
2260
2261 pub fn universe(space: Space) -> Result<BasicMap, LibISLError> {
2263 let isl_rs_ctx = space.get_ctx();
2264 let mut space = space;
2265 space.do_not_free_on_drop();
2266 let space = space.ptr;
2267 let isl_rs_result = unsafe { isl_basic_map_universe(space) };
2268 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2269 should_free_on_drop: true };
2270 let err = isl_rs_ctx.last_error();
2271 if err != Error::None_ {
2272 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2273 }
2274 Ok(isl_rs_result)
2275 }
2276
2277 pub fn upper_bound_si(self, type_: DimType, pos: u32, value: i32)
2279 -> Result<BasicMap, LibISLError> {
2280 let bmap = self;
2281 let isl_rs_ctx = bmap.get_ctx();
2282 let mut bmap = bmap;
2283 bmap.do_not_free_on_drop();
2284 let bmap = bmap.ptr;
2285 let type_ = type_.to_i32();
2286 let isl_rs_result = unsafe { isl_basic_map_upper_bound_si(bmap, type_, pos, value) };
2287 let isl_rs_result = BasicMap { ptr: isl_rs_result,
2288 should_free_on_drop: true };
2289 let err = isl_rs_ctx.last_error();
2290 if err != Error::None_ {
2291 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2292 }
2293 Ok(isl_rs_result)
2294 }
2295
2296 pub fn wrap(self) -> Result<BasicSet, LibISLError> {
2298 let bmap = self;
2299 let isl_rs_ctx = bmap.get_ctx();
2300 let mut bmap = bmap;
2301 bmap.do_not_free_on_drop();
2302 let bmap = bmap.ptr;
2303 let isl_rs_result = unsafe { isl_basic_map_wrap(bmap) };
2304 let isl_rs_result = BasicSet { ptr: isl_rs_result,
2305 should_free_on_drop: true };
2306 let err = isl_rs_ctx.last_error();
2307 if err != Error::None_ {
2308 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2309 }
2310 Ok(isl_rs_result)
2311 }
2312
2313 pub fn zip(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_zip(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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
2326 }
2327 Ok(isl_rs_result)
2328 }
2329
2330 pub fn do_not_free_on_drop(&mut self) {
2333 self.should_free_on_drop = false;
2334 }
2335}
2336
2337impl Drop for BasicMap {
2338 fn drop(&mut self) {
2339 if self.should_free_on_drop {
2340 unsafe {
2341 isl_basic_map_free(self.ptr);
2342 }
2343 }
2344 }
2345}