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 let err_msg = isl_rs_ctx.last_error_msg();
166 isl_rs_ctx.reset_error();
167 return Err(LibISLError::new(err, err_msg));
168 }
169 Ok(isl_rs_result)
170 }
171
172 pub fn add_dims(self, type_: DimType, n: u32) -> Result<PwQPolynomial, LibISLError> {
174 let pwqp = self;
175 let isl_rs_ctx = pwqp.get_ctx();
176 let mut pwqp = pwqp;
177 pwqp.do_not_free_on_drop();
178 let pwqp = pwqp.ptr;
179 let type_ = type_.to_i32();
180 let isl_rs_result = unsafe { isl_pw_qpolynomial_add_dims(pwqp, type_, n) };
181 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
182 should_free_on_drop: true };
183 let err = isl_rs_ctx.last_error();
184 if err != Error::None_ {
185 let err_msg = isl_rs_ctx.last_error_msg();
186 isl_rs_ctx.reset_error();
187 return Err(LibISLError::new(err, err_msg));
188 }
189 Ok(isl_rs_result)
190 }
191
192 pub fn add_disjoint(self, pwqp2: PwQPolynomial) -> Result<PwQPolynomial, LibISLError> {
194 let pwqp1 = self;
195 let isl_rs_ctx = pwqp1.get_ctx();
196 let mut pwqp1 = pwqp1;
197 pwqp1.do_not_free_on_drop();
198 let pwqp1 = pwqp1.ptr;
199 let mut pwqp2 = pwqp2;
200 pwqp2.do_not_free_on_drop();
201 let pwqp2 = pwqp2.ptr;
202 let isl_rs_result = unsafe { isl_pw_qpolynomial_add_disjoint(pwqp1, pwqp2) };
203 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
204 should_free_on_drop: true };
205 let err = isl_rs_ctx.last_error();
206 if err != Error::None_ {
207 let err_msg = isl_rs_ctx.last_error_msg();
208 isl_rs_ctx.reset_error();
209 return Err(LibISLError::new(err, err_msg));
210 }
211 Ok(isl_rs_result)
212 }
213
214 pub fn alloc(set: Set, qp: QPolynomial) -> Result<PwQPolynomial, LibISLError> {
216 let isl_rs_ctx = set.get_ctx();
217 let mut set = set;
218 set.do_not_free_on_drop();
219 let set = set.ptr;
220 let mut qp = qp;
221 qp.do_not_free_on_drop();
222 let qp = qp.ptr;
223 let isl_rs_result = unsafe { isl_pw_qpolynomial_alloc(set, qp) };
224 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
225 should_free_on_drop: true };
226 let err = isl_rs_ctx.last_error();
227 if err != Error::None_ {
228 let err_msg = isl_rs_ctx.last_error_msg();
229 isl_rs_ctx.reset_error();
230 return Err(LibISLError::new(err, err_msg));
231 }
232 Ok(isl_rs_result)
233 }
234
235 pub fn as_qpolynomial(self) -> Result<QPolynomial, LibISLError> {
237 let pwqp = self;
238 let isl_rs_ctx = pwqp.get_ctx();
239 let mut pwqp = pwqp;
240 pwqp.do_not_free_on_drop();
241 let pwqp = pwqp.ptr;
242 let isl_rs_result = unsafe { isl_pw_qpolynomial_as_qpolynomial(pwqp) };
243 let isl_rs_result = QPolynomial { ptr: isl_rs_result,
244 should_free_on_drop: true };
245 let err = isl_rs_ctx.last_error();
246 if err != Error::None_ {
247 let err_msg = isl_rs_ctx.last_error_msg();
248 isl_rs_ctx.reset_error();
249 return Err(LibISLError::new(err, err_msg));
250 }
251 Ok(isl_rs_result)
252 }
253
254 pub fn coalesce(self) -> Result<PwQPolynomial, LibISLError> {
256 let pwqp = self;
257 let isl_rs_ctx = pwqp.get_ctx();
258 let mut pwqp = pwqp;
259 pwqp.do_not_free_on_drop();
260 let pwqp = pwqp.ptr;
261 let isl_rs_result = unsafe { isl_pw_qpolynomial_coalesce(pwqp) };
262 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
263 should_free_on_drop: true };
264 let err = isl_rs_ctx.last_error();
265 if err != Error::None_ {
266 let err_msg = isl_rs_ctx.last_error_msg();
267 isl_rs_ctx.reset_error();
268 return Err(LibISLError::new(err, err_msg));
269 }
270 Ok(isl_rs_result)
271 }
272
273 pub fn copy(&self) -> Result<PwQPolynomial, LibISLError> {
275 let pwqp = self;
276 let isl_rs_ctx = pwqp.get_ctx();
277 let pwqp = pwqp.ptr;
278 let isl_rs_result = unsafe { isl_pw_qpolynomial_copy(pwqp) };
279 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
280 should_free_on_drop: true };
281 let err = isl_rs_ctx.last_error();
282 if err != Error::None_ {
283 let err_msg = isl_rs_ctx.last_error_msg();
284 isl_rs_ctx.reset_error();
285 return Err(LibISLError::new(err, err_msg));
286 }
287 Ok(isl_rs_result)
288 }
289
290 pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
292 let pwqp = self;
293 let isl_rs_ctx = pwqp.get_ctx();
294 let pwqp = pwqp.ptr;
295 let type_ = type_.to_i32();
296 let isl_rs_result = unsafe { isl_pw_qpolynomial_dim(pwqp, type_) };
297 let err = isl_rs_ctx.last_error();
298 if err != Error::None_ {
299 let err_msg = isl_rs_ctx.last_error_msg();
300 isl_rs_ctx.reset_error();
301 return Err(LibISLError::new(err, err_msg));
302 }
303 Ok(isl_rs_result)
304 }
305
306 pub fn domain(self) -> Result<Set, LibISLError> {
308 let pwqp = self;
309 let isl_rs_ctx = pwqp.get_ctx();
310 let mut pwqp = pwqp;
311 pwqp.do_not_free_on_drop();
312 let pwqp = pwqp.ptr;
313 let isl_rs_result = unsafe { isl_pw_qpolynomial_domain(pwqp) };
314 let isl_rs_result = Set { ptr: isl_rs_result,
315 should_free_on_drop: true };
316 let err = isl_rs_ctx.last_error();
317 if err != Error::None_ {
318 let err_msg = isl_rs_ctx.last_error_msg();
319 isl_rs_ctx.reset_error();
320 return Err(LibISLError::new(err, err_msg));
321 }
322 Ok(isl_rs_result)
323 }
324
325 pub fn domain_reverse(self) -> 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 isl_rs_result = unsafe { isl_pw_qpolynomial_domain_reverse(pwqp) };
333 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
334 should_free_on_drop: true };
335 let err = isl_rs_ctx.last_error();
336 if err != Error::None_ {
337 let err_msg = isl_rs_ctx.last_error_msg();
338 isl_rs_ctx.reset_error();
339 return Err(LibISLError::new(err, err_msg));
340 }
341 Ok(isl_rs_result)
342 }
343
344 pub fn drop_dims(self, type_: DimType, first: u32, n: u32)
346 -> Result<PwQPolynomial, LibISLError> {
347 let pwqp = self;
348 let isl_rs_ctx = pwqp.get_ctx();
349 let mut pwqp = pwqp;
350 pwqp.do_not_free_on_drop();
351 let pwqp = pwqp.ptr;
352 let type_ = type_.to_i32();
353 let isl_rs_result = unsafe { isl_pw_qpolynomial_drop_dims(pwqp, type_, first, n) };
354 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
355 should_free_on_drop: true };
356 let err = isl_rs_ctx.last_error();
357 if err != Error::None_ {
358 let err_msg = isl_rs_ctx.last_error_msg();
359 isl_rs_ctx.reset_error();
360 return Err(LibISLError::new(err, err_msg));
361 }
362 Ok(isl_rs_result)
363 }
364
365 pub fn drop_unused_params(self) -> Result<PwQPolynomial, LibISLError> {
367 let pwqp = self;
368 let isl_rs_ctx = pwqp.get_ctx();
369 let mut pwqp = pwqp;
370 pwqp.do_not_free_on_drop();
371 let pwqp = pwqp.ptr;
372 let isl_rs_result = unsafe { isl_pw_qpolynomial_drop_unused_params(pwqp) };
373 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
374 should_free_on_drop: true };
375 let err = isl_rs_ctx.last_error();
376 if err != Error::None_ {
377 let err_msg = isl_rs_ctx.last_error_msg();
378 isl_rs_ctx.reset_error();
379 return Err(LibISLError::new(err, err_msg));
380 }
381 Ok(isl_rs_result)
382 }
383
384 pub fn dump(&self) -> Result<(), LibISLError> {
386 let pwqp = self;
387 let isl_rs_ctx = pwqp.get_ctx();
388 let pwqp = pwqp.ptr;
389 let isl_rs_result = unsafe { isl_pw_qpolynomial_dump(pwqp) };
390 let err = isl_rs_ctx.last_error();
391 if err != Error::None_ {
392 let err_msg = isl_rs_ctx.last_error_msg();
393 isl_rs_ctx.reset_error();
394 return Err(LibISLError::new(err, err_msg));
395 }
396 Ok(isl_rs_result)
397 }
398
399 pub fn eval(self, pnt: Point) -> Result<Val, LibISLError> {
401 let pwqp = self;
402 let isl_rs_ctx = pwqp.get_ctx();
403 let mut pwqp = pwqp;
404 pwqp.do_not_free_on_drop();
405 let pwqp = pwqp.ptr;
406 let mut pnt = pnt;
407 pnt.do_not_free_on_drop();
408 let pnt = pnt.ptr;
409 let isl_rs_result = unsafe { isl_pw_qpolynomial_eval(pwqp, pnt) };
410 let isl_rs_result = Val { ptr: isl_rs_result,
411 should_free_on_drop: true };
412 let err = isl_rs_ctx.last_error();
413 if err != Error::None_ {
414 let err_msg = isl_rs_ctx.last_error_msg();
415 isl_rs_ctx.reset_error();
416 return Err(LibISLError::new(err, err_msg));
417 }
418 Ok(isl_rs_result)
419 }
420
421 pub fn find_dim_by_name(&self, type_: DimType, name: &str) -> Result<i32, LibISLError> {
423 let pwqp = self;
424 let isl_rs_ctx = pwqp.get_ctx();
425 let pwqp = pwqp.ptr;
426 let type_ = type_.to_i32();
427 let name = CString::new(name).unwrap();
428 let name = name.as_ptr();
429 let isl_rs_result = unsafe { isl_pw_qpolynomial_find_dim_by_name(pwqp, type_, name) };
430 let err = isl_rs_ctx.last_error();
431 if err != Error::None_ {
432 let err_msg = isl_rs_ctx.last_error_msg();
433 isl_rs_ctx.reset_error();
434 return Err(LibISLError::new(err, err_msg));
435 }
436 Ok(isl_rs_result)
437 }
438
439 pub fn fix_val(self, type_: DimType, n: u32, v: Val) -> Result<PwQPolynomial, LibISLError> {
441 let pwqp = self;
442 let isl_rs_ctx = pwqp.get_ctx();
443 let mut pwqp = pwqp;
444 pwqp.do_not_free_on_drop();
445 let pwqp = pwqp.ptr;
446 let type_ = type_.to_i32();
447 let mut v = v;
448 v.do_not_free_on_drop();
449 let v = v.ptr;
450 let isl_rs_result = unsafe { isl_pw_qpolynomial_fix_val(pwqp, type_, n, v) };
451 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
452 should_free_on_drop: true };
453 let err = isl_rs_ctx.last_error();
454 if err != Error::None_ {
455 let err_msg = isl_rs_ctx.last_error_msg();
456 isl_rs_ctx.reset_error();
457 return Err(LibISLError::new(err, err_msg));
458 }
459 Ok(isl_rs_result)
460 }
461
462 pub fn free(self) -> Result<PwQPolynomial, LibISLError> {
464 let pwqp = self;
465 let isl_rs_ctx = pwqp.get_ctx();
466 let mut pwqp = pwqp;
467 pwqp.do_not_free_on_drop();
468 let pwqp = pwqp.ptr;
469 let isl_rs_result = unsafe { isl_pw_qpolynomial_free(pwqp) };
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 let err_msg = isl_rs_ctx.last_error_msg();
475 isl_rs_ctx.reset_error();
476 return Err(LibISLError::new(err, err_msg));
477 }
478 Ok(isl_rs_result)
479 }
480
481 pub fn from_pw_aff(pwaff: PwAff) -> Result<PwQPolynomial, LibISLError> {
483 let isl_rs_ctx = pwaff.get_ctx();
484 let mut pwaff = pwaff;
485 pwaff.do_not_free_on_drop();
486 let pwaff = pwaff.ptr;
487 let isl_rs_result = unsafe { isl_pw_qpolynomial_from_pw_aff(pwaff) };
488 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
489 should_free_on_drop: true };
490 let err = isl_rs_ctx.last_error();
491 if err != Error::None_ {
492 let err_msg = isl_rs_ctx.last_error_msg();
493 isl_rs_ctx.reset_error();
494 return Err(LibISLError::new(err, err_msg));
495 }
496 Ok(isl_rs_result)
497 }
498
499 pub fn from_qpolynomial(qp: QPolynomial) -> Result<PwQPolynomial, LibISLError> {
501 let isl_rs_ctx = qp.get_ctx();
502 let mut qp = qp;
503 qp.do_not_free_on_drop();
504 let qp = qp.ptr;
505 let isl_rs_result = unsafe { isl_pw_qpolynomial_from_qpolynomial(qp) };
506 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
507 should_free_on_drop: true };
508 let err = isl_rs_ctx.last_error();
509 if err != Error::None_ {
510 let err_msg = isl_rs_ctx.last_error_msg();
511 isl_rs_ctx.reset_error();
512 return Err(LibISLError::new(err, err_msg));
513 }
514 Ok(isl_rs_result)
515 }
516
517 pub fn from_range(self) -> Result<PwQPolynomial, LibISLError> {
519 let pwqp = self;
520 let isl_rs_ctx = pwqp.get_ctx();
521 let mut pwqp = pwqp;
522 pwqp.do_not_free_on_drop();
523 let pwqp = pwqp.ptr;
524 let isl_rs_result = unsafe { isl_pw_qpolynomial_from_range(pwqp) };
525 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
526 should_free_on_drop: true };
527 let err = isl_rs_ctx.last_error();
528 if err != Error::None_ {
529 let err_msg = isl_rs_ctx.last_error_msg();
530 isl_rs_ctx.reset_error();
531 return Err(LibISLError::new(err, err_msg));
532 }
533 Ok(isl_rs_result)
534 }
535
536 pub fn get_ctx(&self) -> Context {
538 let pwqp = self;
539 let pwqp = pwqp.ptr;
540 let isl_rs_result = unsafe { isl_pw_qpolynomial_get_ctx(pwqp) };
541 let isl_rs_result = Context { ptr: isl_rs_result,
542 should_free_on_drop: false };
543 isl_rs_result
544 }
545
546 pub fn get_domain_space(&self) -> Result<Space, LibISLError> {
548 let pwqp = self;
549 let isl_rs_ctx = pwqp.get_ctx();
550 let pwqp = pwqp.ptr;
551 let isl_rs_result = unsafe { isl_pw_qpolynomial_get_domain_space(pwqp) };
552 let isl_rs_result = Space { ptr: isl_rs_result,
553 should_free_on_drop: true };
554 let err = isl_rs_ctx.last_error();
555 if err != Error::None_ {
556 let err_msg = isl_rs_ctx.last_error_msg();
557 isl_rs_ctx.reset_error();
558 return Err(LibISLError::new(err, err_msg));
559 }
560 Ok(isl_rs_result)
561 }
562
563 pub fn get_space(&self) -> Result<Space, LibISLError> {
565 let pwqp = self;
566 let isl_rs_ctx = pwqp.get_ctx();
567 let pwqp = pwqp.ptr;
568 let isl_rs_result = unsafe { isl_pw_qpolynomial_get_space(pwqp) };
569 let isl_rs_result = Space { ptr: isl_rs_result,
570 should_free_on_drop: true };
571 let err = isl_rs_ctx.last_error();
572 if err != Error::None_ {
573 let err_msg = isl_rs_ctx.last_error_msg();
574 isl_rs_ctx.reset_error();
575 return Err(LibISLError::new(err, err_msg));
576 }
577 Ok(isl_rs_result)
578 }
579
580 pub fn gist(self, context: Set) -> Result<PwQPolynomial, LibISLError> {
582 let pwqp = self;
583 let isl_rs_ctx = pwqp.get_ctx();
584 let mut pwqp = pwqp;
585 pwqp.do_not_free_on_drop();
586 let pwqp = pwqp.ptr;
587 let mut context = context;
588 context.do_not_free_on_drop();
589 let context = context.ptr;
590 let isl_rs_result = unsafe { isl_pw_qpolynomial_gist(pwqp, context) };
591 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
592 should_free_on_drop: true };
593 let err = isl_rs_ctx.last_error();
594 if err != Error::None_ {
595 let err_msg = isl_rs_ctx.last_error_msg();
596 isl_rs_ctx.reset_error();
597 return Err(LibISLError::new(err, err_msg));
598 }
599 Ok(isl_rs_result)
600 }
601
602 pub fn gist_params(self, context: Set) -> Result<PwQPolynomial, LibISLError> {
604 let pwqp = self;
605 let isl_rs_ctx = pwqp.get_ctx();
606 let mut pwqp = pwqp;
607 pwqp.do_not_free_on_drop();
608 let pwqp = pwqp.ptr;
609 let mut context = context;
610 context.do_not_free_on_drop();
611 let context = context.ptr;
612 let isl_rs_result = unsafe { isl_pw_qpolynomial_gist_params(pwqp, context) };
613 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
614 should_free_on_drop: true };
615 let err = isl_rs_ctx.last_error();
616 if err != Error::None_ {
617 let err_msg = isl_rs_ctx.last_error_msg();
618 isl_rs_ctx.reset_error();
619 return Err(LibISLError::new(err, err_msg));
620 }
621 Ok(isl_rs_result)
622 }
623
624 pub fn has_equal_space(&self, pwqp2: &PwQPolynomial) -> Result<bool, LibISLError> {
626 let pwqp1 = self;
627 let isl_rs_ctx = pwqp1.get_ctx();
628 let pwqp1 = pwqp1.ptr;
629 let pwqp2 = pwqp2.ptr;
630 let isl_rs_result = unsafe { isl_pw_qpolynomial_has_equal_space(pwqp1, pwqp2) };
631 let isl_rs_result = match isl_rs_result {
632 0 => false,
633 1 => true,
634 _ => {
635 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
636 }
637 };
638 let err = isl_rs_ctx.last_error();
639 if err != Error::None_ {
640 let err_msg = isl_rs_ctx.last_error_msg();
641 isl_rs_ctx.reset_error();
642 return Err(LibISLError::new(err, err_msg));
643 }
644 Ok(isl_rs_result)
645 }
646
647 pub fn insert_dims(self, type_: DimType, first: u32, n: u32)
649 -> Result<PwQPolynomial, LibISLError> {
650 let pwqp = self;
651 let isl_rs_ctx = pwqp.get_ctx();
652 let mut pwqp = pwqp;
653 pwqp.do_not_free_on_drop();
654 let pwqp = pwqp.ptr;
655 let type_ = type_.to_i32();
656 let isl_rs_result = unsafe { isl_pw_qpolynomial_insert_dims(pwqp, type_, first, n) };
657 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
658 should_free_on_drop: true };
659 let err = isl_rs_ctx.last_error();
660 if err != Error::None_ {
661 let err_msg = isl_rs_ctx.last_error_msg();
662 isl_rs_ctx.reset_error();
663 return Err(LibISLError::new(err, err_msg));
664 }
665 Ok(isl_rs_result)
666 }
667
668 pub fn intersect_domain(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
670 let pwpq = self;
671 let isl_rs_ctx = pwpq.get_ctx();
672 let mut pwpq = pwpq;
673 pwpq.do_not_free_on_drop();
674 let pwpq = pwpq.ptr;
675 let mut set = set;
676 set.do_not_free_on_drop();
677 let set = set.ptr;
678 let isl_rs_result = unsafe { isl_pw_qpolynomial_intersect_domain(pwpq, set) };
679 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
680 should_free_on_drop: true };
681 let err = isl_rs_ctx.last_error();
682 if err != Error::None_ {
683 let err_msg = isl_rs_ctx.last_error_msg();
684 isl_rs_ctx.reset_error();
685 return Err(LibISLError::new(err, err_msg));
686 }
687 Ok(isl_rs_result)
688 }
689
690 pub fn intersect_domain_wrapped_domain(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
692 let pwpq = self;
693 let isl_rs_ctx = pwpq.get_ctx();
694 let mut pwpq = pwpq;
695 pwpq.do_not_free_on_drop();
696 let pwpq = pwpq.ptr;
697 let mut set = set;
698 set.do_not_free_on_drop();
699 let set = set.ptr;
700 let isl_rs_result =
701 unsafe { isl_pw_qpolynomial_intersect_domain_wrapped_domain(pwpq, set) };
702 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
703 should_free_on_drop: true };
704 let err = isl_rs_ctx.last_error();
705 if err != Error::None_ {
706 let err_msg = isl_rs_ctx.last_error_msg();
707 isl_rs_ctx.reset_error();
708 return Err(LibISLError::new(err, err_msg));
709 }
710 Ok(isl_rs_result)
711 }
712
713 pub fn intersect_domain_wrapped_range(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
715 let pwpq = self;
716 let isl_rs_ctx = pwpq.get_ctx();
717 let mut pwpq = pwpq;
718 pwpq.do_not_free_on_drop();
719 let pwpq = pwpq.ptr;
720 let mut set = set;
721 set.do_not_free_on_drop();
722 let set = set.ptr;
723 let isl_rs_result = unsafe { isl_pw_qpolynomial_intersect_domain_wrapped_range(pwpq, set) };
724 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
725 should_free_on_drop: true };
726 let err = isl_rs_ctx.last_error();
727 if err != Error::None_ {
728 let err_msg = isl_rs_ctx.last_error_msg();
729 isl_rs_ctx.reset_error();
730 return Err(LibISLError::new(err, err_msg));
731 }
732 Ok(isl_rs_result)
733 }
734
735 pub fn intersect_params(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
737 let pwpq = self;
738 let isl_rs_ctx = pwpq.get_ctx();
739 let mut pwpq = pwpq;
740 pwpq.do_not_free_on_drop();
741 let pwpq = pwpq.ptr;
742 let mut set = set;
743 set.do_not_free_on_drop();
744 let set = set.ptr;
745 let isl_rs_result = unsafe { isl_pw_qpolynomial_intersect_params(pwpq, set) };
746 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
747 should_free_on_drop: true };
748 let err = isl_rs_ctx.last_error();
749 if err != Error::None_ {
750 let err_msg = isl_rs_ctx.last_error_msg();
751 isl_rs_ctx.reset_error();
752 return Err(LibISLError::new(err, err_msg));
753 }
754 Ok(isl_rs_result)
755 }
756
757 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> Result<bool, LibISLError> {
759 let pwqp = self;
760 let isl_rs_ctx = pwqp.get_ctx();
761 let pwqp = pwqp.ptr;
762 let type_ = type_.to_i32();
763 let isl_rs_result = unsafe { isl_pw_qpolynomial_involves_dims(pwqp, type_, first, n) };
764 let isl_rs_result = match isl_rs_result {
765 0 => false,
766 1 => true,
767 _ => {
768 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
769 }
770 };
771 let err = isl_rs_ctx.last_error();
772 if err != Error::None_ {
773 let err_msg = isl_rs_ctx.last_error_msg();
774 isl_rs_ctx.reset_error();
775 return Err(LibISLError::new(err, err_msg));
776 }
777 Ok(isl_rs_result)
778 }
779
780 pub fn involves_nan(&self) -> Result<bool, LibISLError> {
782 let pwqp = self;
783 let isl_rs_ctx = pwqp.get_ctx();
784 let pwqp = pwqp.ptr;
785 let isl_rs_result = unsafe { isl_pw_qpolynomial_involves_nan(pwqp) };
786 let isl_rs_result = match isl_rs_result {
787 0 => false,
788 1 => true,
789 _ => {
790 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
791 }
792 };
793 let err = isl_rs_ctx.last_error();
794 if err != Error::None_ {
795 let err_msg = isl_rs_ctx.last_error_msg();
796 isl_rs_ctx.reset_error();
797 return Err(LibISLError::new(err, err_msg));
798 }
799 Ok(isl_rs_result)
800 }
801
802 pub fn involves_param_id(&self, id: &Id) -> Result<bool, LibISLError> {
804 let pwqp = self;
805 let isl_rs_ctx = pwqp.get_ctx();
806 let pwqp = pwqp.ptr;
807 let id = id.ptr;
808 let isl_rs_result = unsafe { isl_pw_qpolynomial_involves_param_id(pwqp, id) };
809 let isl_rs_result = match isl_rs_result {
810 0 => false,
811 1 => true,
812 _ => {
813 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
814 }
815 };
816 let err = isl_rs_ctx.last_error();
817 if err != Error::None_ {
818 let err_msg = isl_rs_ctx.last_error_msg();
819 isl_rs_ctx.reset_error();
820 return Err(LibISLError::new(err, err_msg));
821 }
822 Ok(isl_rs_result)
823 }
824
825 pub fn is_zero(&self) -> Result<bool, LibISLError> {
827 let pwqp = self;
828 let isl_rs_ctx = pwqp.get_ctx();
829 let pwqp = pwqp.ptr;
830 let isl_rs_result = unsafe { isl_pw_qpolynomial_is_zero(pwqp) };
831 let isl_rs_result = match isl_rs_result {
832 0 => false,
833 1 => true,
834 _ => {
835 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
836 }
837 };
838 let err = isl_rs_ctx.last_error();
839 if err != Error::None_ {
840 let err_msg = isl_rs_ctx.last_error_msg();
841 isl_rs_ctx.reset_error();
842 return Err(LibISLError::new(err, err_msg));
843 }
844 Ok(isl_rs_result)
845 }
846
847 pub fn isa_qpolynomial(&self) -> Result<bool, LibISLError> {
849 let pwqp = self;
850 let isl_rs_ctx = pwqp.get_ctx();
851 let pwqp = pwqp.ptr;
852 let isl_rs_result = unsafe { isl_pw_qpolynomial_isa_qpolynomial(pwqp) };
853 let isl_rs_result = match isl_rs_result {
854 0 => false,
855 1 => true,
856 _ => {
857 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
858 }
859 };
860 let err = isl_rs_ctx.last_error();
861 if err != Error::None_ {
862 let err_msg = isl_rs_ctx.last_error_msg();
863 isl_rs_ctx.reset_error();
864 return Err(LibISLError::new(err, err_msg));
865 }
866 Ok(isl_rs_result)
867 }
868
869 pub fn max(self) -> Result<Val, LibISLError> {
871 let pwqp = self;
872 let isl_rs_ctx = pwqp.get_ctx();
873 let mut pwqp = pwqp;
874 pwqp.do_not_free_on_drop();
875 let pwqp = pwqp.ptr;
876 let isl_rs_result = unsafe { isl_pw_qpolynomial_max(pwqp) };
877 let isl_rs_result = Val { ptr: isl_rs_result,
878 should_free_on_drop: true };
879 let err = isl_rs_ctx.last_error();
880 if err != Error::None_ {
881 let err_msg = isl_rs_ctx.last_error_msg();
882 isl_rs_ctx.reset_error();
883 return Err(LibISLError::new(err, err_msg));
884 }
885 Ok(isl_rs_result)
886 }
887
888 pub fn min(self) -> Result<Val, LibISLError> {
890 let pwqp = self;
891 let isl_rs_ctx = pwqp.get_ctx();
892 let mut pwqp = pwqp;
893 pwqp.do_not_free_on_drop();
894 let pwqp = pwqp.ptr;
895 let isl_rs_result = unsafe { isl_pw_qpolynomial_min(pwqp) };
896 let isl_rs_result = Val { ptr: isl_rs_result,
897 should_free_on_drop: true };
898 let err = isl_rs_ctx.last_error();
899 if err != Error::None_ {
900 let err_msg = isl_rs_ctx.last_error_msg();
901 isl_rs_ctx.reset_error();
902 return Err(LibISLError::new(err, err_msg));
903 }
904 Ok(isl_rs_result)
905 }
906
907 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
909 n: u32)
910 -> Result<PwQPolynomial, LibISLError> {
911 let pwqp = self;
912 let isl_rs_ctx = pwqp.get_ctx();
913 let mut pwqp = pwqp;
914 pwqp.do_not_free_on_drop();
915 let pwqp = pwqp.ptr;
916 let dst_type = dst_type.to_i32();
917 let src_type = src_type.to_i32();
918 let isl_rs_result =
919 unsafe { isl_pw_qpolynomial_move_dims(pwqp, dst_type, dst_pos, src_type, src_pos, n) };
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 let err_msg = isl_rs_ctx.last_error_msg();
925 isl_rs_ctx.reset_error();
926 return Err(LibISLError::new(err, err_msg));
927 }
928 Ok(isl_rs_result)
929 }
930
931 pub fn mul(self, pwqp2: PwQPolynomial) -> Result<PwQPolynomial, LibISLError> {
933 let pwqp1 = self;
934 let isl_rs_ctx = pwqp1.get_ctx();
935 let mut pwqp1 = pwqp1;
936 pwqp1.do_not_free_on_drop();
937 let pwqp1 = pwqp1.ptr;
938 let mut pwqp2 = pwqp2;
939 pwqp2.do_not_free_on_drop();
940 let pwqp2 = pwqp2.ptr;
941 let isl_rs_result = unsafe { isl_pw_qpolynomial_mul(pwqp1, pwqp2) };
942 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
943 should_free_on_drop: true };
944 let err = isl_rs_ctx.last_error();
945 if err != Error::None_ {
946 let err_msg = isl_rs_ctx.last_error_msg();
947 isl_rs_ctx.reset_error();
948 return Err(LibISLError::new(err, err_msg));
949 }
950 Ok(isl_rs_result)
951 }
952
953 pub fn n_piece(&self) -> Result<i32, LibISLError> {
955 let pwqp = self;
956 let isl_rs_ctx = pwqp.get_ctx();
957 let pwqp = pwqp.ptr;
958 let isl_rs_result = unsafe { isl_pw_qpolynomial_n_piece(pwqp) };
959 let err = isl_rs_ctx.last_error();
960 if err != Error::None_ {
961 let err_msg = isl_rs_ctx.last_error_msg();
962 isl_rs_ctx.reset_error();
963 return Err(LibISLError::new(err, err_msg));
964 }
965 Ok(isl_rs_result)
966 }
967
968 pub fn neg(self) -> Result<PwQPolynomial, LibISLError> {
970 let pwqp = self;
971 let isl_rs_ctx = pwqp.get_ctx();
972 let mut pwqp = pwqp;
973 pwqp.do_not_free_on_drop();
974 let pwqp = pwqp.ptr;
975 let isl_rs_result = unsafe { isl_pw_qpolynomial_neg(pwqp) };
976 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
977 should_free_on_drop: true };
978 let err = isl_rs_ctx.last_error();
979 if err != Error::None_ {
980 let err_msg = isl_rs_ctx.last_error_msg();
981 isl_rs_ctx.reset_error();
982 return Err(LibISLError::new(err, err_msg));
983 }
984 Ok(isl_rs_result)
985 }
986
987 pub fn plain_is_equal(&self, pwqp2: &PwQPolynomial) -> Result<bool, LibISLError> {
989 let pwqp1 = self;
990 let isl_rs_ctx = pwqp1.get_ctx();
991 let pwqp1 = pwqp1.ptr;
992 let pwqp2 = pwqp2.ptr;
993 let isl_rs_result = unsafe { isl_pw_qpolynomial_plain_is_equal(pwqp1, pwqp2) };
994 let isl_rs_result = match isl_rs_result {
995 0 => false,
996 1 => true,
997 _ => {
998 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
999 }
1000 };
1001 let err = isl_rs_ctx.last_error();
1002 if err != Error::None_ {
1003 let err_msg = isl_rs_ctx.last_error_msg();
1004 isl_rs_ctx.reset_error();
1005 return Err(LibISLError::new(err, err_msg));
1006 }
1007 Ok(isl_rs_result)
1008 }
1009
1010 pub fn pow(self, exponent: u32) -> Result<PwQPolynomial, LibISLError> {
1012 let pwqp = self;
1013 let isl_rs_ctx = pwqp.get_ctx();
1014 let mut pwqp = pwqp;
1015 pwqp.do_not_free_on_drop();
1016 let pwqp = pwqp.ptr;
1017 let isl_rs_result = unsafe { isl_pw_qpolynomial_pow(pwqp, exponent) };
1018 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1019 should_free_on_drop: true };
1020 let err = isl_rs_ctx.last_error();
1021 if err != Error::None_ {
1022 let err_msg = isl_rs_ctx.last_error_msg();
1023 isl_rs_ctx.reset_error();
1024 return Err(LibISLError::new(err, err_msg));
1025 }
1026 Ok(isl_rs_result)
1027 }
1028
1029 pub fn project_domain_on_params(self) -> Result<PwQPolynomial, LibISLError> {
1031 let pwqp = self;
1032 let isl_rs_ctx = pwqp.get_ctx();
1033 let mut pwqp = pwqp;
1034 pwqp.do_not_free_on_drop();
1035 let pwqp = pwqp.ptr;
1036 let isl_rs_result = unsafe { isl_pw_qpolynomial_project_domain_on_params(pwqp) };
1037 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1038 should_free_on_drop: true };
1039 let err = isl_rs_ctx.last_error();
1040 if err != Error::None_ {
1041 let err_msg = isl_rs_ctx.last_error_msg();
1042 isl_rs_ctx.reset_error();
1043 return Err(LibISLError::new(err, err_msg));
1044 }
1045 Ok(isl_rs_result)
1046 }
1047
1048 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<PwQPolynomial, LibISLError> {
1050 let isl_rs_ctx = Context { ptr: ctx.ptr,
1051 should_free_on_drop: false };
1052 let ctx = ctx.ptr;
1053 let str_ = CString::new(str_).unwrap();
1054 let str_ = str_.as_ptr();
1055 let isl_rs_result = unsafe { isl_pw_qpolynomial_read_from_str(ctx, str_) };
1056 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1057 should_free_on_drop: true };
1058 let err = isl_rs_ctx.last_error();
1059 if err != Error::None_ {
1060 let err_msg = isl_rs_ctx.last_error_msg();
1061 isl_rs_ctx.reset_error();
1062 return Err(LibISLError::new(err, err_msg));
1063 }
1064 Ok(isl_rs_result)
1065 }
1066
1067 pub fn reset_domain_space(self, space: Space) -> Result<PwQPolynomial, LibISLError> {
1069 let pwqp = self;
1070 let isl_rs_ctx = pwqp.get_ctx();
1071 let mut pwqp = pwqp;
1072 pwqp.do_not_free_on_drop();
1073 let pwqp = pwqp.ptr;
1074 let mut space = space;
1075 space.do_not_free_on_drop();
1076 let space = space.ptr;
1077 let isl_rs_result = unsafe { isl_pw_qpolynomial_reset_domain_space(pwqp, space) };
1078 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1079 should_free_on_drop: true };
1080 let err = isl_rs_ctx.last_error();
1081 if err != Error::None_ {
1082 let err_msg = isl_rs_ctx.last_error_msg();
1083 isl_rs_ctx.reset_error();
1084 return Err(LibISLError::new(err, err_msg));
1085 }
1086 Ok(isl_rs_result)
1087 }
1088
1089 pub fn reset_user(self) -> Result<PwQPolynomial, LibISLError> {
1091 let pwqp = self;
1092 let isl_rs_ctx = pwqp.get_ctx();
1093 let mut pwqp = pwqp;
1094 pwqp.do_not_free_on_drop();
1095 let pwqp = pwqp.ptr;
1096 let isl_rs_result = unsafe { isl_pw_qpolynomial_reset_user(pwqp) };
1097 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1098 should_free_on_drop: true };
1099 let err = isl_rs_ctx.last_error();
1100 if err != Error::None_ {
1101 let err_msg = isl_rs_ctx.last_error_msg();
1102 isl_rs_ctx.reset_error();
1103 return Err(LibISLError::new(err, err_msg));
1104 }
1105 Ok(isl_rs_result)
1106 }
1107
1108 pub fn scale_down_val(self, v: Val) -> Result<PwQPolynomial, LibISLError> {
1110 let pwqp = self;
1111 let isl_rs_ctx = pwqp.get_ctx();
1112 let mut pwqp = pwqp;
1113 pwqp.do_not_free_on_drop();
1114 let pwqp = pwqp.ptr;
1115 let mut v = v;
1116 v.do_not_free_on_drop();
1117 let v = v.ptr;
1118 let isl_rs_result = unsafe { isl_pw_qpolynomial_scale_down_val(pwqp, v) };
1119 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1120 should_free_on_drop: true };
1121 let err = isl_rs_ctx.last_error();
1122 if err != Error::None_ {
1123 let err_msg = isl_rs_ctx.last_error_msg();
1124 isl_rs_ctx.reset_error();
1125 return Err(LibISLError::new(err, err_msg));
1126 }
1127 Ok(isl_rs_result)
1128 }
1129
1130 pub fn scale_val(self, v: Val) -> Result<PwQPolynomial, LibISLError> {
1132 let pwqp = self;
1133 let isl_rs_ctx = pwqp.get_ctx();
1134 let mut pwqp = pwqp;
1135 pwqp.do_not_free_on_drop();
1136 let pwqp = pwqp.ptr;
1137 let mut v = v;
1138 v.do_not_free_on_drop();
1139 let v = v.ptr;
1140 let isl_rs_result = unsafe { isl_pw_qpolynomial_scale_val(pwqp, v) };
1141 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1142 should_free_on_drop: true };
1143 let err = isl_rs_ctx.last_error();
1144 if err != Error::None_ {
1145 let err_msg = isl_rs_ctx.last_error_msg();
1146 isl_rs_ctx.reset_error();
1147 return Err(LibISLError::new(err, err_msg));
1148 }
1149 Ok(isl_rs_result)
1150 }
1151
1152 pub fn set_dim_name(self, type_: DimType, pos: u32, s: &str)
1154 -> Result<PwQPolynomial, LibISLError> {
1155 let pwqp = self;
1156 let isl_rs_ctx = pwqp.get_ctx();
1157 let mut pwqp = pwqp;
1158 pwqp.do_not_free_on_drop();
1159 let pwqp = pwqp.ptr;
1160 let type_ = type_.to_i32();
1161 let s = CString::new(s).unwrap();
1162 let s = s.as_ptr();
1163 let isl_rs_result = unsafe { isl_pw_qpolynomial_set_dim_name(pwqp, type_, pos, s) };
1164 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1165 should_free_on_drop: true };
1166 let err = isl_rs_ctx.last_error();
1167 if err != Error::None_ {
1168 let err_msg = isl_rs_ctx.last_error_msg();
1169 isl_rs_ctx.reset_error();
1170 return Err(LibISLError::new(err, err_msg));
1171 }
1172 Ok(isl_rs_result)
1173 }
1174
1175 pub fn split_dims(self, type_: DimType, first: u32, n: u32)
1177 -> Result<PwQPolynomial, LibISLError> {
1178 let pwqp = self;
1179 let isl_rs_ctx = pwqp.get_ctx();
1180 let mut pwqp = pwqp;
1181 pwqp.do_not_free_on_drop();
1182 let pwqp = pwqp.ptr;
1183 let type_ = type_.to_i32();
1184 let isl_rs_result = unsafe { isl_pw_qpolynomial_split_dims(pwqp, type_, first, n) };
1185 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1186 should_free_on_drop: true };
1187 let err = isl_rs_ctx.last_error();
1188 if err != Error::None_ {
1189 let err_msg = isl_rs_ctx.last_error_msg();
1190 isl_rs_ctx.reset_error();
1191 return Err(LibISLError::new(err, err_msg));
1192 }
1193 Ok(isl_rs_result)
1194 }
1195
1196 pub fn split_periods(self, max_periods: i32) -> Result<PwQPolynomial, LibISLError> {
1198 let pwqp = self;
1199 let isl_rs_ctx = pwqp.get_ctx();
1200 let mut pwqp = pwqp;
1201 pwqp.do_not_free_on_drop();
1202 let pwqp = pwqp.ptr;
1203 let isl_rs_result = unsafe { isl_pw_qpolynomial_split_periods(pwqp, max_periods) };
1204 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1205 should_free_on_drop: true };
1206 let err = isl_rs_ctx.last_error();
1207 if err != Error::None_ {
1208 let err_msg = isl_rs_ctx.last_error_msg();
1209 isl_rs_ctx.reset_error();
1210 return Err(LibISLError::new(err, err_msg));
1211 }
1212 Ok(isl_rs_result)
1213 }
1214
1215 pub fn sub(self, pwqp2: PwQPolynomial) -> Result<PwQPolynomial, LibISLError> {
1217 let pwqp1 = self;
1218 let isl_rs_ctx = pwqp1.get_ctx();
1219 let mut pwqp1 = pwqp1;
1220 pwqp1.do_not_free_on_drop();
1221 let pwqp1 = pwqp1.ptr;
1222 let mut pwqp2 = pwqp2;
1223 pwqp2.do_not_free_on_drop();
1224 let pwqp2 = pwqp2.ptr;
1225 let isl_rs_result = unsafe { isl_pw_qpolynomial_sub(pwqp1, pwqp2) };
1226 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1227 should_free_on_drop: true };
1228 let err = isl_rs_ctx.last_error();
1229 if err != Error::None_ {
1230 let err_msg = isl_rs_ctx.last_error_msg();
1231 isl_rs_ctx.reset_error();
1232 return Err(LibISLError::new(err, err_msg));
1233 }
1234 Ok(isl_rs_result)
1235 }
1236
1237 pub fn subtract_domain(self, set: Set) -> Result<PwQPolynomial, LibISLError> {
1239 let pwpq = self;
1240 let isl_rs_ctx = pwpq.get_ctx();
1241 let mut pwpq = pwpq;
1242 pwpq.do_not_free_on_drop();
1243 let pwpq = pwpq.ptr;
1244 let mut set = set;
1245 set.do_not_free_on_drop();
1246 let set = set.ptr;
1247 let isl_rs_result = unsafe { isl_pw_qpolynomial_subtract_domain(pwpq, set) };
1248 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1249 should_free_on_drop: true };
1250 let err = isl_rs_ctx.last_error();
1251 if err != Error::None_ {
1252 let err_msg = isl_rs_ctx.last_error_msg();
1253 isl_rs_ctx.reset_error();
1254 return Err(LibISLError::new(err, err_msg));
1255 }
1256 Ok(isl_rs_result)
1257 }
1258
1259 pub fn to_list(self) -> Result<PwQPolynomialList, LibISLError> {
1261 let el = self;
1262 let isl_rs_ctx = el.get_ctx();
1263 let mut el = el;
1264 el.do_not_free_on_drop();
1265 let el = el.ptr;
1266 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_list(el) };
1267 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
1268 should_free_on_drop: true };
1269 let err = isl_rs_ctx.last_error();
1270 if err != Error::None_ {
1271 let err_msg = isl_rs_ctx.last_error_msg();
1272 isl_rs_ctx.reset_error();
1273 return Err(LibISLError::new(err, err_msg));
1274 }
1275 Ok(isl_rs_result)
1276 }
1277
1278 pub fn to_polynomial(self, sign: i32) -> Result<PwQPolynomial, LibISLError> {
1280 let pwqp = self;
1281 let isl_rs_ctx = pwqp.get_ctx();
1282 let mut pwqp = pwqp;
1283 pwqp.do_not_free_on_drop();
1284 let pwqp = pwqp.ptr;
1285 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_polynomial(pwqp, sign) };
1286 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1287 should_free_on_drop: true };
1288 let err = isl_rs_ctx.last_error();
1289 if err != Error::None_ {
1290 let err_msg = isl_rs_ctx.last_error_msg();
1291 isl_rs_ctx.reset_error();
1292 return Err(LibISLError::new(err, err_msg));
1293 }
1294 Ok(isl_rs_result)
1295 }
1296
1297 pub fn to_str(&self) -> Result<&str, LibISLError> {
1299 let pwqp = self;
1300 let isl_rs_ctx = pwqp.get_ctx();
1301 let pwqp = pwqp.ptr;
1302 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_str(pwqp) };
1303 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1304 let isl_rs_result = isl_rs_result.to_str().unwrap();
1305 let err = isl_rs_ctx.last_error();
1306 if err != Error::None_ {
1307 let err_msg = isl_rs_ctx.last_error_msg();
1308 isl_rs_ctx.reset_error();
1309 return Err(LibISLError::new(err, err_msg));
1310 }
1311 Ok(isl_rs_result)
1312 }
1313
1314 pub fn to_union_pw_qpolynomial(self) -> Result<UnionPwQPolynomial, LibISLError> {
1316 let pwqp = self;
1317 let isl_rs_ctx = pwqp.get_ctx();
1318 let mut pwqp = pwqp;
1319 pwqp.do_not_free_on_drop();
1320 let pwqp = pwqp.ptr;
1321 let isl_rs_result = unsafe { isl_pw_qpolynomial_to_union_pw_qpolynomial(pwqp) };
1322 let isl_rs_result = UnionPwQPolynomial { ptr: isl_rs_result,
1323 should_free_on_drop: true };
1324 let err = isl_rs_ctx.last_error();
1325 if err != Error::None_ {
1326 let err_msg = isl_rs_ctx.last_error_msg();
1327 isl_rs_ctx.reset_error();
1328 return Err(LibISLError::new(err, err_msg));
1329 }
1330 Ok(isl_rs_result)
1331 }
1332
1333 pub fn zero(space: Space) -> Result<PwQPolynomial, LibISLError> {
1335 let isl_rs_ctx = space.get_ctx();
1336 let mut space = space;
1337 space.do_not_free_on_drop();
1338 let space = space.ptr;
1339 let isl_rs_result = unsafe { isl_pw_qpolynomial_zero(space) };
1340 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
1341 should_free_on_drop: true };
1342 let err = isl_rs_ctx.last_error();
1343 if err != Error::None_ {
1344 let err_msg = isl_rs_ctx.last_error_msg();
1345 isl_rs_ctx.reset_error();
1346 return Err(LibISLError::new(err, err_msg));
1347 }
1348 Ok(isl_rs_result)
1349 }
1350
1351 pub fn do_not_free_on_drop(&mut self) {
1354 self.should_free_on_drop = false;
1355 }
1356}
1357
1358impl Drop for PwQPolynomial {
1359 fn drop(&mut self) {
1360 if self.should_free_on_drop {
1361 unsafe {
1362 isl_pw_qpolynomial_free(self.ptr);
1363 }
1364 }
1365 }
1366}