1use super::{Context, DimType, Error, Fold, LibISLError, Point, QPolynomial, Set, Space, Val};
5use libc::uintptr_t;
6
7pub struct QPolynomialFold {
9 pub ptr: uintptr_t,
10 pub should_free_on_drop: bool,
11}
12
13extern "C" {
14
15 fn isl_qpolynomial_fold_alloc(type_: i32, qp: uintptr_t) -> uintptr_t;
16
17 fn isl_qpolynomial_fold_copy(fold: uintptr_t) -> uintptr_t;
18
19 fn isl_qpolynomial_fold_dump(fold: uintptr_t) -> ();
20
21 fn isl_qpolynomial_fold_empty(type_: i32, space: uintptr_t) -> uintptr_t;
22
23 fn isl_qpolynomial_fold_eval(fold: uintptr_t, pnt: uintptr_t) -> uintptr_t;
24
25 fn isl_qpolynomial_fold_fold(fold1: uintptr_t, fold2: uintptr_t) -> uintptr_t;
26
27 fn isl_qpolynomial_fold_free(fold: uintptr_t) -> uintptr_t;
28
29 fn isl_qpolynomial_fold_get_ctx(fold: uintptr_t) -> uintptr_t;
30
31 fn isl_qpolynomial_fold_get_domain_space(fold: uintptr_t) -> uintptr_t;
32
33 fn isl_qpolynomial_fold_get_space(fold: uintptr_t) -> uintptr_t;
34
35 fn isl_qpolynomial_fold_get_type(fold: uintptr_t) -> i32;
36
37 fn isl_qpolynomial_fold_gist(fold: uintptr_t, context: uintptr_t) -> uintptr_t;
38
39 fn isl_qpolynomial_fold_gist_params(fold: uintptr_t, context: uintptr_t) -> uintptr_t;
40
41 fn isl_qpolynomial_fold_is_empty(fold: uintptr_t) -> i32;
42
43 fn isl_qpolynomial_fold_is_nan(fold: uintptr_t) -> i32;
44
45 fn isl_qpolynomial_fold_move_dims(fold: uintptr_t, dst_type: i32, dst_pos: u32, src_type: i32,
46 src_pos: u32, n: u32)
47 -> uintptr_t;
48
49 fn isl_qpolynomial_fold_plain_is_equal(fold1: uintptr_t, fold2: uintptr_t) -> i32;
50
51 fn isl_qpolynomial_fold_scale_down_val(fold: uintptr_t, v: uintptr_t) -> uintptr_t;
52
53 fn isl_qpolynomial_fold_scale_val(fold: uintptr_t, v: uintptr_t) -> uintptr_t;
54
55}
56
57impl QPolynomialFold {
58 pub fn alloc(type_: Fold, qp: QPolynomial) -> Result<QPolynomialFold, LibISLError> {
60 let isl_rs_ctx = qp.get_ctx();
61 let type_ = type_.to_i32();
62 let mut qp = qp;
63 qp.do_not_free_on_drop();
64 let qp = qp.ptr;
65 let isl_rs_result = unsafe { isl_qpolynomial_fold_alloc(type_, qp) };
66 let isl_rs_result = QPolynomialFold { ptr: isl_rs_result,
67 should_free_on_drop: true };
68 let err = isl_rs_ctx.last_error();
69 if err != Error::None_ {
70 let err_msg = isl_rs_ctx.last_error_msg();
71 isl_rs_ctx.reset_error();
72 return Err(LibISLError::new(err, err_msg));
73 }
74 Ok(isl_rs_result)
75 }
76
77 pub fn copy(&self) -> Result<QPolynomialFold, LibISLError> {
79 let fold = self;
80 let isl_rs_ctx = fold.get_ctx();
81 let fold = fold.ptr;
82 let isl_rs_result = unsafe { isl_qpolynomial_fold_copy(fold) };
83 let isl_rs_result = QPolynomialFold { ptr: isl_rs_result,
84 should_free_on_drop: true };
85 let err = isl_rs_ctx.last_error();
86 if err != Error::None_ {
87 let err_msg = isl_rs_ctx.last_error_msg();
88 isl_rs_ctx.reset_error();
89 return Err(LibISLError::new(err, err_msg));
90 }
91 Ok(isl_rs_result)
92 }
93
94 pub fn dump(&self) -> Result<(), LibISLError> {
96 let fold = self;
97 let isl_rs_ctx = fold.get_ctx();
98 let fold = fold.ptr;
99 let isl_rs_result = unsafe { isl_qpolynomial_fold_dump(fold) };
100 let err = isl_rs_ctx.last_error();
101 if err != Error::None_ {
102 let err_msg = isl_rs_ctx.last_error_msg();
103 isl_rs_ctx.reset_error();
104 return Err(LibISLError::new(err, err_msg));
105 }
106 Ok(isl_rs_result)
107 }
108
109 pub fn empty(type_: Fold, space: Space) -> Result<QPolynomialFold, LibISLError> {
111 let isl_rs_ctx = space.get_ctx();
112 let type_ = type_.to_i32();
113 let mut space = space;
114 space.do_not_free_on_drop();
115 let space = space.ptr;
116 let isl_rs_result = unsafe { isl_qpolynomial_fold_empty(type_, space) };
117 let isl_rs_result = QPolynomialFold { ptr: isl_rs_result,
118 should_free_on_drop: true };
119 let err = isl_rs_ctx.last_error();
120 if err != Error::None_ {
121 let err_msg = isl_rs_ctx.last_error_msg();
122 isl_rs_ctx.reset_error();
123 return Err(LibISLError::new(err, err_msg));
124 }
125 Ok(isl_rs_result)
126 }
127
128 pub fn eval(self, pnt: Point) -> Result<Val, LibISLError> {
130 let fold = self;
131 let isl_rs_ctx = fold.get_ctx();
132 let mut fold = fold;
133 fold.do_not_free_on_drop();
134 let fold = fold.ptr;
135 let mut pnt = pnt;
136 pnt.do_not_free_on_drop();
137 let pnt = pnt.ptr;
138 let isl_rs_result = unsafe { isl_qpolynomial_fold_eval(fold, pnt) };
139 let isl_rs_result = Val { ptr: isl_rs_result,
140 should_free_on_drop: true };
141 let err = isl_rs_ctx.last_error();
142 if err != Error::None_ {
143 let err_msg = isl_rs_ctx.last_error_msg();
144 isl_rs_ctx.reset_error();
145 return Err(LibISLError::new(err, err_msg));
146 }
147 Ok(isl_rs_result)
148 }
149
150 pub fn fold(self, fold2: QPolynomialFold) -> Result<QPolynomialFold, LibISLError> {
152 let fold1 = self;
153 let isl_rs_ctx = fold1.get_ctx();
154 let mut fold1 = fold1;
155 fold1.do_not_free_on_drop();
156 let fold1 = fold1.ptr;
157 let mut fold2 = fold2;
158 fold2.do_not_free_on_drop();
159 let fold2 = fold2.ptr;
160 let isl_rs_result = unsafe { isl_qpolynomial_fold_fold(fold1, fold2) };
161 let isl_rs_result = QPolynomialFold { 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 free(self) -> Result<QPolynomialFold, LibISLError> {
174 let fold = self;
175 let isl_rs_ctx = fold.get_ctx();
176 let mut fold = fold;
177 fold.do_not_free_on_drop();
178 let fold = fold.ptr;
179 let isl_rs_result = unsafe { isl_qpolynomial_fold_free(fold) };
180 let isl_rs_result = QPolynomialFold { ptr: isl_rs_result,
181 should_free_on_drop: true };
182 let err = isl_rs_ctx.last_error();
183 if err != Error::None_ {
184 let err_msg = isl_rs_ctx.last_error_msg();
185 isl_rs_ctx.reset_error();
186 return Err(LibISLError::new(err, err_msg));
187 }
188 Ok(isl_rs_result)
189 }
190
191 pub fn get_ctx(&self) -> Context {
193 let fold = self;
194 let fold = fold.ptr;
195 let isl_rs_result = unsafe { isl_qpolynomial_fold_get_ctx(fold) };
196 let isl_rs_result = Context { ptr: isl_rs_result,
197 should_free_on_drop: false };
198 isl_rs_result
199 }
200
201 pub fn get_domain_space(&self) -> Result<Space, LibISLError> {
203 let fold = self;
204 let isl_rs_ctx = fold.get_ctx();
205 let fold = fold.ptr;
206 let isl_rs_result = unsafe { isl_qpolynomial_fold_get_domain_space(fold) };
207 let isl_rs_result = Space { ptr: isl_rs_result,
208 should_free_on_drop: true };
209 let err = isl_rs_ctx.last_error();
210 if err != Error::None_ {
211 let err_msg = isl_rs_ctx.last_error_msg();
212 isl_rs_ctx.reset_error();
213 return Err(LibISLError::new(err, err_msg));
214 }
215 Ok(isl_rs_result)
216 }
217
218 pub fn get_space(&self) -> Result<Space, LibISLError> {
220 let fold = self;
221 let isl_rs_ctx = fold.get_ctx();
222 let fold = fold.ptr;
223 let isl_rs_result = unsafe { isl_qpolynomial_fold_get_space(fold) };
224 let isl_rs_result = Space { 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 get_type(&self) -> Result<Fold, LibISLError> {
237 let fold = self;
238 let isl_rs_ctx = fold.get_ctx();
239 let fold = fold.ptr;
240 let isl_rs_result = unsafe { isl_qpolynomial_fold_get_type(fold) };
241 let isl_rs_result = Fold::from_i32(isl_rs_result);
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 gist(self, context: Set) -> Result<QPolynomialFold, LibISLError> {
253 let fold = self;
254 let isl_rs_ctx = fold.get_ctx();
255 let mut fold = fold;
256 fold.do_not_free_on_drop();
257 let fold = fold.ptr;
258 let mut context = context;
259 context.do_not_free_on_drop();
260 let context = context.ptr;
261 let isl_rs_result = unsafe { isl_qpolynomial_fold_gist(fold, context) };
262 let isl_rs_result = QPolynomialFold { 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 gist_params(self, context: Set) -> Result<QPolynomialFold, LibISLError> {
275 let fold = self;
276 let isl_rs_ctx = fold.get_ctx();
277 let mut fold = fold;
278 fold.do_not_free_on_drop();
279 let fold = fold.ptr;
280 let mut context = context;
281 context.do_not_free_on_drop();
282 let context = context.ptr;
283 let isl_rs_result = unsafe { isl_qpolynomial_fold_gist_params(fold, context) };
284 let isl_rs_result = QPolynomialFold { 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 is_empty(&self) -> Result<bool, LibISLError> {
297 let fold = self;
298 let isl_rs_ctx = fold.get_ctx();
299 let fold = fold.ptr;
300 let isl_rs_result = unsafe { isl_qpolynomial_fold_is_empty(fold) };
301 let isl_rs_result = match isl_rs_result {
302 0 => false,
303 1 => true,
304 _ => {
305 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
306 }
307 };
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 is_nan(&self) -> Result<bool, LibISLError> {
319 let fold = self;
320 let isl_rs_ctx = fold.get_ctx();
321 let fold = fold.ptr;
322 let isl_rs_result = unsafe { isl_qpolynomial_fold_is_nan(fold) };
323 let isl_rs_result = match isl_rs_result {
324 0 => false,
325 1 => true,
326 _ => {
327 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
328 }
329 };
330 let err = isl_rs_ctx.last_error();
331 if err != Error::None_ {
332 let err_msg = isl_rs_ctx.last_error_msg();
333 isl_rs_ctx.reset_error();
334 return Err(LibISLError::new(err, err_msg));
335 }
336 Ok(isl_rs_result)
337 }
338
339 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
341 n: u32)
342 -> Result<QPolynomialFold, LibISLError> {
343 let fold = self;
344 let isl_rs_ctx = fold.get_ctx();
345 let mut fold = fold;
346 fold.do_not_free_on_drop();
347 let fold = fold.ptr;
348 let dst_type = dst_type.to_i32();
349 let src_type = src_type.to_i32();
350 let isl_rs_result = unsafe {
351 isl_qpolynomial_fold_move_dims(fold, dst_type, dst_pos, src_type, src_pos, n)
352 };
353 let isl_rs_result = QPolynomialFold { ptr: isl_rs_result,
354 should_free_on_drop: true };
355 let err = isl_rs_ctx.last_error();
356 if err != Error::None_ {
357 let err_msg = isl_rs_ctx.last_error_msg();
358 isl_rs_ctx.reset_error();
359 return Err(LibISLError::new(err, err_msg));
360 }
361 Ok(isl_rs_result)
362 }
363
364 pub fn plain_is_equal(&self, fold2: &QPolynomialFold) -> Result<bool, LibISLError> {
366 let fold1 = self;
367 let isl_rs_ctx = fold1.get_ctx();
368 let fold1 = fold1.ptr;
369 let fold2 = fold2.ptr;
370 let isl_rs_result = unsafe { isl_qpolynomial_fold_plain_is_equal(fold1, fold2) };
371 let isl_rs_result = match isl_rs_result {
372 0 => false,
373 1 => true,
374 _ => {
375 return Err(LibISLError::new(Error::Unknown, "Got isl_bool = -1"));
376 }
377 };
378 let err = isl_rs_ctx.last_error();
379 if err != Error::None_ {
380 let err_msg = isl_rs_ctx.last_error_msg();
381 isl_rs_ctx.reset_error();
382 return Err(LibISLError::new(err, err_msg));
383 }
384 Ok(isl_rs_result)
385 }
386
387 pub fn scale_down_val(self, v: Val) -> Result<QPolynomialFold, LibISLError> {
389 let fold = self;
390 let isl_rs_ctx = fold.get_ctx();
391 let mut fold = fold;
392 fold.do_not_free_on_drop();
393 let fold = fold.ptr;
394 let mut v = v;
395 v.do_not_free_on_drop();
396 let v = v.ptr;
397 let isl_rs_result = unsafe { isl_qpolynomial_fold_scale_down_val(fold, v) };
398 let isl_rs_result = QPolynomialFold { ptr: isl_rs_result,
399 should_free_on_drop: true };
400 let err = isl_rs_ctx.last_error();
401 if err != Error::None_ {
402 let err_msg = isl_rs_ctx.last_error_msg();
403 isl_rs_ctx.reset_error();
404 return Err(LibISLError::new(err, err_msg));
405 }
406 Ok(isl_rs_result)
407 }
408
409 pub fn scale_val(self, v: Val) -> Result<QPolynomialFold, LibISLError> {
411 let fold = self;
412 let isl_rs_ctx = fold.get_ctx();
413 let mut fold = fold;
414 fold.do_not_free_on_drop();
415 let fold = fold.ptr;
416 let mut v = v;
417 v.do_not_free_on_drop();
418 let v = v.ptr;
419 let isl_rs_result = unsafe { isl_qpolynomial_fold_scale_val(fold, v) };
420 let isl_rs_result = QPolynomialFold { ptr: isl_rs_result,
421 should_free_on_drop: true };
422 let err = isl_rs_ctx.last_error();
423 if err != Error::None_ {
424 let err_msg = isl_rs_ctx.last_error_msg();
425 isl_rs_ctx.reset_error();
426 return Err(LibISLError::new(err, err_msg));
427 }
428 Ok(isl_rs_result)
429 }
430
431 pub fn do_not_free_on_drop(&mut self) {
434 self.should_free_on_drop = false;
435 }
436}
437
438impl Drop for QPolynomialFold {
439 fn drop(&mut self) {
440 if self.should_free_on_drop {
441 unsafe {
442 isl_qpolynomial_fold_free(self.ptr);
443 }
444 }
445 }
446}