1use crate::bindings::{BasicSet, Context, DimType, Id, LocalSpace, Point, Set, Space, Val};
5use libc::uintptr_t;
6use std::ffi::{CStr, CString};
7use std::os::raw::c_char;
8
9pub struct Aff {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_aff_zero_on_domain_space(space: uintptr_t) -> uintptr_t;
18
19 fn isl_aff_zero_on_domain(ls: uintptr_t) -> uintptr_t;
20
21 fn isl_aff_val_on_domain_space(space: uintptr_t, val: uintptr_t) -> uintptr_t;
22
23 fn isl_aff_val_on_domain(ls: uintptr_t, val: uintptr_t) -> uintptr_t;
24
25 fn isl_aff_var_on_domain(ls: uintptr_t, type_: DimType, pos: u32) -> uintptr_t;
26
27 fn isl_aff_nan_on_domain_space(space: uintptr_t) -> uintptr_t;
28
29 fn isl_aff_nan_on_domain(ls: uintptr_t) -> uintptr_t;
30
31 fn isl_aff_param_on_domain_space_id(space: uintptr_t, id: uintptr_t) -> uintptr_t;
32
33 fn isl_aff_copy(aff: uintptr_t) -> uintptr_t;
34
35 fn isl_aff_free(aff: uintptr_t) -> uintptr_t;
36
37 fn isl_aff_get_ctx(aff: uintptr_t) -> uintptr_t;
38
39 fn isl_aff_get_hash(aff: uintptr_t) -> u32;
40
41 fn isl_aff_involves_locals(aff: uintptr_t) -> i32;
42
43 fn isl_aff_dim(aff: uintptr_t, type_: DimType) -> i32;
44
45 fn isl_aff_involves_dims(aff: uintptr_t, type_: DimType, first: u32, n: u32) -> i32;
46
47 fn isl_aff_get_domain_space(aff: uintptr_t) -> uintptr_t;
48
49 fn isl_aff_get_space(aff: uintptr_t) -> uintptr_t;
50
51 fn isl_aff_get_domain_local_space(aff: uintptr_t) -> uintptr_t;
52
53 fn isl_aff_get_local_space(aff: uintptr_t) -> uintptr_t;
54
55 fn isl_aff_get_dim_name(aff: uintptr_t, type_: DimType, pos: u32) -> *const c_char;
56
57 fn isl_aff_get_constant_val(aff: uintptr_t) -> uintptr_t;
58
59 fn isl_aff_get_coefficient_val(aff: uintptr_t, type_: DimType, pos: i32) -> uintptr_t;
60
61 fn isl_aff_coefficient_sgn(aff: uintptr_t, type_: DimType, pos: i32) -> i32;
62
63 fn isl_aff_get_denominator_val(aff: uintptr_t) -> uintptr_t;
64
65 fn isl_aff_set_constant_si(aff: uintptr_t, v: i32) -> uintptr_t;
66
67 fn isl_aff_set_constant_val(aff: uintptr_t, v: uintptr_t) -> uintptr_t;
68
69 fn isl_aff_set_coefficient_si(aff: uintptr_t, type_: DimType, pos: i32, v: i32) -> uintptr_t;
70
71 fn isl_aff_set_coefficient_val(aff: uintptr_t, type_: DimType, pos: i32, v: uintptr_t)
72 -> uintptr_t;
73
74 fn isl_aff_add_constant_si(aff: uintptr_t, v: i32) -> uintptr_t;
75
76 fn isl_aff_add_constant_val(aff: uintptr_t, v: uintptr_t) -> uintptr_t;
77
78 fn isl_aff_add_constant_num_si(aff: uintptr_t, v: i32) -> uintptr_t;
79
80 fn isl_aff_add_coefficient_si(aff: uintptr_t, type_: DimType, pos: i32, v: i32) -> uintptr_t;
81
82 fn isl_aff_add_coefficient_val(aff: uintptr_t, type_: DimType, pos: i32, v: uintptr_t)
83 -> uintptr_t;
84
85 fn isl_aff_is_cst(aff: uintptr_t) -> i32;
86
87 fn isl_aff_set_tuple_id(aff: uintptr_t, type_: DimType, id: uintptr_t) -> uintptr_t;
88
89 fn isl_aff_set_dim_name(aff: uintptr_t, type_: DimType, pos: u32, s: *const c_char)
90 -> uintptr_t;
91
92 fn isl_aff_set_dim_id(aff: uintptr_t, type_: DimType, pos: u32, id: uintptr_t) -> uintptr_t;
93
94 fn isl_aff_find_dim_by_name(aff: uintptr_t, type_: DimType, name: *const c_char) -> i32;
95
96 fn isl_aff_plain_is_equal(aff1: uintptr_t, aff2: uintptr_t) -> i32;
97
98 fn isl_aff_plain_is_zero(aff: uintptr_t) -> i32;
99
100 fn isl_aff_is_nan(aff: uintptr_t) -> i32;
101
102 fn isl_aff_get_div(aff: uintptr_t, pos: i32) -> uintptr_t;
103
104 fn isl_aff_from_range(aff: uintptr_t) -> uintptr_t;
105
106 fn isl_aff_neg(aff: uintptr_t) -> uintptr_t;
107
108 fn isl_aff_ceil(aff: uintptr_t) -> uintptr_t;
109
110 fn isl_aff_floor(aff: uintptr_t) -> uintptr_t;
111
112 fn isl_aff_mod_val(aff: uintptr_t, mod_: uintptr_t) -> uintptr_t;
113
114 fn isl_aff_mul(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
115
116 fn isl_aff_div(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
117
118 fn isl_aff_add(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
119
120 fn isl_aff_sub(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
121
122 fn isl_aff_scale_val(aff: uintptr_t, v: uintptr_t) -> uintptr_t;
123
124 fn isl_aff_scale_down_ui(aff: uintptr_t, f: u32) -> uintptr_t;
125
126 fn isl_aff_scale_down_val(aff: uintptr_t, v: uintptr_t) -> uintptr_t;
127
128 fn isl_aff_insert_dims(aff: uintptr_t, type_: DimType, first: u32, n: u32) -> uintptr_t;
129
130 fn isl_aff_add_dims(aff: uintptr_t, type_: DimType, n: u32) -> uintptr_t;
131
132 fn isl_aff_move_dims(aff: uintptr_t, dst_type: DimType, dst_pos: u32, src_type: DimType,
133 src_pos: u32, n: u32)
134 -> uintptr_t;
135
136 fn isl_aff_drop_dims(aff: uintptr_t, type_: DimType, first: u32, n: u32) -> uintptr_t;
137
138 fn isl_aff_project_domain_on_params(aff: uintptr_t) -> uintptr_t;
139
140 fn isl_aff_align_params(aff: uintptr_t, model: uintptr_t) -> uintptr_t;
141
142 fn isl_aff_gist(aff: uintptr_t, context: uintptr_t) -> uintptr_t;
143
144 fn isl_aff_gist_params(aff: uintptr_t, context: uintptr_t) -> uintptr_t;
145
146 fn isl_aff_eval(aff: uintptr_t, pnt: uintptr_t) -> uintptr_t;
147
148 fn isl_aff_pullback_aff(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
149
150 fn isl_aff_zero_basic_set(aff: uintptr_t) -> uintptr_t;
151
152 fn isl_aff_neg_basic_set(aff: uintptr_t) -> uintptr_t;
153
154 fn isl_aff_eq_basic_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
155
156 fn isl_aff_eq_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
157
158 fn isl_aff_ne_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
159
160 fn isl_aff_le_basic_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
161
162 fn isl_aff_le_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
163
164 fn isl_aff_lt_basic_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
165
166 fn isl_aff_lt_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
167
168 fn isl_aff_ge_basic_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
169
170 fn isl_aff_ge_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
171
172 fn isl_aff_gt_basic_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
173
174 fn isl_aff_gt_set(aff1: uintptr_t, aff2: uintptr_t) -> uintptr_t;
175
176 fn isl_aff_bind_id(aff: uintptr_t, id: uintptr_t) -> uintptr_t;
177
178 fn isl_aff_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
179
180 fn isl_aff_to_str(aff: uintptr_t) -> *const c_char;
181
182 fn isl_aff_dump(aff: uintptr_t);
183
184}
185
186impl Aff {
187 pub fn zero_on_domain_space(space: Space) -> Aff {
189 let mut space = space;
190 space.do_not_free_on_drop();
191 let space = space.ptr;
192 let isl_rs_result = unsafe { isl_aff_zero_on_domain_space(space) };
193 let isl_rs_result = Aff { ptr: isl_rs_result,
194 should_free_on_drop: true };
195 isl_rs_result
196 }
197
198 pub fn zero_on_domain(ls: LocalSpace) -> Aff {
200 let mut ls = ls;
201 ls.do_not_free_on_drop();
202 let ls = ls.ptr;
203 let isl_rs_result = unsafe { isl_aff_zero_on_domain(ls) };
204 let isl_rs_result = Aff { ptr: isl_rs_result,
205 should_free_on_drop: true };
206 isl_rs_result
207 }
208
209 pub fn val_on_domain_space(space: Space, val: Val) -> Aff {
211 let mut space = space;
212 space.do_not_free_on_drop();
213 let space = space.ptr;
214 let mut val = val;
215 val.do_not_free_on_drop();
216 let val = val.ptr;
217 let isl_rs_result = unsafe { isl_aff_val_on_domain_space(space, val) };
218 let isl_rs_result = Aff { ptr: isl_rs_result,
219 should_free_on_drop: true };
220 isl_rs_result
221 }
222
223 pub fn val_on_domain(ls: LocalSpace, val: Val) -> Aff {
225 let mut ls = ls;
226 ls.do_not_free_on_drop();
227 let ls = ls.ptr;
228 let mut val = val;
229 val.do_not_free_on_drop();
230 let val = val.ptr;
231 let isl_rs_result = unsafe { isl_aff_val_on_domain(ls, val) };
232 let isl_rs_result = Aff { ptr: isl_rs_result,
233 should_free_on_drop: true };
234 isl_rs_result
235 }
236
237 pub fn var_on_domain(ls: LocalSpace, type_: DimType, pos: u32) -> Aff {
239 let mut ls = ls;
240 ls.do_not_free_on_drop();
241 let ls = ls.ptr;
242 let isl_rs_result = unsafe { isl_aff_var_on_domain(ls, type_, pos) };
243 let isl_rs_result = Aff { ptr: isl_rs_result,
244 should_free_on_drop: true };
245 isl_rs_result
246 }
247
248 pub fn nan_on_domain_space(space: Space) -> Aff {
250 let mut space = space;
251 space.do_not_free_on_drop();
252 let space = space.ptr;
253 let isl_rs_result = unsafe { isl_aff_nan_on_domain_space(space) };
254 let isl_rs_result = Aff { ptr: isl_rs_result,
255 should_free_on_drop: true };
256 isl_rs_result
257 }
258
259 pub fn nan_on_domain(ls: LocalSpace) -> Aff {
261 let mut ls = ls;
262 ls.do_not_free_on_drop();
263 let ls = ls.ptr;
264 let isl_rs_result = unsafe { isl_aff_nan_on_domain(ls) };
265 let isl_rs_result = Aff { ptr: isl_rs_result,
266 should_free_on_drop: true };
267 isl_rs_result
268 }
269
270 pub fn param_on_domain_space_id(space: Space, id: Id) -> Aff {
272 let mut space = space;
273 space.do_not_free_on_drop();
274 let space = space.ptr;
275 let mut id = id;
276 id.do_not_free_on_drop();
277 let id = id.ptr;
278 let isl_rs_result = unsafe { isl_aff_param_on_domain_space_id(space, id) };
279 let isl_rs_result = Aff { ptr: isl_rs_result,
280 should_free_on_drop: true };
281 isl_rs_result
282 }
283
284 pub fn copy(&self) -> Aff {
286 let aff = self;
287 let aff = aff.ptr;
288 let isl_rs_result = unsafe { isl_aff_copy(aff) };
289 let isl_rs_result = Aff { ptr: isl_rs_result,
290 should_free_on_drop: true };
291 isl_rs_result
292 }
293
294 pub fn free(self) -> Aff {
296 let aff = self;
297 let mut aff = aff;
298 aff.do_not_free_on_drop();
299 let aff = aff.ptr;
300 let isl_rs_result = unsafe { isl_aff_free(aff) };
301 let isl_rs_result = Aff { ptr: isl_rs_result,
302 should_free_on_drop: true };
303 isl_rs_result
304 }
305
306 pub fn get_ctx(&self) -> Context {
308 let aff = self;
309 let aff = aff.ptr;
310 let isl_rs_result = unsafe { isl_aff_get_ctx(aff) };
311 let isl_rs_result = Context { ptr: isl_rs_result,
312 should_free_on_drop: true };
313 let mut isl_rs_result = isl_rs_result;
314 isl_rs_result.do_not_free_on_drop();
315 isl_rs_result
316 }
317
318 pub fn get_hash(&self) -> u32 {
320 let aff = self;
321 let aff = aff.ptr;
322 let isl_rs_result = unsafe { isl_aff_get_hash(aff) };
323 isl_rs_result
324 }
325
326 pub fn involves_locals(&self) -> bool {
328 let aff = self;
329 let aff = aff.ptr;
330 let isl_rs_result = unsafe { isl_aff_involves_locals(aff) };
331 let isl_rs_result = match isl_rs_result {
332 0 => false,
333 1 => true,
334 _ => panic!("Got isl_bool = -1"),
335 };
336 isl_rs_result
337 }
338
339 pub fn dim(&self, type_: DimType) -> i32 {
341 let aff = self;
342 let aff = aff.ptr;
343 let isl_rs_result = unsafe { isl_aff_dim(aff, type_) };
344 isl_rs_result
345 }
346
347 pub fn involves_dims(&self, type_: DimType, first: u32, n: u32) -> bool {
349 let aff = self;
350 let aff = aff.ptr;
351 let isl_rs_result = unsafe { isl_aff_involves_dims(aff, type_, first, n) };
352 let isl_rs_result = match isl_rs_result {
353 0 => false,
354 1 => true,
355 _ => panic!("Got isl_bool = -1"),
356 };
357 isl_rs_result
358 }
359
360 pub fn get_domain_space(&self) -> Space {
362 let aff = self;
363 let aff = aff.ptr;
364 let isl_rs_result = unsafe { isl_aff_get_domain_space(aff) };
365 let isl_rs_result = Space { ptr: isl_rs_result,
366 should_free_on_drop: true };
367 isl_rs_result
368 }
369
370 pub fn get_space(&self) -> Space {
372 let aff = self;
373 let aff = aff.ptr;
374 let isl_rs_result = unsafe { isl_aff_get_space(aff) };
375 let isl_rs_result = Space { ptr: isl_rs_result,
376 should_free_on_drop: true };
377 isl_rs_result
378 }
379
380 pub fn get_domain_local_space(&self) -> LocalSpace {
382 let aff = self;
383 let aff = aff.ptr;
384 let isl_rs_result = unsafe { isl_aff_get_domain_local_space(aff) };
385 let isl_rs_result = LocalSpace { ptr: isl_rs_result,
386 should_free_on_drop: true };
387 isl_rs_result
388 }
389
390 pub fn get_local_space(&self) -> LocalSpace {
392 let aff = self;
393 let aff = aff.ptr;
394 let isl_rs_result = unsafe { isl_aff_get_local_space(aff) };
395 let isl_rs_result = LocalSpace { ptr: isl_rs_result,
396 should_free_on_drop: true };
397 isl_rs_result
398 }
399
400 pub fn get_dim_name(&self, type_: DimType, pos: u32) -> &str {
402 let aff = self;
403 let aff = aff.ptr;
404 let isl_rs_result = unsafe { isl_aff_get_dim_name(aff, type_, pos) };
405 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
406 let isl_rs_result = isl_rs_result.to_str().unwrap();
407 isl_rs_result
408 }
409
410 pub fn get_constant_val(&self) -> Val {
412 let aff = self;
413 let aff = aff.ptr;
414 let isl_rs_result = unsafe { isl_aff_get_constant_val(aff) };
415 let isl_rs_result = Val { ptr: isl_rs_result,
416 should_free_on_drop: true };
417 isl_rs_result
418 }
419
420 pub fn get_coefficient_val(&self, type_: DimType, pos: i32) -> Val {
422 let aff = self;
423 let aff = aff.ptr;
424 let isl_rs_result = unsafe { isl_aff_get_coefficient_val(aff, type_, pos) };
425 let isl_rs_result = Val { ptr: isl_rs_result,
426 should_free_on_drop: true };
427 isl_rs_result
428 }
429
430 pub fn coefficient_sgn(&self, type_: DimType, pos: i32) -> i32 {
432 let aff = self;
433 let aff = aff.ptr;
434 let isl_rs_result = unsafe { isl_aff_coefficient_sgn(aff, type_, pos) };
435 isl_rs_result
436 }
437
438 pub fn get_denominator_val(&self) -> Val {
440 let aff = self;
441 let aff = aff.ptr;
442 let isl_rs_result = unsafe { isl_aff_get_denominator_val(aff) };
443 let isl_rs_result = Val { ptr: isl_rs_result,
444 should_free_on_drop: true };
445 isl_rs_result
446 }
447
448 pub fn set_constant_si(self, v: i32) -> Aff {
450 let aff = self;
451 let mut aff = aff;
452 aff.do_not_free_on_drop();
453 let aff = aff.ptr;
454 let isl_rs_result = unsafe { isl_aff_set_constant_si(aff, v) };
455 let isl_rs_result = Aff { ptr: isl_rs_result,
456 should_free_on_drop: true };
457 isl_rs_result
458 }
459
460 pub fn set_constant_val(self, v: Val) -> Aff {
462 let aff = self;
463 let mut aff = aff;
464 aff.do_not_free_on_drop();
465 let aff = aff.ptr;
466 let mut v = v;
467 v.do_not_free_on_drop();
468 let v = v.ptr;
469 let isl_rs_result = unsafe { isl_aff_set_constant_val(aff, v) };
470 let isl_rs_result = Aff { ptr: isl_rs_result,
471 should_free_on_drop: true };
472 isl_rs_result
473 }
474
475 pub fn set_coefficient_si(self, type_: DimType, pos: i32, v: i32) -> Aff {
477 let aff = self;
478 let mut aff = aff;
479 aff.do_not_free_on_drop();
480 let aff = aff.ptr;
481 let isl_rs_result = unsafe { isl_aff_set_coefficient_si(aff, type_, pos, v) };
482 let isl_rs_result = Aff { ptr: isl_rs_result,
483 should_free_on_drop: true };
484 isl_rs_result
485 }
486
487 pub fn set_coefficient_val(self, type_: DimType, pos: i32, v: Val) -> Aff {
489 let aff = self;
490 let mut aff = aff;
491 aff.do_not_free_on_drop();
492 let aff = aff.ptr;
493 let mut v = v;
494 v.do_not_free_on_drop();
495 let v = v.ptr;
496 let isl_rs_result = unsafe { isl_aff_set_coefficient_val(aff, type_, pos, v) };
497 let isl_rs_result = Aff { ptr: isl_rs_result,
498 should_free_on_drop: true };
499 isl_rs_result
500 }
501
502 pub fn add_constant_si(self, v: i32) -> Aff {
504 let aff = self;
505 let mut aff = aff;
506 aff.do_not_free_on_drop();
507 let aff = aff.ptr;
508 let isl_rs_result = unsafe { isl_aff_add_constant_si(aff, v) };
509 let isl_rs_result = Aff { ptr: isl_rs_result,
510 should_free_on_drop: true };
511 isl_rs_result
512 }
513
514 pub fn add_constant_val(self, v: Val) -> Aff {
516 let aff = self;
517 let mut aff = aff;
518 aff.do_not_free_on_drop();
519 let aff = aff.ptr;
520 let mut v = v;
521 v.do_not_free_on_drop();
522 let v = v.ptr;
523 let isl_rs_result = unsafe { isl_aff_add_constant_val(aff, v) };
524 let isl_rs_result = Aff { ptr: isl_rs_result,
525 should_free_on_drop: true };
526 isl_rs_result
527 }
528
529 pub fn add_constant_num_si(self, v: i32) -> Aff {
531 let aff = self;
532 let mut aff = aff;
533 aff.do_not_free_on_drop();
534 let aff = aff.ptr;
535 let isl_rs_result = unsafe { isl_aff_add_constant_num_si(aff, v) };
536 let isl_rs_result = Aff { ptr: isl_rs_result,
537 should_free_on_drop: true };
538 isl_rs_result
539 }
540
541 pub fn add_coefficient_si(self, type_: DimType, pos: i32, v: i32) -> Aff {
543 let aff = self;
544 let mut aff = aff;
545 aff.do_not_free_on_drop();
546 let aff = aff.ptr;
547 let isl_rs_result = unsafe { isl_aff_add_coefficient_si(aff, type_, pos, v) };
548 let isl_rs_result = Aff { ptr: isl_rs_result,
549 should_free_on_drop: true };
550 isl_rs_result
551 }
552
553 pub fn add_coefficient_val(self, type_: DimType, pos: i32, v: Val) -> Aff {
555 let aff = self;
556 let mut aff = aff;
557 aff.do_not_free_on_drop();
558 let aff = aff.ptr;
559 let mut v = v;
560 v.do_not_free_on_drop();
561 let v = v.ptr;
562 let isl_rs_result = unsafe { isl_aff_add_coefficient_val(aff, type_, pos, v) };
563 let isl_rs_result = Aff { ptr: isl_rs_result,
564 should_free_on_drop: true };
565 isl_rs_result
566 }
567
568 pub fn is_cst(&self) -> bool {
570 let aff = self;
571 let aff = aff.ptr;
572 let isl_rs_result = unsafe { isl_aff_is_cst(aff) };
573 let isl_rs_result = match isl_rs_result {
574 0 => false,
575 1 => true,
576 _ => panic!("Got isl_bool = -1"),
577 };
578 isl_rs_result
579 }
580
581 pub fn set_tuple_id(self, type_: DimType, id: Id) -> Aff {
583 let aff = self;
584 let mut aff = aff;
585 aff.do_not_free_on_drop();
586 let aff = aff.ptr;
587 let mut id = id;
588 id.do_not_free_on_drop();
589 let id = id.ptr;
590 let isl_rs_result = unsafe { isl_aff_set_tuple_id(aff, type_, id) };
591 let isl_rs_result = Aff { ptr: isl_rs_result,
592 should_free_on_drop: true };
593 isl_rs_result
594 }
595
596 pub fn set_dim_name(self, type_: DimType, pos: u32, s: &str) -> Aff {
598 let aff = self;
599 let mut aff = aff;
600 aff.do_not_free_on_drop();
601 let aff = aff.ptr;
602 let s = CString::new(s).unwrap();
603 let s = s.as_ptr();
604 let isl_rs_result = unsafe { isl_aff_set_dim_name(aff, type_, pos, s) };
605 let isl_rs_result = Aff { ptr: isl_rs_result,
606 should_free_on_drop: true };
607 isl_rs_result
608 }
609
610 pub fn set_dim_id(self, type_: DimType, pos: u32, id: Id) -> Aff {
612 let aff = self;
613 let mut aff = aff;
614 aff.do_not_free_on_drop();
615 let aff = aff.ptr;
616 let mut id = id;
617 id.do_not_free_on_drop();
618 let id = id.ptr;
619 let isl_rs_result = unsafe { isl_aff_set_dim_id(aff, type_, pos, id) };
620 let isl_rs_result = Aff { ptr: isl_rs_result,
621 should_free_on_drop: true };
622 isl_rs_result
623 }
624
625 pub fn find_dim_by_name(&self, type_: DimType, name: &str) -> i32 {
627 let aff = self;
628 let aff = aff.ptr;
629 let name = CString::new(name).unwrap();
630 let name = name.as_ptr();
631 let isl_rs_result = unsafe { isl_aff_find_dim_by_name(aff, type_, name) };
632 isl_rs_result
633 }
634
635 pub fn plain_is_equal(&self, aff2: &Aff) -> bool {
637 let aff1 = self;
638 let aff1 = aff1.ptr;
639 let aff2 = aff2.ptr;
640 let isl_rs_result = unsafe { isl_aff_plain_is_equal(aff1, aff2) };
641 let isl_rs_result = match isl_rs_result {
642 0 => false,
643 1 => true,
644 _ => panic!("Got isl_bool = -1"),
645 };
646 isl_rs_result
647 }
648
649 pub fn plain_is_zero(&self) -> bool {
651 let aff = self;
652 let aff = aff.ptr;
653 let isl_rs_result = unsafe { isl_aff_plain_is_zero(aff) };
654 let isl_rs_result = match isl_rs_result {
655 0 => false,
656 1 => true,
657 _ => panic!("Got isl_bool = -1"),
658 };
659 isl_rs_result
660 }
661
662 pub fn is_nan(&self) -> bool {
664 let aff = self;
665 let aff = aff.ptr;
666 let isl_rs_result = unsafe { isl_aff_is_nan(aff) };
667 let isl_rs_result = match isl_rs_result {
668 0 => false,
669 1 => true,
670 _ => panic!("Got isl_bool = -1"),
671 };
672 isl_rs_result
673 }
674
675 pub fn get_div(&self, pos: i32) -> Aff {
677 let aff = self;
678 let aff = aff.ptr;
679 let isl_rs_result = unsafe { isl_aff_get_div(aff, pos) };
680 let isl_rs_result = Aff { ptr: isl_rs_result,
681 should_free_on_drop: true };
682 isl_rs_result
683 }
684
685 pub fn from_range(self) -> Aff {
687 let aff = self;
688 let mut aff = aff;
689 aff.do_not_free_on_drop();
690 let aff = aff.ptr;
691 let isl_rs_result = unsafe { isl_aff_from_range(aff) };
692 let isl_rs_result = Aff { ptr: isl_rs_result,
693 should_free_on_drop: true };
694 isl_rs_result
695 }
696
697 pub fn neg(self) -> Aff {
699 let aff = self;
700 let mut aff = aff;
701 aff.do_not_free_on_drop();
702 let aff = aff.ptr;
703 let isl_rs_result = unsafe { isl_aff_neg(aff) };
704 let isl_rs_result = Aff { ptr: isl_rs_result,
705 should_free_on_drop: true };
706 isl_rs_result
707 }
708
709 pub fn ceil(self) -> Aff {
711 let aff = self;
712 let mut aff = aff;
713 aff.do_not_free_on_drop();
714 let aff = aff.ptr;
715 let isl_rs_result = unsafe { isl_aff_ceil(aff) };
716 let isl_rs_result = Aff { ptr: isl_rs_result,
717 should_free_on_drop: true };
718 isl_rs_result
719 }
720
721 pub fn floor(self) -> Aff {
723 let aff = self;
724 let mut aff = aff;
725 aff.do_not_free_on_drop();
726 let aff = aff.ptr;
727 let isl_rs_result = unsafe { isl_aff_floor(aff) };
728 let isl_rs_result = Aff { ptr: isl_rs_result,
729 should_free_on_drop: true };
730 isl_rs_result
731 }
732
733 pub fn mod_val(self, mod_: Val) -> Aff {
735 let aff = self;
736 let mut aff = aff;
737 aff.do_not_free_on_drop();
738 let aff = aff.ptr;
739 let mut mod_ = mod_;
740 mod_.do_not_free_on_drop();
741 let mod_ = mod_.ptr;
742 let isl_rs_result = unsafe { isl_aff_mod_val(aff, mod_) };
743 let isl_rs_result = Aff { ptr: isl_rs_result,
744 should_free_on_drop: true };
745 isl_rs_result
746 }
747
748 pub fn mul(self, aff2: Aff) -> Aff {
750 let aff1 = self;
751 let mut aff1 = aff1;
752 aff1.do_not_free_on_drop();
753 let aff1 = aff1.ptr;
754 let mut aff2 = aff2;
755 aff2.do_not_free_on_drop();
756 let aff2 = aff2.ptr;
757 let isl_rs_result = unsafe { isl_aff_mul(aff1, aff2) };
758 let isl_rs_result = Aff { ptr: isl_rs_result,
759 should_free_on_drop: true };
760 isl_rs_result
761 }
762
763 pub fn div(self, aff2: Aff) -> Aff {
765 let aff1 = self;
766 let mut aff1 = aff1;
767 aff1.do_not_free_on_drop();
768 let aff1 = aff1.ptr;
769 let mut aff2 = aff2;
770 aff2.do_not_free_on_drop();
771 let aff2 = aff2.ptr;
772 let isl_rs_result = unsafe { isl_aff_div(aff1, aff2) };
773 let isl_rs_result = Aff { ptr: isl_rs_result,
774 should_free_on_drop: true };
775 isl_rs_result
776 }
777
778 pub fn add(self, aff2: Aff) -> Aff {
780 let aff1 = self;
781 let mut aff1 = aff1;
782 aff1.do_not_free_on_drop();
783 let aff1 = aff1.ptr;
784 let mut aff2 = aff2;
785 aff2.do_not_free_on_drop();
786 let aff2 = aff2.ptr;
787 let isl_rs_result = unsafe { isl_aff_add(aff1, aff2) };
788 let isl_rs_result = Aff { ptr: isl_rs_result,
789 should_free_on_drop: true };
790 isl_rs_result
791 }
792
793 pub fn sub(self, aff2: Aff) -> Aff {
795 let aff1 = self;
796 let mut aff1 = aff1;
797 aff1.do_not_free_on_drop();
798 let aff1 = aff1.ptr;
799 let mut aff2 = aff2;
800 aff2.do_not_free_on_drop();
801 let aff2 = aff2.ptr;
802 let isl_rs_result = unsafe { isl_aff_sub(aff1, aff2) };
803 let isl_rs_result = Aff { ptr: isl_rs_result,
804 should_free_on_drop: true };
805 isl_rs_result
806 }
807
808 pub fn scale_val(self, v: Val) -> Aff {
810 let aff = self;
811 let mut aff = aff;
812 aff.do_not_free_on_drop();
813 let aff = aff.ptr;
814 let mut v = v;
815 v.do_not_free_on_drop();
816 let v = v.ptr;
817 let isl_rs_result = unsafe { isl_aff_scale_val(aff, v) };
818 let isl_rs_result = Aff { ptr: isl_rs_result,
819 should_free_on_drop: true };
820 isl_rs_result
821 }
822
823 pub fn scale_down_ui(self, f: u32) -> Aff {
825 let aff = self;
826 let mut aff = aff;
827 aff.do_not_free_on_drop();
828 let aff = aff.ptr;
829 let isl_rs_result = unsafe { isl_aff_scale_down_ui(aff, f) };
830 let isl_rs_result = Aff { ptr: isl_rs_result,
831 should_free_on_drop: true };
832 isl_rs_result
833 }
834
835 pub fn scale_down_val(self, v: Val) -> Aff {
837 let aff = self;
838 let mut aff = aff;
839 aff.do_not_free_on_drop();
840 let aff = aff.ptr;
841 let mut v = v;
842 v.do_not_free_on_drop();
843 let v = v.ptr;
844 let isl_rs_result = unsafe { isl_aff_scale_down_val(aff, v) };
845 let isl_rs_result = Aff { ptr: isl_rs_result,
846 should_free_on_drop: true };
847 isl_rs_result
848 }
849
850 pub fn insert_dims(self, type_: DimType, first: u32, n: u32) -> Aff {
852 let aff = self;
853 let mut aff = aff;
854 aff.do_not_free_on_drop();
855 let aff = aff.ptr;
856 let isl_rs_result = unsafe { isl_aff_insert_dims(aff, type_, first, n) };
857 let isl_rs_result = Aff { ptr: isl_rs_result,
858 should_free_on_drop: true };
859 isl_rs_result
860 }
861
862 pub fn add_dims(self, type_: DimType, n: u32) -> Aff {
864 let aff = self;
865 let mut aff = aff;
866 aff.do_not_free_on_drop();
867 let aff = aff.ptr;
868 let isl_rs_result = unsafe { isl_aff_add_dims(aff, type_, n) };
869 let isl_rs_result = Aff { ptr: isl_rs_result,
870 should_free_on_drop: true };
871 isl_rs_result
872 }
873
874 pub fn move_dims(self, dst_type: DimType, dst_pos: u32, src_type: DimType, src_pos: u32,
876 n: u32)
877 -> Aff {
878 let aff = self;
879 let mut aff = aff;
880 aff.do_not_free_on_drop();
881 let aff = aff.ptr;
882 let isl_rs_result =
883 unsafe { isl_aff_move_dims(aff, dst_type, dst_pos, src_type, src_pos, n) };
884 let isl_rs_result = Aff { ptr: isl_rs_result,
885 should_free_on_drop: true };
886 isl_rs_result
887 }
888
889 pub fn drop_dims(self, type_: DimType, first: u32, n: u32) -> Aff {
891 let aff = self;
892 let mut aff = aff;
893 aff.do_not_free_on_drop();
894 let aff = aff.ptr;
895 let isl_rs_result = unsafe { isl_aff_drop_dims(aff, type_, first, n) };
896 let isl_rs_result = Aff { ptr: isl_rs_result,
897 should_free_on_drop: true };
898 isl_rs_result
899 }
900
901 pub fn project_domain_on_params(self) -> Aff {
903 let aff = self;
904 let mut aff = aff;
905 aff.do_not_free_on_drop();
906 let aff = aff.ptr;
907 let isl_rs_result = unsafe { isl_aff_project_domain_on_params(aff) };
908 let isl_rs_result = Aff { ptr: isl_rs_result,
909 should_free_on_drop: true };
910 isl_rs_result
911 }
912
913 pub fn align_params(self, model: Space) -> Aff {
915 let aff = self;
916 let mut aff = aff;
917 aff.do_not_free_on_drop();
918 let aff = aff.ptr;
919 let mut model = model;
920 model.do_not_free_on_drop();
921 let model = model.ptr;
922 let isl_rs_result = unsafe { isl_aff_align_params(aff, model) };
923 let isl_rs_result = Aff { ptr: isl_rs_result,
924 should_free_on_drop: true };
925 isl_rs_result
926 }
927
928 pub fn gist(self, context: Set) -> Aff {
930 let aff = self;
931 let mut aff = aff;
932 aff.do_not_free_on_drop();
933 let aff = aff.ptr;
934 let mut context = context;
935 context.do_not_free_on_drop();
936 let context = context.ptr;
937 let isl_rs_result = unsafe { isl_aff_gist(aff, context) };
938 let isl_rs_result = Aff { ptr: isl_rs_result,
939 should_free_on_drop: true };
940 isl_rs_result
941 }
942
943 pub fn gist_params(self, context: Set) -> Aff {
945 let aff = self;
946 let mut aff = aff;
947 aff.do_not_free_on_drop();
948 let aff = aff.ptr;
949 let mut context = context;
950 context.do_not_free_on_drop();
951 let context = context.ptr;
952 let isl_rs_result = unsafe { isl_aff_gist_params(aff, context) };
953 let isl_rs_result = Aff { ptr: isl_rs_result,
954 should_free_on_drop: true };
955 isl_rs_result
956 }
957
958 pub fn eval(self, pnt: Point) -> Val {
960 let aff = self;
961 let mut aff = aff;
962 aff.do_not_free_on_drop();
963 let aff = aff.ptr;
964 let mut pnt = pnt;
965 pnt.do_not_free_on_drop();
966 let pnt = pnt.ptr;
967 let isl_rs_result = unsafe { isl_aff_eval(aff, pnt) };
968 let isl_rs_result = Val { ptr: isl_rs_result,
969 should_free_on_drop: true };
970 isl_rs_result
971 }
972
973 pub fn pullback_aff(self, aff2: Aff) -> Aff {
975 let aff1 = self;
976 let mut aff1 = aff1;
977 aff1.do_not_free_on_drop();
978 let aff1 = aff1.ptr;
979 let mut aff2 = aff2;
980 aff2.do_not_free_on_drop();
981 let aff2 = aff2.ptr;
982 let isl_rs_result = unsafe { isl_aff_pullback_aff(aff1, aff2) };
983 let isl_rs_result = Aff { ptr: isl_rs_result,
984 should_free_on_drop: true };
985 isl_rs_result
986 }
987
988 pub fn zero_basic_set(self) -> BasicSet {
990 let aff = self;
991 let mut aff = aff;
992 aff.do_not_free_on_drop();
993 let aff = aff.ptr;
994 let isl_rs_result = unsafe { isl_aff_zero_basic_set(aff) };
995 let isl_rs_result = BasicSet { ptr: isl_rs_result,
996 should_free_on_drop: true };
997 isl_rs_result
998 }
999
1000 pub fn neg_basic_set(self) -> BasicSet {
1002 let aff = self;
1003 let mut aff = aff;
1004 aff.do_not_free_on_drop();
1005 let aff = aff.ptr;
1006 let isl_rs_result = unsafe { isl_aff_neg_basic_set(aff) };
1007 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1008 should_free_on_drop: true };
1009 isl_rs_result
1010 }
1011
1012 pub fn eq_basic_set(self, aff2: Aff) -> BasicSet {
1014 let aff1 = self;
1015 let mut aff1 = aff1;
1016 aff1.do_not_free_on_drop();
1017 let aff1 = aff1.ptr;
1018 let mut aff2 = aff2;
1019 aff2.do_not_free_on_drop();
1020 let aff2 = aff2.ptr;
1021 let isl_rs_result = unsafe { isl_aff_eq_basic_set(aff1, aff2) };
1022 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1023 should_free_on_drop: true };
1024 isl_rs_result
1025 }
1026
1027 pub fn eq_set(self, aff2: Aff) -> Set {
1029 let aff1 = self;
1030 let mut aff1 = aff1;
1031 aff1.do_not_free_on_drop();
1032 let aff1 = aff1.ptr;
1033 let mut aff2 = aff2;
1034 aff2.do_not_free_on_drop();
1035 let aff2 = aff2.ptr;
1036 let isl_rs_result = unsafe { isl_aff_eq_set(aff1, aff2) };
1037 let isl_rs_result = Set { ptr: isl_rs_result,
1038 should_free_on_drop: true };
1039 isl_rs_result
1040 }
1041
1042 pub fn ne_set(self, aff2: Aff) -> Set {
1044 let aff1 = self;
1045 let mut aff1 = aff1;
1046 aff1.do_not_free_on_drop();
1047 let aff1 = aff1.ptr;
1048 let mut aff2 = aff2;
1049 aff2.do_not_free_on_drop();
1050 let aff2 = aff2.ptr;
1051 let isl_rs_result = unsafe { isl_aff_ne_set(aff1, aff2) };
1052 let isl_rs_result = Set { ptr: isl_rs_result,
1053 should_free_on_drop: true };
1054 isl_rs_result
1055 }
1056
1057 pub fn le_basic_set(self, aff2: Aff) -> BasicSet {
1059 let aff1 = self;
1060 let mut aff1 = aff1;
1061 aff1.do_not_free_on_drop();
1062 let aff1 = aff1.ptr;
1063 let mut aff2 = aff2;
1064 aff2.do_not_free_on_drop();
1065 let aff2 = aff2.ptr;
1066 let isl_rs_result = unsafe { isl_aff_le_basic_set(aff1, aff2) };
1067 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1068 should_free_on_drop: true };
1069 isl_rs_result
1070 }
1071
1072 pub fn le_set(self, aff2: Aff) -> Set {
1074 let aff1 = self;
1075 let mut aff1 = aff1;
1076 aff1.do_not_free_on_drop();
1077 let aff1 = aff1.ptr;
1078 let mut aff2 = aff2;
1079 aff2.do_not_free_on_drop();
1080 let aff2 = aff2.ptr;
1081 let isl_rs_result = unsafe { isl_aff_le_set(aff1, aff2) };
1082 let isl_rs_result = Set { ptr: isl_rs_result,
1083 should_free_on_drop: true };
1084 isl_rs_result
1085 }
1086
1087 pub fn lt_basic_set(self, aff2: Aff) -> BasicSet {
1089 let aff1 = self;
1090 let mut aff1 = aff1;
1091 aff1.do_not_free_on_drop();
1092 let aff1 = aff1.ptr;
1093 let mut aff2 = aff2;
1094 aff2.do_not_free_on_drop();
1095 let aff2 = aff2.ptr;
1096 let isl_rs_result = unsafe { isl_aff_lt_basic_set(aff1, aff2) };
1097 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1098 should_free_on_drop: true };
1099 isl_rs_result
1100 }
1101
1102 pub fn lt_set(self, aff2: Aff) -> Set {
1104 let aff1 = self;
1105 let mut aff1 = aff1;
1106 aff1.do_not_free_on_drop();
1107 let aff1 = aff1.ptr;
1108 let mut aff2 = aff2;
1109 aff2.do_not_free_on_drop();
1110 let aff2 = aff2.ptr;
1111 let isl_rs_result = unsafe { isl_aff_lt_set(aff1, aff2) };
1112 let isl_rs_result = Set { ptr: isl_rs_result,
1113 should_free_on_drop: true };
1114 isl_rs_result
1115 }
1116
1117 pub fn ge_basic_set(self, aff2: Aff) -> BasicSet {
1119 let aff1 = self;
1120 let mut aff1 = aff1;
1121 aff1.do_not_free_on_drop();
1122 let aff1 = aff1.ptr;
1123 let mut aff2 = aff2;
1124 aff2.do_not_free_on_drop();
1125 let aff2 = aff2.ptr;
1126 let isl_rs_result = unsafe { isl_aff_ge_basic_set(aff1, aff2) };
1127 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1128 should_free_on_drop: true };
1129 isl_rs_result
1130 }
1131
1132 pub fn ge_set(self, aff2: Aff) -> Set {
1134 let aff1 = self;
1135 let mut aff1 = aff1;
1136 aff1.do_not_free_on_drop();
1137 let aff1 = aff1.ptr;
1138 let mut aff2 = aff2;
1139 aff2.do_not_free_on_drop();
1140 let aff2 = aff2.ptr;
1141 let isl_rs_result = unsafe { isl_aff_ge_set(aff1, aff2) };
1142 let isl_rs_result = Set { ptr: isl_rs_result,
1143 should_free_on_drop: true };
1144 isl_rs_result
1145 }
1146
1147 pub fn gt_basic_set(self, aff2: Aff) -> BasicSet {
1149 let aff1 = self;
1150 let mut aff1 = aff1;
1151 aff1.do_not_free_on_drop();
1152 let aff1 = aff1.ptr;
1153 let mut aff2 = aff2;
1154 aff2.do_not_free_on_drop();
1155 let aff2 = aff2.ptr;
1156 let isl_rs_result = unsafe { isl_aff_gt_basic_set(aff1, aff2) };
1157 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1158 should_free_on_drop: true };
1159 isl_rs_result
1160 }
1161
1162 pub fn gt_set(self, aff2: Aff) -> Set {
1164 let aff1 = self;
1165 let mut aff1 = aff1;
1166 aff1.do_not_free_on_drop();
1167 let aff1 = aff1.ptr;
1168 let mut aff2 = aff2;
1169 aff2.do_not_free_on_drop();
1170 let aff2 = aff2.ptr;
1171 let isl_rs_result = unsafe { isl_aff_gt_set(aff1, aff2) };
1172 let isl_rs_result = Set { ptr: isl_rs_result,
1173 should_free_on_drop: true };
1174 isl_rs_result
1175 }
1176
1177 pub fn bind_id(self, id: Id) -> BasicSet {
1179 let aff = self;
1180 let mut aff = aff;
1181 aff.do_not_free_on_drop();
1182 let aff = aff.ptr;
1183 let mut id = id;
1184 id.do_not_free_on_drop();
1185 let id = id.ptr;
1186 let isl_rs_result = unsafe { isl_aff_bind_id(aff, id) };
1187 let isl_rs_result = BasicSet { ptr: isl_rs_result,
1188 should_free_on_drop: true };
1189 isl_rs_result
1190 }
1191
1192 pub fn read_from_str(ctx: &Context, str_: &str) -> Aff {
1194 let ctx = ctx.ptr;
1195 let str_ = CString::new(str_).unwrap();
1196 let str_ = str_.as_ptr();
1197 let isl_rs_result = unsafe { isl_aff_read_from_str(ctx, str_) };
1198 let isl_rs_result = Aff { ptr: isl_rs_result,
1199 should_free_on_drop: true };
1200 isl_rs_result
1201 }
1202
1203 pub fn to_str(&self) -> &str {
1205 let aff = self;
1206 let aff = aff.ptr;
1207 let isl_rs_result = unsafe { isl_aff_to_str(aff) };
1208 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1209 let isl_rs_result = isl_rs_result.to_str().unwrap();
1210 isl_rs_result
1211 }
1212
1213 pub fn dump(&self) {
1215 let aff = self;
1216 let aff = aff.ptr;
1217 let isl_rs_result = unsafe { isl_aff_dump(aff) };
1218 isl_rs_result
1219 }
1220
1221 pub fn do_not_free_on_drop(&mut self) {
1223 self.should_free_on_drop = false;
1224 }
1225}
1226
1227impl Drop for Aff {
1228 fn drop(&mut self) {
1229 if self.should_free_on_drop {
1230 unsafe {
1231 isl_aff_free(self.ptr);
1232 }
1233 }
1234 }
1235}