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