1use super::{Context, Error, LibISLError, PwQPolynomial};
5use libc::uintptr_t;
6use std::ffi::CStr;
7use std::os::raw::c_char;
8
9pub struct PwQPolynomialList {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_pw_qpolynomial_list_add(list: uintptr_t, el: uintptr_t) -> uintptr_t;
18
19 fn isl_pw_qpolynomial_list_alloc(ctx: uintptr_t, n: i32) -> uintptr_t;
20
21 fn isl_pw_qpolynomial_list_clear(list: uintptr_t) -> uintptr_t;
22
23 fn isl_pw_qpolynomial_list_concat(list1: uintptr_t, list2: uintptr_t) -> uintptr_t;
24
25 fn isl_pw_qpolynomial_list_copy(list: uintptr_t) -> uintptr_t;
26
27 fn isl_pw_qpolynomial_list_drop(list: uintptr_t, first: u32, n: u32) -> uintptr_t;
28
29 fn isl_pw_qpolynomial_list_dump(list: uintptr_t) -> ();
30
31 fn isl_pw_qpolynomial_list_free(list: uintptr_t) -> uintptr_t;
32
33 fn isl_pw_qpolynomial_list_from_pw_qpolynomial(el: uintptr_t) -> uintptr_t;
34
35 fn isl_pw_qpolynomial_list_get_at(list: uintptr_t, index: i32) -> uintptr_t;
36
37 fn isl_pw_qpolynomial_list_get_ctx(list: uintptr_t) -> uintptr_t;
38
39 fn isl_pw_qpolynomial_list_get_pw_qpolynomial(list: uintptr_t, index: i32) -> uintptr_t;
40
41 fn isl_pw_qpolynomial_list_insert(list: uintptr_t, pos: u32, el: uintptr_t) -> uintptr_t;
42
43 fn isl_pw_qpolynomial_list_n_pw_qpolynomial(list: uintptr_t) -> i32;
44
45 fn isl_pw_qpolynomial_list_reverse(list: uintptr_t) -> uintptr_t;
46
47 fn isl_pw_qpolynomial_list_set_at(list: uintptr_t, index: i32, el: uintptr_t) -> uintptr_t;
48
49 fn isl_pw_qpolynomial_list_set_pw_qpolynomial(list: uintptr_t, index: i32, el: uintptr_t)
50 -> uintptr_t;
51
52 fn isl_pw_qpolynomial_list_size(list: uintptr_t) -> i32;
53
54 fn isl_pw_qpolynomial_list_swap(list: uintptr_t, pos1: u32, pos2: u32) -> uintptr_t;
55
56 fn isl_pw_qpolynomial_list_to_str(list: uintptr_t) -> *const c_char;
57
58}
59
60impl PwQPolynomialList {
61 pub fn add(self, el: PwQPolynomial) -> Result<PwQPolynomialList, LibISLError> {
63 let list = self;
64 let isl_rs_ctx = list.get_ctx();
65 let mut list = list;
66 list.do_not_free_on_drop();
67 let list = list.ptr;
68 let mut el = el;
69 el.do_not_free_on_drop();
70 let el = el.ptr;
71 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_add(list, el) };
72 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
73 should_free_on_drop: true };
74 let err = isl_rs_ctx.last_error();
75 if err != Error::None_ {
76 let err_msg = isl_rs_ctx.last_error_msg();
77 isl_rs_ctx.reset_error();
78 return Err(LibISLError::new(err, err_msg));
79 }
80 Ok(isl_rs_result)
81 }
82
83 pub fn alloc(ctx: &Context, n: i32) -> Result<PwQPolynomialList, LibISLError> {
85 let isl_rs_ctx = Context { ptr: ctx.ptr,
86 should_free_on_drop: false };
87 let ctx = ctx.ptr;
88 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_alloc(ctx, n) };
89 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
90 should_free_on_drop: true };
91 let err = isl_rs_ctx.last_error();
92 if err != Error::None_ {
93 let err_msg = isl_rs_ctx.last_error_msg();
94 isl_rs_ctx.reset_error();
95 return Err(LibISLError::new(err, err_msg));
96 }
97 Ok(isl_rs_result)
98 }
99
100 pub fn clear(self) -> Result<PwQPolynomialList, LibISLError> {
102 let list = self;
103 let isl_rs_ctx = list.get_ctx();
104 let mut list = list;
105 list.do_not_free_on_drop();
106 let list = list.ptr;
107 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_clear(list) };
108 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
109 should_free_on_drop: true };
110 let err = isl_rs_ctx.last_error();
111 if err != Error::None_ {
112 let err_msg = isl_rs_ctx.last_error_msg();
113 isl_rs_ctx.reset_error();
114 return Err(LibISLError::new(err, err_msg));
115 }
116 Ok(isl_rs_result)
117 }
118
119 pub fn concat(self, list2: PwQPolynomialList) -> Result<PwQPolynomialList, LibISLError> {
121 let list1 = self;
122 let isl_rs_ctx = list1.get_ctx();
123 let mut list1 = list1;
124 list1.do_not_free_on_drop();
125 let list1 = list1.ptr;
126 let mut list2 = list2;
127 list2.do_not_free_on_drop();
128 let list2 = list2.ptr;
129 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_concat(list1, list2) };
130 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
131 should_free_on_drop: true };
132 let err = isl_rs_ctx.last_error();
133 if err != Error::None_ {
134 let err_msg = isl_rs_ctx.last_error_msg();
135 isl_rs_ctx.reset_error();
136 return Err(LibISLError::new(err, err_msg));
137 }
138 Ok(isl_rs_result)
139 }
140
141 pub fn copy(&self) -> Result<PwQPolynomialList, LibISLError> {
143 let list = self;
144 let isl_rs_ctx = list.get_ctx();
145 let list = list.ptr;
146 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_copy(list) };
147 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
148 should_free_on_drop: true };
149 let err = isl_rs_ctx.last_error();
150 if err != Error::None_ {
151 let err_msg = isl_rs_ctx.last_error_msg();
152 isl_rs_ctx.reset_error();
153 return Err(LibISLError::new(err, err_msg));
154 }
155 Ok(isl_rs_result)
156 }
157
158 pub fn drop(self, first: u32, n: u32) -> Result<PwQPolynomialList, LibISLError> {
160 let list = self;
161 let isl_rs_ctx = list.get_ctx();
162 let mut list = list;
163 list.do_not_free_on_drop();
164 let list = list.ptr;
165 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_drop(list, first, n) };
166 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
167 should_free_on_drop: true };
168 let err = isl_rs_ctx.last_error();
169 if err != Error::None_ {
170 let err_msg = isl_rs_ctx.last_error_msg();
171 isl_rs_ctx.reset_error();
172 return Err(LibISLError::new(err, err_msg));
173 }
174 Ok(isl_rs_result)
175 }
176
177 pub fn dump(&self) -> Result<(), LibISLError> {
179 let list = self;
180 let isl_rs_ctx = list.get_ctx();
181 let list = list.ptr;
182 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_dump(list) };
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 free(self) -> Result<PwQPolynomialList, LibISLError> {
194 let list = self;
195 let isl_rs_ctx = list.get_ctx();
196 let mut list = list;
197 list.do_not_free_on_drop();
198 let list = list.ptr;
199 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_free(list) };
200 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
201 should_free_on_drop: true };
202 let err = isl_rs_ctx.last_error();
203 if err != Error::None_ {
204 let err_msg = isl_rs_ctx.last_error_msg();
205 isl_rs_ctx.reset_error();
206 return Err(LibISLError::new(err, err_msg));
207 }
208 Ok(isl_rs_result)
209 }
210
211 pub fn from_pw_qpolynomial(el: PwQPolynomial) -> Result<PwQPolynomialList, LibISLError> {
213 let isl_rs_ctx = el.get_ctx();
214 let mut el = el;
215 el.do_not_free_on_drop();
216 let el = el.ptr;
217 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_from_pw_qpolynomial(el) };
218 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
219 should_free_on_drop: true };
220 let err = isl_rs_ctx.last_error();
221 if err != Error::None_ {
222 let err_msg = isl_rs_ctx.last_error_msg();
223 isl_rs_ctx.reset_error();
224 return Err(LibISLError::new(err, err_msg));
225 }
226 Ok(isl_rs_result)
227 }
228
229 pub fn get_at(&self, index: i32) -> Result<PwQPolynomial, LibISLError> {
231 let list = self;
232 let isl_rs_ctx = list.get_ctx();
233 let list = list.ptr;
234 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_get_at(list, index) };
235 let isl_rs_result = PwQPolynomial { ptr: isl_rs_result,
236 should_free_on_drop: true };
237 let err = isl_rs_ctx.last_error();
238 if err != Error::None_ {
239 let err_msg = isl_rs_ctx.last_error_msg();
240 isl_rs_ctx.reset_error();
241 return Err(LibISLError::new(err, err_msg));
242 }
243 Ok(isl_rs_result)
244 }
245
246 pub fn get_ctx(&self) -> Context {
248 let list = self;
249 let list = list.ptr;
250 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_get_ctx(list) };
251 let isl_rs_result = Context { ptr: isl_rs_result,
252 should_free_on_drop: false };
253 isl_rs_result
254 }
255
256 pub fn get_pw_qpolynomial(&self, index: i32) -> Result<PwQPolynomial, LibISLError> {
258 let list = self;
259 let isl_rs_ctx = list.get_ctx();
260 let list = list.ptr;
261 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_get_pw_qpolynomial(list, index) };
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 insert(self, pos: u32, el: PwQPolynomial) -> Result<PwQPolynomialList, LibISLError> {
275 let list = self;
276 let isl_rs_ctx = list.get_ctx();
277 let mut list = list;
278 list.do_not_free_on_drop();
279 let list = list.ptr;
280 let mut el = el;
281 el.do_not_free_on_drop();
282 let el = el.ptr;
283 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_insert(list, pos, el) };
284 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
285 should_free_on_drop: true };
286 let err = isl_rs_ctx.last_error();
287 if err != Error::None_ {
288 let err_msg = isl_rs_ctx.last_error_msg();
289 isl_rs_ctx.reset_error();
290 return Err(LibISLError::new(err, err_msg));
291 }
292 Ok(isl_rs_result)
293 }
294
295 pub fn n_pw_qpolynomial(&self) -> Result<i32, LibISLError> {
297 let list = self;
298 let isl_rs_ctx = list.get_ctx();
299 let list = list.ptr;
300 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_n_pw_qpolynomial(list) };
301 let err = isl_rs_ctx.last_error();
302 if err != Error::None_ {
303 let err_msg = isl_rs_ctx.last_error_msg();
304 isl_rs_ctx.reset_error();
305 return Err(LibISLError::new(err, err_msg));
306 }
307 Ok(isl_rs_result)
308 }
309
310 pub fn reverse(self) -> Result<PwQPolynomialList, LibISLError> {
312 let list = self;
313 let isl_rs_ctx = list.get_ctx();
314 let mut list = list;
315 list.do_not_free_on_drop();
316 let list = list.ptr;
317 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_reverse(list) };
318 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
319 should_free_on_drop: true };
320 let err = isl_rs_ctx.last_error();
321 if err != Error::None_ {
322 let err_msg = isl_rs_ctx.last_error_msg();
323 isl_rs_ctx.reset_error();
324 return Err(LibISLError::new(err, err_msg));
325 }
326 Ok(isl_rs_result)
327 }
328
329 pub fn set_at(self, index: i32, el: PwQPolynomial) -> Result<PwQPolynomialList, LibISLError> {
331 let list = self;
332 let isl_rs_ctx = list.get_ctx();
333 let mut list = list;
334 list.do_not_free_on_drop();
335 let list = list.ptr;
336 let mut el = el;
337 el.do_not_free_on_drop();
338 let el = el.ptr;
339 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_set_at(list, index, el) };
340 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
341 should_free_on_drop: true };
342 let err = isl_rs_ctx.last_error();
343 if err != Error::None_ {
344 let err_msg = isl_rs_ctx.last_error_msg();
345 isl_rs_ctx.reset_error();
346 return Err(LibISLError::new(err, err_msg));
347 }
348 Ok(isl_rs_result)
349 }
350
351 pub fn set_pw_qpolynomial(self, index: i32, el: PwQPolynomial)
353 -> Result<PwQPolynomialList, LibISLError> {
354 let list = self;
355 let isl_rs_ctx = list.get_ctx();
356 let mut list = list;
357 list.do_not_free_on_drop();
358 let list = list.ptr;
359 let mut el = el;
360 el.do_not_free_on_drop();
361 let el = el.ptr;
362 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_set_pw_qpolynomial(list, index, el) };
363 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
364 should_free_on_drop: true };
365 let err = isl_rs_ctx.last_error();
366 if err != Error::None_ {
367 let err_msg = isl_rs_ctx.last_error_msg();
368 isl_rs_ctx.reset_error();
369 return Err(LibISLError::new(err, err_msg));
370 }
371 Ok(isl_rs_result)
372 }
373
374 pub fn size(&self) -> Result<i32, LibISLError> {
376 let list = self;
377 let isl_rs_ctx = list.get_ctx();
378 let list = list.ptr;
379 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_size(list) };
380 let err = isl_rs_ctx.last_error();
381 if err != Error::None_ {
382 let err_msg = isl_rs_ctx.last_error_msg();
383 isl_rs_ctx.reset_error();
384 return Err(LibISLError::new(err, err_msg));
385 }
386 Ok(isl_rs_result)
387 }
388
389 pub fn swap(self, pos1: u32, pos2: u32) -> Result<PwQPolynomialList, LibISLError> {
391 let list = self;
392 let isl_rs_ctx = list.get_ctx();
393 let mut list = list;
394 list.do_not_free_on_drop();
395 let list = list.ptr;
396 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_swap(list, pos1, pos2) };
397 let isl_rs_result = PwQPolynomialList { ptr: isl_rs_result,
398 should_free_on_drop: true };
399 let err = isl_rs_ctx.last_error();
400 if err != Error::None_ {
401 let err_msg = isl_rs_ctx.last_error_msg();
402 isl_rs_ctx.reset_error();
403 return Err(LibISLError::new(err, err_msg));
404 }
405 Ok(isl_rs_result)
406 }
407
408 pub fn to_str(&self) -> Result<&str, LibISLError> {
410 let list = self;
411 let isl_rs_ctx = list.get_ctx();
412 let list = list.ptr;
413 let isl_rs_result = unsafe { isl_pw_qpolynomial_list_to_str(list) };
414 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
415 let isl_rs_result = isl_rs_result.to_str().unwrap();
416 let err = isl_rs_ctx.last_error();
417 if err != Error::None_ {
418 let err_msg = isl_rs_ctx.last_error_msg();
419 isl_rs_ctx.reset_error();
420 return Err(LibISLError::new(err, err_msg));
421 }
422 Ok(isl_rs_result)
423 }
424
425 pub fn do_not_free_on_drop(&mut self) {
428 self.should_free_on_drop = false;
429 }
430}
431
432impl Drop for PwQPolynomialList {
433 fn drop(&mut self) {
434 if self.should_free_on_drop {
435 unsafe {
436 isl_pw_qpolynomial_list_free(self.ptr);
437 }
438 }
439 }
440}