1use super::{Context, Error, LibISLError, ValList};
5use libc::uintptr_t;
6use std::ffi::{CStr, CString};
7use std::os::raw::c_char;
8
9pub struct Val {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_val_2exp(v: uintptr_t) -> uintptr_t;
18
19 fn isl_val_abs(v: uintptr_t) -> uintptr_t;
20
21 fn isl_val_abs_eq(v1: uintptr_t, v2: uintptr_t) -> i32;
22
23 fn isl_val_add(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
24
25 fn isl_val_add_ui(v1: uintptr_t, v2: u64) -> uintptr_t;
26
27 fn isl_val_ceil(v: uintptr_t) -> uintptr_t;
28
29 fn isl_val_cmp_si(v: uintptr_t, i: i64) -> i32;
30
31 fn isl_val_copy(v: uintptr_t) -> uintptr_t;
32
33 fn isl_val_div(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
34
35 fn isl_val_div_ui(v1: uintptr_t, v2: u64) -> uintptr_t;
36
37 fn isl_val_dump(v: uintptr_t) -> ();
38
39 fn isl_val_eq(v1: uintptr_t, v2: uintptr_t) -> i32;
40
41 fn isl_val_eq_si(v: uintptr_t, i: i64) -> i32;
42
43 fn isl_val_floor(v: uintptr_t) -> uintptr_t;
44
45 fn isl_val_free(v: uintptr_t) -> uintptr_t;
46
47 fn isl_val_gcd(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
48
49 fn isl_val_ge(v1: uintptr_t, v2: uintptr_t) -> i32;
50
51 fn isl_val_get_ctx(val: uintptr_t) -> uintptr_t;
52
53 fn isl_val_get_d(v: uintptr_t) -> f64;
54
55 fn isl_val_get_den_si(v: uintptr_t) -> i64;
56
57 fn isl_val_get_den_val(v: uintptr_t) -> uintptr_t;
58
59 fn isl_val_get_hash(val: uintptr_t) -> u32;
60
61 fn isl_val_get_num_si(v: uintptr_t) -> i64;
62
63 fn isl_val_gt(v1: uintptr_t, v2: uintptr_t) -> i32;
64
65 fn isl_val_gt_si(v: uintptr_t, i: i64) -> i32;
66
67 fn isl_val_infty(ctx: uintptr_t) -> uintptr_t;
68
69 fn isl_val_int_from_si(ctx: uintptr_t, i: i64) -> uintptr_t;
70
71 fn isl_val_int_from_ui(ctx: uintptr_t, u: u64) -> uintptr_t;
72
73 fn isl_val_inv(v: uintptr_t) -> uintptr_t;
74
75 fn isl_val_is_divisible_by(v1: uintptr_t, v2: uintptr_t) -> i32;
76
77 fn isl_val_is_infty(v: uintptr_t) -> i32;
78
79 fn isl_val_is_int(v: uintptr_t) -> i32;
80
81 fn isl_val_is_nan(v: uintptr_t) -> i32;
82
83 fn isl_val_is_neg(v: uintptr_t) -> i32;
84
85 fn isl_val_is_neginfty(v: uintptr_t) -> i32;
86
87 fn isl_val_is_negone(v: uintptr_t) -> i32;
88
89 fn isl_val_is_nonneg(v: uintptr_t) -> i32;
90
91 fn isl_val_is_nonpos(v: uintptr_t) -> i32;
92
93 fn isl_val_is_one(v: uintptr_t) -> i32;
94
95 fn isl_val_is_pos(v: uintptr_t) -> i32;
96
97 fn isl_val_is_rat(v: uintptr_t) -> i32;
98
99 fn isl_val_is_zero(v: uintptr_t) -> i32;
100
101 fn isl_val_le(v1: uintptr_t, v2: uintptr_t) -> i32;
102
103 fn isl_val_lt(v1: uintptr_t, v2: uintptr_t) -> i32;
104
105 fn isl_val_max(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
106
107 fn isl_val_min(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
108
109 fn isl_val_mod(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
110
111 fn isl_val_mul(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
112
113 fn isl_val_mul_ui(v1: uintptr_t, v2: u64) -> uintptr_t;
114
115 fn isl_val_n_abs_num_chunks(v: uintptr_t, size: usize) -> i32;
116
117 fn isl_val_nan(ctx: uintptr_t) -> uintptr_t;
118
119 fn isl_val_ne(v1: uintptr_t, v2: uintptr_t) -> i32;
120
121 fn isl_val_neg(v: uintptr_t) -> uintptr_t;
122
123 fn isl_val_neginfty(ctx: uintptr_t) -> uintptr_t;
124
125 fn isl_val_negone(ctx: uintptr_t) -> uintptr_t;
126
127 fn isl_val_one(ctx: uintptr_t) -> uintptr_t;
128
129 fn isl_val_pow2(v: uintptr_t) -> uintptr_t;
130
131 fn isl_val_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
132
133 fn isl_val_set_si(v: uintptr_t, i: i64) -> uintptr_t;
134
135 fn isl_val_sgn(v: uintptr_t) -> i32;
136
137 fn isl_val_sub(v1: uintptr_t, v2: uintptr_t) -> uintptr_t;
138
139 fn isl_val_sub_ui(v1: uintptr_t, v2: u64) -> uintptr_t;
140
141 fn isl_val_to_list(el: uintptr_t) -> uintptr_t;
142
143 fn isl_val_to_str(v: uintptr_t) -> *const c_char;
144
145 fn isl_val_trunc(v: uintptr_t) -> uintptr_t;
146
147 fn isl_val_zero(ctx: uintptr_t) -> uintptr_t;
148
149}
150
151impl Val {
152 pub fn to_exp(self) -> Result<Val, LibISLError> {
154 let v = self;
155 let isl_rs_ctx = v.get_ctx();
156 let mut v = v;
157 v.do_not_free_on_drop();
158 let v = v.ptr;
159 let isl_rs_result = unsafe { isl_val_2exp(v) };
160 let isl_rs_result = Val { ptr: isl_rs_result,
161 should_free_on_drop: true };
162 let err = isl_rs_ctx.last_error();
163 if err != Error::None_ {
164 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
165 }
166 Ok(isl_rs_result)
167 }
168
169 pub fn abs(self) -> Result<Val, LibISLError> {
171 let v = self;
172 let isl_rs_ctx = v.get_ctx();
173 let mut v = v;
174 v.do_not_free_on_drop();
175 let v = v.ptr;
176 let isl_rs_result = unsafe { isl_val_abs(v) };
177 let isl_rs_result = Val { ptr: isl_rs_result,
178 should_free_on_drop: true };
179 let err = isl_rs_ctx.last_error();
180 if err != Error::None_ {
181 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
182 }
183 Ok(isl_rs_result)
184 }
185
186 pub fn abs_eq(&self, v2: &Val) -> Result<bool, LibISLError> {
188 let v1 = self;
189 let isl_rs_ctx = v1.get_ctx();
190 let v1 = v1.ptr;
191 let v2 = v2.ptr;
192 let isl_rs_result = unsafe { isl_val_abs_eq(v1, v2) };
193 let isl_rs_result = match isl_rs_result {
194 0 => false,
195 1 => true,
196 _ => panic!("Got isl_bool = -1"),
197 };
198 let err = isl_rs_ctx.last_error();
199 if err != Error::None_ {
200 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
201 }
202 Ok(isl_rs_result)
203 }
204
205 pub fn add(self, v2: Val) -> Result<Val, LibISLError> {
207 let v1 = self;
208 let isl_rs_ctx = v1.get_ctx();
209 let mut v1 = v1;
210 v1.do_not_free_on_drop();
211 let v1 = v1.ptr;
212 let mut v2 = v2;
213 v2.do_not_free_on_drop();
214 let v2 = v2.ptr;
215 let isl_rs_result = unsafe { isl_val_add(v1, v2) };
216 let isl_rs_result = Val { ptr: isl_rs_result,
217 should_free_on_drop: true };
218 let err = isl_rs_ctx.last_error();
219 if err != Error::None_ {
220 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
221 }
222 Ok(isl_rs_result)
223 }
224
225 pub fn add_ui(self, v2: u64) -> Result<Val, LibISLError> {
227 let v1 = self;
228 let isl_rs_ctx = v1.get_ctx();
229 let mut v1 = v1;
230 v1.do_not_free_on_drop();
231 let v1 = v1.ptr;
232 let isl_rs_result = unsafe { isl_val_add_ui(v1, v2) };
233 let isl_rs_result = Val { ptr: isl_rs_result,
234 should_free_on_drop: true };
235 let err = isl_rs_ctx.last_error();
236 if err != Error::None_ {
237 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
238 }
239 Ok(isl_rs_result)
240 }
241
242 pub fn ceil(self) -> Result<Val, LibISLError> {
244 let v = self;
245 let isl_rs_ctx = v.get_ctx();
246 let mut v = v;
247 v.do_not_free_on_drop();
248 let v = v.ptr;
249 let isl_rs_result = unsafe { isl_val_ceil(v) };
250 let isl_rs_result = Val { ptr: isl_rs_result,
251 should_free_on_drop: true };
252 let err = isl_rs_ctx.last_error();
253 if err != Error::None_ {
254 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
255 }
256 Ok(isl_rs_result)
257 }
258
259 pub fn cmp_si(&self, i: i64) -> Result<i32, LibISLError> {
261 let v = self;
262 let isl_rs_ctx = v.get_ctx();
263 let v = v.ptr;
264 let isl_rs_result = unsafe { isl_val_cmp_si(v, i) };
265 let err = isl_rs_ctx.last_error();
266 if err != Error::None_ {
267 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
268 }
269 Ok(isl_rs_result)
270 }
271
272 pub fn copy(&self) -> Result<Val, LibISLError> {
274 let v = self;
275 let isl_rs_ctx = v.get_ctx();
276 let v = v.ptr;
277 let isl_rs_result = unsafe { isl_val_copy(v) };
278 let isl_rs_result = Val { ptr: isl_rs_result,
279 should_free_on_drop: true };
280 let err = isl_rs_ctx.last_error();
281 if err != Error::None_ {
282 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
283 }
284 Ok(isl_rs_result)
285 }
286
287 pub fn div(self, v2: Val) -> Result<Val, LibISLError> {
289 let v1 = self;
290 let isl_rs_ctx = v1.get_ctx();
291 let mut v1 = v1;
292 v1.do_not_free_on_drop();
293 let v1 = v1.ptr;
294 let mut v2 = v2;
295 v2.do_not_free_on_drop();
296 let v2 = v2.ptr;
297 let isl_rs_result = unsafe { isl_val_div(v1, v2) };
298 let isl_rs_result = Val { ptr: isl_rs_result,
299 should_free_on_drop: true };
300 let err = isl_rs_ctx.last_error();
301 if err != Error::None_ {
302 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
303 }
304 Ok(isl_rs_result)
305 }
306
307 pub fn div_ui(self, v2: u64) -> Result<Val, LibISLError> {
309 let v1 = self;
310 let isl_rs_ctx = v1.get_ctx();
311 let mut v1 = v1;
312 v1.do_not_free_on_drop();
313 let v1 = v1.ptr;
314 let isl_rs_result = unsafe { isl_val_div_ui(v1, v2) };
315 let isl_rs_result = Val { ptr: isl_rs_result,
316 should_free_on_drop: true };
317 let err = isl_rs_ctx.last_error();
318 if err != Error::None_ {
319 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
320 }
321 Ok(isl_rs_result)
322 }
323
324 pub fn dump(&self) -> Result<(), LibISLError> {
326 let v = self;
327 let isl_rs_ctx = v.get_ctx();
328 let v = v.ptr;
329 let isl_rs_result = unsafe { isl_val_dump(v) };
330 let err = isl_rs_ctx.last_error();
331 if err != Error::None_ {
332 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
333 }
334 Ok(isl_rs_result)
335 }
336
337 pub fn eq(&self, v2: &Val) -> Result<bool, LibISLError> {
339 let v1 = self;
340 let isl_rs_ctx = v1.get_ctx();
341 let v1 = v1.ptr;
342 let v2 = v2.ptr;
343 let isl_rs_result = unsafe { isl_val_eq(v1, v2) };
344 let isl_rs_result = match isl_rs_result {
345 0 => false,
346 1 => true,
347 _ => panic!("Got isl_bool = -1"),
348 };
349 let err = isl_rs_ctx.last_error();
350 if err != Error::None_ {
351 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
352 }
353 Ok(isl_rs_result)
354 }
355
356 pub fn eq_si(&self, i: i64) -> Result<bool, LibISLError> {
358 let v = self;
359 let isl_rs_ctx = v.get_ctx();
360 let v = v.ptr;
361 let isl_rs_result = unsafe { isl_val_eq_si(v, i) };
362 let isl_rs_result = match isl_rs_result {
363 0 => false,
364 1 => true,
365 _ => panic!("Got isl_bool = -1"),
366 };
367 let err = isl_rs_ctx.last_error();
368 if err != Error::None_ {
369 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
370 }
371 Ok(isl_rs_result)
372 }
373
374 pub fn floor(self) -> Result<Val, LibISLError> {
376 let v = self;
377 let isl_rs_ctx = v.get_ctx();
378 let mut v = v;
379 v.do_not_free_on_drop();
380 let v = v.ptr;
381 let isl_rs_result = unsafe { isl_val_floor(v) };
382 let isl_rs_result = Val { ptr: isl_rs_result,
383 should_free_on_drop: true };
384 let err = isl_rs_ctx.last_error();
385 if err != Error::None_ {
386 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
387 }
388 Ok(isl_rs_result)
389 }
390
391 pub fn free(self) -> Result<Val, LibISLError> {
393 let v = self;
394 let isl_rs_ctx = v.get_ctx();
395 let mut v = v;
396 v.do_not_free_on_drop();
397 let v = v.ptr;
398 let isl_rs_result = unsafe { isl_val_free(v) };
399 let isl_rs_result = Val { ptr: isl_rs_result,
400 should_free_on_drop: true };
401 let err = isl_rs_ctx.last_error();
402 if err != Error::None_ {
403 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
404 }
405 Ok(isl_rs_result)
406 }
407
408 pub fn gcd(self, v2: Val) -> Result<Val, LibISLError> {
410 let v1 = self;
411 let isl_rs_ctx = v1.get_ctx();
412 let mut v1 = v1;
413 v1.do_not_free_on_drop();
414 let v1 = v1.ptr;
415 let mut v2 = v2;
416 v2.do_not_free_on_drop();
417 let v2 = v2.ptr;
418 let isl_rs_result = unsafe { isl_val_gcd(v1, v2) };
419 let isl_rs_result = Val { ptr: isl_rs_result,
420 should_free_on_drop: true };
421 let err = isl_rs_ctx.last_error();
422 if err != Error::None_ {
423 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
424 }
425 Ok(isl_rs_result)
426 }
427
428 pub fn ge(&self, v2: &Val) -> Result<bool, LibISLError> {
430 let v1 = self;
431 let isl_rs_ctx = v1.get_ctx();
432 let v1 = v1.ptr;
433 let v2 = v2.ptr;
434 let isl_rs_result = unsafe { isl_val_ge(v1, v2) };
435 let isl_rs_result = match isl_rs_result {
436 0 => false,
437 1 => true,
438 _ => panic!("Got isl_bool = -1"),
439 };
440 let err = isl_rs_ctx.last_error();
441 if err != Error::None_ {
442 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
443 }
444 Ok(isl_rs_result)
445 }
446
447 pub fn get_ctx(&self) -> Context {
449 let val = self;
450 let val = val.ptr;
451 let isl_rs_result = unsafe { isl_val_get_ctx(val) };
452 let isl_rs_result = Context { ptr: isl_rs_result,
453 should_free_on_drop: false };
454 isl_rs_result
455 }
456
457 pub fn get_d(&self) -> Result<f64, LibISLError> {
459 let v = self;
460 let isl_rs_ctx = v.get_ctx();
461 let v = v.ptr;
462 let isl_rs_result = unsafe { isl_val_get_d(v) };
463 let err = isl_rs_ctx.last_error();
464 if err != Error::None_ {
465 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
466 }
467 Ok(isl_rs_result)
468 }
469
470 pub fn get_den_si(&self) -> Result<i64, LibISLError> {
472 let v = self;
473 let isl_rs_ctx = v.get_ctx();
474 let v = v.ptr;
475 let isl_rs_result = unsafe { isl_val_get_den_si(v) };
476 let err = isl_rs_ctx.last_error();
477 if err != Error::None_ {
478 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
479 }
480 Ok(isl_rs_result)
481 }
482
483 pub fn get_den_val(&self) -> Result<Val, LibISLError> {
485 let v = self;
486 let isl_rs_ctx = v.get_ctx();
487 let v = v.ptr;
488 let isl_rs_result = unsafe { isl_val_get_den_val(v) };
489 let isl_rs_result = Val { ptr: isl_rs_result,
490 should_free_on_drop: true };
491 let err = isl_rs_ctx.last_error();
492 if err != Error::None_ {
493 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
494 }
495 Ok(isl_rs_result)
496 }
497
498 pub fn get_hash(&self) -> Result<u32, LibISLError> {
500 let val = self;
501 let isl_rs_ctx = val.get_ctx();
502 let val = val.ptr;
503 let isl_rs_result = unsafe { isl_val_get_hash(val) };
504 let err = isl_rs_ctx.last_error();
505 if err != Error::None_ {
506 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
507 }
508 Ok(isl_rs_result)
509 }
510
511 pub fn get_num_si(&self) -> Result<i64, LibISLError> {
513 let v = self;
514 let isl_rs_ctx = v.get_ctx();
515 let v = v.ptr;
516 let isl_rs_result = unsafe { isl_val_get_num_si(v) };
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 gt(&self, v2: &Val) -> Result<bool, LibISLError> {
526 let v1 = self;
527 let isl_rs_ctx = v1.get_ctx();
528 let v1 = v1.ptr;
529 let v2 = v2.ptr;
530 let isl_rs_result = unsafe { isl_val_gt(v1, v2) };
531 let isl_rs_result = match isl_rs_result {
532 0 => false,
533 1 => true,
534 _ => panic!("Got isl_bool = -1"),
535 };
536 let err = isl_rs_ctx.last_error();
537 if err != Error::None_ {
538 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
539 }
540 Ok(isl_rs_result)
541 }
542
543 pub fn gt_si(&self, i: i64) -> Result<bool, LibISLError> {
545 let v = self;
546 let isl_rs_ctx = v.get_ctx();
547 let v = v.ptr;
548 let isl_rs_result = unsafe { isl_val_gt_si(v, i) };
549 let isl_rs_result = match isl_rs_result {
550 0 => false,
551 1 => true,
552 _ => panic!("Got isl_bool = -1"),
553 };
554 let err = isl_rs_ctx.last_error();
555 if err != Error::None_ {
556 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
557 }
558 Ok(isl_rs_result)
559 }
560
561 pub fn infty(ctx: &Context) -> Result<Val, LibISLError> {
563 let isl_rs_ctx = Context { ptr: ctx.ptr,
564 should_free_on_drop: false };
565 let ctx = ctx.ptr;
566 let isl_rs_result = unsafe { isl_val_infty(ctx) };
567 let isl_rs_result = Val { ptr: isl_rs_result,
568 should_free_on_drop: true };
569 let err = isl_rs_ctx.last_error();
570 if err != Error::None_ {
571 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
572 }
573 Ok(isl_rs_result)
574 }
575
576 pub fn int_from_si(ctx: &Context, i: i64) -> Result<Val, LibISLError> {
578 let isl_rs_ctx = Context { ptr: ctx.ptr,
579 should_free_on_drop: false };
580 let ctx = ctx.ptr;
581 let isl_rs_result = unsafe { isl_val_int_from_si(ctx, i) };
582 let isl_rs_result = Val { ptr: isl_rs_result,
583 should_free_on_drop: true };
584 let err = isl_rs_ctx.last_error();
585 if err != Error::None_ {
586 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
587 }
588 Ok(isl_rs_result)
589 }
590
591 pub fn int_from_ui(ctx: &Context, u: u64) -> Result<Val, LibISLError> {
593 let isl_rs_ctx = Context { ptr: ctx.ptr,
594 should_free_on_drop: false };
595 let ctx = ctx.ptr;
596 let isl_rs_result = unsafe { isl_val_int_from_ui(ctx, u) };
597 let isl_rs_result = Val { ptr: isl_rs_result,
598 should_free_on_drop: true };
599 let err = isl_rs_ctx.last_error();
600 if err != Error::None_ {
601 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
602 }
603 Ok(isl_rs_result)
604 }
605
606 pub fn inv(self) -> Result<Val, LibISLError> {
608 let v = self;
609 let isl_rs_ctx = v.get_ctx();
610 let mut v = v;
611 v.do_not_free_on_drop();
612 let v = v.ptr;
613 let isl_rs_result = unsafe { isl_val_inv(v) };
614 let isl_rs_result = Val { ptr: isl_rs_result,
615 should_free_on_drop: true };
616 let err = isl_rs_ctx.last_error();
617 if err != Error::None_ {
618 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
619 }
620 Ok(isl_rs_result)
621 }
622
623 pub fn is_divisible_by(&self, v2: &Val) -> Result<bool, LibISLError> {
625 let v1 = self;
626 let isl_rs_ctx = v1.get_ctx();
627 let v1 = v1.ptr;
628 let v2 = v2.ptr;
629 let isl_rs_result = unsafe { isl_val_is_divisible_by(v1, v2) };
630 let isl_rs_result = match isl_rs_result {
631 0 => false,
632 1 => true,
633 _ => panic!("Got isl_bool = -1"),
634 };
635 let err = isl_rs_ctx.last_error();
636 if err != Error::None_ {
637 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
638 }
639 Ok(isl_rs_result)
640 }
641
642 pub fn is_infty(&self) -> Result<bool, LibISLError> {
644 let v = self;
645 let isl_rs_ctx = v.get_ctx();
646 let v = v.ptr;
647 let isl_rs_result = unsafe { isl_val_is_infty(v) };
648 let isl_rs_result = match isl_rs_result {
649 0 => false,
650 1 => true,
651 _ => panic!("Got isl_bool = -1"),
652 };
653 let err = isl_rs_ctx.last_error();
654 if err != Error::None_ {
655 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
656 }
657 Ok(isl_rs_result)
658 }
659
660 pub fn is_int(&self) -> Result<bool, LibISLError> {
662 let v = self;
663 let isl_rs_ctx = v.get_ctx();
664 let v = v.ptr;
665 let isl_rs_result = unsafe { isl_val_is_int(v) };
666 let isl_rs_result = match isl_rs_result {
667 0 => false,
668 1 => true,
669 _ => panic!("Got isl_bool = -1"),
670 };
671 let err = isl_rs_ctx.last_error();
672 if err != Error::None_ {
673 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
674 }
675 Ok(isl_rs_result)
676 }
677
678 pub fn is_nan(&self) -> Result<bool, LibISLError> {
680 let v = self;
681 let isl_rs_ctx = v.get_ctx();
682 let v = v.ptr;
683 let isl_rs_result = unsafe { isl_val_is_nan(v) };
684 let isl_rs_result = match isl_rs_result {
685 0 => false,
686 1 => true,
687 _ => panic!("Got isl_bool = -1"),
688 };
689 let err = isl_rs_ctx.last_error();
690 if err != Error::None_ {
691 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
692 }
693 Ok(isl_rs_result)
694 }
695
696 pub fn is_neg(&self) -> Result<bool, LibISLError> {
698 let v = self;
699 let isl_rs_ctx = v.get_ctx();
700 let v = v.ptr;
701 let isl_rs_result = unsafe { isl_val_is_neg(v) };
702 let isl_rs_result = match isl_rs_result {
703 0 => false,
704 1 => true,
705 _ => panic!("Got isl_bool = -1"),
706 };
707 let err = isl_rs_ctx.last_error();
708 if err != Error::None_ {
709 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
710 }
711 Ok(isl_rs_result)
712 }
713
714 pub fn is_neginfty(&self) -> Result<bool, LibISLError> {
716 let v = self;
717 let isl_rs_ctx = v.get_ctx();
718 let v = v.ptr;
719 let isl_rs_result = unsafe { isl_val_is_neginfty(v) };
720 let isl_rs_result = match isl_rs_result {
721 0 => false,
722 1 => true,
723 _ => panic!("Got isl_bool = -1"),
724 };
725 let err = isl_rs_ctx.last_error();
726 if err != Error::None_ {
727 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
728 }
729 Ok(isl_rs_result)
730 }
731
732 pub fn is_negone(&self) -> Result<bool, LibISLError> {
734 let v = self;
735 let isl_rs_ctx = v.get_ctx();
736 let v = v.ptr;
737 let isl_rs_result = unsafe { isl_val_is_negone(v) };
738 let isl_rs_result = match isl_rs_result {
739 0 => false,
740 1 => true,
741 _ => panic!("Got isl_bool = -1"),
742 };
743 let err = isl_rs_ctx.last_error();
744 if err != Error::None_ {
745 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
746 }
747 Ok(isl_rs_result)
748 }
749
750 pub fn is_nonneg(&self) -> Result<bool, LibISLError> {
752 let v = self;
753 let isl_rs_ctx = v.get_ctx();
754 let v = v.ptr;
755 let isl_rs_result = unsafe { isl_val_is_nonneg(v) };
756 let isl_rs_result = match isl_rs_result {
757 0 => false,
758 1 => true,
759 _ => panic!("Got isl_bool = -1"),
760 };
761 let err = isl_rs_ctx.last_error();
762 if err != Error::None_ {
763 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
764 }
765 Ok(isl_rs_result)
766 }
767
768 pub fn is_nonpos(&self) -> Result<bool, LibISLError> {
770 let v = self;
771 let isl_rs_ctx = v.get_ctx();
772 let v = v.ptr;
773 let isl_rs_result = unsafe { isl_val_is_nonpos(v) };
774 let isl_rs_result = match isl_rs_result {
775 0 => false,
776 1 => true,
777 _ => panic!("Got isl_bool = -1"),
778 };
779 let err = isl_rs_ctx.last_error();
780 if err != Error::None_ {
781 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
782 }
783 Ok(isl_rs_result)
784 }
785
786 pub fn is_one(&self) -> Result<bool, LibISLError> {
788 let v = self;
789 let isl_rs_ctx = v.get_ctx();
790 let v = v.ptr;
791 let isl_rs_result = unsafe { isl_val_is_one(v) };
792 let isl_rs_result = match isl_rs_result {
793 0 => false,
794 1 => true,
795 _ => panic!("Got isl_bool = -1"),
796 };
797 let err = isl_rs_ctx.last_error();
798 if err != Error::None_ {
799 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
800 }
801 Ok(isl_rs_result)
802 }
803
804 pub fn is_pos(&self) -> Result<bool, LibISLError> {
806 let v = self;
807 let isl_rs_ctx = v.get_ctx();
808 let v = v.ptr;
809 let isl_rs_result = unsafe { isl_val_is_pos(v) };
810 let isl_rs_result = match isl_rs_result {
811 0 => false,
812 1 => true,
813 _ => panic!("Got isl_bool = -1"),
814 };
815 let err = isl_rs_ctx.last_error();
816 if err != Error::None_ {
817 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
818 }
819 Ok(isl_rs_result)
820 }
821
822 pub fn is_rat(&self) -> Result<bool, LibISLError> {
824 let v = self;
825 let isl_rs_ctx = v.get_ctx();
826 let v = v.ptr;
827 let isl_rs_result = unsafe { isl_val_is_rat(v) };
828 let isl_rs_result = match isl_rs_result {
829 0 => false,
830 1 => true,
831 _ => panic!("Got isl_bool = -1"),
832 };
833 let err = isl_rs_ctx.last_error();
834 if err != Error::None_ {
835 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
836 }
837 Ok(isl_rs_result)
838 }
839
840 pub fn is_zero(&self) -> Result<bool, LibISLError> {
842 let v = self;
843 let isl_rs_ctx = v.get_ctx();
844 let v = v.ptr;
845 let isl_rs_result = unsafe { isl_val_is_zero(v) };
846 let isl_rs_result = match isl_rs_result {
847 0 => false,
848 1 => true,
849 _ => panic!("Got isl_bool = -1"),
850 };
851 let err = isl_rs_ctx.last_error();
852 if err != Error::None_ {
853 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
854 }
855 Ok(isl_rs_result)
856 }
857
858 pub fn le(&self, v2: &Val) -> Result<bool, LibISLError> {
860 let v1 = self;
861 let isl_rs_ctx = v1.get_ctx();
862 let v1 = v1.ptr;
863 let v2 = v2.ptr;
864 let isl_rs_result = unsafe { isl_val_le(v1, v2) };
865 let isl_rs_result = match isl_rs_result {
866 0 => false,
867 1 => true,
868 _ => panic!("Got isl_bool = -1"),
869 };
870 let err = isl_rs_ctx.last_error();
871 if err != Error::None_ {
872 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
873 }
874 Ok(isl_rs_result)
875 }
876
877 pub fn lt(&self, v2: &Val) -> Result<bool, LibISLError> {
879 let v1 = self;
880 let isl_rs_ctx = v1.get_ctx();
881 let v1 = v1.ptr;
882 let v2 = v2.ptr;
883 let isl_rs_result = unsafe { isl_val_lt(v1, v2) };
884 let isl_rs_result = match isl_rs_result {
885 0 => false,
886 1 => true,
887 _ => panic!("Got isl_bool = -1"),
888 };
889 let err = isl_rs_ctx.last_error();
890 if err != Error::None_ {
891 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
892 }
893 Ok(isl_rs_result)
894 }
895
896 pub fn max(self, v2: Val) -> Result<Val, LibISLError> {
898 let v1 = self;
899 let isl_rs_ctx = v1.get_ctx();
900 let mut v1 = v1;
901 v1.do_not_free_on_drop();
902 let v1 = v1.ptr;
903 let mut v2 = v2;
904 v2.do_not_free_on_drop();
905 let v2 = v2.ptr;
906 let isl_rs_result = unsafe { isl_val_max(v1, v2) };
907 let isl_rs_result = Val { ptr: isl_rs_result,
908 should_free_on_drop: true };
909 let err = isl_rs_ctx.last_error();
910 if err != Error::None_ {
911 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
912 }
913 Ok(isl_rs_result)
914 }
915
916 pub fn min(self, v2: Val) -> Result<Val, LibISLError> {
918 let v1 = self;
919 let isl_rs_ctx = v1.get_ctx();
920 let mut v1 = v1;
921 v1.do_not_free_on_drop();
922 let v1 = v1.ptr;
923 let mut v2 = v2;
924 v2.do_not_free_on_drop();
925 let v2 = v2.ptr;
926 let isl_rs_result = unsafe { isl_val_min(v1, v2) };
927 let isl_rs_result = Val { ptr: isl_rs_result,
928 should_free_on_drop: true };
929 let err = isl_rs_ctx.last_error();
930 if err != Error::None_ {
931 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
932 }
933 Ok(isl_rs_result)
934 }
935
936 pub fn mod_(self, v2: Val) -> Result<Val, LibISLError> {
938 let v1 = self;
939 let isl_rs_ctx = v1.get_ctx();
940 let mut v1 = v1;
941 v1.do_not_free_on_drop();
942 let v1 = v1.ptr;
943 let mut v2 = v2;
944 v2.do_not_free_on_drop();
945 let v2 = v2.ptr;
946 let isl_rs_result = unsafe { isl_val_mod(v1, v2) };
947 let isl_rs_result = Val { ptr: isl_rs_result,
948 should_free_on_drop: true };
949 let err = isl_rs_ctx.last_error();
950 if err != Error::None_ {
951 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
952 }
953 Ok(isl_rs_result)
954 }
955
956 pub fn mul(self, v2: Val) -> Result<Val, LibISLError> {
958 let v1 = self;
959 let isl_rs_ctx = v1.get_ctx();
960 let mut v1 = v1;
961 v1.do_not_free_on_drop();
962 let v1 = v1.ptr;
963 let mut v2 = v2;
964 v2.do_not_free_on_drop();
965 let v2 = v2.ptr;
966 let isl_rs_result = unsafe { isl_val_mul(v1, v2) };
967 let isl_rs_result = Val { ptr: isl_rs_result,
968 should_free_on_drop: true };
969 let err = isl_rs_ctx.last_error();
970 if err != Error::None_ {
971 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
972 }
973 Ok(isl_rs_result)
974 }
975
976 pub fn mul_ui(self, v2: u64) -> Result<Val, LibISLError> {
978 let v1 = self;
979 let isl_rs_ctx = v1.get_ctx();
980 let mut v1 = v1;
981 v1.do_not_free_on_drop();
982 let v1 = v1.ptr;
983 let isl_rs_result = unsafe { isl_val_mul_ui(v1, v2) };
984 let isl_rs_result = Val { ptr: isl_rs_result,
985 should_free_on_drop: true };
986 let err = isl_rs_ctx.last_error();
987 if err != Error::None_ {
988 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
989 }
990 Ok(isl_rs_result)
991 }
992
993 pub fn n_abs_num_chunks(&self, size: usize) -> Result<i32, LibISLError> {
995 let v = self;
996 let isl_rs_ctx = v.get_ctx();
997 let v = v.ptr;
998 let isl_rs_result = unsafe { isl_val_n_abs_num_chunks(v, size) };
999 let err = isl_rs_ctx.last_error();
1000 if err != Error::None_ {
1001 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1002 }
1003 Ok(isl_rs_result)
1004 }
1005
1006 pub fn nan(ctx: &Context) -> Result<Val, LibISLError> {
1008 let isl_rs_ctx = Context { ptr: ctx.ptr,
1009 should_free_on_drop: false };
1010 let ctx = ctx.ptr;
1011 let isl_rs_result = unsafe { isl_val_nan(ctx) };
1012 let isl_rs_result = Val { ptr: isl_rs_result,
1013 should_free_on_drop: true };
1014 let err = isl_rs_ctx.last_error();
1015 if err != Error::None_ {
1016 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1017 }
1018 Ok(isl_rs_result)
1019 }
1020
1021 pub fn ne(&self, v2: &Val) -> Result<bool, LibISLError> {
1023 let v1 = self;
1024 let isl_rs_ctx = v1.get_ctx();
1025 let v1 = v1.ptr;
1026 let v2 = v2.ptr;
1027 let isl_rs_result = unsafe { isl_val_ne(v1, v2) };
1028 let isl_rs_result = match isl_rs_result {
1029 0 => false,
1030 1 => true,
1031 _ => panic!("Got isl_bool = -1"),
1032 };
1033 let err = isl_rs_ctx.last_error();
1034 if err != Error::None_ {
1035 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1036 }
1037 Ok(isl_rs_result)
1038 }
1039
1040 pub fn neg(self) -> Result<Val, LibISLError> {
1042 let v = self;
1043 let isl_rs_ctx = v.get_ctx();
1044 let mut v = v;
1045 v.do_not_free_on_drop();
1046 let v = v.ptr;
1047 let isl_rs_result = unsafe { isl_val_neg(v) };
1048 let isl_rs_result = Val { ptr: isl_rs_result,
1049 should_free_on_drop: true };
1050 let err = isl_rs_ctx.last_error();
1051 if err != Error::None_ {
1052 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1053 }
1054 Ok(isl_rs_result)
1055 }
1056
1057 pub fn neginfty(ctx: &Context) -> Result<Val, LibISLError> {
1059 let isl_rs_ctx = Context { ptr: ctx.ptr,
1060 should_free_on_drop: false };
1061 let ctx = ctx.ptr;
1062 let isl_rs_result = unsafe { isl_val_neginfty(ctx) };
1063 let isl_rs_result = Val { ptr: isl_rs_result,
1064 should_free_on_drop: true };
1065 let err = isl_rs_ctx.last_error();
1066 if err != Error::None_ {
1067 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1068 }
1069 Ok(isl_rs_result)
1070 }
1071
1072 pub fn negone(ctx: &Context) -> Result<Val, LibISLError> {
1074 let isl_rs_ctx = Context { ptr: ctx.ptr,
1075 should_free_on_drop: false };
1076 let ctx = ctx.ptr;
1077 let isl_rs_result = unsafe { isl_val_negone(ctx) };
1078 let isl_rs_result = Val { ptr: isl_rs_result,
1079 should_free_on_drop: true };
1080 let err = isl_rs_ctx.last_error();
1081 if err != Error::None_ {
1082 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1083 }
1084 Ok(isl_rs_result)
1085 }
1086
1087 pub fn one(ctx: &Context) -> Result<Val, LibISLError> {
1089 let isl_rs_ctx = Context { ptr: ctx.ptr,
1090 should_free_on_drop: false };
1091 let ctx = ctx.ptr;
1092 let isl_rs_result = unsafe { isl_val_one(ctx) };
1093 let isl_rs_result = Val { ptr: isl_rs_result,
1094 should_free_on_drop: true };
1095 let err = isl_rs_ctx.last_error();
1096 if err != Error::None_ {
1097 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1098 }
1099 Ok(isl_rs_result)
1100 }
1101
1102 pub fn pow2(self) -> Result<Val, LibISLError> {
1104 let v = self;
1105 let isl_rs_ctx = v.get_ctx();
1106 let mut v = v;
1107 v.do_not_free_on_drop();
1108 let v = v.ptr;
1109 let isl_rs_result = unsafe { isl_val_pow2(v) };
1110 let isl_rs_result = Val { ptr: isl_rs_result,
1111 should_free_on_drop: true };
1112 let err = isl_rs_ctx.last_error();
1113 if err != Error::None_ {
1114 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1115 }
1116 Ok(isl_rs_result)
1117 }
1118
1119 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<Val, LibISLError> {
1121 let isl_rs_ctx = Context { ptr: ctx.ptr,
1122 should_free_on_drop: false };
1123 let ctx = ctx.ptr;
1124 let str_ = CString::new(str_).unwrap();
1125 let str_ = str_.as_ptr();
1126 let isl_rs_result = unsafe { isl_val_read_from_str(ctx, str_) };
1127 let isl_rs_result = Val { ptr: isl_rs_result,
1128 should_free_on_drop: true };
1129 let err = isl_rs_ctx.last_error();
1130 if err != Error::None_ {
1131 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1132 }
1133 Ok(isl_rs_result)
1134 }
1135
1136 pub fn set_si(self, i: i64) -> Result<Val, LibISLError> {
1138 let v = self;
1139 let isl_rs_ctx = v.get_ctx();
1140 let mut v = v;
1141 v.do_not_free_on_drop();
1142 let v = v.ptr;
1143 let isl_rs_result = unsafe { isl_val_set_si(v, i) };
1144 let isl_rs_result = Val { ptr: isl_rs_result,
1145 should_free_on_drop: true };
1146 let err = isl_rs_ctx.last_error();
1147 if err != Error::None_ {
1148 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1149 }
1150 Ok(isl_rs_result)
1151 }
1152
1153 pub fn sgn(&self) -> Result<i32, LibISLError> {
1155 let v = self;
1156 let isl_rs_ctx = v.get_ctx();
1157 let v = v.ptr;
1158 let isl_rs_result = unsafe { isl_val_sgn(v) };
1159 let err = isl_rs_ctx.last_error();
1160 if err != Error::None_ {
1161 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1162 }
1163 Ok(isl_rs_result)
1164 }
1165
1166 pub fn sub(self, v2: Val) -> Result<Val, LibISLError> {
1168 let v1 = self;
1169 let isl_rs_ctx = v1.get_ctx();
1170 let mut v1 = v1;
1171 v1.do_not_free_on_drop();
1172 let v1 = v1.ptr;
1173 let mut v2 = v2;
1174 v2.do_not_free_on_drop();
1175 let v2 = v2.ptr;
1176 let isl_rs_result = unsafe { isl_val_sub(v1, v2) };
1177 let isl_rs_result = Val { ptr: isl_rs_result,
1178 should_free_on_drop: true };
1179 let err = isl_rs_ctx.last_error();
1180 if err != Error::None_ {
1181 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1182 }
1183 Ok(isl_rs_result)
1184 }
1185
1186 pub fn sub_ui(self, v2: u64) -> Result<Val, LibISLError> {
1188 let v1 = self;
1189 let isl_rs_ctx = v1.get_ctx();
1190 let mut v1 = v1;
1191 v1.do_not_free_on_drop();
1192 let v1 = v1.ptr;
1193 let isl_rs_result = unsafe { isl_val_sub_ui(v1, v2) };
1194 let isl_rs_result = Val { ptr: isl_rs_result,
1195 should_free_on_drop: true };
1196 let err = isl_rs_ctx.last_error();
1197 if err != Error::None_ {
1198 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1199 }
1200 Ok(isl_rs_result)
1201 }
1202
1203 pub fn to_list(self) -> Result<ValList, LibISLError> {
1205 let el = self;
1206 let isl_rs_ctx = el.get_ctx();
1207 let mut el = el;
1208 el.do_not_free_on_drop();
1209 let el = el.ptr;
1210 let isl_rs_result = unsafe { isl_val_to_list(el) };
1211 let isl_rs_result = ValList { ptr: isl_rs_result,
1212 should_free_on_drop: true };
1213 let err = isl_rs_ctx.last_error();
1214 if err != Error::None_ {
1215 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1216 }
1217 Ok(isl_rs_result)
1218 }
1219
1220 pub fn to_str(&self) -> Result<&str, LibISLError> {
1222 let v = self;
1223 let isl_rs_ctx = v.get_ctx();
1224 let v = v.ptr;
1225 let isl_rs_result = unsafe { isl_val_to_str(v) };
1226 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1227 let isl_rs_result = isl_rs_result.to_str().unwrap();
1228 let err = isl_rs_ctx.last_error();
1229 if err != Error::None_ {
1230 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1231 }
1232 Ok(isl_rs_result)
1233 }
1234
1235 pub fn trunc(self) -> Result<Val, LibISLError> {
1237 let v = self;
1238 let isl_rs_ctx = v.get_ctx();
1239 let mut v = v;
1240 v.do_not_free_on_drop();
1241 let v = v.ptr;
1242 let isl_rs_result = unsafe { isl_val_trunc(v) };
1243 let isl_rs_result = Val { ptr: isl_rs_result,
1244 should_free_on_drop: true };
1245 let err = isl_rs_ctx.last_error();
1246 if err != Error::None_ {
1247 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1248 }
1249 Ok(isl_rs_result)
1250 }
1251
1252 pub fn zero(ctx: &Context) -> Result<Val, LibISLError> {
1254 let isl_rs_ctx = Context { ptr: ctx.ptr,
1255 should_free_on_drop: false };
1256 let ctx = ctx.ptr;
1257 let isl_rs_result = unsafe { isl_val_zero(ctx) };
1258 let isl_rs_result = Val { ptr: isl_rs_result,
1259 should_free_on_drop: true };
1260 let err = isl_rs_ctx.last_error();
1261 if err != Error::None_ {
1262 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1263 }
1264 Ok(isl_rs_result)
1265 }
1266
1267 pub fn do_not_free_on_drop(&mut self) {
1269 self.should_free_on_drop = false;
1270 }
1271}
1272
1273impl Drop for Val {
1274 fn drop(&mut self) {
1275 if self.should_free_on_drop {
1276 unsafe {
1277 isl_val_free(self.ptr);
1278 }
1279 }
1280 }
1281}