1use crate::bindings::{Context, 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_alloc(ctx: uintptr_t, size: u32) -> uintptr_t;
16
17 fn isl_vec_zero(ctx: uintptr_t, size: u32) -> uintptr_t;
18
19 fn isl_vec_copy(vec: uintptr_t) -> uintptr_t;
20
21 fn isl_vec_free(vec: uintptr_t) -> uintptr_t;
22
23 fn isl_vec_get_ctx(vec: uintptr_t) -> uintptr_t;
24
25 fn isl_vec_size(vec: uintptr_t) -> i32;
26
27 fn isl_vec_get_element_val(vec: uintptr_t, pos: i32) -> uintptr_t;
28
29 fn isl_vec_set_element_si(vec: uintptr_t, pos: i32, v: i32) -> uintptr_t;
30
31 fn isl_vec_set_element_val(vec: uintptr_t, pos: i32, v: uintptr_t) -> uintptr_t;
32
33 fn isl_vec_is_equal(vec1: uintptr_t, vec2: uintptr_t) -> i32;
34
35 fn isl_vec_cmp_element(vec1: uintptr_t, vec2: uintptr_t, pos: i32) -> i32;
36
37 fn isl_vec_dump(vec: uintptr_t);
38
39 fn isl_vec_ceil(vec: uintptr_t) -> uintptr_t;
40
41 fn isl_vec_normalize(vec: uintptr_t) -> uintptr_t;
42
43 fn isl_vec_set_si(vec: uintptr_t, v: i32) -> uintptr_t;
44
45 fn isl_vec_set_val(vec: uintptr_t, v: uintptr_t) -> uintptr_t;
46
47 fn isl_vec_clr(vec: uintptr_t) -> uintptr_t;
48
49 fn isl_vec_neg(vec: uintptr_t) -> uintptr_t;
50
51 fn isl_vec_add(vec1: uintptr_t, vec2: uintptr_t) -> uintptr_t;
52
53 fn isl_vec_extend(vec: uintptr_t, size: u32) -> uintptr_t;
54
55 fn isl_vec_zero_extend(vec: uintptr_t, size: u32) -> uintptr_t;
56
57 fn isl_vec_concat(vec1: uintptr_t, vec2: uintptr_t) -> uintptr_t;
58
59 fn isl_vec_sort(vec: uintptr_t) -> uintptr_t;
60
61 fn isl_vec_drop_els(vec: uintptr_t, pos: u32, n: u32) -> uintptr_t;
62
63 fn isl_vec_add_els(vec: uintptr_t, n: u32) -> uintptr_t;
64
65 fn isl_vec_insert_els(vec: uintptr_t, pos: u32, n: u32) -> uintptr_t;
66
67 fn isl_vec_insert_zero_els(vec: uintptr_t, pos: u32, n: u32) -> uintptr_t;
68
69 fn isl_vec_move_els(vec: uintptr_t, dst_col: u32, src_col: u32, n: u32) -> uintptr_t;
70
71}
72
73impl Vec {
74 pub fn alloc(ctx: &Context, size: u32) -> Vec {
76 let ctx = ctx.ptr;
77 let isl_rs_result = unsafe { isl_vec_alloc(ctx, size) };
78 let isl_rs_result = Vec { ptr: isl_rs_result,
79 should_free_on_drop: true };
80 isl_rs_result
81 }
82
83 pub fn zero(ctx: &Context, size: u32) -> Vec {
85 let ctx = ctx.ptr;
86 let isl_rs_result = unsafe { isl_vec_zero(ctx, size) };
87 let isl_rs_result = Vec { ptr: isl_rs_result,
88 should_free_on_drop: true };
89 isl_rs_result
90 }
91
92 pub fn copy(&self) -> Vec {
94 let vec = self;
95 let vec = vec.ptr;
96 let isl_rs_result = unsafe { isl_vec_copy(vec) };
97 let isl_rs_result = Vec { ptr: isl_rs_result,
98 should_free_on_drop: true };
99 isl_rs_result
100 }
101
102 pub fn free(self) -> Vec {
104 let vec = self;
105 let mut vec = vec;
106 vec.do_not_free_on_drop();
107 let vec = vec.ptr;
108 let isl_rs_result = unsafe { isl_vec_free(vec) };
109 let isl_rs_result = Vec { ptr: isl_rs_result,
110 should_free_on_drop: true };
111 isl_rs_result
112 }
113
114 pub fn get_ctx(&self) -> Context {
116 let vec = self;
117 let vec = vec.ptr;
118 let isl_rs_result = unsafe { isl_vec_get_ctx(vec) };
119 let isl_rs_result = Context { ptr: isl_rs_result,
120 should_free_on_drop: true };
121 let mut isl_rs_result = isl_rs_result;
122 isl_rs_result.do_not_free_on_drop();
123 isl_rs_result
124 }
125
126 pub fn size(&self) -> i32 {
128 let vec = self;
129 let vec = vec.ptr;
130 let isl_rs_result = unsafe { isl_vec_size(vec) };
131 isl_rs_result
132 }
133
134 pub fn get_element_val(&self, pos: i32) -> Val {
136 let vec = self;
137 let vec = vec.ptr;
138 let isl_rs_result = unsafe { isl_vec_get_element_val(vec, pos) };
139 let isl_rs_result = Val { ptr: isl_rs_result,
140 should_free_on_drop: true };
141 isl_rs_result
142 }
143
144 pub fn set_element_si(self, pos: i32, v: i32) -> Vec {
146 let vec = self;
147 let mut vec = vec;
148 vec.do_not_free_on_drop();
149 let vec = vec.ptr;
150 let isl_rs_result = unsafe { isl_vec_set_element_si(vec, pos, v) };
151 let isl_rs_result = Vec { ptr: isl_rs_result,
152 should_free_on_drop: true };
153 isl_rs_result
154 }
155
156 pub fn set_element_val(self, pos: i32, v: Val) -> Vec {
158 let vec = self;
159 let mut vec = vec;
160 vec.do_not_free_on_drop();
161 let vec = vec.ptr;
162 let mut v = v;
163 v.do_not_free_on_drop();
164 let v = v.ptr;
165 let isl_rs_result = unsafe { isl_vec_set_element_val(vec, pos, v) };
166 let isl_rs_result = Vec { ptr: isl_rs_result,
167 should_free_on_drop: true };
168 isl_rs_result
169 }
170
171 pub fn is_equal(&self, vec2: &Vec) -> bool {
173 let vec1 = self;
174 let vec1 = vec1.ptr;
175 let vec2 = vec2.ptr;
176 let isl_rs_result = unsafe { isl_vec_is_equal(vec1, vec2) };
177 let isl_rs_result = match isl_rs_result {
178 0 => false,
179 1 => true,
180 _ => panic!("Got isl_bool = -1"),
181 };
182 isl_rs_result
183 }
184
185 pub fn cmp_element(&self, vec2: &Vec, pos: i32) -> i32 {
187 let vec1 = self;
188 let vec1 = vec1.ptr;
189 let vec2 = vec2.ptr;
190 let isl_rs_result = unsafe { isl_vec_cmp_element(vec1, vec2, pos) };
191 isl_rs_result
192 }
193
194 pub fn dump(&self) {
196 let vec = self;
197 let vec = vec.ptr;
198 let isl_rs_result = unsafe { isl_vec_dump(vec) };
199 isl_rs_result
200 }
201
202 pub fn ceil(self) -> Vec {
204 let vec = self;
205 let mut vec = vec;
206 vec.do_not_free_on_drop();
207 let vec = vec.ptr;
208 let isl_rs_result = unsafe { isl_vec_ceil(vec) };
209 let isl_rs_result = Vec { ptr: isl_rs_result,
210 should_free_on_drop: true };
211 isl_rs_result
212 }
213
214 pub fn normalize(self) -> Vec {
216 let vec = self;
217 let mut vec = vec;
218 vec.do_not_free_on_drop();
219 let vec = vec.ptr;
220 let isl_rs_result = unsafe { isl_vec_normalize(vec) };
221 let isl_rs_result = Vec { ptr: isl_rs_result,
222 should_free_on_drop: true };
223 isl_rs_result
224 }
225
226 pub fn set_si(self, v: i32) -> Vec {
228 let vec = self;
229 let mut vec = vec;
230 vec.do_not_free_on_drop();
231 let vec = vec.ptr;
232 let isl_rs_result = unsafe { isl_vec_set_si(vec, v) };
233 let isl_rs_result = Vec { ptr: isl_rs_result,
234 should_free_on_drop: true };
235 isl_rs_result
236 }
237
238 pub fn set_val(self, v: Val) -> Vec {
240 let vec = self;
241 let mut vec = vec;
242 vec.do_not_free_on_drop();
243 let vec = vec.ptr;
244 let mut v = v;
245 v.do_not_free_on_drop();
246 let v = v.ptr;
247 let isl_rs_result = unsafe { isl_vec_set_val(vec, v) };
248 let isl_rs_result = Vec { ptr: isl_rs_result,
249 should_free_on_drop: true };
250 isl_rs_result
251 }
252
253 pub fn clr(self) -> Vec {
255 let vec = self;
256 let mut vec = vec;
257 vec.do_not_free_on_drop();
258 let vec = vec.ptr;
259 let isl_rs_result = unsafe { isl_vec_clr(vec) };
260 let isl_rs_result = Vec { ptr: isl_rs_result,
261 should_free_on_drop: true };
262 isl_rs_result
263 }
264
265 pub fn neg(self) -> Vec {
267 let vec = self;
268 let mut vec = vec;
269 vec.do_not_free_on_drop();
270 let vec = vec.ptr;
271 let isl_rs_result = unsafe { isl_vec_neg(vec) };
272 let isl_rs_result = Vec { ptr: isl_rs_result,
273 should_free_on_drop: true };
274 isl_rs_result
275 }
276
277 pub fn add(self, vec2: Vec) -> Vec {
279 let vec1 = self;
280 let mut vec1 = vec1;
281 vec1.do_not_free_on_drop();
282 let vec1 = vec1.ptr;
283 let mut vec2 = vec2;
284 vec2.do_not_free_on_drop();
285 let vec2 = vec2.ptr;
286 let isl_rs_result = unsafe { isl_vec_add(vec1, vec2) };
287 let isl_rs_result = Vec { ptr: isl_rs_result,
288 should_free_on_drop: true };
289 isl_rs_result
290 }
291
292 pub fn extend(self, size: u32) -> Vec {
294 let vec = self;
295 let mut vec = vec;
296 vec.do_not_free_on_drop();
297 let vec = vec.ptr;
298 let isl_rs_result = unsafe { isl_vec_extend(vec, size) };
299 let isl_rs_result = Vec { ptr: isl_rs_result,
300 should_free_on_drop: true };
301 isl_rs_result
302 }
303
304 pub fn zero_extend(self, size: u32) -> Vec {
306 let vec = self;
307 let mut vec = vec;
308 vec.do_not_free_on_drop();
309 let vec = vec.ptr;
310 let isl_rs_result = unsafe { isl_vec_zero_extend(vec, size) };
311 let isl_rs_result = Vec { ptr: isl_rs_result,
312 should_free_on_drop: true };
313 isl_rs_result
314 }
315
316 pub fn concat(self, vec2: Vec) -> Vec {
318 let vec1 = self;
319 let mut vec1 = vec1;
320 vec1.do_not_free_on_drop();
321 let vec1 = vec1.ptr;
322 let mut vec2 = vec2;
323 vec2.do_not_free_on_drop();
324 let vec2 = vec2.ptr;
325 let isl_rs_result = unsafe { isl_vec_concat(vec1, vec2) };
326 let isl_rs_result = Vec { ptr: isl_rs_result,
327 should_free_on_drop: true };
328 isl_rs_result
329 }
330
331 pub fn sort(self) -> Vec {
333 let vec = self;
334 let mut vec = vec;
335 vec.do_not_free_on_drop();
336 let vec = vec.ptr;
337 let isl_rs_result = unsafe { isl_vec_sort(vec) };
338 let isl_rs_result = Vec { ptr: isl_rs_result,
339 should_free_on_drop: true };
340 isl_rs_result
341 }
342
343 pub fn drop_els(self, pos: u32, n: u32) -> Vec {
345 let vec = self;
346 let mut vec = vec;
347 vec.do_not_free_on_drop();
348 let vec = vec.ptr;
349 let isl_rs_result = unsafe { isl_vec_drop_els(vec, pos, n) };
350 let isl_rs_result = Vec { ptr: isl_rs_result,
351 should_free_on_drop: true };
352 isl_rs_result
353 }
354
355 pub fn add_els(self, n: u32) -> Vec {
357 let vec = self;
358 let mut vec = vec;
359 vec.do_not_free_on_drop();
360 let vec = vec.ptr;
361 let isl_rs_result = unsafe { isl_vec_add_els(vec, n) };
362 let isl_rs_result = Vec { ptr: isl_rs_result,
363 should_free_on_drop: true };
364 isl_rs_result
365 }
366
367 pub fn insert_els(self, pos: u32, n: u32) -> Vec {
369 let vec = self;
370 let mut vec = vec;
371 vec.do_not_free_on_drop();
372 let vec = vec.ptr;
373 let isl_rs_result = unsafe { isl_vec_insert_els(vec, pos, n) };
374 let isl_rs_result = Vec { ptr: isl_rs_result,
375 should_free_on_drop: true };
376 isl_rs_result
377 }
378
379 pub fn insert_zero_els(self, pos: u32, n: u32) -> Vec {
381 let vec = self;
382 let mut vec = vec;
383 vec.do_not_free_on_drop();
384 let vec = vec.ptr;
385 let isl_rs_result = unsafe { isl_vec_insert_zero_els(vec, pos, n) };
386 let isl_rs_result = Vec { ptr: isl_rs_result,
387 should_free_on_drop: true };
388 isl_rs_result
389 }
390
391 pub fn move_els(self, dst_col: u32, src_col: u32, n: u32) -> Vec {
393 let vec = self;
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_move_els(vec, dst_col, src_col, n) };
398 let isl_rs_result = Vec { ptr: isl_rs_result,
399 should_free_on_drop: true };
400 isl_rs_result
401 }
402
403 pub fn do_not_free_on_drop(&mut self) {
405 self.should_free_on_drop = false;
406 }
407}
408
409impl Drop for Vec {
410 fn drop(&mut self) {
411 if self.should_free_on_drop {
412 unsafe {
413 isl_vec_free(self.ptr);
414 }
415 }
416 }
417}