1use super::{Aff, ConstraintList, Context, DimType, Error, LibISLError, LocalSpace, Space, Val};
5use libc::uintptr_t;
6use std::ffi::CStr;
7use std::os::raw::c_char;
8
9pub struct Constraint {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_constraint_alloc_equality(ls: uintptr_t) -> uintptr_t;
18
19 fn isl_constraint_alloc_inequality(ls: uintptr_t) -> uintptr_t;
20
21 fn isl_constraint_cmp_last_non_zero(c1: uintptr_t, c2: uintptr_t) -> i32;
22
23 fn isl_constraint_copy(c: uintptr_t) -> uintptr_t;
24
25 fn isl_constraint_dim(constraint: uintptr_t, type_: i32) -> i32;
26
27 fn isl_constraint_dump(c: uintptr_t) -> ();
28
29 fn isl_constraint_free(c: uintptr_t) -> uintptr_t;
30
31 fn isl_constraint_get_aff(constraint: uintptr_t) -> uintptr_t;
32
33 fn isl_constraint_get_bound(constraint: uintptr_t, type_: i32, pos: i32) -> uintptr_t;
34
35 fn isl_constraint_get_coefficient_val(constraint: uintptr_t, type_: i32, pos: i32)
36 -> uintptr_t;
37
38 fn isl_constraint_get_constant_val(constraint: uintptr_t) -> uintptr_t;
39
40 fn isl_constraint_get_ctx(c: uintptr_t) -> uintptr_t;
41
42 fn isl_constraint_get_dim_name(constraint: uintptr_t, type_: i32, pos: u32) -> *const c_char;
43
44 fn isl_constraint_get_div(constraint: uintptr_t, pos: i32) -> uintptr_t;
45
46 fn isl_constraint_get_local_space(constraint: uintptr_t) -> uintptr_t;
47
48 fn isl_constraint_get_space(constraint: uintptr_t) -> uintptr_t;
49
50 fn isl_constraint_involves_dims(constraint: uintptr_t, type_: i32, first: u32, n: u32) -> i32;
51
52 fn isl_constraint_is_div_constraint(constraint: uintptr_t) -> i32;
53
54 fn isl_constraint_is_equal(constraint1: uintptr_t, constraint2: uintptr_t) -> i32;
55
56 fn isl_constraint_is_equality(constraint: uintptr_t) -> i32;
57
58 fn isl_constraint_is_lower_bound(constraint: uintptr_t, type_: i32, pos: u32) -> i32;
59
60 fn isl_constraint_is_upper_bound(constraint: uintptr_t, type_: i32, pos: u32) -> i32;
61
62 fn isl_constraint_negate(constraint: uintptr_t) -> uintptr_t;
63
64 fn isl_constraint_plain_cmp(c1: uintptr_t, c2: uintptr_t) -> i32;
65
66 fn isl_constraint_set_coefficient_si(constraint: uintptr_t, type_: i32, pos: i32, v: i32)
67 -> uintptr_t;
68
69 fn isl_constraint_set_coefficient_val(constraint: uintptr_t, type_: i32, pos: i32,
70 v: uintptr_t)
71 -> uintptr_t;
72
73 fn isl_constraint_set_constant_si(constraint: uintptr_t, v: i32) -> uintptr_t;
74
75 fn isl_constraint_set_constant_val(constraint: uintptr_t, v: uintptr_t) -> uintptr_t;
76
77 fn isl_constraint_to_list(el: uintptr_t) -> uintptr_t;
78
79}
80
81impl Constraint {
82 pub fn alloc_equality(ls: LocalSpace) -> Result<Constraint, LibISLError> {
84 let isl_rs_ctx = ls.get_ctx();
85 let mut ls = ls;
86 ls.do_not_free_on_drop();
87 let ls = ls.ptr;
88 let isl_rs_result = unsafe { isl_constraint_alloc_equality(ls) };
89 let isl_rs_result = Constraint { ptr: isl_rs_result,
90 should_free_on_drop: true };
91 let err = isl_rs_ctx.last_error();
92 if err != Error::None_ {
93 let err_msg = isl_rs_ctx.last_error_msg();
94 isl_rs_ctx.reset_error();
95 return Err(LibISLError::new(err, err_msg));
96 }
97 Ok(isl_rs_result)
98 }
99
100 pub fn alloc_inequality(ls: LocalSpace) -> Result<Constraint, LibISLError> {
102 let isl_rs_ctx = ls.get_ctx();
103 let mut ls = ls;
104 ls.do_not_free_on_drop();
105 let ls = ls.ptr;
106 let isl_rs_result = unsafe { isl_constraint_alloc_inequality(ls) };
107 let isl_rs_result = Constraint { ptr: isl_rs_result,
108 should_free_on_drop: true };
109 let err = isl_rs_ctx.last_error();
110 if err != Error::None_ {
111 let err_msg = isl_rs_ctx.last_error_msg();
112 isl_rs_ctx.reset_error();
113 return Err(LibISLError::new(err, err_msg));
114 }
115 Ok(isl_rs_result)
116 }
117
118 pub fn cmp_last_non_zero(&self, c2: &Constraint) -> Result<i32, LibISLError> {
120 let c1 = self;
121 let isl_rs_ctx = c1.get_ctx();
122 let c1 = c1.ptr;
123 let c2 = c2.ptr;
124 let isl_rs_result = unsafe { isl_constraint_cmp_last_non_zero(c1, c2) };
125 let err = isl_rs_ctx.last_error();
126 if err != Error::None_ {
127 let err_msg = isl_rs_ctx.last_error_msg();
128 isl_rs_ctx.reset_error();
129 return Err(LibISLError::new(err, err_msg));
130 }
131 Ok(isl_rs_result)
132 }
133
134 pub fn copy(&self) -> Result<Constraint, LibISLError> {
136 let c = self;
137 let isl_rs_ctx = c.get_ctx();
138 let c = c.ptr;
139 let isl_rs_result = unsafe { isl_constraint_copy(c) };
140 let isl_rs_result = Constraint { ptr: isl_rs_result,
141 should_free_on_drop: true };
142 let err = isl_rs_ctx.last_error();
143 if err != Error::None_ {
144 let err_msg = isl_rs_ctx.last_error_msg();
145 isl_rs_ctx.reset_error();
146 return Err(LibISLError::new(err, err_msg));
147 }
148 Ok(isl_rs_result)
149 }
150
151 pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
153 let constraint = self;
154 let isl_rs_ctx = constraint.get_ctx();
155 let constraint = constraint.ptr;
156 let type_ = type_.to_i32();
157 let isl_rs_result = unsafe { isl_constraint_dim(constraint, type_) };
158 let err = isl_rs_ctx.last_error();
159 if err != Error::None_ {
160 let err_msg = isl_rs_ctx.last_error_msg();
161 isl_rs_ctx.reset_error();
162 return Err(LibISLError::new(err, err_msg));
163 }
164 Ok(isl_rs_result)
165 }
166
167 pub fn dump(&self) -> Result<(), LibISLError> {
169 let c = self;
170 let isl_rs_ctx = c.get_ctx();
171 let c = c.ptr;
172 let isl_rs_result = unsafe { isl_constraint_dump(c) };
173 let err = isl_rs_ctx.last_error();
174 if err != Error::None_ {
175 let err_msg = isl_rs_ctx.last_error_msg();
176 isl_rs_ctx.reset_error();
177 return Err(LibISLError::new(err, err_msg));
178 }
179 Ok(isl_rs_result)
180 }
181
182 pub fn free(self) -> Result<Constraint, LibISLError> {
184 let c = self;
185 let isl_rs_ctx = c.get_ctx();
186 let mut c = c;
187 c.do_not_free_on_drop();
188 let c = c.ptr;
189 let isl_rs_result = unsafe { isl_constraint_free(c) };
190 let isl_rs_result = Constraint { ptr: isl_rs_result,
191 should_free_on_drop: true };
192 let err = isl_rs_ctx.last_error();
193 if err != Error::None_ {
194 let err_msg = isl_rs_ctx.last_error_msg();
195 isl_rs_ctx.reset_error();
196 return Err(LibISLError::new(err, err_msg));
197 }
198 Ok(isl_rs_result)
199 }
200
201 pub fn get_aff(&self) -> Result<Aff, LibISLError> {
203 let constraint = self;
204 let isl_rs_ctx = constraint.get_ctx();
205 let constraint = constraint.ptr;
206 let isl_rs_result = unsafe { isl_constraint_get_aff(constraint) };
207 let isl_rs_result = Aff { ptr: isl_rs_result,
208 should_free_on_drop: true };
209 let err = isl_rs_ctx.last_error();
210 if err != Error::None_ {
211 let err_msg = isl_rs_ctx.last_error_msg();
212 isl_rs_ctx.reset_error();
213 return Err(LibISLError::new(err, err_msg));
214 }
215 Ok(isl_rs_result)
216 }
217
218 pub fn get_bound(&self, type_: DimType, pos: i32) -> Result<Aff, LibISLError> {
220 let constraint = self;
221 let isl_rs_ctx = constraint.get_ctx();
222 let constraint = constraint.ptr;
223 let type_ = type_.to_i32();
224 let isl_rs_result = unsafe { isl_constraint_get_bound(constraint, type_, pos) };
225 let isl_rs_result = Aff { ptr: isl_rs_result,
226 should_free_on_drop: true };
227 let err = isl_rs_ctx.last_error();
228 if err != Error::None_ {
229 let err_msg = isl_rs_ctx.last_error_msg();
230 isl_rs_ctx.reset_error();
231 return Err(LibISLError::new(err, err_msg));
232 }
233 Ok(isl_rs_result)
234 }
235
236 pub fn get_coefficient_val(&self, type_: DimType, pos: i32) -> Result<Val, LibISLError> {
238 let constraint = self;
239 let isl_rs_ctx = constraint.get_ctx();
240 let constraint = constraint.ptr;
241 let type_ = type_.to_i32();
242 let isl_rs_result = unsafe { isl_constraint_get_coefficient_val(constraint, type_, pos) };
243 let isl_rs_result = Val { ptr: isl_rs_result,
244 should_free_on_drop: true };
245 let err = isl_rs_ctx.last_error();
246 if err != Error::None_ {
247 let err_msg = isl_rs_ctx.last_error_msg();
248 isl_rs_ctx.reset_error();
249 return Err(LibISLError::new(err, err_msg));
250 }
251 Ok(isl_rs_result)
252 }
253
254 pub fn get_constant_val(&self) -> Result<Val, LibISLError> {
256 let constraint = self;
257 let isl_rs_ctx = constraint.get_ctx();
258 let constraint = constraint.ptr;
259 let isl_rs_result = unsafe { isl_constraint_get_constant_val(constraint) };
260 let isl_rs_result = Val { ptr: isl_rs_result,
261 should_free_on_drop: true };
262 let err = isl_rs_ctx.last_error();
263 if err != Error::None_ {
264 let err_msg = isl_rs_ctx.last_error_msg();
265 isl_rs_ctx.reset_error();
266 return Err(LibISLError::new(err, err_msg));
267 }
268 Ok(isl_rs_result)
269 }
270
271 pub fn get_ctx(&self) -> Context {
273 let c = self;
274 let c = c.ptr;
275 let isl_rs_result = unsafe { isl_constraint_get_ctx(c) };
276 let isl_rs_result = Context { ptr: isl_rs_result,
277 should_free_on_drop: false };
278 isl_rs_result
279 }
280
281 pub fn get_dim_name(&self, type_: DimType, pos: u32) -> Result<&str, LibISLError> {
283 let constraint = self;
284 let isl_rs_ctx = constraint.get_ctx();
285 let constraint = constraint.ptr;
286 let type_ = type_.to_i32();
287 let isl_rs_result = unsafe { isl_constraint_get_dim_name(constraint, type_, pos) };
288 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
289 let isl_rs_result = isl_rs_result.to_str().unwrap();
290 let err = isl_rs_ctx.last_error();
291 if err != Error::None_ {
292 let err_msg = isl_rs_ctx.last_error_msg();
293 isl_rs_ctx.reset_error();
294 return Err(LibISLError::new(err, err_msg));
295 }
296 Ok(isl_rs_result)
297 }
298
299 pub fn get_div(&self, pos: i32) -> Result<Aff, LibISLError> {
301 let constraint = self;
302 let isl_rs_ctx = constraint.get_ctx();
303 let constraint = constraint.ptr;
304 let isl_rs_result = unsafe { isl_constraint_get_div(constraint, pos) };
305 let isl_rs_result = Aff { ptr: isl_rs_result,
306 should_free_on_drop: true };
307 let err = isl_rs_ctx.last_error();
308 if err != Error::None_ {
309 let err_msg = isl_rs_ctx.last_error_msg();
310 isl_rs_ctx.reset_error();
311 return Err(LibISLError::new(err, err_msg));
312 }
313 Ok(isl_rs_result)
314 }
315
316 pub fn get_local_space(&self) -> Result<LocalSpace, LibISLError> {
318 let constraint = self;
319 let isl_rs_ctx = constraint.get_ctx();
320 let constraint = constraint.ptr;
321 let isl_rs_result = unsafe { isl_constraint_get_local_space(constraint) };
322 let isl_rs_result = LocalSpace { 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 get_space(&self) -> Result<Space, LibISLError> {
335 let constraint = self;
336 let isl_rs_ctx = constraint.get_ctx();
337 let constraint = constraint.ptr;
338 let isl_rs_result = unsafe { isl_constraint_get_space(constraint) };
339 let isl_rs_result = Space { ptr: isl_rs_result,
340 should_free_on_drop: true };
341 let err = isl_rs_ctx.last_error();
342 if err != Error::None_ {
343 let err_msg = isl_rs_ctx.last_error_msg();
344 isl_rs_ctx.reset_error();
345 return Err(LibISLError::new(err, err_msg));
346 }
347 Ok(isl_rs_result)
348 }
349
350 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
352 let constraint = self;
353 let isl_rs_ctx = constraint.get_ctx();
354 let constraint = constraint.ptr;
355 let type_ = type_.to_i32();
356 let isl_rs_result = unsafe { isl_constraint_involves_dims(constraint, type_, first, n) };
357 let isl_rs_result = match isl_rs_result {
358 0 => false,
359 1 => true,
360 _ => {
361 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
362 }
363 };
364 let err = isl_rs_ctx.last_error();
365 if err != Error::None_ {
366 let err_msg = isl_rs_ctx.last_error_msg();
367 isl_rs_ctx.reset_error();
368 return Err(LibISLError::new(err, err_msg));
369 }
370 Ok(isl_rs_result)
371 }
372
373 pub fn is_div_constraint(&self) -> Result<bool, LibISLError> {
375 let constraint = self;
376 let isl_rs_ctx = constraint.get_ctx();
377 let constraint = constraint.ptr;
378 let isl_rs_result = unsafe { isl_constraint_is_div_constraint(constraint) };
379 let isl_rs_result = match isl_rs_result {
380 0 => false,
381 1 => true,
382 _ => {
383 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
384 }
385 };
386 let err = isl_rs_ctx.last_error();
387 if err != Error::None_ {
388 let err_msg = isl_rs_ctx.last_error_msg();
389 isl_rs_ctx.reset_error();
390 return Err(LibISLError::new(err, err_msg));
391 }
392 Ok(isl_rs_result)
393 }
394
395 pub fn is_equal(&self, constraint2: &Constraint) -> Result<i32, LibISLError> {
397 let constraint1 = self;
398 let isl_rs_ctx = constraint1.get_ctx();
399 let constraint1 = constraint1.ptr;
400 let constraint2 = constraint2.ptr;
401 let isl_rs_result = unsafe { isl_constraint_is_equal(constraint1, constraint2) };
402 let err = isl_rs_ctx.last_error();
403 if err != Error::None_ {
404 let err_msg = isl_rs_ctx.last_error_msg();
405 isl_rs_ctx.reset_error();
406 return Err(LibISLError::new(err, err_msg));
407 }
408 Ok(isl_rs_result)
409 }
410
411 pub fn is_equality(&self) -> Result<bool, LibISLError> {
413 let constraint = self;
414 let isl_rs_ctx = constraint.get_ctx();
415 let constraint = constraint.ptr;
416 let isl_rs_result = unsafe { isl_constraint_is_equality(constraint) };
417 let isl_rs_result = match isl_rs_result {
418 0 => false,
419 1 => true,
420 _ => {
421 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
422 }
423 };
424 let err = isl_rs_ctx.last_error();
425 if err != Error::None_ {
426 let err_msg = isl_rs_ctx.last_error_msg();
427 isl_rs_ctx.reset_error();
428 return Err(LibISLError::new(err, err_msg));
429 }
430 Ok(isl_rs_result)
431 }
432
433 pub fn is_lower_bound(&self, type_: DimType, pos: u32) -> Result<bool, LibISLError> {
435 let constraint = self;
436 let isl_rs_ctx = constraint.get_ctx();
437 let constraint = constraint.ptr;
438 let type_ = type_.to_i32();
439 let isl_rs_result = unsafe { isl_constraint_is_lower_bound(constraint, type_, pos) };
440 let isl_rs_result = match isl_rs_result {
441 0 => false,
442 1 => true,
443 _ => {
444 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
445 }
446 };
447 let err = isl_rs_ctx.last_error();
448 if err != Error::None_ {
449 let err_msg = isl_rs_ctx.last_error_msg();
450 isl_rs_ctx.reset_error();
451 return Err(LibISLError::new(err, err_msg));
452 }
453 Ok(isl_rs_result)
454 }
455
456 pub fn is_upper_bound(&self, type_: DimType, pos: u32) -> Result<bool, LibISLError> {
458 let constraint = self;
459 let isl_rs_ctx = constraint.get_ctx();
460 let constraint = constraint.ptr;
461 let type_ = type_.to_i32();
462 let isl_rs_result = unsafe { isl_constraint_is_upper_bound(constraint, type_, pos) };
463 let isl_rs_result = match isl_rs_result {
464 0 => false,
465 1 => true,
466 _ => {
467 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
468 }
469 };
470 let err = isl_rs_ctx.last_error();
471 if err != Error::None_ {
472 let err_msg = isl_rs_ctx.last_error_msg();
473 isl_rs_ctx.reset_error();
474 return Err(LibISLError::new(err, err_msg));
475 }
476 Ok(isl_rs_result)
477 }
478
479 pub fn negate(self) -> Result<Constraint, LibISLError> {
481 let constraint = self;
482 let isl_rs_ctx = constraint.get_ctx();
483 let mut constraint = constraint;
484 constraint.do_not_free_on_drop();
485 let constraint = constraint.ptr;
486 let isl_rs_result = unsafe { isl_constraint_negate(constraint) };
487 let isl_rs_result = Constraint { ptr: isl_rs_result,
488 should_free_on_drop: true };
489 let err = isl_rs_ctx.last_error();
490 if err != Error::None_ {
491 let err_msg = isl_rs_ctx.last_error_msg();
492 isl_rs_ctx.reset_error();
493 return Err(LibISLError::new(err, err_msg));
494 }
495 Ok(isl_rs_result)
496 }
497
498 pub fn plain_cmp(&self, c2: &Constraint) -> Result<i32, LibISLError> {
500 let c1 = self;
501 let isl_rs_ctx = c1.get_ctx();
502 let c1 = c1.ptr;
503 let c2 = c2.ptr;
504 let isl_rs_result = unsafe { isl_constraint_plain_cmp(c1, c2) };
505 let err = isl_rs_ctx.last_error();
506 if err != Error::None_ {
507 let err_msg = isl_rs_ctx.last_error_msg();
508 isl_rs_ctx.reset_error();
509 return Err(LibISLError::new(err, err_msg));
510 }
511 Ok(isl_rs_result)
512 }
513
514 pub fn set_coefficient_si(self, type_: DimType, pos: i32, v: i32)
516 -> Result<Constraint, LibISLError> {
517 let constraint = self;
518 let isl_rs_ctx = constraint.get_ctx();
519 let mut constraint = constraint;
520 constraint.do_not_free_on_drop();
521 let constraint = constraint.ptr;
522 let type_ = type_.to_i32();
523 let isl_rs_result = unsafe { isl_constraint_set_coefficient_si(constraint, type_, pos, v) };
524 let isl_rs_result = Constraint { ptr: isl_rs_result,
525 should_free_on_drop: true };
526 let err = isl_rs_ctx.last_error();
527 if err != Error::None_ {
528 let err_msg = isl_rs_ctx.last_error_msg();
529 isl_rs_ctx.reset_error();
530 return Err(LibISLError::new(err, err_msg));
531 }
532 Ok(isl_rs_result)
533 }
534
535 pub fn set_coefficient_val(self, type_: DimType, pos: i32, v: Val)
537 -> Result<Constraint, LibISLError> {
538 let constraint = self;
539 let isl_rs_ctx = constraint.get_ctx();
540 let mut constraint = constraint;
541 constraint.do_not_free_on_drop();
542 let constraint = constraint.ptr;
543 let type_ = type_.to_i32();
544 let mut v = v;
545 v.do_not_free_on_drop();
546 let v = v.ptr;
547 let isl_rs_result =
548 unsafe { isl_constraint_set_coefficient_val(constraint, type_, pos, v) };
549 let isl_rs_result = Constraint { ptr: isl_rs_result,
550 should_free_on_drop: true };
551 let err = isl_rs_ctx.last_error();
552 if err != Error::None_ {
553 let err_msg = isl_rs_ctx.last_error_msg();
554 isl_rs_ctx.reset_error();
555 return Err(LibISLError::new(err, err_msg));
556 }
557 Ok(isl_rs_result)
558 }
559
560 pub fn set_constant_si(self, v: i32) -> Result<Constraint, LibISLError> {
562 let constraint = self;
563 let isl_rs_ctx = constraint.get_ctx();
564 let mut constraint = constraint;
565 constraint.do_not_free_on_drop();
566 let constraint = constraint.ptr;
567 let isl_rs_result = unsafe { isl_constraint_set_constant_si(constraint, v) };
568 let isl_rs_result = Constraint { ptr: isl_rs_result,
569 should_free_on_drop: true };
570 let err = isl_rs_ctx.last_error();
571 if err != Error::None_ {
572 let err_msg = isl_rs_ctx.last_error_msg();
573 isl_rs_ctx.reset_error();
574 return Err(LibISLError::new(err, err_msg));
575 }
576 Ok(isl_rs_result)
577 }
578
579 pub fn set_constant_val(self, v: Val) -> Result<Constraint, LibISLError> {
581 let constraint = self;
582 let isl_rs_ctx = constraint.get_ctx();
583 let mut constraint = constraint;
584 constraint.do_not_free_on_drop();
585 let constraint = constraint.ptr;
586 let mut v = v;
587 v.do_not_free_on_drop();
588 let v = v.ptr;
589 let isl_rs_result = unsafe { isl_constraint_set_constant_val(constraint, v) };
590 let isl_rs_result = Constraint { ptr: isl_rs_result,
591 should_free_on_drop: true };
592 let err = isl_rs_ctx.last_error();
593 if err != Error::None_ {
594 let err_msg = isl_rs_ctx.last_error_msg();
595 isl_rs_ctx.reset_error();
596 return Err(LibISLError::new(err, err_msg));
597 }
598 Ok(isl_rs_result)
599 }
600
601 pub fn to_list(self) -> Result<ConstraintList, LibISLError> {
603 let el = self;
604 let isl_rs_ctx = el.get_ctx();
605 let mut el = el;
606 el.do_not_free_on_drop();
607 let el = el.ptr;
608 let isl_rs_result = unsafe { isl_constraint_to_list(el) };
609 let isl_rs_result = ConstraintList { ptr: isl_rs_result,
610 should_free_on_drop: true };
611 let err = isl_rs_ctx.last_error();
612 if err != Error::None_ {
613 let err_msg = isl_rs_ctx.last_error_msg();
614 isl_rs_ctx.reset_error();
615 return Err(LibISLError::new(err, err_msg));
616 }
617 Ok(isl_rs_result)
618 }
619
620 pub fn do_not_free_on_drop(&mut self) {
623 self.should_free_on_drop = false;
624 }
625}
626
627impl Drop for Constraint {
628 fn drop(&mut self) {
629 if self.should_free_on_drop {
630 unsafe {
631 isl_constraint_free(self.ptr);
632 }
633 }
634 }
635}