isl_rs/bindings/
qpolynomial.rs

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