1use super::{Aff, Context, Error, LibISLError};
5use libc::uintptr_t;
6use std::ffi::{CStr, CString};
7use std::os::raw::c_char;
8
9pub struct AffList {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_aff_list_add(list: uintptr_t, el: uintptr_t) -> uintptr_t;
18
19 fn isl_aff_list_alloc(ctx: uintptr_t, n: i32) -> uintptr_t;
20
21 fn isl_aff_list_clear(list: uintptr_t) -> uintptr_t;
22
23 fn isl_aff_list_concat(list1: uintptr_t, list2: uintptr_t) -> uintptr_t;
24
25 fn isl_aff_list_copy(list: uintptr_t) -> uintptr_t;
26
27 fn isl_aff_list_drop(list: uintptr_t, first: u32, n: u32) -> uintptr_t;
28
29 fn isl_aff_list_dump(list: uintptr_t) -> ();
30
31 fn isl_aff_list_free(list: uintptr_t) -> uintptr_t;
32
33 fn isl_aff_list_from_aff(el: uintptr_t) -> uintptr_t;
34
35 fn isl_aff_list_get_aff(list: uintptr_t, index: i32) -> uintptr_t;
36
37 fn isl_aff_list_get_at(list: uintptr_t, index: i32) -> uintptr_t;
38
39 fn isl_aff_list_get_ctx(list: uintptr_t) -> uintptr_t;
40
41 fn isl_aff_list_insert(list: uintptr_t, pos: u32, el: uintptr_t) -> uintptr_t;
42
43 fn isl_aff_list_n_aff(list: uintptr_t) -> i32;
44
45 fn isl_aff_list_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
46
47 fn isl_aff_list_reverse(list: uintptr_t) -> uintptr_t;
48
49 fn isl_aff_list_set_aff(list: uintptr_t, index: i32, el: uintptr_t) -> uintptr_t;
50
51 fn isl_aff_list_set_at(list: uintptr_t, index: i32, el: uintptr_t) -> uintptr_t;
52
53 fn isl_aff_list_size(list: uintptr_t) -> i32;
54
55 fn isl_aff_list_swap(list: uintptr_t, pos1: u32, pos2: u32) -> uintptr_t;
56
57 fn isl_aff_list_to_str(list: uintptr_t) -> *const c_char;
58
59}
60
61impl AffList {
62 pub fn add(self, el: Aff) -> Result<AffList, LibISLError> {
64 let list = self;
65 let isl_rs_ctx = list.get_ctx();
66 let mut list = list;
67 list.do_not_free_on_drop();
68 let list = list.ptr;
69 let mut el = el;
70 el.do_not_free_on_drop();
71 let el = el.ptr;
72 let isl_rs_result = unsafe { isl_aff_list_add(list, el) };
73 let isl_rs_result = AffList { ptr: isl_rs_result,
74 should_free_on_drop: true };
75 let err = isl_rs_ctx.last_error();
76 if err != Error::None_ {
77 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
78 }
79 Ok(isl_rs_result)
80 }
81
82 pub fn alloc(ctx: &Context, n: i32) -> Result<AffList, LibISLError> {
84 let isl_rs_ctx = Context { ptr: ctx.ptr,
85 should_free_on_drop: false };
86 let ctx = ctx.ptr;
87 let isl_rs_result = unsafe { isl_aff_list_alloc(ctx, n) };
88 let isl_rs_result = AffList { ptr: isl_rs_result,
89 should_free_on_drop: true };
90 let err = isl_rs_ctx.last_error();
91 if err != Error::None_ {
92 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
93 }
94 Ok(isl_rs_result)
95 }
96
97 pub fn clear(self) -> Result<AffList, LibISLError> {
99 let list = self;
100 let isl_rs_ctx = list.get_ctx();
101 let mut list = list;
102 list.do_not_free_on_drop();
103 let list = list.ptr;
104 let isl_rs_result = unsafe { isl_aff_list_clear(list) };
105 let isl_rs_result = AffList { ptr: isl_rs_result,
106 should_free_on_drop: true };
107 let err = isl_rs_ctx.last_error();
108 if err != Error::None_ {
109 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
110 }
111 Ok(isl_rs_result)
112 }
113
114 pub fn concat(self, list2: AffList) -> Result<AffList, LibISLError> {
116 let list1 = self;
117 let isl_rs_ctx = list1.get_ctx();
118 let mut list1 = list1;
119 list1.do_not_free_on_drop();
120 let list1 = list1.ptr;
121 let mut list2 = list2;
122 list2.do_not_free_on_drop();
123 let list2 = list2.ptr;
124 let isl_rs_result = unsafe { isl_aff_list_concat(list1, list2) };
125 let isl_rs_result = AffList { 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 copy(&self) -> Result<AffList, LibISLError> {
136 let list = self;
137 let isl_rs_ctx = list.get_ctx();
138 let list = list.ptr;
139 let isl_rs_result = unsafe { isl_aff_list_copy(list) };
140 let isl_rs_result = AffList { ptr: isl_rs_result,
141 should_free_on_drop: true };
142 let err = isl_rs_ctx.last_error();
143 if err != Error::None_ {
144 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
145 }
146 Ok(isl_rs_result)
147 }
148
149 pub fn drop(self, first: u32, n: u32) -> Result<AffList, LibISLError> {
151 let list = self;
152 let isl_rs_ctx = list.get_ctx();
153 let mut list = list;
154 list.do_not_free_on_drop();
155 let list = list.ptr;
156 let isl_rs_result = unsafe { isl_aff_list_drop(list, first, n) };
157 let isl_rs_result = AffList { ptr: isl_rs_result,
158 should_free_on_drop: true };
159 let err = isl_rs_ctx.last_error();
160 if err != Error::None_ {
161 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
162 }
163 Ok(isl_rs_result)
164 }
165
166 pub fn dump(&self) -> Result<(), LibISLError> {
168 let list = self;
169 let isl_rs_ctx = list.get_ctx();
170 let list = list.ptr;
171 let isl_rs_result = unsafe { isl_aff_list_dump(list) };
172 let err = isl_rs_ctx.last_error();
173 if err != Error::None_ {
174 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
175 }
176 Ok(isl_rs_result)
177 }
178
179 pub fn free(self) -> Result<AffList, LibISLError> {
181 let list = self;
182 let isl_rs_ctx = list.get_ctx();
183 let mut list = list;
184 list.do_not_free_on_drop();
185 let list = list.ptr;
186 let isl_rs_result = unsafe { isl_aff_list_free(list) };
187 let isl_rs_result = AffList { 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 from_aff(el: Aff) -> Result<AffList, LibISLError> {
198 let isl_rs_ctx = el.get_ctx();
199 let mut el = el;
200 el.do_not_free_on_drop();
201 let el = el.ptr;
202 let isl_rs_result = unsafe { isl_aff_list_from_aff(el) };
203 let isl_rs_result = AffList { ptr: isl_rs_result,
204 should_free_on_drop: true };
205 let err = isl_rs_ctx.last_error();
206 if err != Error::None_ {
207 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
208 }
209 Ok(isl_rs_result)
210 }
211
212 pub fn get_aff(&self, index: i32) -> Result<Aff, LibISLError> {
214 let list = self;
215 let isl_rs_ctx = list.get_ctx();
216 let list = list.ptr;
217 let isl_rs_result = unsafe { isl_aff_list_get_aff(list, index) };
218 let isl_rs_result = Aff { ptr: isl_rs_result,
219 should_free_on_drop: true };
220 let err = isl_rs_ctx.last_error();
221 if err != Error::None_ {
222 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
223 }
224 Ok(isl_rs_result)
225 }
226
227 pub fn get_at(&self, index: i32) -> Result<Aff, LibISLError> {
229 let list = self;
230 let isl_rs_ctx = list.get_ctx();
231 let list = list.ptr;
232 let isl_rs_result = unsafe { isl_aff_list_get_at(list, index) };
233 let isl_rs_result = Aff { ptr: isl_rs_result,
234 should_free_on_drop: true };
235 let err = isl_rs_ctx.last_error();
236 if err != Error::None_ {
237 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
238 }
239 Ok(isl_rs_result)
240 }
241
242 pub fn get_ctx(&self) -> Context {
244 let list = self;
245 let list = list.ptr;
246 let isl_rs_result = unsafe { isl_aff_list_get_ctx(list) };
247 let isl_rs_result = Context { ptr: isl_rs_result,
248 should_free_on_drop: false };
249 isl_rs_result
250 }
251
252 pub fn insert(self, pos: u32, el: Aff) -> Result<AffList, LibISLError> {
254 let list = self;
255 let isl_rs_ctx = list.get_ctx();
256 let mut list = list;
257 list.do_not_free_on_drop();
258 let list = list.ptr;
259 let mut el = el;
260 el.do_not_free_on_drop();
261 let el = el.ptr;
262 let isl_rs_result = unsafe { isl_aff_list_insert(list, pos, el) };
263 let isl_rs_result = AffList { ptr: isl_rs_result,
264 should_free_on_drop: true };
265 let err = isl_rs_ctx.last_error();
266 if err != Error::None_ {
267 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
268 }
269 Ok(isl_rs_result)
270 }
271
272 pub fn n_aff(&self) -> Result<i32, LibISLError> {
274 let list = self;
275 let isl_rs_ctx = list.get_ctx();
276 let list = list.ptr;
277 let isl_rs_result = unsafe { isl_aff_list_n_aff(list) };
278 let err = isl_rs_ctx.last_error();
279 if err != Error::None_ {
280 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
281 }
282 Ok(isl_rs_result)
283 }
284
285 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<AffList, LibISLError> {
287 let isl_rs_ctx = Context { ptr: ctx.ptr,
288 should_free_on_drop: false };
289 let ctx = ctx.ptr;
290 let str_ = CString::new(str_).unwrap();
291 let str_ = str_.as_ptr();
292 let isl_rs_result = unsafe { isl_aff_list_read_from_str(ctx, str_) };
293 let isl_rs_result = AffList { ptr: isl_rs_result,
294 should_free_on_drop: true };
295 let err = isl_rs_ctx.last_error();
296 if err != Error::None_ {
297 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
298 }
299 Ok(isl_rs_result)
300 }
301
302 pub fn reverse(self) -> Result<AffList, LibISLError> {
304 let list = self;
305 let isl_rs_ctx = list.get_ctx();
306 let mut list = list;
307 list.do_not_free_on_drop();
308 let list = list.ptr;
309 let isl_rs_result = unsafe { isl_aff_list_reverse(list) };
310 let isl_rs_result = AffList { ptr: isl_rs_result,
311 should_free_on_drop: true };
312 let err = isl_rs_ctx.last_error();
313 if err != Error::None_ {
314 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
315 }
316 Ok(isl_rs_result)
317 }
318
319 pub fn set_aff(self, index: i32, el: Aff) -> Result<AffList, LibISLError> {
321 let list = self;
322 let isl_rs_ctx = list.get_ctx();
323 let mut list = list;
324 list.do_not_free_on_drop();
325 let list = list.ptr;
326 let mut el = el;
327 el.do_not_free_on_drop();
328 let el = el.ptr;
329 let isl_rs_result = unsafe { isl_aff_list_set_aff(list, index, el) };
330 let isl_rs_result = AffList { ptr: isl_rs_result,
331 should_free_on_drop: true };
332 let err = isl_rs_ctx.last_error();
333 if err != Error::None_ {
334 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
335 }
336 Ok(isl_rs_result)
337 }
338
339 pub fn set_at(self, index: i32, el: Aff) -> Result<AffList, LibISLError> {
341 let list = self;
342 let isl_rs_ctx = list.get_ctx();
343 let mut list = list;
344 list.do_not_free_on_drop();
345 let list = list.ptr;
346 let mut el = el;
347 el.do_not_free_on_drop();
348 let el = el.ptr;
349 let isl_rs_result = unsafe { isl_aff_list_set_at(list, index, el) };
350 let isl_rs_result = AffList { ptr: isl_rs_result,
351 should_free_on_drop: true };
352 let err = isl_rs_ctx.last_error();
353 if err != Error::None_ {
354 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
355 }
356 Ok(isl_rs_result)
357 }
358
359 pub fn size(&self) -> Result<i32, LibISLError> {
361 let list = self;
362 let isl_rs_ctx = list.get_ctx();
363 let list = list.ptr;
364 let isl_rs_result = unsafe { isl_aff_list_size(list) };
365 let err = isl_rs_ctx.last_error();
366 if err != Error::None_ {
367 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
368 }
369 Ok(isl_rs_result)
370 }
371
372 pub fn swap(self, pos1: u32, pos2: u32) -> Result<AffList, LibISLError> {
374 let list = self;
375 let isl_rs_ctx = list.get_ctx();
376 let mut list = list;
377 list.do_not_free_on_drop();
378 let list = list.ptr;
379 let isl_rs_result = unsafe { isl_aff_list_swap(list, pos1, pos2) };
380 let isl_rs_result = AffList { ptr: isl_rs_result,
381 should_free_on_drop: true };
382 let err = isl_rs_ctx.last_error();
383 if err != Error::None_ {
384 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
385 }
386 Ok(isl_rs_result)
387 }
388
389 pub fn to_str(&self) -> Result<&str, LibISLError> {
391 let list = self;
392 let isl_rs_ctx = list.get_ctx();
393 let list = list.ptr;
394 let isl_rs_result = unsafe { isl_aff_list_to_str(list) };
395 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
396 let isl_rs_result = isl_rs_result.to_str().unwrap();
397 let err = isl_rs_ctx.last_error();
398 if err != Error::None_ {
399 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
400 }
401 Ok(isl_rs_result)
402 }
403
404 pub fn do_not_free_on_drop(&mut self) {
407 self.should_free_on_drop = false;
408 }
409}
410
411impl Drop for AffList {
412 fn drop(&mut self) {
413 if self.should_free_on_drop {
414 unsafe {
415 isl_aff_list_free(self.ptr);
416 }
417 }
418 }
419}