1use super::{Context, Error, LibISLError, PwQPolynomialFold};
5use libc::uintptr_t;
6use std::ffi::CStr;
7use std::os::raw::c_char;
8
9pub struct PwQPolynomialFoldList {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_pw_qpolynomial_fold_list_add(list: uintptr_t, el: uintptr_t) -> uintptr_t;
18
19 fn isl_pw_qpolynomial_fold_list_alloc(ctx: uintptr_t, n: i32) -> uintptr_t;
20
21 fn isl_pw_qpolynomial_fold_list_clear(list: uintptr_t) -> uintptr_t;
22
23 fn isl_pw_qpolynomial_fold_list_concat(list1: uintptr_t, list2: uintptr_t) -> uintptr_t;
24
25 fn isl_pw_qpolynomial_fold_list_copy(list: uintptr_t) -> uintptr_t;
26
27 fn isl_pw_qpolynomial_fold_list_drop(list: uintptr_t, first: u32, n: u32) -> uintptr_t;
28
29 fn isl_pw_qpolynomial_fold_list_dump(list: uintptr_t) -> ();
30
31 fn isl_pw_qpolynomial_fold_list_free(list: uintptr_t) -> uintptr_t;
32
33 fn isl_pw_qpolynomial_fold_list_from_pw_qpolynomial_fold(el: uintptr_t) -> uintptr_t;
34
35 fn isl_pw_qpolynomial_fold_list_get_at(list: uintptr_t, index: i32) -> uintptr_t;
36
37 fn isl_pw_qpolynomial_fold_list_get_ctx(list: uintptr_t) -> uintptr_t;
38
39 fn isl_pw_qpolynomial_fold_list_get_pw_qpolynomial_fold(list: uintptr_t, index: i32)
40 -> uintptr_t;
41
42 fn isl_pw_qpolynomial_fold_list_insert(list: uintptr_t, pos: u32, el: uintptr_t) -> uintptr_t;
43
44 fn isl_pw_qpolynomial_fold_list_n_pw_qpolynomial_fold(list: uintptr_t) -> i32;
45
46 fn isl_pw_qpolynomial_fold_list_reverse(list: uintptr_t) -> uintptr_t;
47
48 fn isl_pw_qpolynomial_fold_list_set_at(list: uintptr_t, index: i32, el: uintptr_t)
49 -> uintptr_t;
50
51 fn isl_pw_qpolynomial_fold_list_set_pw_qpolynomial_fold(list: uintptr_t, index: i32,
52 el: uintptr_t)
53 -> uintptr_t;
54
55 fn isl_pw_qpolynomial_fold_list_size(list: uintptr_t) -> i32;
56
57 fn isl_pw_qpolynomial_fold_list_swap(list: uintptr_t, pos1: u32, pos2: u32) -> uintptr_t;
58
59 fn isl_pw_qpolynomial_fold_list_to_str(list: uintptr_t) -> *const c_char;
60
61}
62
63impl PwQPolynomialFoldList {
64 pub fn add(self, el: PwQPolynomialFold) -> Result<PwQPolynomialFoldList, LibISLError> {
66 let list = self;
67 let isl_rs_ctx = list.get_ctx();
68 let mut list = list;
69 list.do_not_free_on_drop();
70 let list = list.ptr;
71 let mut el = el;
72 el.do_not_free_on_drop();
73 let el = el.ptr;
74 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_add(list, el) };
75 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
76 should_free_on_drop: true };
77 let err = isl_rs_ctx.last_error();
78 if err != Error::None_ {
79 let err_msg = isl_rs_ctx.last_error_msg();
80 isl_rs_ctx.reset_error();
81 return Err(LibISLError::new(err, err_msg));
82 }
83 Ok(isl_rs_result)
84 }
85
86 pub fn alloc(ctx: &Context, n: i32) -> Result<PwQPolynomialFoldList, LibISLError> {
88 let isl_rs_ctx = Context { ptr: ctx.ptr,
89 should_free_on_drop: false };
90 let ctx = ctx.ptr;
91 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_alloc(ctx, n) };
92 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
93 should_free_on_drop: true };
94 let err = isl_rs_ctx.last_error();
95 if err != Error::None_ {
96 let err_msg = isl_rs_ctx.last_error_msg();
97 isl_rs_ctx.reset_error();
98 return Err(LibISLError::new(err, err_msg));
99 }
100 Ok(isl_rs_result)
101 }
102
103 pub fn clear(self) -> Result<PwQPolynomialFoldList, LibISLError> {
105 let list = self;
106 let isl_rs_ctx = list.get_ctx();
107 let mut list = list;
108 list.do_not_free_on_drop();
109 let list = list.ptr;
110 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_clear(list) };
111 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
112 should_free_on_drop: true };
113 let err = isl_rs_ctx.last_error();
114 if err != Error::None_ {
115 let err_msg = isl_rs_ctx.last_error_msg();
116 isl_rs_ctx.reset_error();
117 return Err(LibISLError::new(err, err_msg));
118 }
119 Ok(isl_rs_result)
120 }
121
122 pub fn concat(self, list2: PwQPolynomialFoldList)
124 -> Result<PwQPolynomialFoldList, LibISLError> {
125 let list1 = self;
126 let isl_rs_ctx = list1.get_ctx();
127 let mut list1 = list1;
128 list1.do_not_free_on_drop();
129 let list1 = list1.ptr;
130 let mut list2 = list2;
131 list2.do_not_free_on_drop();
132 let list2 = list2.ptr;
133 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_concat(list1, list2) };
134 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
135 should_free_on_drop: true };
136 let err = isl_rs_ctx.last_error();
137 if err != Error::None_ {
138 let err_msg = isl_rs_ctx.last_error_msg();
139 isl_rs_ctx.reset_error();
140 return Err(LibISLError::new(err, err_msg));
141 }
142 Ok(isl_rs_result)
143 }
144
145 pub fn copy(&self) -> Result<PwQPolynomialFoldList, LibISLError> {
147 let list = self;
148 let isl_rs_ctx = list.get_ctx();
149 let list = list.ptr;
150 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_copy(list) };
151 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
152 should_free_on_drop: true };
153 let err = isl_rs_ctx.last_error();
154 if err != Error::None_ {
155 let err_msg = isl_rs_ctx.last_error_msg();
156 isl_rs_ctx.reset_error();
157 return Err(LibISLError::new(err, err_msg));
158 }
159 Ok(isl_rs_result)
160 }
161
162 pub fn drop(self, first: u32, n: u32) -> Result<PwQPolynomialFoldList, LibISLError> {
164 let list = self;
165 let isl_rs_ctx = list.get_ctx();
166 let mut list = list;
167 list.do_not_free_on_drop();
168 let list = list.ptr;
169 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_drop(list, first, n) };
170 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
171 should_free_on_drop: true };
172 let err = isl_rs_ctx.last_error();
173 if err != Error::None_ {
174 let err_msg = isl_rs_ctx.last_error_msg();
175 isl_rs_ctx.reset_error();
176 return Err(LibISLError::new(err, err_msg));
177 }
178 Ok(isl_rs_result)
179 }
180
181 pub fn dump(&self) -> Result<(), LibISLError> {
183 let list = self;
184 let isl_rs_ctx = list.get_ctx();
185 let list = list.ptr;
186 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_dump(list) };
187 let err = isl_rs_ctx.last_error();
188 if err != Error::None_ {
189 let err_msg = isl_rs_ctx.last_error_msg();
190 isl_rs_ctx.reset_error();
191 return Err(LibISLError::new(err, err_msg));
192 }
193 Ok(isl_rs_result)
194 }
195
196 pub fn free(self) -> Result<PwQPolynomialFoldList, LibISLError> {
198 let list = self;
199 let isl_rs_ctx = list.get_ctx();
200 let mut list = list;
201 list.do_not_free_on_drop();
202 let list = list.ptr;
203 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_free(list) };
204 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
205 should_free_on_drop: true };
206 let err = isl_rs_ctx.last_error();
207 if err != Error::None_ {
208 let err_msg = isl_rs_ctx.last_error_msg();
209 isl_rs_ctx.reset_error();
210 return Err(LibISLError::new(err, err_msg));
211 }
212 Ok(isl_rs_result)
213 }
214
215 pub fn from_pw_qpolynomial_fold(el: PwQPolynomialFold)
217 -> Result<PwQPolynomialFoldList, LibISLError> {
218 let isl_rs_ctx = el.get_ctx();
219 let mut el = el;
220 el.do_not_free_on_drop();
221 let el = el.ptr;
222 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_from_pw_qpolynomial_fold(el) };
223 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
224 should_free_on_drop: true };
225 let err = isl_rs_ctx.last_error();
226 if err != Error::None_ {
227 let err_msg = isl_rs_ctx.last_error_msg();
228 isl_rs_ctx.reset_error();
229 return Err(LibISLError::new(err, err_msg));
230 }
231 Ok(isl_rs_result)
232 }
233
234 pub fn get_at(&self, index: i32) -> Result<PwQPolynomialFold, LibISLError> {
236 let list = self;
237 let isl_rs_ctx = list.get_ctx();
238 let list = list.ptr;
239 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_get_at(list, index) };
240 let isl_rs_result = PwQPolynomialFold { ptr: isl_rs_result,
241 should_free_on_drop: true };
242 let err = isl_rs_ctx.last_error();
243 if err != Error::None_ {
244 let err_msg = isl_rs_ctx.last_error_msg();
245 isl_rs_ctx.reset_error();
246 return Err(LibISLError::new(err, err_msg));
247 }
248 Ok(isl_rs_result)
249 }
250
251 pub fn get_ctx(&self) -> Context {
253 let list = self;
254 let list = list.ptr;
255 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_get_ctx(list) };
256 let isl_rs_result = Context { ptr: isl_rs_result,
257 should_free_on_drop: false };
258 isl_rs_result
259 }
260
261 pub fn get_pw_qpolynomial_fold(&self, index: i32) -> Result<PwQPolynomialFold, LibISLError> {
263 let list = self;
264 let isl_rs_ctx = list.get_ctx();
265 let list = list.ptr;
266 let isl_rs_result =
267 unsafe { isl_pw_qpolynomial_fold_list_get_pw_qpolynomial_fold(list, index) };
268 let isl_rs_result = PwQPolynomialFold { ptr: isl_rs_result,
269 should_free_on_drop: true };
270 let err = isl_rs_ctx.last_error();
271 if err != Error::None_ {
272 let err_msg = isl_rs_ctx.last_error_msg();
273 isl_rs_ctx.reset_error();
274 return Err(LibISLError::new(err, err_msg));
275 }
276 Ok(isl_rs_result)
277 }
278
279 pub fn insert(self, pos: u32, el: PwQPolynomialFold)
281 -> Result<PwQPolynomialFoldList, LibISLError> {
282 let list = self;
283 let isl_rs_ctx = list.get_ctx();
284 let mut list = list;
285 list.do_not_free_on_drop();
286 let list = list.ptr;
287 let mut el = el;
288 el.do_not_free_on_drop();
289 let el = el.ptr;
290 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_insert(list, pos, el) };
291 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
292 should_free_on_drop: true };
293 let err = isl_rs_ctx.last_error();
294 if err != Error::None_ {
295 let err_msg = isl_rs_ctx.last_error_msg();
296 isl_rs_ctx.reset_error();
297 return Err(LibISLError::new(err, err_msg));
298 }
299 Ok(isl_rs_result)
300 }
301
302 pub fn n_pw_qpolynomial_fold(&self) -> Result<i32, LibISLError> {
304 let list = self;
305 let isl_rs_ctx = list.get_ctx();
306 let list = list.ptr;
307 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_n_pw_qpolynomial_fold(list) };
308 let err = isl_rs_ctx.last_error();
309 if err != Error::None_ {
310 let err_msg = isl_rs_ctx.last_error_msg();
311 isl_rs_ctx.reset_error();
312 return Err(LibISLError::new(err, err_msg));
313 }
314 Ok(isl_rs_result)
315 }
316
317 pub fn reverse(self) -> Result<PwQPolynomialFoldList, LibISLError> {
319 let list = self;
320 let isl_rs_ctx = list.get_ctx();
321 let mut list = list;
322 list.do_not_free_on_drop();
323 let list = list.ptr;
324 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_reverse(list) };
325 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
326 should_free_on_drop: true };
327 let err = isl_rs_ctx.last_error();
328 if err != Error::None_ {
329 let err_msg = isl_rs_ctx.last_error_msg();
330 isl_rs_ctx.reset_error();
331 return Err(LibISLError::new(err, err_msg));
332 }
333 Ok(isl_rs_result)
334 }
335
336 pub fn set_at(self, index: i32, el: PwQPolynomialFold)
338 -> Result<PwQPolynomialFoldList, LibISLError> {
339 let list = self;
340 let isl_rs_ctx = list.get_ctx();
341 let mut list = list;
342 list.do_not_free_on_drop();
343 let list = list.ptr;
344 let mut el = el;
345 el.do_not_free_on_drop();
346 let el = el.ptr;
347 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_set_at(list, index, el) };
348 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
349 should_free_on_drop: true };
350 let err = isl_rs_ctx.last_error();
351 if err != Error::None_ {
352 let err_msg = isl_rs_ctx.last_error_msg();
353 isl_rs_ctx.reset_error();
354 return Err(LibISLError::new(err, err_msg));
355 }
356 Ok(isl_rs_result)
357 }
358
359 pub fn set_pw_qpolynomial_fold(self, index: i32, el: PwQPolynomialFold)
361 -> Result<PwQPolynomialFoldList, LibISLError> {
362 let list = self;
363 let isl_rs_ctx = list.get_ctx();
364 let mut list = list;
365 list.do_not_free_on_drop();
366 let list = list.ptr;
367 let mut el = el;
368 el.do_not_free_on_drop();
369 let el = el.ptr;
370 let isl_rs_result =
371 unsafe { isl_pw_qpolynomial_fold_list_set_pw_qpolynomial_fold(list, index, el) };
372 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
373 should_free_on_drop: true };
374 let err = isl_rs_ctx.last_error();
375 if err != Error::None_ {
376 let err_msg = isl_rs_ctx.last_error_msg();
377 isl_rs_ctx.reset_error();
378 return Err(LibISLError::new(err, err_msg));
379 }
380 Ok(isl_rs_result)
381 }
382
383 pub fn size(&self) -> Result<i32, LibISLError> {
385 let list = self;
386 let isl_rs_ctx = list.get_ctx();
387 let list = list.ptr;
388 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_size(list) };
389 let err = isl_rs_ctx.last_error();
390 if err != Error::None_ {
391 let err_msg = isl_rs_ctx.last_error_msg();
392 isl_rs_ctx.reset_error();
393 return Err(LibISLError::new(err, err_msg));
394 }
395 Ok(isl_rs_result)
396 }
397
398 pub fn swap(self, pos1: u32, pos2: u32) -> Result<PwQPolynomialFoldList, LibISLError> {
400 let list = self;
401 let isl_rs_ctx = list.get_ctx();
402 let mut list = list;
403 list.do_not_free_on_drop();
404 let list = list.ptr;
405 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_swap(list, pos1, pos2) };
406 let isl_rs_result = PwQPolynomialFoldList { ptr: isl_rs_result,
407 should_free_on_drop: true };
408 let err = isl_rs_ctx.last_error();
409 if err != Error::None_ {
410 let err_msg = isl_rs_ctx.last_error_msg();
411 isl_rs_ctx.reset_error();
412 return Err(LibISLError::new(err, err_msg));
413 }
414 Ok(isl_rs_result)
415 }
416
417 pub fn to_str(&self) -> Result<&str, LibISLError> {
419 let list = self;
420 let isl_rs_ctx = list.get_ctx();
421 let list = list.ptr;
422 let isl_rs_result = unsafe { isl_pw_qpolynomial_fold_list_to_str(list) };
423 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
424 let isl_rs_result = isl_rs_result.to_str().unwrap();
425 let err = isl_rs_ctx.last_error();
426 if err != Error::None_ {
427 let err_msg = isl_rs_ctx.last_error_msg();
428 isl_rs_ctx.reset_error();
429 return Err(LibISLError::new(err, err_msg));
430 }
431 Ok(isl_rs_result)
432 }
433
434 pub fn do_not_free_on_drop(&mut self) {
437 self.should_free_on_drop = false;
438 }
439}
440
441impl Drop for PwQPolynomialFoldList {
442 fn drop(&mut self) {
443 if self.should_free_on_drop {
444 unsafe {
445 isl_pw_qpolynomial_fold_list_free(self.ptr);
446 }
447 }
448 }
449}