1use super::{Context, Error, LibISLError, Mat, Val};
5use libc::uintptr_t;
6
7pub struct Vec {
9 pub ptr: uintptr_t,
10 pub should_free_on_drop: bool,
11}
12
13extern "C" {
14
15 fn isl_vec_add(vec1: uintptr_t, vec2: uintptr_t) -> uintptr_t;
16
17 fn isl_vec_add_els(vec: uintptr_t, n: u32) -> uintptr_t;
18
19 fn isl_vec_alloc(ctx: uintptr_t, size: u32) -> uintptr_t;
20
21 fn isl_vec_ceil(vec: uintptr_t) -> uintptr_t;
22
23 fn isl_vec_clr(vec: uintptr_t) -> uintptr_t;
24
25 fn isl_vec_cmp_element(vec1: uintptr_t, vec2: uintptr_t, pos: i32) -> i32;
26
27 fn isl_vec_concat(vec1: uintptr_t, vec2: uintptr_t) -> uintptr_t;
28
29 fn isl_vec_copy(vec: uintptr_t) -> uintptr_t;
30
31 fn isl_vec_drop_els(vec: uintptr_t, pos: u32, n: u32) -> uintptr_t;
32
33 fn isl_vec_dump(vec: uintptr_t) -> ();
34
35 fn isl_vec_extend(vec: uintptr_t, size: u32) -> uintptr_t;
36
37 fn isl_vec_free(vec: uintptr_t) -> uintptr_t;
38
39 fn isl_vec_get_ctx(vec: uintptr_t) -> uintptr_t;
40
41 fn isl_vec_get_element_val(vec: uintptr_t, pos: i32) -> uintptr_t;
42
43 fn isl_vec_insert_els(vec: uintptr_t, pos: u32, n: u32) -> uintptr_t;
44
45 fn isl_vec_insert_zero_els(vec: uintptr_t, pos: u32, n: u32) -> uintptr_t;
46
47 fn isl_vec_is_equal(vec1: uintptr_t, vec2: uintptr_t) -> i32;
48
49 fn isl_vec_mat_product(vec: uintptr_t, mat: uintptr_t) -> uintptr_t;
50
51 fn isl_vec_move_els(vec: uintptr_t, dst_col: u32, src_col: u32, n: u32) -> uintptr_t;
52
53 fn isl_vec_neg(vec: uintptr_t) -> uintptr_t;
54
55 fn isl_vec_normalize(vec: uintptr_t) -> uintptr_t;
56
57 fn isl_vec_set_element_si(vec: uintptr_t, pos: i32, v: i32) -> uintptr_t;
58
59 fn isl_vec_set_element_val(vec: uintptr_t, pos: i32, v: uintptr_t) -> uintptr_t;
60
61 fn isl_vec_set_si(vec: uintptr_t, v: i32) -> uintptr_t;
62
63 fn isl_vec_set_val(vec: uintptr_t, v: uintptr_t) -> uintptr_t;
64
65 fn isl_vec_size(vec: uintptr_t) -> i32;
66
67 fn isl_vec_sort(vec: uintptr_t) -> uintptr_t;
68
69 fn isl_vec_zero(ctx: uintptr_t, size: u32) -> uintptr_t;
70
71 fn isl_vec_zero_extend(vec: uintptr_t, size: u32) -> uintptr_t;
72
73}
74
75impl Vec {
76 pub fn add(self, vec2: Vec) -> Result<Vec, LibISLError> {
78 let vec1 = self;
79 let isl_rs_ctx = vec1.get_ctx();
80 let mut vec1 = vec1;
81 vec1.do_not_free_on_drop();
82 let vec1 = vec1.ptr;
83 let mut vec2 = vec2;
84 vec2.do_not_free_on_drop();
85 let vec2 = vec2.ptr;
86 let isl_rs_result = unsafe { isl_vec_add(vec1, vec2) };
87 let isl_rs_result = Vec { ptr: isl_rs_result,
88 should_free_on_drop: true };
89 let err = isl_rs_ctx.last_error();
90 if err != Error::None_ {
91 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
92 }
93 Ok(isl_rs_result)
94 }
95
96 pub fn add_els(self, n: u32) -> Result<Vec, LibISLError> {
98 let vec = self;
99 let isl_rs_ctx = vec.get_ctx();
100 let mut vec = vec;
101 vec.do_not_free_on_drop();
102 let vec = vec.ptr;
103 let isl_rs_result = unsafe { isl_vec_add_els(vec, n) };
104 let isl_rs_result = Vec { ptr: isl_rs_result,
105 should_free_on_drop: true };
106 let err = isl_rs_ctx.last_error();
107 if err != Error::None_ {
108 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
109 }
110 Ok(isl_rs_result)
111 }
112
113 pub fn alloc(ctx: &Context, size: u32) -> Result<Vec, LibISLError> {
115 let isl_rs_ctx = Context { ptr: ctx.ptr,
116 should_free_on_drop: false };
117 let ctx = ctx.ptr;
118 let isl_rs_result = unsafe { isl_vec_alloc(ctx, size) };
119 let isl_rs_result = Vec { ptr: isl_rs_result,
120 should_free_on_drop: true };
121 let err = isl_rs_ctx.last_error();
122 if err != Error::None_ {
123 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
124 }
125 Ok(isl_rs_result)
126 }
127
128 pub fn ceil(self) -> Result<Vec, LibISLError> {
130 let vec = self;
131 let isl_rs_ctx = vec.get_ctx();
132 let mut vec = vec;
133 vec.do_not_free_on_drop();
134 let vec = vec.ptr;
135 let isl_rs_result = unsafe { isl_vec_ceil(vec) };
136 let isl_rs_result = Vec { ptr: isl_rs_result,
137 should_free_on_drop: true };
138 let err = isl_rs_ctx.last_error();
139 if err != Error::None_ {
140 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
141 }
142 Ok(isl_rs_result)
143 }
144
145 pub fn clr(self) -> Result<Vec, LibISLError> {
147 let vec = self;
148 let isl_rs_ctx = vec.get_ctx();
149 let mut vec = vec;
150 vec.do_not_free_on_drop();
151 let vec = vec.ptr;
152 let isl_rs_result = unsafe { isl_vec_clr(vec) };
153 let isl_rs_result = Vec { ptr: isl_rs_result,
154 should_free_on_drop: true };
155 let err = isl_rs_ctx.last_error();
156 if err != Error::None_ {
157 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
158 }
159 Ok(isl_rs_result)
160 }
161
162 pub fn cmp_element(&self, vec2: &Vec, pos: i32) -> Result<i32, LibISLError> {
164 let vec1 = self;
165 let isl_rs_ctx = vec1.get_ctx();
166 let vec1 = vec1.ptr;
167 let vec2 = vec2.ptr;
168 let isl_rs_result = unsafe { isl_vec_cmp_element(vec1, vec2, pos) };
169 let err = isl_rs_ctx.last_error();
170 if err != Error::None_ {
171 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
172 }
173 Ok(isl_rs_result)
174 }
175
176 pub fn concat(self, vec2: Vec) -> Result<Vec, LibISLError> {
178 let vec1 = self;
179 let isl_rs_ctx = vec1.get_ctx();
180 let mut vec1 = vec1;
181 vec1.do_not_free_on_drop();
182 let vec1 = vec1.ptr;
183 let mut vec2 = vec2;
184 vec2.do_not_free_on_drop();
185 let vec2 = vec2.ptr;
186 let isl_rs_result = unsafe { isl_vec_concat(vec1, vec2) };
187 let isl_rs_result = Vec { ptr: isl_rs_result,
188 should_free_on_drop: true };
189 let err = isl_rs_ctx.last_error();
190 if err != Error::None_ {
191 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
192 }
193 Ok(isl_rs_result)
194 }
195
196 pub fn copy(&self) -> Result<Vec, LibISLError> {
198 let vec = self;
199 let isl_rs_ctx = vec.get_ctx();
200 let vec = vec.ptr;
201 let isl_rs_result = unsafe { isl_vec_copy(vec) };
202 let isl_rs_result = Vec { 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 drop_els(self, pos: u32, n: u32) -> Result<Vec, LibISLError> {
213 let vec = self;
214 let isl_rs_ctx = vec.get_ctx();
215 let mut vec = vec;
216 vec.do_not_free_on_drop();
217 let vec = vec.ptr;
218 let isl_rs_result = unsafe { isl_vec_drop_els(vec, pos, n) };
219 let isl_rs_result = Vec { ptr: isl_rs_result,
220 should_free_on_drop: true };
221 let err = isl_rs_ctx.last_error();
222 if err != Error::None_ {
223 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
224 }
225 Ok(isl_rs_result)
226 }
227
228 pub fn dump(&self) -> Result<(), LibISLError> {
230 let vec = self;
231 let isl_rs_ctx = vec.get_ctx();
232 let vec = vec.ptr;
233 let isl_rs_result = unsafe { isl_vec_dump(vec) };
234 let err = isl_rs_ctx.last_error();
235 if err != Error::None_ {
236 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
237 }
238 Ok(isl_rs_result)
239 }
240
241 pub fn extend(self, size: u32) -> Result<Vec, LibISLError> {
243 let vec = self;
244 let isl_rs_ctx = vec.get_ctx();
245 let mut vec = vec;
246 vec.do_not_free_on_drop();
247 let vec = vec.ptr;
248 let isl_rs_result = unsafe { isl_vec_extend(vec, size) };
249 let isl_rs_result = Vec { ptr: isl_rs_result,
250 should_free_on_drop: true };
251 let err = isl_rs_ctx.last_error();
252 if err != Error::None_ {
253 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
254 }
255 Ok(isl_rs_result)
256 }
257
258 pub fn free(self) -> Result<Vec, LibISLError> {
260 let vec = self;
261 let isl_rs_ctx = vec.get_ctx();
262 let mut vec = vec;
263 vec.do_not_free_on_drop();
264 let vec = vec.ptr;
265 let isl_rs_result = unsafe { isl_vec_free(vec) };
266 let isl_rs_result = Vec { ptr: isl_rs_result,
267 should_free_on_drop: true };
268 let err = isl_rs_ctx.last_error();
269 if err != Error::None_ {
270 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
271 }
272 Ok(isl_rs_result)
273 }
274
275 pub fn get_ctx(&self) -> Context {
277 let vec = self;
278 let vec = vec.ptr;
279 let isl_rs_result = unsafe { isl_vec_get_ctx(vec) };
280 let isl_rs_result = Context { ptr: isl_rs_result,
281 should_free_on_drop: false };
282 isl_rs_result
283 }
284
285 pub fn get_element_val(&self, pos: i32) -> Result<Val, LibISLError> {
287 let vec = self;
288 let isl_rs_ctx = vec.get_ctx();
289 let vec = vec.ptr;
290 let isl_rs_result = unsafe { isl_vec_get_element_val(vec, pos) };
291 let isl_rs_result = Val { ptr: isl_rs_result,
292 should_free_on_drop: true };
293 let err = isl_rs_ctx.last_error();
294 if err != Error::None_ {
295 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
296 }
297 Ok(isl_rs_result)
298 }
299
300 pub fn insert_els(self, pos: u32, n: u32) -> Result<Vec, LibISLError> {
302 let vec = self;
303 let isl_rs_ctx = vec.get_ctx();
304 let mut vec = vec;
305 vec.do_not_free_on_drop();
306 let vec = vec.ptr;
307 let isl_rs_result = unsafe { isl_vec_insert_els(vec, pos, n) };
308 let isl_rs_result = Vec { ptr: isl_rs_result,
309 should_free_on_drop: true };
310 let err = isl_rs_ctx.last_error();
311 if err != Error::None_ {
312 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
313 }
314 Ok(isl_rs_result)
315 }
316
317 pub fn insert_zero_els(self, pos: u32, n: u32) -> Result<Vec, LibISLError> {
319 let vec = self;
320 let isl_rs_ctx = vec.get_ctx();
321 let mut vec = vec;
322 vec.do_not_free_on_drop();
323 let vec = vec.ptr;
324 let isl_rs_result = unsafe { isl_vec_insert_zero_els(vec, pos, n) };
325 let isl_rs_result = Vec { ptr: isl_rs_result,
326 should_free_on_drop: true };
327 let err = isl_rs_ctx.last_error();
328 if err != Error::None_ {
329 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
330 }
331 Ok(isl_rs_result)
332 }
333
334 pub fn is_equal(&self, vec2: &Vec) -> Result<bool, LibISLError> {
336 let vec1 = self;
337 let isl_rs_ctx = vec1.get_ctx();
338 let vec1 = vec1.ptr;
339 let vec2 = vec2.ptr;
340 let isl_rs_result = unsafe { isl_vec_is_equal(vec1, vec2) };
341 let isl_rs_result = match isl_rs_result {
342 0 => false,
343 1 => true,
344 _ => panic!("Got isl_bool = -1"),
345 };
346 let err = isl_rs_ctx.last_error();
347 if err != Error::None_ {
348 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
349 }
350 Ok(isl_rs_result)
351 }
352
353 pub fn mat_product(self, mat: Mat) -> Result<Vec, LibISLError> {
355 let vec = self;
356 let isl_rs_ctx = vec.get_ctx();
357 let mut vec = vec;
358 vec.do_not_free_on_drop();
359 let vec = vec.ptr;
360 let mut mat = mat;
361 mat.do_not_free_on_drop();
362 let mat = mat.ptr;
363 let isl_rs_result = unsafe { isl_vec_mat_product(vec, mat) };
364 let isl_rs_result = Vec { ptr: isl_rs_result,
365 should_free_on_drop: true };
366 let err = isl_rs_ctx.last_error();
367 if err != Error::None_ {
368 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
369 }
370 Ok(isl_rs_result)
371 }
372
373 pub fn move_els(self, dst_col: u32, src_col: u32, n: u32) -> Result<Vec, LibISLError> {
375 let vec = self;
376 let isl_rs_ctx = vec.get_ctx();
377 let mut vec = vec;
378 vec.do_not_free_on_drop();
379 let vec = vec.ptr;
380 let isl_rs_result = unsafe { isl_vec_move_els(vec, dst_col, src_col, n) };
381 let isl_rs_result = Vec { ptr: isl_rs_result,
382 should_free_on_drop: true };
383 let err = isl_rs_ctx.last_error();
384 if err != Error::None_ {
385 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
386 }
387 Ok(isl_rs_result)
388 }
389
390 pub fn neg(self) -> Result<Vec, LibISLError> {
392 let vec = self;
393 let isl_rs_ctx = vec.get_ctx();
394 let mut vec = vec;
395 vec.do_not_free_on_drop();
396 let vec = vec.ptr;
397 let isl_rs_result = unsafe { isl_vec_neg(vec) };
398 let isl_rs_result = Vec { ptr: isl_rs_result,
399 should_free_on_drop: true };
400 let err = isl_rs_ctx.last_error();
401 if err != Error::None_ {
402 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
403 }
404 Ok(isl_rs_result)
405 }
406
407 pub fn normalize(self) -> Result<Vec, LibISLError> {
409 let vec = self;
410 let isl_rs_ctx = vec.get_ctx();
411 let mut vec = vec;
412 vec.do_not_free_on_drop();
413 let vec = vec.ptr;
414 let isl_rs_result = unsafe { isl_vec_normalize(vec) };
415 let isl_rs_result = Vec { ptr: isl_rs_result,
416 should_free_on_drop: true };
417 let err = isl_rs_ctx.last_error();
418 if err != Error::None_ {
419 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
420 }
421 Ok(isl_rs_result)
422 }
423
424 pub fn set_element_si(self, pos: i32, v: i32) -> Result<Vec, LibISLError> {
426 let vec = self;
427 let isl_rs_ctx = vec.get_ctx();
428 let mut vec = vec;
429 vec.do_not_free_on_drop();
430 let vec = vec.ptr;
431 let isl_rs_result = unsafe { isl_vec_set_element_si(vec, pos, v) };
432 let isl_rs_result = Vec { ptr: isl_rs_result,
433 should_free_on_drop: true };
434 let err = isl_rs_ctx.last_error();
435 if err != Error::None_ {
436 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
437 }
438 Ok(isl_rs_result)
439 }
440
441 pub fn set_element_val(self, pos: i32, v: Val) -> Result<Vec, LibISLError> {
443 let vec = self;
444 let isl_rs_ctx = vec.get_ctx();
445 let mut vec = vec;
446 vec.do_not_free_on_drop();
447 let vec = vec.ptr;
448 let mut v = v;
449 v.do_not_free_on_drop();
450 let v = v.ptr;
451 let isl_rs_result = unsafe { isl_vec_set_element_val(vec, pos, v) };
452 let isl_rs_result = Vec { ptr: isl_rs_result,
453 should_free_on_drop: true };
454 let err = isl_rs_ctx.last_error();
455 if err != Error::None_ {
456 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
457 }
458 Ok(isl_rs_result)
459 }
460
461 pub fn set_si(self, v: i32) -> Result<Vec, LibISLError> {
463 let vec = self;
464 let isl_rs_ctx = vec.get_ctx();
465 let mut vec = vec;
466 vec.do_not_free_on_drop();
467 let vec = vec.ptr;
468 let isl_rs_result = unsafe { isl_vec_set_si(vec, v) };
469 let isl_rs_result = Vec { ptr: isl_rs_result,
470 should_free_on_drop: true };
471 let err = isl_rs_ctx.last_error();
472 if err != Error::None_ {
473 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
474 }
475 Ok(isl_rs_result)
476 }
477
478 pub fn set_val(self, v: Val) -> Result<Vec, LibISLError> {
480 let vec = self;
481 let isl_rs_ctx = vec.get_ctx();
482 let mut vec = vec;
483 vec.do_not_free_on_drop();
484 let vec = vec.ptr;
485 let mut v = v;
486 v.do_not_free_on_drop();
487 let v = v.ptr;
488 let isl_rs_result = unsafe { isl_vec_set_val(vec, v) };
489 let isl_rs_result = Vec { ptr: isl_rs_result,
490 should_free_on_drop: true };
491 let err = isl_rs_ctx.last_error();
492 if err != Error::None_ {
493 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
494 }
495 Ok(isl_rs_result)
496 }
497
498 pub fn size(&self) -> Result<i32, LibISLError> {
500 let vec = self;
501 let isl_rs_ctx = vec.get_ctx();
502 let vec = vec.ptr;
503 let isl_rs_result = unsafe { isl_vec_size(vec) };
504 let err = isl_rs_ctx.last_error();
505 if err != Error::None_ {
506 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
507 }
508 Ok(isl_rs_result)
509 }
510
511 pub fn sort(self) -> Result<Vec, LibISLError> {
513 let vec = self;
514 let isl_rs_ctx = vec.get_ctx();
515 let mut vec = vec;
516 vec.do_not_free_on_drop();
517 let vec = vec.ptr;
518 let isl_rs_result = unsafe { isl_vec_sort(vec) };
519 let isl_rs_result = Vec { ptr: isl_rs_result,
520 should_free_on_drop: true };
521 let err = isl_rs_ctx.last_error();
522 if err != Error::None_ {
523 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
524 }
525 Ok(isl_rs_result)
526 }
527
528 pub fn zero(ctx: &Context, size: u32) -> Result<Vec, LibISLError> {
530 let isl_rs_ctx = Context { ptr: ctx.ptr,
531 should_free_on_drop: false };
532 let ctx = ctx.ptr;
533 let isl_rs_result = unsafe { isl_vec_zero(ctx, size) };
534 let isl_rs_result = Vec { ptr: isl_rs_result,
535 should_free_on_drop: true };
536 let err = isl_rs_ctx.last_error();
537 if err != Error::None_ {
538 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
539 }
540 Ok(isl_rs_result)
541 }
542
543 pub fn zero_extend(self, size: u32) -> Result<Vec, LibISLError> {
545 let vec = self;
546 let isl_rs_ctx = vec.get_ctx();
547 let mut vec = vec;
548 vec.do_not_free_on_drop();
549 let vec = vec.ptr;
550 let isl_rs_result = unsafe { isl_vec_zero_extend(vec, size) };
551 let isl_rs_result = Vec { ptr: isl_rs_result,
552 should_free_on_drop: true };
553 let err = isl_rs_ctx.last_error();
554 if err != Error::None_ {
555 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
556 }
557 Ok(isl_rs_result)
558 }
559
560 pub fn do_not_free_on_drop(&mut self) {
562 self.should_free_on_drop = false;
563 }
564}
565
566impl Drop for Vec {
567 fn drop(&mut self) {
568 if self.should_free_on_drop {
569 unsafe {
570 isl_vec_free(self.ptr);
571 }
572 }
573 }
574}