1use super::{
5 Context, DimType, Error, Id, LibISLError, Point, PwAff, PwQPolynomialList, QPolynomial, Set,
6 Space, UnionPwQPolynomial, Val,
7};
8use libc::uintptr_t;
9use std::ffi::{CStr, CString};
10use std::os::raw::c_char;
11
12pub struct PwQPolynomial {
14 pub ptr: uintptr_t,
15 pub should_free_on_drop: bool,
16}
17
18extern "C" {
19
20 fn isl_pw_qpolynomial_add(pwqp1: uintptr_t, pwqp2: uintptr_t) -> uintptr_t;
21
22 fn isl_pw_qpolynomial_add_dims(pwqp: uintptr_t, type_: i32, n: u32) -> uintptr_t;
23
24 fn isl_pw_qpolynomial_add_disjoint(pwqp1: uintptr_t, pwqp2: uintptr_t) -> uintptr_t;
25
26 fn isl_pw_qpolynomial_alloc(set: uintptr_t, qp: uintptr_t) -> uintptr_t;
27
28 fn isl_pw_qpolynomial_as_qpolynomial(pwqp: uintptr_t) -> uintptr_t;
29
30 fn isl_pw_qpolynomial_coalesce(pwqp: uintptr_t) -> uintptr_t;
31
32 fn isl_pw_qpolynomial_copy(pwqp: uintptr_t) -> uintptr_t;
33
34 fn isl_pw_qpolynomial_dim(pwqp: uintptr_t, type_: i32) -> i32;
35
36 fn isl_pw_qpolynomial_domain(pwqp: uintptr_t) -> uintptr_t;
37
38 fn isl_pw_qpolynomial_domain_reverse(pwqp: uintptr_t) -> uintptr_t;
39
40 fn isl_pw_qpolynomial_drop_dims(pwqp: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
41
42 fn isl_pw_qpolynomial_drop_unused_params(pwqp: uintptr_t) -> uintptr_t;
43
44 fn isl_pw_qpolynomial_dump(pwqp: uintptr_t) -> ();
45
46 fn isl_pw_qpolynomial_eval(pwqp: uintptr_t, pnt: uintptr_t) -> uintptr_t;
47
48 fn isl_pw_qpolynomial_find_dim_by_name(pwqp: uintptr_t, type_: i32, name: *const c_char)
49 -> i32;
50
51 fn isl_pw_qpolynomial_fix_val(pwqp: uintptr_t, type_: i32, n: u32, v: uintptr_t) -> uintptr_t;
52
53 fn isl_pw_qpolynomial_free(pwqp: uintptr_t) -> uintptr_t;
54
55 fn isl_pw_qpolynomial_from_pw_aff(pwaff: uintptr_t) -> uintptr_t;
56
57 fn isl_pw_qpolynomial_from_qpolynomial(qp: uintptr_t) -> uintptr_t;
58
59 fn isl_pw_qpolynomial_from_range(pwqp: uintptr_t) -> uintptr_t;
60
61 fn isl_pw_qpolynomial_get_ctx(pwqp: uintptr_t) -> uintptr_t;
62
63 fn isl_pw_qpolynomial_get_domain_space(pwqp: uintptr_t) -> uintptr_t;
64
65 fn isl_pw_qpolynomial_get_space(pwqp: uintptr_t) -> uintptr_t;
66
67 fn isl_pw_qpolynomial_gist(pwqp: uintptr_t, context: uintptr_t) -> uintptr_t;
68
69 fn isl_pw_qpolynomial_gist_params(pwqp: uintptr_t, context: uintptr_t) -> uintptr_t;
70
71 fn isl_pw_qpolynomial_has_equal_space(pwqp1: uintptr_t, pwqp2: uintptr_t) -> i32;
72
73 fn isl_pw_qpolynomial_insert_dims(pwqp: uintptr_t, type_: i32, first: u32, n: u32)
74 -> uintptr_t;
75
76 fn isl_pw_qpolynomial_intersect_domain(pwpq: uintptr_t, set: uintptr_t) -> uintptr_t;
77
78 fn isl_pw_qpolynomial_intersect_domain_wrapped_domain(pwpq: uintptr_t, set: uintptr_t)
79 -> uintptr_t;
80
81 fn isl_pw_qpolynomial_intersect_domain_wrapped_range(pwpq: uintptr_t, set: uintptr_t)
82 -> uintptr_t;
83
84 fn isl_pw_qpolynomial_intersect_params(pwpq: uintptr_t, set: uintptr_t) -> uintptr_t;
85
86 fn isl_pw_qpolynomial_involves_dims(pwqp: uintptr_t, type_: i32, first: u32, n: u32) -> i32;
87
88 fn isl_pw_qpolynomial_involves_nan(pwqp: uintptr_t) -> i32;
89
90 fn isl_pw_qpolynomial_involves_param_id(pwqp: uintptr_t, id: uintptr_t) -> i32;
91
92 fn isl_pw_qpolynomial_is_zero(pwqp: uintptr_t) -> i32;
93
94 fn isl_pw_qpolynomial_isa_qpolynomial(pwqp: uintptr_t) -> i32;
95
96 fn isl_pw_qpolynomial_max(pwqp: uintptr_t) -> uintptr_t;
97
98 fn isl_pw_qpolynomial_min(pwqp: uintptr_t) -> uintptr_t;
99
100 fn isl_pw_qpolynomial_move_dims(pwqp: uintptr_t, dst_type: i32, dst_pos: u32, src_type: i32,
101 src_pos: u32, n: u32)
102 -> uintptr_t;
103
104 fn isl_pw_qpolynomial_mul(pwqp1: uintptr_t, pwqp2: uintptr_t) -> uintptr_t;
105
106 fn isl_pw_qpolynomial_n_piece(pwqp: uintptr_t) -> i32;
107
108 fn isl_pw_qpolynomial_neg(pwqp: uintptr_t) -> uintptr_t;
109
110 fn isl_pw_qpolynomial_plain_is_equal(pwqp1: uintptr_t, pwqp2: uintptr_t) -> i32;
111
112 fn isl_pw_qpolynomial_pow(pwqp: uintptr_t, exponent: u32) -> uintptr_t;
113
114 fn isl_pw_qpolynomial_project_domain_on_params(pwqp: uintptr_t) -> uintptr_t;
115
116 fn isl_pw_qpolynomial_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
117
118 fn isl_pw_qpolynomial_reset_domain_space(pwqp: uintptr_t, space: uintptr_t) -> uintptr_t;
119
120 fn isl_pw_qpolynomial_reset_user(pwqp: uintptr_t) -> uintptr_t;
121
122 fn isl_pw_qpolynomial_scale_down_val(pwqp: uintptr_t, v: uintptr_t) -> uintptr_t;
123
124 fn isl_pw_qpolynomial_scale_val(pwqp: uintptr_t, v: uintptr_t) -> uintptr_t;
125
126 fn isl_pw_qpolynomial_set_dim_name(pwqp: uintptr_t, type_: i32, pos: u32, s: *const c_char)
127 -> uintptr_t;
128
129 fn isl_pw_qpolynomial_split_dims(pwqp: uintptr_t, type_: i32, first: u32, n: u32) -> uintptr_t;
130
131 fn isl_pw_qpolynomial_split_periods(pwqp: uintptr_t, max_periods: i32) -> uintptr_t;
132
133 fn isl_pw_qpolynomial_sub(pwqp1: uintptr_t, pwqp2: uintptr_t) -> uintptr_t;
134
135 fn isl_pw_qpolynomial_subtract_domain(pwpq: uintptr_t, set: uintptr_t) -> uintptr_t;
136
137 fn isl_pw_qpolynomial_to_list(el: uintptr_t) -> uintptr_t;
138
139 fn isl_pw_qpolynomial_to_polynomial(pwqp: uintptr_t, sign: i32) -> uintptr_t;
140
141 fn isl_pw_qpolynomial_to_str(pwqp: uintptr_t) -> *const c_char;
142
143 fn isl_pw_qpolynomial_to_union_pw_qpolynomial(pwqp: uintptr_t) -> uintptr_t;
144
145 fn isl_pw_qpolynomial_zero(space: uintptr_t) -> uintptr_t;
146
147}
148
149impl PwQPolynomial {
150 pub fn add(self, pwqp2: PwQPolynomial) -> Result<PwQPolynomial, LibISLError> {
152 let pwqp1 = self;
153 let isl_rs_ctx = pwqp1.get_ctx();
154 let mut pwqp1 = pwqp1;
155 pwqp1.do_not_free_on_drop();
156 let pwqp1 = pwqp1.ptr;
157 let mut pwqp2 = pwqp2;
158 pwqp2.do_not_free_on_drop();
159 let pwqp2 = pwqp2.ptr;
160 let isl_rs_result = unsafe { isl_pw_qpolynomial_add(pwqp1, pwqp2) };
161 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
162 should_free_on_drop: true };
163 let err = isl_rs_ctx.last_error();
164 if err != Error::None_ {
165 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
166 }
167 Ok(isl_rs_result)
168 }
169
170 pub fn add_dims(self, type_: DimType, n: u32) -> Result<PwQPolynomial, LibISLError> {
172 let pwqp = self;
173 let isl_rs_ctx = pwqp.get_ctx();
174 let mut pwqp = pwqp;
175 pwqp.do_not_free_on_drop();
176 let pwqp = pwqp.ptr;
177 let type_ = type_.to_i32();
178 let isl_rs_result = unsafe { isl_pw_qpolynomial_add_dims(pwqp, type_, n) };
179 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
180 should_free_on_drop: true };
181 let err = isl_rs_ctx.last_error();
182 if err != Error::None_ {
183 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
184 }
185 Ok(isl_rs_result)
186 }
187
188 pub fn add_disjoint(self, pwqp2: PwQPolynomial) -> Result<PwQPolynomial, LibISLError> {
190 let pwqp1 = self;
191 let isl_rs_ctx = pwqp1.get_ctx();
192 let mut pwqp1 = pwqp1;
193 pwqp1.do_not_free_on_drop();
194 let pwqp1 = pwqp1.ptr;
195 let mut pwqp2 = pwqp2;
196 pwqp2.do_not_free_on_drop();
197 let pwqp2 = pwqp2.ptr;
198 let isl_rs_result = unsafe { isl_pw_qpolynomial_add_disjoint(pwqp1, pwqp2) };
199 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
200 should_free_on_drop: true };
201 let err = isl_rs_ctx.last_error();
202 if err != Error::None_ {
203 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
204 }
205 Ok(isl_rs_result)
206 }
207
208 pub fn alloc(set: Set, qp: QPolynomial) -> Result<PwQPolynomial, LibISLError> {
210 let isl_rs_ctx = set.get_ctx();
211 let mut set = set;
212 set.do_not_free_on_drop();
213 let set = set.ptr;
214 let mut qp = qp;
215 qp.do_not_free_on_drop();
216 let qp = qp.ptr;
217 let isl_rs_result = unsafe { isl_pw_qpolynomial_alloc(set, qp) };
218 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
219 should_free_on_drop: true };
220 let err = isl_rs_ctx.last_error();
221 if err != Error::None_ {
222 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
223 }
224 Ok(isl_rs_result)
225 }
226
227 pub fn as_qpolynomial(self) -> Result<QPolynomial, LibISLError> {
229 let pwqp = self;
230 let isl_rs_ctx = pwqp.get_ctx();
231 let mut pwqp = pwqp;
232 pwqp.do_not_free_on_drop();
233 let pwqp = pwqp.ptr;
234 let isl_rs_result = unsafe { isl_pw_qpolynomial_as_qpolynomial(pwqp) };
235 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
236 should_free_on_drop: true };
237 let err = isl_rs_ctx.last_error();
238 if err != Error::None_ {
239 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
240 }
241 Ok(isl_rs_result)
242 }
243
244 pub fn coalesce(self) -> Result<PwQPolynomial, LibISLError> {
246 let pwqp = self;
247 let isl_rs_ctx = pwqp.get_ctx();
248 let mut pwqp = pwqp;
249 pwqp.do_not_free_on_drop();
250 let pwqp = pwqp.ptr;
251 let isl_rs_result = unsafe { isl_pw_qpolynomial_coalesce(pwqp) };
252 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
253 should_free_on_drop: true };
254 let err = isl_rs_ctx.last_error();
255 if err != Error::None_ {
256 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
257 }
258 Ok(isl_rs_result)
259 }
260
261 pub fn copy(&self) -> Result<PwQPolynomial, LibISLError> {
263 let pwqp = self;
264 let isl_rs_ctx = pwqp.get_ctx();
265 let pwqp = pwqp.ptr;
266 let isl_rs_result = unsafe { isl_pw_qpolynomial_copy(pwqp) };
267 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
268 should_free_on_drop: true };
269 let err = isl_rs_ctx.last_error();
270 if err != Error::None_ {
271 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
272 }
273 Ok(isl_rs_result)
274 }
275
276 pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
278 let pwqp = self;
279 let isl_rs_ctx = pwqp.get_ctx();
280 let pwqp = pwqp.ptr;
281 let type_ = type_.to_i32();
282 let isl_rs_result = unsafe { isl_pw_qpolynomial_dim(pwqp, type_) };
283 let err = isl_rs_ctx.last_error();
284 if err != Error::None_ {
285 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
286 }
287 Ok(isl_rs_result)
288 }
289
290 pub fn domain(self) -> Result<Set, LibISLError> {
292 let pwqp = self;
293 let isl_rs_ctx = pwqp.get_ctx();
294 let mut pwqp = pwqp;
295 pwqp.do_not_free_on_drop();
296 let pwqp = pwqp.ptr;
297 let isl_rs_result = unsafe { isl_pw_qpolynomial_domain(pwqp) };
298 let isl_rs_result = Set { 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 domain_reverse(self) -> Result<PwQPolynomial, LibISLError> {
309 let pwqp = self;
310 let isl_rs_ctx = pwqp.get_ctx();
311 let mut pwqp = pwqp;
312 pwqp.do_not_free_on_drop();
313 let pwqp = pwqp.ptr;
314 let isl_rs_result = unsafe { isl_pw_qpolynomial_domain_reverse(pwqp) };
315 let isl_rs_result = PwQPolynomial { 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 drop_dims(self, type_: DimType, first: u32, n: u32)
326 -> Result<PwQPolynomial, LibISLError> {
327 let pwqp = self;
328 let isl_rs_ctx = pwqp.get_ctx();
329 let mut pwqp = pwqp;
330 pwqp.do_not_free_on_drop();
331 let pwqp = pwqp.ptr;
332 let type_ = type_.to_i32();
333 let isl_rs_result = unsafe { isl_pw_qpolynomial_drop_dims(pwqp, type_, first, n) };
334 let isl_rs_result = PwQPolynomial { 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 drop_unused_params(self) -> Result<PwQPolynomial, LibISLError> {
345 let pwqp = self;
346 let isl_rs_ctx = pwqp.get_ctx();
347 let mut pwqp = pwqp;
348 pwqp.do_not_free_on_drop();
349 let pwqp = pwqp.ptr;
350 let isl_rs_result = unsafe { isl_pw_qpolynomial_drop_unused_params(pwqp) };
351 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
352 should_free_on_drop: true };
353 let err = isl_rs_ctx.last_error();
354 if err != Error::None_ {
355 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
356 }
357 Ok(isl_rs_result)
358 }
359
360 pub fn dump(&self) -> Result<(), LibISLError> {
362 let pwqp = self;
363 let isl_rs_ctx = pwqp.get_ctx();
364 let pwqp = pwqp.ptr;
365 let isl_rs_result = unsafe { isl_pw_qpolynomial_dump(pwqp) };
366 let err = isl_rs_ctx.last_error();
367 if err != Error::None_ {
368 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
369 }
370 Ok(isl_rs_result)
371 }
372
373 pub fn eval(self, pnt: Point) -> Result<Val, LibISLError> {
375 let pwqp = self;
376 let isl_rs_ctx = pwqp.get_ctx();
377 let mut pwqp = pwqp;
378 pwqp.do_not_free_on_drop();
379 let pwqp = pwqp.ptr;
380 let mut pnt = pnt;
381 pnt.do_not_free_on_drop();
382 let pnt = pnt.ptr;
383 let isl_rs_result = unsafe { isl_pw_qpolynomial_eval(pwqp, pnt) };
384 let isl_rs_result = Val { ptr: isl_rs_result,
385 should_free_on_drop: true };
386 let err = isl_rs_ctx.last_error();
387 if err != Error::None_ {
388 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
389 }
390 Ok(isl_rs_result)
391 }
392
393 pub fn find_dim_by_name(&self, type_: DimType, name: &str) -> Result<i32, LibISLError> {
395 let pwqp = self;
396 let isl_rs_ctx = pwqp.get_ctx();
397 let pwqp = pwqp.ptr;
398 let type_ = type_.to_i32();
399 let name = CString::new(name).unwrap();
400 let name = name.as_ptr();
401 let isl_rs_result = unsafe { isl_pw_qpolynomial_find_dim_by_name(pwqp, type_, name) };
402 let err = isl_rs_ctx.last_error();
403 if err != Error::None_ {
404 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
405 }
406 Ok(isl_rs_result)
407 }
408
409 pub fn fix_val(self, type_: DimType, n: u32, v: Val) -> Result<PwQPolynomial, LibISLError> {
411 let pwqp = self;
412 let isl_rs_ctx = pwqp.get_ctx();
413 let mut pwqp = pwqp;
414 pwqp.do_not_free_on_drop();
415 let pwqp = pwqp.ptr;
416 let type_ = type_.to_i32();
417 let mut v = v;
418 v.do_not_free_on_drop();
419 let v = v.ptr;
420 let isl_rs_result = unsafe { isl_pw_qpolynomial_fix_val(pwqp, type_, n, v) };
421 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
422 should_free_on_drop: true };
423 let err = isl_rs_ctx.last_error();
424 if err != Error::None_ {
425 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
426 }
427 Ok(isl_rs_result)
428 }
429
430 pub fn free(self) -> Result<PwQPolynomial, LibISLError> {
432 let pwqp = self;
433 let isl_rs_ctx = pwqp.get_ctx();
434 let mut pwqp = pwqp;
435 pwqp.do_not_free_on_drop();
436 let pwqp = pwqp.ptr;
437 let isl_rs_result = unsafe { isl_pw_qpolynomial_free(pwqp) };
438 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
439 should_free_on_drop: true };
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 from_pw_aff(pwaff: PwAff) -> Result<PwQPolynomial, LibISLError> {
449 let isl_rs_ctx = pwaff.get_ctx();
450 let mut pwaff = pwaff;
451 pwaff.do_not_free_on_drop();
452 let pwaff = pwaff.ptr;
453 let isl_rs_result = unsafe { isl_pw_qpolynomial_from_pw_aff(pwaff) };
454 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
455 should_free_on_drop: true };
456 let err = isl_rs_ctx.last_error();
457 if err != Error::None_ {
458 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
459 }
460 Ok(isl_rs_result)
461 }
462
463 pub fn from_qpolynomial(qp: QPolynomial) -> Result<PwQPolynomial, LibISLError> {
465 let isl_rs_ctx = qp.get_ctx();
466 let mut qp = qp;
467 qp.do_not_free_on_drop();
468 let qp = qp.ptr;
469 let isl_rs_result = unsafe { isl_pw_qpolynomial_from_qpolynomial(qp) };
470 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
471 should_free_on_drop: true };
472 let err = isl_rs_ctx.last_error();
473 if err != Error::None_ {
474 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
475 }
476 Ok(isl_rs_result)
477 }
478
479 pub fn from_range(self) -> Result<PwQPolynomial, LibISLError> {
481 let pwqp = self;
482 let isl_rs_ctx = pwqp.get_ctx();
483 let mut pwqp = pwqp;
484 pwqp.do_not_free_on_drop();
485 let pwqp = pwqp.ptr;
486 let isl_rs_result = unsafe { isl_pw_qpolynomial_from_range(pwqp) };
487 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
488 should_free_on_drop: true };
489 let err = isl_rs_ctx.last_error();
490 if err != Error::None_ {
491 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
492 }
493 Ok(isl_rs_result)
494 }
495
496 pub fn get_ctx(&self) -> Context {
498 let pwqp = self;
499 let pwqp = pwqp.ptr;
500 let isl_rs_result = unsafe { isl_pw_qpolynomial_get_ctx(pwqp) };
501 let isl_rs_result = Context { ptr: isl_rs_result,
502 should_free_on_drop: false };
503 isl_rs_result
504 }
505
506 pub fn get_domain_space(&self) -> Result<Space, LibISLError> {
508 let pwqp = self;
509 let isl_rs_ctx = pwqp.get_ctx();
510 let pwqp = pwqp.ptr;
511 let isl_rs_result = unsafe { isl_pw_qpolynomial_get_domain_space(pwqp) };
512 let isl_rs_result = Space { ptr: isl_rs_result,
513 should_free_on_drop: true };
514 let err = isl_rs_ctx.last_error();
515 if err != Error::None_ {
516 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
517 }
518 Ok(isl_rs_result)
519 }
520
521 pub fn get_space(&self) -> Result<Space, LibISLError> {
523 let pwqp = self;
524 let isl_rs_ctx = pwqp.get_ctx();
525 let pwqp = pwqp.ptr;
526 let isl_rs_result = unsafe { isl_pw_qpolynomial_get_space(pwqp) };
527 let isl_rs_result = Space { ptr: isl_rs_result,
528 should_free_on_drop: true };
529 let err = isl_rs_ctx.last_error();
530 if err != Error::None_ {
531 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
532 }
533 Ok(isl_rs_result)
534 }
535
536 pub fn gist(self, context: Set) -> Result<PwQPolynomial, LibISLError> {
538 let pwqp = self;
539 let isl_rs_ctx = pwqp.get_ctx();
540 let mut pwqp = pwqp;
541 pwqp.do_not_free_on_drop();
542 let pwqp = pwqp.ptr;
543 let mut context = context;
544 context.do_not_free_on_drop();
545 let context = context.ptr;
546 let isl_rs_result = unsafe { isl_pw_qpolynomial_gist(pwqp, context) };
547 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
548 should_free_on_drop: true };
549 let err = isl_rs_ctx.last_error();
550 if err != Error::None_ {
551 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
552 }
553 Ok(isl_rs_result)
554 }
555
556 pub fn gist_params(self, context: Set) -> Result<PwQPolynomial, LibISLError> {
558 let pwqp = self;
559 let isl_rs_ctx = pwqp.get_ctx();
560 let mut pwqp = pwqp;
561 pwqp.do_not_free_on_drop();
562 let pwqp = pwqp.ptr;
563 let mut context = context;
564 context.do_not_free_on_drop();
565 let context = context.ptr;
566 let isl_rs_result = unsafe { isl_pw_qpolynomial_gist_params(pwqp, context) };
567 let isl_rs_result = PwQPolynomial { 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 has_equal_space(&self, pwqp2: &PwQPolynomial) -> Result<bool, LibISLError> {
578 let pwqp1 = self;
579 let isl_rs_ctx = pwqp1.get_ctx();
580 let pwqp1 = pwqp1.ptr;
581 let pwqp2 = pwqp2.ptr;
582 let isl_rs_result = unsafe { isl_pw_qpolynomial_has_equal_space(pwqp1, pwqp2) };
583 let isl_rs_result = match isl_rs_result {
584 0 => false,
585 1 => true,
586 _ => panic!("Got isl_bool = -1"),
587 };
588 let err = isl_rs_ctx.last_error();
589 if err != Error::None_ {
590 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
591 }
592 Ok(isl_rs_result)
593 }
594
595 pub fn insert_dims(self, type_: DimType, first: u32, n: u32)
597 -> Result<PwQPolynomial, LibISLError> {
598 let pwqp = self;
599 let isl_rs_ctx = pwqp.get_ctx();
600 let mut pwqp = pwqp;
601 pwqp.do_not_free_on_drop();
602 let pwqp = pwqp.ptr;
603 let type_ = type_.to_i32();
604 let isl_rs_result = unsafe { isl_pw_qpolynomial_insert_dims(pwqp, type_, first, n) };
605 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
606 should_free_on_drop: true };
607 let err = isl_rs_ctx.last_error();
608 if err != Error::None_ {
609 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
610 }
611 Ok(isl_rs_result)
612 }
613
614 pub fn intersect_domain(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
616 let pwpq = self;
617 let isl_rs_ctx = pwpq.get_ctx();
618 let mut pwpq = pwpq;
619 pwpq.do_not_free_on_drop();
620 let pwpq = pwpq.ptr;
621 let mut set = set;
622 set.do_not_free_on_drop();
623 let set = set.ptr;
624 let isl_rs_result = unsafe { isl_pw_qpolynomial_intersect_domain(pwpq, set) };
625 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
626 should_free_on_drop: true };
627 let err = isl_rs_ctx.last_error();
628 if err != Error::None_ {
629 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
630 }
631 Ok(isl_rs_result)
632 }
633
634 pub fn intersect_domain_wrapped_domain(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
636 let pwpq = self;
637 let isl_rs_ctx = pwpq.get_ctx();
638 let mut pwpq = pwpq;
639 pwpq.do_not_free_on_drop();
640 let pwpq = pwpq.ptr;
641 let mut set = set;
642 set.do_not_free_on_drop();
643 let set = set.ptr;
644 let isl_rs_result =
645 unsafe { isl_pw_qpolynomial_intersect_domain_wrapped_domain(pwpq, set) };
646 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
647 should_free_on_drop: true };
648 let err = isl_rs_ctx.last_error();
649 if err != Error::None_ {
650 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
651 }
652 Ok(isl_rs_result)
653 }
654
655 pub fn intersect_domain_wrapped_range(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
657 let pwpq = self;
658 let isl_rs_ctx = pwpq.get_ctx();
659 let mut pwpq = pwpq;
660 pwpq.do_not_free_on_drop();
661 let pwpq = pwpq.ptr;
662 let mut set = set;
663 set.do_not_free_on_drop();
664 let set = set.ptr;
665 let isl_rs_result = unsafe { isl_pw_qpolynomial_intersect_domain_wrapped_range(pwpq, set) };
666 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
667 should_free_on_drop: true };
668 let err = isl_rs_ctx.last_error();
669 if err != Error::None_ {
670 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
671 }
672 Ok(isl_rs_result)
673 }
674
675 pub fn intersect_params(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
677 let pwpq = self;
678 let isl_rs_ctx = pwpq.get_ctx();
679 let mut pwpq = pwpq;
680 pwpq.do_not_free_on_drop();
681 let pwpq = pwpq.ptr;
682 let mut set = set;
683 set.do_not_free_on_drop();
684 let set = set.ptr;
685 let isl_rs_result = unsafe { isl_pw_qpolynomial_intersect_params(pwpq, set) };
686 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
687 should_free_on_drop: true };
688 let err = isl_rs_ctx.last_error();
689 if err != Error::None_ {
690 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
691 }
692 Ok(isl_rs_result)
693 }
694
695 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
697 let pwqp = self;
698 let isl_rs_ctx = pwqp.get_ctx();
699 let pwqp = pwqp.ptr;
700 let type_ = type_.to_i32();
701 let isl_rs_result = unsafe { isl_pw_qpolynomial_involves_dims(pwqp, type_, first, n) };
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 involves_nan(&self) -> Result<bool, LibISLError> {
716 let pwqp = self;
717 let isl_rs_ctx = pwqp.get_ctx();
718 let pwqp = pwqp.ptr;
719 let isl_rs_result = unsafe { isl_pw_qpolynomial_involves_nan(pwqp) };
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 involves_param_id(&self, id: &Id) -> Result<bool, LibISLError> {
734 let pwqp = self;
735 let isl_rs_ctx = pwqp.get_ctx();
736 let pwqp = pwqp.ptr;
737 let id = id.ptr;
738 let isl_rs_result = unsafe { isl_pw_qpolynomial_involves_param_id(pwqp, id) };
739 let isl_rs_result = match isl_rs_result {
740 0 => false,
741 1 => true,
742 _ => panic!("Got isl_bool = -1"),
743 };
744 let err = isl_rs_ctx.last_error();
745 if err != Error::None_ {
746 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
747 }
748 Ok(isl_rs_result)
749 }
750
751 pub fn is_zero(&self) -> Result<bool, LibISLError> {
753 let pwqp = self;
754 let isl_rs_ctx = pwqp.get_ctx();
755 let pwqp = pwqp.ptr;
756 let isl_rs_result = unsafe { isl_pw_qpolynomial_is_zero(pwqp) };
757 let isl_rs_result = match isl_rs_result {
758 0 => false,
759 1 => true,
760 _ => panic!("Got isl_bool = -1"),
761 };
762 let err = isl_rs_ctx.last_error();
763 if err != Error::None_ {
764 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
765 }
766 Ok(isl_rs_result)
767 }
768
769 pub fn isa_qpolynomial(&self) -> Result<bool, LibISLError> {
771 let pwqp = self;
772 let isl_rs_ctx = pwqp.get_ctx();
773 let pwqp = pwqp.ptr;
774 let isl_rs_result = unsafe { isl_pw_qpolynomial_isa_qpolynomial(pwqp) };
775 let isl_rs_result = match isl_rs_result {
776 0 => false,
777 1 => true,
778 _ => panic!("Got isl_bool = -1"),
779 };
780 let err = isl_rs_ctx.last_error();
781 if err != Error::None_ {
782 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
783 }
784 Ok(isl_rs_result)
785 }
786
787 pub fn max(self) -> Result<Val, LibISLError> {
789 let pwqp = self;
790 let isl_rs_ctx = pwqp.get_ctx();
791 let mut pwqp = pwqp;
792 pwqp.do_not_free_on_drop();
793 let pwqp = pwqp.ptr;
794 let isl_rs_result = unsafe { isl_pw_qpolynomial_max(pwqp) };
795 let isl_rs_result = Val { ptr: isl_rs_result,
796 should_free_on_drop: true };
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 min(self) -> Result<Val, LibISLError> {
806 let pwqp = self;
807 let isl_rs_ctx = pwqp.get_ctx();
808 let mut pwqp = pwqp;
809 pwqp.do_not_free_on_drop();
810 let pwqp = pwqp.ptr;
811 let isl_rs_result = unsafe { isl_pw_qpolynomial_min(pwqp) };
812 let isl_rs_result = Val { ptr: isl_rs_result,
813 should_free_on_drop: true };
814 let err = isl_rs_ctx.last_error();
815 if err != Error::None_ {
816 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
817 }
818 Ok(isl_rs_result)
819 }
820
821 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
823 n: u32)
824 -> Result<PwQPolynomial, LibISLError> {
825 let pwqp = self;
826 let isl_rs_ctx = pwqp.get_ctx();
827 let mut pwqp = pwqp;
828 pwqp.do_not_free_on_drop();
829 let pwqp = pwqp.ptr;
830 let dst_type = dst_type.to_i32();
831 let src_type = src_type.to_i32();
832 let isl_rs_result =
833 unsafe { isl_pw_qpolynomial_move_dims(pwqp, dst_type, dst_pos, src_type, src_pos, n) };
834 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
835 should_free_on_drop: true };
836 let err = isl_rs_ctx.last_error();
837 if err != Error::None_ {
838 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
839 }
840 Ok(isl_rs_result)
841 }
842
843 pub fn mul(self, pwqp2: PwQPolynomial) -> Result<PwQPolynomial, LibISLError> {
845 let pwqp1 = self;
846 let isl_rs_ctx = pwqp1.get_ctx();
847 let mut pwqp1 = pwqp1;
848 pwqp1.do_not_free_on_drop();
849 let pwqp1 = pwqp1.ptr;
850 let mut pwqp2 = pwqp2;
851 pwqp2.do_not_free_on_drop();
852 let pwqp2 = pwqp2.ptr;
853 let isl_rs_result = unsafe { isl_pw_qpolynomial_mul(pwqp1, pwqp2) };
854 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
855 should_free_on_drop: true };
856 let err = isl_rs_ctx.last_error();
857 if err != Error::None_ {
858 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
859 }
860 Ok(isl_rs_result)
861 }
862
863 pub fn n_piece(&self) -> Result<i32, LibISLError> {
865 let pwqp = self;
866 let isl_rs_ctx = pwqp.get_ctx();
867 let pwqp = pwqp.ptr;
868 let isl_rs_result = unsafe { isl_pw_qpolynomial_n_piece(pwqp) };
869 let err = isl_rs_ctx.last_error();
870 if err != Error::None_ {
871 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
872 }
873 Ok(isl_rs_result)
874 }
875
876 pub fn neg(self) -> Result<PwQPolynomial, LibISLError> {
878 let pwqp = self;
879 let isl_rs_ctx = pwqp.get_ctx();
880 let mut pwqp = pwqp;
881 pwqp.do_not_free_on_drop();
882 let pwqp = pwqp.ptr;
883 let isl_rs_result = unsafe { isl_pw_qpolynomial_neg(pwqp) };
884 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
885 should_free_on_drop: true };
886 let err = isl_rs_ctx.last_error();
887 if err != Error::None_ {
888 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
889 }
890 Ok(isl_rs_result)
891 }
892
893 pub fn plain_is_equal(&self, pwqp2: &PwQPolynomial) -> Result<bool, LibISLError> {
895 let pwqp1 = self;
896 let isl_rs_ctx = pwqp1.get_ctx();
897 let pwqp1 = pwqp1.ptr;
898 let pwqp2 = pwqp2.ptr;
899 let isl_rs_result = unsafe { isl_pw_qpolynomial_plain_is_equal(pwqp1, pwqp2) };
900 let isl_rs_result = match isl_rs_result {
901 0 => false,
902 1 => true,
903 _ => panic!("Got isl_bool = -1"),
904 };
905 let err = isl_rs_ctx.last_error();
906 if err != Error::None_ {
907 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
908 }
909 Ok(isl_rs_result)
910 }
911
912 pub fn pow(self, exponent: u32) -> Result<PwQPolynomial, LibISLError> {
914 let pwqp = self;
915 let isl_rs_ctx = pwqp.get_ctx();
916 let mut pwqp = pwqp;
917 pwqp.do_not_free_on_drop();
918 let pwqp = pwqp.ptr;
919 let isl_rs_result = unsafe { isl_pw_qpolynomial_pow(pwqp, exponent) };
920 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
921 should_free_on_drop: true };
922 let err = isl_rs_ctx.last_error();
923 if err != Error::None_ {
924 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
925 }
926 Ok(isl_rs_result)
927 }
928
929 pub fn project_domain_on_params(self) -> Result<PwQPolynomial, LibISLError> {
931 let pwqp = self;
932 let isl_rs_ctx = pwqp.get_ctx();
933 let mut pwqp = pwqp;
934 pwqp.do_not_free_on_drop();
935 let pwqp = pwqp.ptr;
936 let isl_rs_result = unsafe { isl_pw_qpolynomial_project_domain_on_params(pwqp) };
937 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
938 should_free_on_drop: true };
939 let err = isl_rs_ctx.last_error();
940 if err != Error::None_ {
941 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
942 }
943 Ok(isl_rs_result)
944 }
945
946 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<PwQPolynomial, LibISLError> {
948 let isl_rs_ctx = Context { ptr: ctx.ptr,
949 should_free_on_drop: false };
950 let ctx = ctx.ptr;
951 let str_ = CString::new(str_).unwrap();
952 let str_ = str_.as_ptr();
953 let isl_rs_result = unsafe { isl_pw_qpolynomial_read_from_str(ctx, str_) };
954 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
955 should_free_on_drop: true };
956 let err = isl_rs_ctx.last_error();
957 if err != Error::None_ {
958 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
959 }
960 Ok(isl_rs_result)
961 }
962
963 pub fn reset_domain_space(self, space: Space) -> Result<PwQPolynomial, LibISLError> {
965 let pwqp = self;
966 let isl_rs_ctx = pwqp.get_ctx();
967 let mut pwqp = pwqp;
968 pwqp.do_not_free_on_drop();
969 let pwqp = pwqp.ptr;
970 let mut space = space;
971 space.do_not_free_on_drop();
972 let space = space.ptr;
973 let isl_rs_result = unsafe { isl_pw_qpolynomial_reset_domain_space(pwqp, space) };
974 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
975 should_free_on_drop: true };
976 let err = isl_rs_ctx.last_error();
977 if err != Error::None_ {
978 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
979 }
980 Ok(isl_rs_result)
981 }
982
983 pub fn reset_user(self) -> Result<PwQPolynomial, LibISLError> {
985 let pwqp = self;
986 let isl_rs_ctx = pwqp.get_ctx();
987 let mut pwqp = pwqp;
988 pwqp.do_not_free_on_drop();
989 let pwqp = pwqp.ptr;
990 let isl_rs_result = unsafe { isl_pw_qpolynomial_reset_user(pwqp) };
991 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
992 should_free_on_drop: true };
993 let err = isl_rs_ctx.last_error();
994 if err != Error::None_ {
995 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
996 }
997 Ok(isl_rs_result)
998 }
999
1000 pub fn scale_down_val(self, v: Val) -> Result<PwQPolynomial, LibISLError> {
1002 let pwqp = self;
1003 let isl_rs_ctx = pwqp.get_ctx();
1004 let mut pwqp = pwqp;
1005 pwqp.do_not_free_on_drop();
1006 let pwqp = pwqp.ptr;
1007 let mut v = v;
1008 v.do_not_free_on_drop();
1009 let v = v.ptr;
1010 let isl_rs_result = unsafe { isl_pw_qpolynomial_scale_down_val(pwqp, v) };
1011 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1012 should_free_on_drop: true };
1013 let err = isl_rs_ctx.last_error();
1014 if err != Error::None_ {
1015 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1016 }
1017 Ok(isl_rs_result)
1018 }
1019
1020 pub fn scale_val(self, v: Val) -> Result<PwQPolynomial, LibISLError> {
1022 let pwqp = self;
1023 let isl_rs_ctx = pwqp.get_ctx();
1024 let mut pwqp = pwqp;
1025 pwqp.do_not_free_on_drop();
1026 let pwqp = pwqp.ptr;
1027 let mut v = v;
1028 v.do_not_free_on_drop();
1029 let v = v.ptr;
1030 let isl_rs_result = unsafe { isl_pw_qpolynomial_scale_val(pwqp, v) };
1031 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1032 should_free_on_drop: true };
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 set_dim_name(self, type_: DimType, pos: u32, s: &str)
1042 -> Result<PwQPolynomial, LibISLError> {
1043 let pwqp = self;
1044 let isl_rs_ctx = pwqp.get_ctx();
1045 let mut pwqp = pwqp;
1046 pwqp.do_not_free_on_drop();
1047 let pwqp = pwqp.ptr;
1048 let type_ = type_.to_i32();
1049 let s = CString::new(s).unwrap();
1050 let s = s.as_ptr();
1051 let isl_rs_result = unsafe { isl_pw_qpolynomial_set_dim_name(pwqp, type_, pos, s) };
1052 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1053 should_free_on_drop: true };
1054 let err = isl_rs_ctx.last_error();
1055 if err != Error::None_ {
1056 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1057 }
1058 Ok(isl_rs_result)
1059 }
1060
1061 pub fn split_dims(self, type_: DimType, first: u32, n: u32)
1063 -> Result<PwQPolynomial, LibISLError> {
1064 let pwqp = self;
1065 let isl_rs_ctx = pwqp.get_ctx();
1066 let mut pwqp = pwqp;
1067 pwqp.do_not_free_on_drop();
1068 let pwqp = pwqp.ptr;
1069 let type_ = type_.to_i32();
1070 let isl_rs_result = unsafe { isl_pw_qpolynomial_split_dims(pwqp, type_, first, n) };
1071 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1072 should_free_on_drop: true };
1073 let err = isl_rs_ctx.last_error();
1074 if err != Error::None_ {
1075 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1076 }
1077 Ok(isl_rs_result)
1078 }
1079
1080 pub fn split_periods(self, max_periods: i32) -> Result<PwQPolynomial, LibISLError> {
1082 let pwqp = self;
1083 let isl_rs_ctx = pwqp.get_ctx();
1084 let mut pwqp = pwqp;
1085 pwqp.do_not_free_on_drop();
1086 let pwqp = pwqp.ptr;
1087 let isl_rs_result = unsafe { isl_pw_qpolynomial_split_periods(pwqp, max_periods) };
1088 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1089 should_free_on_drop: true };
1090 let err = isl_rs_ctx.last_error();
1091 if err != Error::None_ {
1092 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1093 }
1094 Ok(isl_rs_result)
1095 }
1096
1097 pub fn sub(self, pwqp2: PwQPolynomial) -> Result<PwQPolynomial, LibISLError> {
1099 let pwqp1 = self;
1100 let isl_rs_ctx = pwqp1.get_ctx();
1101 let mut pwqp1 = pwqp1;
1102 pwqp1.do_not_free_on_drop();
1103 let pwqp1 = pwqp1.ptr;
1104 let mut pwqp2 = pwqp2;
1105 pwqp2.do_not_free_on_drop();
1106 let pwqp2 = pwqp2.ptr;
1107 let isl_rs_result = unsafe { isl_pw_qpolynomial_sub(pwqp1, pwqp2) };
1108 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1109 should_free_on_drop: true };
1110 let err = isl_rs_ctx.last_error();
1111 if err != Error::None_ {
1112 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1113 }
1114 Ok(isl_rs_result)
1115 }
1116
1117 pub fn subtract_domain(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
1119 let pwpq = self;
1120 let isl_rs_ctx = pwpq.get_ctx();
1121 let mut pwpq = pwpq;
1122 pwpq.do_not_free_on_drop();
1123 let pwpq = pwpq.ptr;
1124 let mut set = set;
1125 set.do_not_free_on_drop();
1126 let set = set.ptr;
1127 let isl_rs_result = unsafe { isl_pw_qpolynomial_subtract_domain(pwpq, set) };
1128 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1129 should_free_on_drop: true };
1130 let err = isl_rs_ctx.last_error();
1131 if err != Error::None_ {
1132 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1133 }
1134 Ok(isl_rs_result)
1135 }
1136
1137 pub fn to_list(self) -> Result<PwQPolynomialList, LibISLError> {
1139 let el = self;
1140 let isl_rs_ctx = el.get_ctx();
1141 let mut el = el;
1142 el.do_not_free_on_drop();
1143 let el = el.ptr;
1144 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_list(el) };
1145 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
1146 should_free_on_drop: true };
1147 let err = isl_rs_ctx.last_error();
1148 if err != Error::None_ {
1149 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1150 }
1151 Ok(isl_rs_result)
1152 }
1153
1154 pub fn to_polynomial(self, sign: i32) -> Result<PwQPolynomial, LibISLError> {
1156 let pwqp = self;
1157 let isl_rs_ctx = pwqp.get_ctx();
1158 let mut pwqp = pwqp;
1159 pwqp.do_not_free_on_drop();
1160 let pwqp = pwqp.ptr;
1161 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_polynomial(pwqp, sign) };
1162 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1163 should_free_on_drop: true };
1164 let err = isl_rs_ctx.last_error();
1165 if err != Error::None_ {
1166 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1167 }
1168 Ok(isl_rs_result)
1169 }
1170
1171 pub fn to_str(&self) -> Result<&str, LibISLError> {
1173 let pwqp = self;
1174 let isl_rs_ctx = pwqp.get_ctx();
1175 let pwqp = pwqp.ptr;
1176 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_str(pwqp) };
1177 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1178 let isl_rs_result = isl_rs_result.to_str().unwrap();
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 to_union_pw_qpolynomial(self) -> Result<UnionPwQPolynomial, LibISLError> {
1188 let pwqp = self;
1189 let isl_rs_ctx = pwqp.get_ctx();
1190 let mut pwqp = pwqp;
1191 pwqp.do_not_free_on_drop();
1192 let pwqp = pwqp.ptr;
1193 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_union_pw_qpolynomial(pwqp) };
1194 let isl_rs_result = UnionPwQPolynomial { 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 zero(space: Space) -> Result<PwQPolynomial, LibISLError> {
1205 let isl_rs_ctx = space.get_ctx();
1206 let mut space = space;
1207 space.do_not_free_on_drop();
1208 let space = space.ptr;
1209 let isl_rs_result = unsafe { isl_pw_qpolynomial_zero(space) };
1210 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1211 should_free_on_drop: true };
1212 let err = isl_rs_ctx.last_error();
1213 if err != Error::None_ {
1214 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1215 }
1216 Ok(isl_rs_result)
1217 }
1218
1219 pub fn do_not_free_on_drop(&mut self) {
1222 self.should_free_on_drop = false;
1223 }
1224}
1225
1226impl Drop for PwQPolynomial {
1227 fn drop(&mut self) {
1228 if self.should_free_on_drop {
1229 unsafe {
1230 isl_pw_qpolynomial_free(self.ptr);
1231 }
1232 }
1233 }
1234}