1use super::{
5 Aff, Constraint, Context, DimType, Error, LibISLError, Point, QPolynomialList, Set, Space,
6 Term, Val,
7};
8use libc::uintptr_t;
9use std::ffi::CString;
10use std::os::raw::c_char;
11
12pub struct QPolynomial {
14 pub ptr: uintptr_t,
15 pub should_free_on_drop: bool,
16}
17
18extern "C" {
19
20 fn isl_qpolynomial_add(qp1: uintptr_t, qp2: uintptr_t) -> uintptr_t;
21
22 fn isl_qpolynomial_add_dims(qp: uintptr_t, type_: i32, n: u32) -> uintptr_t;
23
24 fn isl_qpolynomial_align_params(qp: uintptr_t, model: uintptr_t) -> uintptr_t;
25
26 fn isl_qpolynomial_as_aff(qp: uintptr_t) -> uintptr_t;
27
28 fn isl_qpolynomial_copy(qp: uintptr_t) -> uintptr_t;
29
30 fn isl_qpolynomial_dim(qp: uintptr_t, type_: i32) -> i32;
31
32 fn isl_qpolynomial_domain_reverse(qp: uintptr_t) -> uintptr_t;
33
34 fn isl_qpolynomial_drop_dims(qp: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
35
36 fn isl_qpolynomial_dump(qp: uintptr_t) -> ();
37
38 fn isl_qpolynomial_eval(qp: uintptr_t, pnt: uintptr_t) -> uintptr_t;
39
40 fn isl_qpolynomial_free(qp: uintptr_t) -> uintptr_t;
41
42 fn isl_qpolynomial_from_aff(aff: uintptr_t) -> uintptr_t;
43
44 fn isl_qpolynomial_from_constraint(c: uintptr_t, type_: i32, pos: u32) -> uintptr_t;
45
46 fn isl_qpolynomial_from_term(term: uintptr_t) -> uintptr_t;
47
48 fn isl_qpolynomial_get_constant_val(qp: uintptr_t) -> uintptr_t;
49
50 fn isl_qpolynomial_get_ctx(qp: uintptr_t) -> uintptr_t;
51
52 fn isl_qpolynomial_get_domain_space(qp: uintptr_t) -> uintptr_t;
53
54 fn isl_qpolynomial_get_space(qp: uintptr_t) -> uintptr_t;
55
56 fn isl_qpolynomial_gist(qp: uintptr_t, context: uintptr_t) -> uintptr_t;
57
58 fn isl_qpolynomial_gist_params(qp: uintptr_t, context: uintptr_t) -> uintptr_t;
59
60 fn isl_qpolynomial_homogenize(poly: uintptr_t) -> uintptr_t;
61
62 fn isl_qpolynomial_infty_on_domain(domain: uintptr_t) -> uintptr_t;
63
64 fn isl_qpolynomial_insert_dims(qp: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
65
66 fn isl_qpolynomial_involves_dims(qp: uintptr_t, type_: i32, first: u32, n: u32) -> i32;
67
68 fn isl_qpolynomial_is_infty(qp: uintptr_t) -> i32;
69
70 fn isl_qpolynomial_is_nan(qp: uintptr_t) -> i32;
71
72 fn isl_qpolynomial_is_neginfty(qp: uintptr_t) -> i32;
73
74 fn isl_qpolynomial_is_zero(qp: uintptr_t) -> i32;
75
76 fn isl_qpolynomial_isa_aff(qp: uintptr_t) -> i32;
77
78 fn isl_qpolynomial_move_dims(qp: uintptr_t, dst_type: i32, dst_pos: u32, src_type: i32,
79 src_pos: u32, n: u32)
80 -> uintptr_t;
81
82 fn isl_qpolynomial_mul(qp1: uintptr_t, qp2: uintptr_t) -> uintptr_t;
83
84 fn isl_qpolynomial_nan_on_domain(domain: uintptr_t) -> uintptr_t;
85
86 fn isl_qpolynomial_neg(qp: uintptr_t) -> uintptr_t;
87
88 fn isl_qpolynomial_neginfty_on_domain(domain: uintptr_t) -> uintptr_t;
89
90 fn isl_qpolynomial_one_on_domain(domain: uintptr_t) -> uintptr_t;
91
92 fn isl_qpolynomial_plain_is_equal(qp1: uintptr_t, qp2: uintptr_t) -> i32;
93
94 fn isl_qpolynomial_pow(qp: uintptr_t, power: u32) -> uintptr_t;
95
96 fn isl_qpolynomial_project_domain_on_params(qp: uintptr_t) -> uintptr_t;
97
98 fn isl_qpolynomial_scale_down_val(qp: uintptr_t, v: uintptr_t) -> uintptr_t;
99
100 fn isl_qpolynomial_scale_val(qp: uintptr_t, v: uintptr_t) -> uintptr_t;
101
102 fn isl_qpolynomial_set_dim_name(qp: uintptr_t, type_: i32, pos: u32, s: *const c_char)
103 -> uintptr_t;
104
105 fn isl_qpolynomial_sgn(qp: uintptr_t) -> i32;
106
107 fn isl_qpolynomial_sub(qp1: uintptr_t, qp2: uintptr_t) -> uintptr_t;
108
109 fn isl_qpolynomial_to_list(el: uintptr_t) -> uintptr_t;
110
111 fn isl_qpolynomial_val_on_domain(space: uintptr_t, val: uintptr_t) -> uintptr_t;
112
113 fn isl_qpolynomial_var_on_domain(domain: uintptr_t, type_: i32, pos: u32) -> uintptr_t;
114
115 fn isl_qpolynomial_zero_on_domain(domain: uintptr_t) -> uintptr_t;
116
117}
118
119impl QPolynomial {
120 pub fn add(self, qp2: QPolynomial) -> Result<QPolynomial, LibISLError> {
122 let qp1 = self;
123 let isl_rs_ctx = qp1.get_ctx();
124 let mut qp1 = qp1;
125 qp1.do_not_free_on_drop();
126 let qp1 = qp1.ptr;
127 let mut qp2 = qp2;
128 qp2.do_not_free_on_drop();
129 let qp2 = qp2.ptr;
130 let isl_rs_result = unsafe { isl_qpolynomial_add(qp1, qp2) };
131 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
132 should_free_on_drop: true };
133 let err = isl_rs_ctx.last_error();
134 if err != Error::None_ {
135 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
136 }
137 Ok(isl_rs_result)
138 }
139
140 pub fn add_dims(self, type_: DimType, n: u32) -> Result<QPolynomial, LibISLError> {
142 let qp = self;
143 let isl_rs_ctx = qp.get_ctx();
144 let mut qp = qp;
145 qp.do_not_free_on_drop();
146 let qp = qp.ptr;
147 let type_ = type_.to_i32();
148 let isl_rs_result = unsafe { isl_qpolynomial_add_dims(qp, type_, n) };
149 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
150 should_free_on_drop: true };
151 let err = isl_rs_ctx.last_error();
152 if err != Error::None_ {
153 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
154 }
155 Ok(isl_rs_result)
156 }
157
158 pub fn align_params(self, model: Space) -> Result<QPolynomial, LibISLError> {
160 let qp = self;
161 let isl_rs_ctx = qp.get_ctx();
162 let mut qp = qp;
163 qp.do_not_free_on_drop();
164 let qp = qp.ptr;
165 let mut model = model;
166 model.do_not_free_on_drop();
167 let model = model.ptr;
168 let isl_rs_result = unsafe { isl_qpolynomial_align_params(qp, model) };
169 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
170 should_free_on_drop: true };
171 let err = isl_rs_ctx.last_error();
172 if err != Error::None_ {
173 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
174 }
175 Ok(isl_rs_result)
176 }
177
178 pub fn as_aff(self) -> Result<Aff, LibISLError> {
180 let qp = self;
181 let isl_rs_ctx = qp.get_ctx();
182 let mut qp = qp;
183 qp.do_not_free_on_drop();
184 let qp = qp.ptr;
185 let isl_rs_result = unsafe { isl_qpolynomial_as_aff(qp) };
186 let isl_rs_result = Aff { ptr: isl_rs_result,
187 should_free_on_drop: true };
188 let err = isl_rs_ctx.last_error();
189 if err != Error::None_ {
190 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
191 }
192 Ok(isl_rs_result)
193 }
194
195 pub fn copy(&self) -> Result<QPolynomial, LibISLError> {
197 let qp = self;
198 let isl_rs_ctx = qp.get_ctx();
199 let qp = qp.ptr;
200 let isl_rs_result = unsafe { isl_qpolynomial_copy(qp) };
201 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
202 should_free_on_drop: true };
203 let err = isl_rs_ctx.last_error();
204 if err != Error::None_ {
205 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
206 }
207 Ok(isl_rs_result)
208 }
209
210 pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
212 let qp = self;
213 let isl_rs_ctx = qp.get_ctx();
214 let qp = qp.ptr;
215 let type_ = type_.to_i32();
216 let isl_rs_result = unsafe { isl_qpolynomial_dim(qp, type_) };
217 let err = isl_rs_ctx.last_error();
218 if err != Error::None_ {
219 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
220 }
221 Ok(isl_rs_result)
222 }
223
224 pub fn domain_reverse(self) -> Result<QPolynomial, LibISLError> {
226 let qp = self;
227 let isl_rs_ctx = qp.get_ctx();
228 let mut qp = qp;
229 qp.do_not_free_on_drop();
230 let qp = qp.ptr;
231 let isl_rs_result = unsafe { isl_qpolynomial_domain_reverse(qp) };
232 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
233 should_free_on_drop: true };
234 let err = isl_rs_ctx.last_error();
235 if err != Error::None_ {
236 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
237 }
238 Ok(isl_rs_result)
239 }
240
241 pub fn drop_dims(self, type_: DimType, first: u32, n: u32) -> Result<QPolynomial, LibISLError> {
243 let qp = self;
244 let isl_rs_ctx = qp.get_ctx();
245 let mut qp = qp;
246 qp.do_not_free_on_drop();
247 let qp = qp.ptr;
248 let type_ = type_.to_i32();
249 let isl_rs_result = unsafe { isl_qpolynomial_drop_dims(qp, type_, first, n) };
250 let isl_rs_result = QPolynomial { 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 dump(&self) -> Result<(), LibISLError> {
261 let qp = self;
262 let isl_rs_ctx = qp.get_ctx();
263 let qp = qp.ptr;
264 let isl_rs_result = unsafe { isl_qpolynomial_dump(qp) };
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 eval(self, pnt: Point) -> Result<Val, LibISLError> {
274 let qp = self;
275 let isl_rs_ctx = qp.get_ctx();
276 let mut qp = qp;
277 qp.do_not_free_on_drop();
278 let qp = qp.ptr;
279 let mut pnt = pnt;
280 pnt.do_not_free_on_drop();
281 let pnt = pnt.ptr;
282 let isl_rs_result = unsafe { isl_qpolynomial_eval(qp, pnt) };
283 let isl_rs_result = Val { 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 free(self) -> Result<QPolynomial, LibISLError> {
294 let qp = self;
295 let isl_rs_ctx = qp.get_ctx();
296 let mut qp = qp;
297 qp.do_not_free_on_drop();
298 let qp = qp.ptr;
299 let isl_rs_result = unsafe { isl_qpolynomial_free(qp) };
300 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
301 should_free_on_drop: true };
302 let err = isl_rs_ctx.last_error();
303 if err != Error::None_ {
304 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
305 }
306 Ok(isl_rs_result)
307 }
308
309 pub fn from_aff(aff: Aff) -> Result<QPolynomial, LibISLError> {
311 let isl_rs_ctx = aff.get_ctx();
312 let mut aff = aff;
313 aff.do_not_free_on_drop();
314 let aff = aff.ptr;
315 let isl_rs_result = unsafe { isl_qpolynomial_from_aff(aff) };
316 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
317 should_free_on_drop: true };
318 let err = isl_rs_ctx.last_error();
319 if err != Error::None_ {
320 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
321 }
322 Ok(isl_rs_result)
323 }
324
325 pub fn from_constraint(c: Constraint, type_: DimType, pos: u32)
327 -> Result<QPolynomial, LibISLError> {
328 let isl_rs_ctx = c.get_ctx();
329 let mut c = c;
330 c.do_not_free_on_drop();
331 let c = c.ptr;
332 let type_ = type_.to_i32();
333 let isl_rs_result = unsafe { isl_qpolynomial_from_constraint(c, type_, pos) };
334 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
335 should_free_on_drop: true };
336 let err = isl_rs_ctx.last_error();
337 if err != Error::None_ {
338 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
339 }
340 Ok(isl_rs_result)
341 }
342
343 pub fn from_term(term: Term) -> Result<QPolynomial, LibISLError> {
345 let isl_rs_ctx = term.get_ctx();
346 let mut term = term;
347 term.do_not_free_on_drop();
348 let term = term.ptr;
349 let isl_rs_result = unsafe { isl_qpolynomial_from_term(term) };
350 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
351 should_free_on_drop: true };
352 let err = isl_rs_ctx.last_error();
353 if err != Error::None_ {
354 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
355 }
356 Ok(isl_rs_result)
357 }
358
359 pub fn get_constant_val(&self) -> Result<Val, LibISLError> {
361 let qp = self;
362 let isl_rs_ctx = qp.get_ctx();
363 let qp = qp.ptr;
364 let isl_rs_result = unsafe { isl_qpolynomial_get_constant_val(qp) };
365 let isl_rs_result = Val { ptr: isl_rs_result,
366 should_free_on_drop: true };
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 get_ctx(&self) -> Context {
376 let qp = self;
377 let qp = qp.ptr;
378 let isl_rs_result = unsafe { isl_qpolynomial_get_ctx(qp) };
379 let isl_rs_result = Context { ptr: isl_rs_result,
380 should_free_on_drop: false };
381 isl_rs_result
382 }
383
384 pub fn get_domain_space(&self) -> Result<Space, LibISLError> {
386 let qp = self;
387 let isl_rs_ctx = qp.get_ctx();
388 let qp = qp.ptr;
389 let isl_rs_result = unsafe { isl_qpolynomial_get_domain_space(qp) };
390 let isl_rs_result = Space { ptr: isl_rs_result,
391 should_free_on_drop: true };
392 let err = isl_rs_ctx.last_error();
393 if err != Error::None_ {
394 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
395 }
396 Ok(isl_rs_result)
397 }
398
399 pub fn get_space(&self) -> Result<Space, LibISLError> {
401 let qp = self;
402 let isl_rs_ctx = qp.get_ctx();
403 let qp = qp.ptr;
404 let isl_rs_result = unsafe { isl_qpolynomial_get_space(qp) };
405 let isl_rs_result = Space { ptr: isl_rs_result,
406 should_free_on_drop: true };
407 let err = isl_rs_ctx.last_error();
408 if err != Error::None_ {
409 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
410 }
411 Ok(isl_rs_result)
412 }
413
414 pub fn gist(self, context: Set) -> Result<QPolynomial, LibISLError> {
416 let qp = self;
417 let isl_rs_ctx = qp.get_ctx();
418 let mut qp = qp;
419 qp.do_not_free_on_drop();
420 let qp = qp.ptr;
421 let mut context = context;
422 context.do_not_free_on_drop();
423 let context = context.ptr;
424 let isl_rs_result = unsafe { isl_qpolynomial_gist(qp, context) };
425 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
426 should_free_on_drop: true };
427 let err = isl_rs_ctx.last_error();
428 if err != Error::None_ {
429 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
430 }
431 Ok(isl_rs_result)
432 }
433
434 pub fn gist_params(self, context: Set) -> Result<QPolynomial, LibISLError> {
436 let qp = self;
437 let isl_rs_ctx = qp.get_ctx();
438 let mut qp = qp;
439 qp.do_not_free_on_drop();
440 let qp = qp.ptr;
441 let mut context = context;
442 context.do_not_free_on_drop();
443 let context = context.ptr;
444 let isl_rs_result = unsafe { isl_qpolynomial_gist_params(qp, context) };
445 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
446 should_free_on_drop: true };
447 let err = isl_rs_ctx.last_error();
448 if err != Error::None_ {
449 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
450 }
451 Ok(isl_rs_result)
452 }
453
454 pub fn homogenize(self) -> Result<QPolynomial, LibISLError> {
456 let poly = self;
457 let isl_rs_ctx = poly.get_ctx();
458 let mut poly = poly;
459 poly.do_not_free_on_drop();
460 let poly = poly.ptr;
461 let isl_rs_result = unsafe { isl_qpolynomial_homogenize(poly) };
462 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
463 should_free_on_drop: true };
464 let err = isl_rs_ctx.last_error();
465 if err != Error::None_ {
466 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
467 }
468 Ok(isl_rs_result)
469 }
470
471 pub fn infty_on_domain(domain: Space) -> Result<QPolynomial, LibISLError> {
473 let isl_rs_ctx = domain.get_ctx();
474 let mut domain = domain;
475 domain.do_not_free_on_drop();
476 let domain = domain.ptr;
477 let isl_rs_result = unsafe { isl_qpolynomial_infty_on_domain(domain) };
478 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
479 should_free_on_drop: true };
480 let err = isl_rs_ctx.last_error();
481 if err != Error::None_ {
482 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
483 }
484 Ok(isl_rs_result)
485 }
486
487 pub fn insert_dims(self, type_: DimType, first: u32, n: u32)
489 -> Result<QPolynomial, LibISLError> {
490 let qp = self;
491 let isl_rs_ctx = qp.get_ctx();
492 let mut qp = qp;
493 qp.do_not_free_on_drop();
494 let qp = qp.ptr;
495 let type_ = type_.to_i32();
496 let isl_rs_result = unsafe { isl_qpolynomial_insert_dims(qp, type_, first, n) };
497 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
498 should_free_on_drop: true };
499 let err = isl_rs_ctx.last_error();
500 if err != Error::None_ {
501 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
502 }
503 Ok(isl_rs_result)
504 }
505
506 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
508 let qp = self;
509 let isl_rs_ctx = qp.get_ctx();
510 let qp = qp.ptr;
511 let type_ = type_.to_i32();
512 let isl_rs_result = unsafe { isl_qpolynomial_involves_dims(qp, type_, first, n) };
513 let isl_rs_result = match isl_rs_result {
514 0 => false,
515 1 => true,
516 _ => panic!("Got isl_bool = -1"),
517 };
518 let err = isl_rs_ctx.last_error();
519 if err != Error::None_ {
520 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
521 }
522 Ok(isl_rs_result)
523 }
524
525 pub fn is_infty(&self) -> Result<bool, LibISLError> {
527 let qp = self;
528 let isl_rs_ctx = qp.get_ctx();
529 let qp = qp.ptr;
530 let isl_rs_result = unsafe { isl_qpolynomial_is_infty(qp) };
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 is_nan(&self) -> Result<bool, LibISLError> {
545 let qp = self;
546 let isl_rs_ctx = qp.get_ctx();
547 let qp = qp.ptr;
548 let isl_rs_result = unsafe { isl_qpolynomial_is_nan(qp) };
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 is_neginfty(&self) -> Result<bool, LibISLError> {
563 let qp = self;
564 let isl_rs_ctx = qp.get_ctx();
565 let qp = qp.ptr;
566 let isl_rs_result = unsafe { isl_qpolynomial_is_neginfty(qp) };
567 let isl_rs_result = match isl_rs_result {
568 0 => false,
569 1 => true,
570 _ => panic!("Got isl_bool = -1"),
571 };
572 let err = isl_rs_ctx.last_error();
573 if err != Error::None_ {
574 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
575 }
576 Ok(isl_rs_result)
577 }
578
579 pub fn is_zero(&self) -> Result<bool, LibISLError> {
581 let qp = self;
582 let isl_rs_ctx = qp.get_ctx();
583 let qp = qp.ptr;
584 let isl_rs_result = unsafe { isl_qpolynomial_is_zero(qp) };
585 let isl_rs_result = match isl_rs_result {
586 0 => false,
587 1 => true,
588 _ => panic!("Got isl_bool = -1"),
589 };
590 let err = isl_rs_ctx.last_error();
591 if err != Error::None_ {
592 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
593 }
594 Ok(isl_rs_result)
595 }
596
597 pub fn isa_aff(&self) -> Result<bool, LibISLError> {
599 let qp = self;
600 let isl_rs_ctx = qp.get_ctx();
601 let qp = qp.ptr;
602 let isl_rs_result = unsafe { isl_qpolynomial_isa_aff(qp) };
603 let isl_rs_result = match isl_rs_result {
604 0 => false,
605 1 => true,
606 _ => panic!("Got isl_bool = -1"),
607 };
608 let err = isl_rs_ctx.last_error();
609 if err != Error::None_ {
610 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
611 }
612 Ok(isl_rs_result)
613 }
614
615 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
617 n: u32)
618 -> Result<QPolynomial, LibISLError> {
619 let qp = self;
620 let isl_rs_ctx = qp.get_ctx();
621 let mut qp = qp;
622 qp.do_not_free_on_drop();
623 let qp = qp.ptr;
624 let dst_type = dst_type.to_i32();
625 let src_type = src_type.to_i32();
626 let isl_rs_result =
627 unsafe { isl_qpolynomial_move_dims(qp, dst_type, dst_pos, src_type, src_pos, n) };
628 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
629 should_free_on_drop: true };
630 let err = isl_rs_ctx.last_error();
631 if err != Error::None_ {
632 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
633 }
634 Ok(isl_rs_result)
635 }
636
637 pub fn mul(self, qp2: QPolynomial) -> Result<QPolynomial, LibISLError> {
639 let qp1 = self;
640 let isl_rs_ctx = qp1.get_ctx();
641 let mut qp1 = qp1;
642 qp1.do_not_free_on_drop();
643 let qp1 = qp1.ptr;
644 let mut qp2 = qp2;
645 qp2.do_not_free_on_drop();
646 let qp2 = qp2.ptr;
647 let isl_rs_result = unsafe { isl_qpolynomial_mul(qp1, qp2) };
648 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
649 should_free_on_drop: true };
650 let err = isl_rs_ctx.last_error();
651 if err != Error::None_ {
652 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
653 }
654 Ok(isl_rs_result)
655 }
656
657 pub fn nan_on_domain(domain: Space) -> Result<QPolynomial, LibISLError> {
659 let isl_rs_ctx = domain.get_ctx();
660 let mut domain = domain;
661 domain.do_not_free_on_drop();
662 let domain = domain.ptr;
663 let isl_rs_result = unsafe { isl_qpolynomial_nan_on_domain(domain) };
664 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
665 should_free_on_drop: true };
666 let err = isl_rs_ctx.last_error();
667 if err != Error::None_ {
668 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
669 }
670 Ok(isl_rs_result)
671 }
672
673 pub fn neg(self) -> Result<QPolynomial, LibISLError> {
675 let qp = self;
676 let isl_rs_ctx = qp.get_ctx();
677 let mut qp = qp;
678 qp.do_not_free_on_drop();
679 let qp = qp.ptr;
680 let isl_rs_result = unsafe { isl_qpolynomial_neg(qp) };
681 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
682 should_free_on_drop: true };
683 let err = isl_rs_ctx.last_error();
684 if err != Error::None_ {
685 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
686 }
687 Ok(isl_rs_result)
688 }
689
690 pub fn neginfty_on_domain(domain: Space) -> Result<QPolynomial, LibISLError> {
692 let isl_rs_ctx = domain.get_ctx();
693 let mut domain = domain;
694 domain.do_not_free_on_drop();
695 let domain = domain.ptr;
696 let isl_rs_result = unsafe { isl_qpolynomial_neginfty_on_domain(domain) };
697 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
698 should_free_on_drop: true };
699 let err = isl_rs_ctx.last_error();
700 if err != Error::None_ {
701 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
702 }
703 Ok(isl_rs_result)
704 }
705
706 pub fn one_on_domain(domain: Space) -> Result<QPolynomial, LibISLError> {
708 let isl_rs_ctx = domain.get_ctx();
709 let mut domain = domain;
710 domain.do_not_free_on_drop();
711 let domain = domain.ptr;
712 let isl_rs_result = unsafe { isl_qpolynomial_one_on_domain(domain) };
713 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
714 should_free_on_drop: true };
715 let err = isl_rs_ctx.last_error();
716 if err != Error::None_ {
717 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
718 }
719 Ok(isl_rs_result)
720 }
721
722 pub fn plain_is_equal(&self, qp2: &QPolynomial) -> Result<bool, LibISLError> {
724 let qp1 = self;
725 let isl_rs_ctx = qp1.get_ctx();
726 let qp1 = qp1.ptr;
727 let qp2 = qp2.ptr;
728 let isl_rs_result = unsafe { isl_qpolynomial_plain_is_equal(qp1, qp2) };
729 let isl_rs_result = match isl_rs_result {
730 0 => false,
731 1 => true,
732 _ => panic!("Got isl_bool = -1"),
733 };
734 let err = isl_rs_ctx.last_error();
735 if err != Error::None_ {
736 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
737 }
738 Ok(isl_rs_result)
739 }
740
741 pub fn pow(self, power: u32) -> Result<QPolynomial, LibISLError> {
743 let qp = self;
744 let isl_rs_ctx = qp.get_ctx();
745 let mut qp = qp;
746 qp.do_not_free_on_drop();
747 let qp = qp.ptr;
748 let isl_rs_result = unsafe { isl_qpolynomial_pow(qp, power) };
749 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
750 should_free_on_drop: true };
751 let err = isl_rs_ctx.last_error();
752 if err != Error::None_ {
753 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
754 }
755 Ok(isl_rs_result)
756 }
757
758 pub fn project_domain_on_params(self) -> Result<QPolynomial, LibISLError> {
760 let qp = self;
761 let isl_rs_ctx = qp.get_ctx();
762 let mut qp = qp;
763 qp.do_not_free_on_drop();
764 let qp = qp.ptr;
765 let isl_rs_result = unsafe { isl_qpolynomial_project_domain_on_params(qp) };
766 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
767 should_free_on_drop: true };
768 let err = isl_rs_ctx.last_error();
769 if err != Error::None_ {
770 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
771 }
772 Ok(isl_rs_result)
773 }
774
775 pub fn scale_down_val(self, v: Val) -> Result<QPolynomial, LibISLError> {
777 let qp = self;
778 let isl_rs_ctx = qp.get_ctx();
779 let mut qp = qp;
780 qp.do_not_free_on_drop();
781 let qp = qp.ptr;
782 let mut v = v;
783 v.do_not_free_on_drop();
784 let v = v.ptr;
785 let isl_rs_result = unsafe { isl_qpolynomial_scale_down_val(qp, v) };
786 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
787 should_free_on_drop: true };
788 let err = isl_rs_ctx.last_error();
789 if err != Error::None_ {
790 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
791 }
792 Ok(isl_rs_result)
793 }
794
795 pub fn scale_val(self, v: Val) -> Result<QPolynomial, LibISLError> {
797 let qp = self;
798 let isl_rs_ctx = qp.get_ctx();
799 let mut qp = qp;
800 qp.do_not_free_on_drop();
801 let qp = qp.ptr;
802 let mut v = v;
803 v.do_not_free_on_drop();
804 let v = v.ptr;
805 let isl_rs_result = unsafe { isl_qpolynomial_scale_val(qp, v) };
806 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
807 should_free_on_drop: true };
808 let err = isl_rs_ctx.last_error();
809 if err != Error::None_ {
810 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
811 }
812 Ok(isl_rs_result)
813 }
814
815 pub fn set_dim_name(self, type_: DimType, pos: u32, s: &str)
817 -> Result<QPolynomial, LibISLError> {
818 let qp = self;
819 let isl_rs_ctx = qp.get_ctx();
820 let mut qp = qp;
821 qp.do_not_free_on_drop();
822 let qp = qp.ptr;
823 let type_ = type_.to_i32();
824 let s = CString::new(s).unwrap();
825 let s = s.as_ptr();
826 let isl_rs_result = unsafe { isl_qpolynomial_set_dim_name(qp, type_, pos, s) };
827 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
828 should_free_on_drop: true };
829 let err = isl_rs_ctx.last_error();
830 if err != Error::None_ {
831 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
832 }
833 Ok(isl_rs_result)
834 }
835
836 pub fn sgn(&self) -> Result<i32, LibISLError> {
838 let qp = self;
839 let isl_rs_ctx = qp.get_ctx();
840 let qp = qp.ptr;
841 let isl_rs_result = unsafe { isl_qpolynomial_sgn(qp) };
842 let err = isl_rs_ctx.last_error();
843 if err != Error::None_ {
844 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
845 }
846 Ok(isl_rs_result)
847 }
848
849 pub fn sub(self, qp2: QPolynomial) -> Result<QPolynomial, LibISLError> {
851 let qp1 = self;
852 let isl_rs_ctx = qp1.get_ctx();
853 let mut qp1 = qp1;
854 qp1.do_not_free_on_drop();
855 let qp1 = qp1.ptr;
856 let mut qp2 = qp2;
857 qp2.do_not_free_on_drop();
858 let qp2 = qp2.ptr;
859 let isl_rs_result = unsafe { isl_qpolynomial_sub(qp1, qp2) };
860 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
861 should_free_on_drop: true };
862 let err = isl_rs_ctx.last_error();
863 if err != Error::None_ {
864 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
865 }
866 Ok(isl_rs_result)
867 }
868
869 pub fn to_list(self) -> Result<QPolynomialList, LibISLError> {
871 let el = self;
872 let isl_rs_ctx = el.get_ctx();
873 let mut el = el;
874 el.do_not_free_on_drop();
875 let el = el.ptr;
876 let isl_rs_result = unsafe { isl_qpolynomial_to_list(el) };
877 let isl_rs_result = QPolynomialList { ptr: isl_rs_result,
878 should_free_on_drop: true };
879 let err = isl_rs_ctx.last_error();
880 if err != Error::None_ {
881 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
882 }
883 Ok(isl_rs_result)
884 }
885
886 pub fn val_on_domain(space: Space, val: Val) -> Result<QPolynomial, LibISLError> {
888 let isl_rs_ctx = space.get_ctx();
889 let mut space = space;
890 space.do_not_free_on_drop();
891 let space = space.ptr;
892 let mut val = val;
893 val.do_not_free_on_drop();
894 let val = val.ptr;
895 let isl_rs_result = unsafe { isl_qpolynomial_val_on_domain(space, val) };
896 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
897 should_free_on_drop: true };
898 let err = isl_rs_ctx.last_error();
899 if err != Error::None_ {
900 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
901 }
902 Ok(isl_rs_result)
903 }
904
905 pub fn var_on_domain(domain: Space, type_: DimType, pos: u32)
907 -> Result<QPolynomial, LibISLError> {
908 let isl_rs_ctx = domain.get_ctx();
909 let mut domain = domain;
910 domain.do_not_free_on_drop();
911 let domain = domain.ptr;
912 let type_ = type_.to_i32();
913 let isl_rs_result = unsafe { isl_qpolynomial_var_on_domain(domain, type_, pos) };
914 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
915 should_free_on_drop: true };
916 let err = isl_rs_ctx.last_error();
917 if err != Error::None_ {
918 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
919 }
920 Ok(isl_rs_result)
921 }
922
923 pub fn zero_on_domain(domain: Space) -> Result<QPolynomial, LibISLError> {
925 let isl_rs_ctx = domain.get_ctx();
926 let mut domain = domain;
927 domain.do_not_free_on_drop();
928 let domain = domain.ptr;
929 let isl_rs_result = unsafe { isl_qpolynomial_zero_on_domain(domain) };
930 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
931 should_free_on_drop: true };
932 let err = isl_rs_ctx.last_error();
933 if err != Error::None_ {
934 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
935 }
936 Ok(isl_rs_result)
937 }
938
939 pub fn do_not_free_on_drop(&mut self) {
942 self.should_free_on_drop = false;
943 }
944}
945
946impl Drop for QPolynomial {
947 fn drop(&mut self) {
948 if self.should_free_on_drop {
949 unsafe {
950 isl_qpolynomial_free(self.ptr);
951 }
952 }
953 }
954}