1use super::{
5 ASTExprList, ASTExprOpType, ASTExprType, Context, Error, Id, IdToASTExpr, LibISLError, Printer,
6 Val,
7};
8use libc::uintptr_t;
9use std::ffi::{CStr, CString};
10use std::os::raw::c_char;
11
12pub struct ASTExpr {
14 pub ptr: uintptr_t,
15 pub should_free_on_drop: bool,
16}
17
18extern "C" {
19
20 fn isl_ast_expr_access(array: uintptr_t, indices: uintptr_t) -> uintptr_t;
21
22 fn isl_ast_expr_add(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
23
24 fn isl_ast_expr_address_of(expr: uintptr_t) -> uintptr_t;
25
26 fn isl_ast_expr_and(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
27
28 fn isl_ast_expr_and_then(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
29
30 fn isl_ast_expr_call(function: uintptr_t, arguments: uintptr_t) -> uintptr_t;
31
32 fn isl_ast_expr_copy(expr: uintptr_t) -> uintptr_t;
33
34 fn isl_ast_expr_div(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
35
36 fn isl_ast_expr_dump(expr: uintptr_t) -> ();
37
38 fn isl_ast_expr_eq(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
39
40 fn isl_ast_expr_free(expr: uintptr_t) -> uintptr_t;
41
42 fn isl_ast_expr_from_id(id: uintptr_t) -> uintptr_t;
43
44 fn isl_ast_expr_from_val(v: uintptr_t) -> uintptr_t;
45
46 fn isl_ast_expr_ge(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
47
48 fn isl_ast_expr_get_ctx(expr: uintptr_t) -> uintptr_t;
49
50 fn isl_ast_expr_get_id(expr: uintptr_t) -> uintptr_t;
51
52 fn isl_ast_expr_get_op_arg(expr: uintptr_t, pos: i32) -> uintptr_t;
53
54 fn isl_ast_expr_get_op_n_arg(expr: uintptr_t) -> i32;
55
56 fn isl_ast_expr_get_op_type(expr: uintptr_t) -> i32;
57
58 fn isl_ast_expr_get_type(expr: uintptr_t) -> i32;
59
60 fn isl_ast_expr_get_val(expr: uintptr_t) -> uintptr_t;
61
62 fn isl_ast_expr_gt(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
63
64 fn isl_ast_expr_id_get_id(expr: uintptr_t) -> uintptr_t;
65
66 fn isl_ast_expr_int_get_val(expr: uintptr_t) -> uintptr_t;
67
68 fn isl_ast_expr_is_equal(expr1: uintptr_t, expr2: uintptr_t) -> i32;
69
70 fn isl_ast_expr_le(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
71
72 fn isl_ast_expr_lt(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
73
74 fn isl_ast_expr_mul(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
75
76 fn isl_ast_expr_neg(expr: uintptr_t) -> uintptr_t;
77
78 fn isl_ast_expr_op_get_arg(expr: uintptr_t, pos: i32) -> uintptr_t;
79
80 fn isl_ast_expr_op_get_n_arg(expr: uintptr_t) -> i32;
81
82 fn isl_ast_expr_op_get_type(expr: uintptr_t) -> i32;
83
84 fn isl_ast_expr_op_type_print_macro(type_: i32, p: uintptr_t) -> uintptr_t;
85
86 fn isl_ast_expr_op_type_set_print_name(p: uintptr_t, type_: i32, name: *const c_char)
87 -> uintptr_t;
88
89 fn isl_ast_expr_or(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
90
91 fn isl_ast_expr_or_else(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
92
93 fn isl_ast_expr_pdiv_q(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
94
95 fn isl_ast_expr_pdiv_r(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
96
97 fn isl_ast_expr_print_macros(expr: uintptr_t, p: uintptr_t) -> uintptr_t;
98
99 fn isl_ast_expr_set_op_arg(expr: uintptr_t, pos: i32, arg: uintptr_t) -> uintptr_t;
100
101 fn isl_ast_expr_sub(expr1: uintptr_t, expr2: uintptr_t) -> uintptr_t;
102
103 fn isl_ast_expr_substitute_ids(expr: uintptr_t, id2expr: uintptr_t) -> uintptr_t;
104
105 fn isl_ast_expr_to_C_str(expr: uintptr_t) -> *const c_char;
106
107 fn isl_ast_expr_to_list(el: uintptr_t) -> uintptr_t;
108
109 fn isl_ast_expr_to_str(expr: uintptr_t) -> *const c_char;
110
111}
112
113impl ASTExpr {
114 pub fn access(self, indices: ASTExprList) -> Result<ASTExpr, LibISLError> {
116 let array = self;
117 let isl_rs_ctx = array.get_ctx();
118 let mut array = array;
119 array.do_not_free_on_drop();
120 let array = array.ptr;
121 let mut indices = indices;
122 indices.do_not_free_on_drop();
123 let indices = indices.ptr;
124 let isl_rs_result = unsafe { isl_ast_expr_access(array, indices) };
125 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
126 should_free_on_drop: true };
127 let err = isl_rs_ctx.last_error();
128 if err != Error::None_ {
129 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
130 }
131 Ok(isl_rs_result)
132 }
133
134 pub fn add(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
136 let expr1 = self;
137 let isl_rs_ctx = expr1.get_ctx();
138 let mut expr1 = expr1;
139 expr1.do_not_free_on_drop();
140 let expr1 = expr1.ptr;
141 let mut expr2 = expr2;
142 expr2.do_not_free_on_drop();
143 let expr2 = expr2.ptr;
144 let isl_rs_result = unsafe { isl_ast_expr_add(expr1, expr2) };
145 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
146 should_free_on_drop: true };
147 let err = isl_rs_ctx.last_error();
148 if err != Error::None_ {
149 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
150 }
151 Ok(isl_rs_result)
152 }
153
154 pub fn address_of(self) -> Result<ASTExpr, LibISLError> {
156 let expr = self;
157 let isl_rs_ctx = expr.get_ctx();
158 let mut expr = expr;
159 expr.do_not_free_on_drop();
160 let expr = expr.ptr;
161 let isl_rs_result = unsafe { isl_ast_expr_address_of(expr) };
162 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
163 should_free_on_drop: true };
164 let err = isl_rs_ctx.last_error();
165 if err != Error::None_ {
166 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
167 }
168 Ok(isl_rs_result)
169 }
170
171 pub fn and(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
173 let expr1 = self;
174 let isl_rs_ctx = expr1.get_ctx();
175 let mut expr1 = expr1;
176 expr1.do_not_free_on_drop();
177 let expr1 = expr1.ptr;
178 let mut expr2 = expr2;
179 expr2.do_not_free_on_drop();
180 let expr2 = expr2.ptr;
181 let isl_rs_result = unsafe { isl_ast_expr_and(expr1, expr2) };
182 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
183 should_free_on_drop: true };
184 let err = isl_rs_ctx.last_error();
185 if err != Error::None_ {
186 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
187 }
188 Ok(isl_rs_result)
189 }
190
191 pub fn and_then(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
193 let expr1 = self;
194 let isl_rs_ctx = expr1.get_ctx();
195 let mut expr1 = expr1;
196 expr1.do_not_free_on_drop();
197 let expr1 = expr1.ptr;
198 let mut expr2 = expr2;
199 expr2.do_not_free_on_drop();
200 let expr2 = expr2.ptr;
201 let isl_rs_result = unsafe { isl_ast_expr_and_then(expr1, expr2) };
202 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
203 should_free_on_drop: true };
204 let err = isl_rs_ctx.last_error();
205 if err != Error::None_ {
206 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
207 }
208 Ok(isl_rs_result)
209 }
210
211 pub fn call(self, arguments: ASTExprList) -> Result<ASTExpr, LibISLError> {
213 let function = self;
214 let isl_rs_ctx = function.get_ctx();
215 let mut function = function;
216 function.do_not_free_on_drop();
217 let function = function.ptr;
218 let mut arguments = arguments;
219 arguments.do_not_free_on_drop();
220 let arguments = arguments.ptr;
221 let isl_rs_result = unsafe { isl_ast_expr_call(function, arguments) };
222 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
223 should_free_on_drop: true };
224 let err = isl_rs_ctx.last_error();
225 if err != Error::None_ {
226 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
227 }
228 Ok(isl_rs_result)
229 }
230
231 pub fn copy(&self) -> Result<ASTExpr, LibISLError> {
233 let expr = self;
234 let isl_rs_ctx = expr.get_ctx();
235 let expr = expr.ptr;
236 let isl_rs_result = unsafe { isl_ast_expr_copy(expr) };
237 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
238 should_free_on_drop: true };
239 let err = isl_rs_ctx.last_error();
240 if err != Error::None_ {
241 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
242 }
243 Ok(isl_rs_result)
244 }
245
246 pub fn div(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
248 let expr1 = self;
249 let isl_rs_ctx = expr1.get_ctx();
250 let mut expr1 = expr1;
251 expr1.do_not_free_on_drop();
252 let expr1 = expr1.ptr;
253 let mut expr2 = expr2;
254 expr2.do_not_free_on_drop();
255 let expr2 = expr2.ptr;
256 let isl_rs_result = unsafe { isl_ast_expr_div(expr1, expr2) };
257 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
258 should_free_on_drop: true };
259 let err = isl_rs_ctx.last_error();
260 if err != Error::None_ {
261 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
262 }
263 Ok(isl_rs_result)
264 }
265
266 pub fn dump(&self) -> Result<(), LibISLError> {
268 let expr = self;
269 let isl_rs_ctx = expr.get_ctx();
270 let expr = expr.ptr;
271 let isl_rs_result = unsafe { isl_ast_expr_dump(expr) };
272 let err = isl_rs_ctx.last_error();
273 if err != Error::None_ {
274 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
275 }
276 Ok(isl_rs_result)
277 }
278
279 pub fn eq(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
281 let expr1 = self;
282 let isl_rs_ctx = expr1.get_ctx();
283 let mut expr1 = expr1;
284 expr1.do_not_free_on_drop();
285 let expr1 = expr1.ptr;
286 let mut expr2 = expr2;
287 expr2.do_not_free_on_drop();
288 let expr2 = expr2.ptr;
289 let isl_rs_result = unsafe { isl_ast_expr_eq(expr1, expr2) };
290 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
291 should_free_on_drop: true };
292 let err = isl_rs_ctx.last_error();
293 if err != Error::None_ {
294 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
295 }
296 Ok(isl_rs_result)
297 }
298
299 pub fn free(self) -> Result<ASTExpr, LibISLError> {
301 let expr = self;
302 let isl_rs_ctx = expr.get_ctx();
303 let mut expr = expr;
304 expr.do_not_free_on_drop();
305 let expr = expr.ptr;
306 let isl_rs_result = unsafe { isl_ast_expr_free(expr) };
307 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
308 should_free_on_drop: true };
309 let err = isl_rs_ctx.last_error();
310 if err != Error::None_ {
311 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
312 }
313 Ok(isl_rs_result)
314 }
315
316 pub fn from_id(id: Id) -> Result<ASTExpr, LibISLError> {
318 let isl_rs_ctx = id.get_ctx();
319 let mut id = id;
320 id.do_not_free_on_drop();
321 let id = id.ptr;
322 let isl_rs_result = unsafe { isl_ast_expr_from_id(id) };
323 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
324 should_free_on_drop: true };
325 let err = isl_rs_ctx.last_error();
326 if err != Error::None_ {
327 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
328 }
329 Ok(isl_rs_result)
330 }
331
332 pub fn from_val(v: Val) -> Result<ASTExpr, LibISLError> {
334 let isl_rs_ctx = v.get_ctx();
335 let mut v = v;
336 v.do_not_free_on_drop();
337 let v = v.ptr;
338 let isl_rs_result = unsafe { isl_ast_expr_from_val(v) };
339 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
340 should_free_on_drop: true };
341 let err = isl_rs_ctx.last_error();
342 if err != Error::None_ {
343 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
344 }
345 Ok(isl_rs_result)
346 }
347
348 pub fn ge(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
350 let expr1 = self;
351 let isl_rs_ctx = expr1.get_ctx();
352 let mut expr1 = expr1;
353 expr1.do_not_free_on_drop();
354 let expr1 = expr1.ptr;
355 let mut expr2 = expr2;
356 expr2.do_not_free_on_drop();
357 let expr2 = expr2.ptr;
358 let isl_rs_result = unsafe { isl_ast_expr_ge(expr1, expr2) };
359 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
360 should_free_on_drop: true };
361 let err = isl_rs_ctx.last_error();
362 if err != Error::None_ {
363 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
364 }
365 Ok(isl_rs_result)
366 }
367
368 pub fn get_ctx(&self) -> Context {
370 let expr = self;
371 let expr = expr.ptr;
372 let isl_rs_result = unsafe { isl_ast_expr_get_ctx(expr) };
373 let isl_rs_result = Context { ptr: isl_rs_result,
374 should_free_on_drop: false };
375 isl_rs_result
376 }
377
378 pub fn get_id(&self) -> Result<Id, LibISLError> {
380 let expr = self;
381 let isl_rs_ctx = expr.get_ctx();
382 let expr = expr.ptr;
383 let isl_rs_result = unsafe { isl_ast_expr_get_id(expr) };
384 let isl_rs_result = Id { ptr: isl_rs_result,
385 should_free_on_drop: true };
386 let err = isl_rs_ctx.last_error();
387 if err != Error::None_ {
388 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
389 }
390 Ok(isl_rs_result)
391 }
392
393 pub fn get_op_arg(&self, pos: i32) -> Result<ASTExpr, LibISLError> {
395 let expr = self;
396 let isl_rs_ctx = expr.get_ctx();
397 let expr = expr.ptr;
398 let isl_rs_result = unsafe { isl_ast_expr_get_op_arg(expr, pos) };
399 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
400 should_free_on_drop: true };
401 let err = isl_rs_ctx.last_error();
402 if err != Error::None_ {
403 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
404 }
405 Ok(isl_rs_result)
406 }
407
408 pub fn get_op_n_arg(&self) -> Result<i32, LibISLError> {
410 let expr = self;
411 let isl_rs_ctx = expr.get_ctx();
412 let expr = expr.ptr;
413 let isl_rs_result = unsafe { isl_ast_expr_get_op_n_arg(expr) };
414 let err = isl_rs_ctx.last_error();
415 if err != Error::None_ {
416 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
417 }
418 Ok(isl_rs_result)
419 }
420
421 pub fn get_op_type(&self) -> Result<ASTExprOpType, LibISLError> {
423 let expr = self;
424 let isl_rs_ctx = expr.get_ctx();
425 let expr = expr.ptr;
426 let isl_rs_result = unsafe { isl_ast_expr_get_op_type(expr) };
427 let isl_rs_result = ASTExprOpType::from_i32(isl_rs_result);
428 let err = isl_rs_ctx.last_error();
429 if err != Error::None_ {
430 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
431 }
432 Ok(isl_rs_result)
433 }
434
435 pub fn get_type(&self) -> Result<ASTExprType, LibISLError> {
437 let expr = self;
438 let isl_rs_ctx = expr.get_ctx();
439 let expr = expr.ptr;
440 let isl_rs_result = unsafe { isl_ast_expr_get_type(expr) };
441 let isl_rs_result = ASTExprType::from_i32(isl_rs_result);
442 let err = isl_rs_ctx.last_error();
443 if err != Error::None_ {
444 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
445 }
446 Ok(isl_rs_result)
447 }
448
449 pub fn get_val(&self) -> Result<Val, LibISLError> {
451 let expr = self;
452 let isl_rs_ctx = expr.get_ctx();
453 let expr = expr.ptr;
454 let isl_rs_result = unsafe { isl_ast_expr_get_val(expr) };
455 let isl_rs_result = Val { ptr: isl_rs_result,
456 should_free_on_drop: true };
457 let err = isl_rs_ctx.last_error();
458 if err != Error::None_ {
459 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
460 }
461 Ok(isl_rs_result)
462 }
463
464 pub fn gt(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
466 let expr1 = self;
467 let isl_rs_ctx = expr1.get_ctx();
468 let mut expr1 = expr1;
469 expr1.do_not_free_on_drop();
470 let expr1 = expr1.ptr;
471 let mut expr2 = expr2;
472 expr2.do_not_free_on_drop();
473 let expr2 = expr2.ptr;
474 let isl_rs_result = unsafe { isl_ast_expr_gt(expr1, expr2) };
475 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
476 should_free_on_drop: true };
477 let err = isl_rs_ctx.last_error();
478 if err != Error::None_ {
479 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
480 }
481 Ok(isl_rs_result)
482 }
483
484 pub fn id_get_id(&self) -> Result<Id, LibISLError> {
486 let expr = self;
487 let isl_rs_ctx = expr.get_ctx();
488 let expr = expr.ptr;
489 let isl_rs_result = unsafe { isl_ast_expr_id_get_id(expr) };
490 let isl_rs_result = Id { ptr: isl_rs_result,
491 should_free_on_drop: true };
492 let err = isl_rs_ctx.last_error();
493 if err != Error::None_ {
494 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
495 }
496 Ok(isl_rs_result)
497 }
498
499 pub fn int_get_val(&self) -> Result<Val, LibISLError> {
501 let expr = self;
502 let isl_rs_ctx = expr.get_ctx();
503 let expr = expr.ptr;
504 let isl_rs_result = unsafe { isl_ast_expr_int_get_val(expr) };
505 let isl_rs_result = Val { ptr: isl_rs_result,
506 should_free_on_drop: true };
507 let err = isl_rs_ctx.last_error();
508 if err != Error::None_ {
509 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
510 }
511 Ok(isl_rs_result)
512 }
513
514 pub fn is_equal(&self, expr2: &ASTExpr) -> Result<bool, LibISLError> {
516 let expr1 = self;
517 let isl_rs_ctx = expr1.get_ctx();
518 let expr1 = expr1.ptr;
519 let expr2 = expr2.ptr;
520 let isl_rs_result = unsafe { isl_ast_expr_is_equal(expr1, expr2) };
521 let isl_rs_result = match isl_rs_result {
522 0 => false,
523 1 => true,
524 _ => panic!("Got isl_bool = -1"),
525 };
526 let err = isl_rs_ctx.last_error();
527 if err != Error::None_ {
528 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
529 }
530 Ok(isl_rs_result)
531 }
532
533 pub fn le(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
535 let expr1 = self;
536 let isl_rs_ctx = expr1.get_ctx();
537 let mut expr1 = expr1;
538 expr1.do_not_free_on_drop();
539 let expr1 = expr1.ptr;
540 let mut expr2 = expr2;
541 expr2.do_not_free_on_drop();
542 let expr2 = expr2.ptr;
543 let isl_rs_result = unsafe { isl_ast_expr_le(expr1, expr2) };
544 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
545 should_free_on_drop: true };
546 let err = isl_rs_ctx.last_error();
547 if err != Error::None_ {
548 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
549 }
550 Ok(isl_rs_result)
551 }
552
553 pub fn lt(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
555 let expr1 = self;
556 let isl_rs_ctx = expr1.get_ctx();
557 let mut expr1 = expr1;
558 expr1.do_not_free_on_drop();
559 let expr1 = expr1.ptr;
560 let mut expr2 = expr2;
561 expr2.do_not_free_on_drop();
562 let expr2 = expr2.ptr;
563 let isl_rs_result = unsafe { isl_ast_expr_lt(expr1, expr2) };
564 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
565 should_free_on_drop: true };
566 let err = isl_rs_ctx.last_error();
567 if err != Error::None_ {
568 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
569 }
570 Ok(isl_rs_result)
571 }
572
573 pub fn mul(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
575 let expr1 = self;
576 let isl_rs_ctx = expr1.get_ctx();
577 let mut expr1 = expr1;
578 expr1.do_not_free_on_drop();
579 let expr1 = expr1.ptr;
580 let mut expr2 = expr2;
581 expr2.do_not_free_on_drop();
582 let expr2 = expr2.ptr;
583 let isl_rs_result = unsafe { isl_ast_expr_mul(expr1, expr2) };
584 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
585 should_free_on_drop: true };
586 let err = isl_rs_ctx.last_error();
587 if err != Error::None_ {
588 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
589 }
590 Ok(isl_rs_result)
591 }
592
593 pub fn neg(self) -> Result<ASTExpr, LibISLError> {
595 let expr = self;
596 let isl_rs_ctx = expr.get_ctx();
597 let mut expr = expr;
598 expr.do_not_free_on_drop();
599 let expr = expr.ptr;
600 let isl_rs_result = unsafe { isl_ast_expr_neg(expr) };
601 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
602 should_free_on_drop: true };
603 let err = isl_rs_ctx.last_error();
604 if err != Error::None_ {
605 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
606 }
607 Ok(isl_rs_result)
608 }
609
610 pub fn op_get_arg(&self, pos: i32) -> Result<ASTExpr, LibISLError> {
612 let expr = self;
613 let isl_rs_ctx = expr.get_ctx();
614 let expr = expr.ptr;
615 let isl_rs_result = unsafe { isl_ast_expr_op_get_arg(expr, pos) };
616 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
617 should_free_on_drop: true };
618 let err = isl_rs_ctx.last_error();
619 if err != Error::None_ {
620 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
621 }
622 Ok(isl_rs_result)
623 }
624
625 pub fn op_get_n_arg(&self) -> Result<i32, LibISLError> {
627 let expr = self;
628 let isl_rs_ctx = expr.get_ctx();
629 let expr = expr.ptr;
630 let isl_rs_result = unsafe { isl_ast_expr_op_get_n_arg(expr) };
631 let err = isl_rs_ctx.last_error();
632 if err != Error::None_ {
633 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
634 }
635 Ok(isl_rs_result)
636 }
637
638 pub fn op_get_type(&self) -> Result<ASTExprOpType, LibISLError> {
640 let expr = self;
641 let isl_rs_ctx = expr.get_ctx();
642 let expr = expr.ptr;
643 let isl_rs_result = unsafe { isl_ast_expr_op_get_type(expr) };
644 let isl_rs_result = ASTExprOpType::from_i32(isl_rs_result);
645 let err = isl_rs_ctx.last_error();
646 if err != Error::None_ {
647 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
648 }
649 Ok(isl_rs_result)
650 }
651
652 pub fn op_type_print_macro(type_: ASTExprOpType, p: Printer) -> Result<Printer, LibISLError> {
654 let isl_rs_ctx = p.get_ctx();
655 let type_ = type_.to_i32();
656 let mut p = p;
657 p.do_not_free_on_drop();
658 let p = p.ptr;
659 let isl_rs_result = unsafe { isl_ast_expr_op_type_print_macro(type_, p) };
660 let isl_rs_result = Printer { ptr: isl_rs_result,
661 should_free_on_drop: true };
662 let err = isl_rs_ctx.last_error();
663 if err != Error::None_ {
664 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
665 }
666 Ok(isl_rs_result)
667 }
668
669 pub fn op_type_set_print_name(p: Printer, type_: ASTExprOpType, name: &str)
671 -> Result<Printer, LibISLError> {
672 let isl_rs_ctx = p.get_ctx();
673 let mut p = p;
674 p.do_not_free_on_drop();
675 let p = p.ptr;
676 let type_ = type_.to_i32();
677 let name = CString::new(name).unwrap();
678 let name = name.as_ptr();
679 let isl_rs_result = unsafe { isl_ast_expr_op_type_set_print_name(p, type_, name) };
680 let isl_rs_result = Printer { ptr: isl_rs_result,
681 should_free_on_drop: true };
682 let err = isl_rs_ctx.last_error();
683 if err != Error::None_ {
684 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
685 }
686 Ok(isl_rs_result)
687 }
688
689 pub fn or(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
691 let expr1 = self;
692 let isl_rs_ctx = expr1.get_ctx();
693 let mut expr1 = expr1;
694 expr1.do_not_free_on_drop();
695 let expr1 = expr1.ptr;
696 let mut expr2 = expr2;
697 expr2.do_not_free_on_drop();
698 let expr2 = expr2.ptr;
699 let isl_rs_result = unsafe { isl_ast_expr_or(expr1, expr2) };
700 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
701 should_free_on_drop: true };
702 let err = isl_rs_ctx.last_error();
703 if err != Error::None_ {
704 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
705 }
706 Ok(isl_rs_result)
707 }
708
709 pub fn or_else(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
711 let expr1 = self;
712 let isl_rs_ctx = expr1.get_ctx();
713 let mut expr1 = expr1;
714 expr1.do_not_free_on_drop();
715 let expr1 = expr1.ptr;
716 let mut expr2 = expr2;
717 expr2.do_not_free_on_drop();
718 let expr2 = expr2.ptr;
719 let isl_rs_result = unsafe { isl_ast_expr_or_else(expr1, expr2) };
720 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
721 should_free_on_drop: true };
722 let err = isl_rs_ctx.last_error();
723 if err != Error::None_ {
724 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
725 }
726 Ok(isl_rs_result)
727 }
728
729 pub fn pdiv_q(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
731 let expr1 = self;
732 let isl_rs_ctx = expr1.get_ctx();
733 let mut expr1 = expr1;
734 expr1.do_not_free_on_drop();
735 let expr1 = expr1.ptr;
736 let mut expr2 = expr2;
737 expr2.do_not_free_on_drop();
738 let expr2 = expr2.ptr;
739 let isl_rs_result = unsafe { isl_ast_expr_pdiv_q(expr1, expr2) };
740 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
741 should_free_on_drop: true };
742 let err = isl_rs_ctx.last_error();
743 if err != Error::None_ {
744 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
745 }
746 Ok(isl_rs_result)
747 }
748
749 pub fn pdiv_r(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
751 let expr1 = self;
752 let isl_rs_ctx = expr1.get_ctx();
753 let mut expr1 = expr1;
754 expr1.do_not_free_on_drop();
755 let expr1 = expr1.ptr;
756 let mut expr2 = expr2;
757 expr2.do_not_free_on_drop();
758 let expr2 = expr2.ptr;
759 let isl_rs_result = unsafe { isl_ast_expr_pdiv_r(expr1, expr2) };
760 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
761 should_free_on_drop: true };
762 let err = isl_rs_ctx.last_error();
763 if err != Error::None_ {
764 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
765 }
766 Ok(isl_rs_result)
767 }
768
769 pub fn print_macros(&self, p: Printer) -> Result<Printer, LibISLError> {
771 let expr = self;
772 let isl_rs_ctx = expr.get_ctx();
773 let expr = expr.ptr;
774 let mut p = p;
775 p.do_not_free_on_drop();
776 let p = p.ptr;
777 let isl_rs_result = unsafe { isl_ast_expr_print_macros(expr, p) };
778 let isl_rs_result = Printer { ptr: isl_rs_result,
779 should_free_on_drop: true };
780 let err = isl_rs_ctx.last_error();
781 if err != Error::None_ {
782 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
783 }
784 Ok(isl_rs_result)
785 }
786
787 pub fn set_op_arg(self, pos: i32, arg: ASTExpr) -> Result<ASTExpr, LibISLError> {
789 let expr = self;
790 let isl_rs_ctx = expr.get_ctx();
791 let mut expr = expr;
792 expr.do_not_free_on_drop();
793 let expr = expr.ptr;
794 let mut arg = arg;
795 arg.do_not_free_on_drop();
796 let arg = arg.ptr;
797 let isl_rs_result = unsafe { isl_ast_expr_set_op_arg(expr, pos, arg) };
798 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
799 should_free_on_drop: true };
800 let err = isl_rs_ctx.last_error();
801 if err != Error::None_ {
802 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
803 }
804 Ok(isl_rs_result)
805 }
806
807 pub fn sub(self, expr2: ASTExpr) -> Result<ASTExpr, LibISLError> {
809 let expr1 = self;
810 let isl_rs_ctx = expr1.get_ctx();
811 let mut expr1 = expr1;
812 expr1.do_not_free_on_drop();
813 let expr1 = expr1.ptr;
814 let mut expr2 = expr2;
815 expr2.do_not_free_on_drop();
816 let expr2 = expr2.ptr;
817 let isl_rs_result = unsafe { isl_ast_expr_sub(expr1, expr2) };
818 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
819 should_free_on_drop: true };
820 let err = isl_rs_ctx.last_error();
821 if err != Error::None_ {
822 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
823 }
824 Ok(isl_rs_result)
825 }
826
827 pub fn substitute_ids(self, id2expr: IdToASTExpr) -> Result<ASTExpr, LibISLError> {
829 let expr = self;
830 let isl_rs_ctx = expr.get_ctx();
831 let mut expr = expr;
832 expr.do_not_free_on_drop();
833 let expr = expr.ptr;
834 let mut id2expr = id2expr;
835 id2expr.do_not_free_on_drop();
836 let id2expr = id2expr.ptr;
837 let isl_rs_result = unsafe { isl_ast_expr_substitute_ids(expr, id2expr) };
838 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
839 should_free_on_drop: true };
840 let err = isl_rs_ctx.last_error();
841 if err != Error::None_ {
842 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
843 }
844 Ok(isl_rs_result)
845 }
846
847 pub fn to_C_str(&self) -> Result<&str, LibISLError> {
849 let expr = self;
850 let isl_rs_ctx = expr.get_ctx();
851 let expr = expr.ptr;
852 let isl_rs_result = unsafe { isl_ast_expr_to_C_str(expr) };
853 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
854 let isl_rs_result = isl_rs_result.to_str().unwrap();
855 let err = isl_rs_ctx.last_error();
856 if err != Error::None_ {
857 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
858 }
859 Ok(isl_rs_result)
860 }
861
862 pub fn to_list(self) -> Result<ASTExprList, LibISLError> {
864 let el = self;
865 let isl_rs_ctx = el.get_ctx();
866 let mut el = el;
867 el.do_not_free_on_drop();
868 let el = el.ptr;
869 let isl_rs_result = unsafe { isl_ast_expr_to_list(el) };
870 let isl_rs_result = ASTExprList { ptr: isl_rs_result,
871 should_free_on_drop: true };
872 let err = isl_rs_ctx.last_error();
873 if err != Error::None_ {
874 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
875 }
876 Ok(isl_rs_result)
877 }
878
879 pub fn to_str(&self) -> Result<&str, LibISLError> {
881 let expr = self;
882 let isl_rs_ctx = expr.get_ctx();
883 let expr = expr.ptr;
884 let isl_rs_result = unsafe { isl_ast_expr_to_str(expr) };
885 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
886 let isl_rs_result = isl_rs_result.to_str().unwrap();
887 let err = isl_rs_ctx.last_error();
888 if err != Error::None_ {
889 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
890 }
891 Ok(isl_rs_result)
892 }
893
894 pub fn do_not_free_on_drop(&mut self) {
897 self.should_free_on_drop = false;
898 }
899}
900
901impl Drop for ASTExpr {
902 fn drop(&mut self) {
903 if self.should_free_on_drop {
904 unsafe {
905 isl_ast_expr_free(self.ptr);
906 }
907 }
908 }
909}