isl_rs/bindings/
id_to_ast_expr.rs1use super::{ASTExpr, Context, Error, Id, LibISLError};
5use libc::uintptr_t;
6use std::ffi::{CStr, CString};
7use std::os::raw::c_char;
8
9pub struct IdToASTExpr {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_id_to_ast_expr_alloc(ctx: uintptr_t, min_size: i32) -> uintptr_t;
18
19 fn isl_id_to_ast_expr_copy(hmap: uintptr_t) -> uintptr_t;
20
21 fn isl_id_to_ast_expr_drop(hmap: uintptr_t, key: uintptr_t) -> uintptr_t;
22
23 fn isl_id_to_ast_expr_dump(hmap: uintptr_t) -> ();
24
25 fn isl_id_to_ast_expr_free(hmap: uintptr_t) -> uintptr_t;
26
27 fn isl_id_to_ast_expr_get(hmap: uintptr_t, key: uintptr_t) -> uintptr_t;
28
29 fn isl_id_to_ast_expr_get_ctx(hmap: uintptr_t) -> uintptr_t;
30
31 fn isl_id_to_ast_expr_has(hmap: uintptr_t, key: uintptr_t) -> i32;
32
33 fn isl_id_to_ast_expr_is_equal(hmap1: uintptr_t, hmap2: uintptr_t) -> i32;
34
35 fn isl_id_to_ast_expr_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
36
37 fn isl_id_to_ast_expr_set(hmap: uintptr_t, key: uintptr_t, val: uintptr_t) -> uintptr_t;
38
39 fn isl_id_to_ast_expr_to_str(hmap: uintptr_t) -> *const c_char;
40
41}
42
43impl IdToASTExpr {
44 pub fn alloc(ctx: &Context, min_size: i32) -> Result<IdToASTExpr, LibISLError> {
46 let isl_rs_ctx = Context { ptr: ctx.ptr,
47 should_free_on_drop: false };
48 let ctx = ctx.ptr;
49 let isl_rs_result = unsafe { isl_id_to_ast_expr_alloc(ctx, min_size) };
50 let isl_rs_result = IdToASTExpr { ptr: isl_rs_result,
51 should_free_on_drop: true };
52 let err = isl_rs_ctx.last_error();
53 if err != Error::None_ {
54 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
55 }
56 Ok(isl_rs_result)
57 }
58
59 pub fn copy(&self) -> Result<IdToASTExpr, LibISLError> {
61 let hmap = self;
62 let isl_rs_ctx = hmap.get_ctx();
63 let hmap = hmap.ptr;
64 let isl_rs_result = unsafe { isl_id_to_ast_expr_copy(hmap) };
65 let isl_rs_result = IdToASTExpr { ptr: isl_rs_result,
66 should_free_on_drop: true };
67 let err = isl_rs_ctx.last_error();
68 if err != Error::None_ {
69 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
70 }
71 Ok(isl_rs_result)
72 }
73
74 pub fn drop(self, key: Id) -> Result<IdToASTExpr, LibISLError> {
76 let hmap = self;
77 let isl_rs_ctx = hmap.get_ctx();
78 let mut hmap = hmap;
79 hmap.do_not_free_on_drop();
80 let hmap = hmap.ptr;
81 let mut key = key;
82 key.do_not_free_on_drop();
83 let key = key.ptr;
84 let isl_rs_result = unsafe { isl_id_to_ast_expr_drop(hmap, key) };
85 let isl_rs_result = IdToASTExpr { ptr: isl_rs_result,
86 should_free_on_drop: true };
87 let err = isl_rs_ctx.last_error();
88 if err != Error::None_ {
89 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
90 }
91 Ok(isl_rs_result)
92 }
93
94 pub fn dump(&self) -> Result<(), LibISLError> {
96 let hmap = self;
97 let isl_rs_ctx = hmap.get_ctx();
98 let hmap = hmap.ptr;
99 let isl_rs_result = unsafe { isl_id_to_ast_expr_dump(hmap) };
100 let err = isl_rs_ctx.last_error();
101 if err != Error::None_ {
102 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
103 }
104 Ok(isl_rs_result)
105 }
106
107 pub fn free(self) -> Result<IdToASTExpr, LibISLError> {
109 let hmap = self;
110 let isl_rs_ctx = hmap.get_ctx();
111 let mut hmap = hmap;
112 hmap.do_not_free_on_drop();
113 let hmap = hmap.ptr;
114 let isl_rs_result = unsafe { isl_id_to_ast_expr_free(hmap) };
115 let isl_rs_result = IdToASTExpr { ptr: isl_rs_result,
116 should_free_on_drop: true };
117 let err = isl_rs_ctx.last_error();
118 if err != Error::None_ {
119 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
120 }
121 Ok(isl_rs_result)
122 }
123
124 pub fn get(&self, key: Id) -> Result<ASTExpr, LibISLError> {
126 let hmap = self;
127 let isl_rs_ctx = hmap.get_ctx();
128 let hmap = hmap.ptr;
129 let mut key = key;
130 key.do_not_free_on_drop();
131 let key = key.ptr;
132 let isl_rs_result = unsafe { isl_id_to_ast_expr_get(hmap, key) };
133 let isl_rs_result = ASTExpr { ptr: isl_rs_result,
134 should_free_on_drop: true };
135 let err = isl_rs_ctx.last_error();
136 if err != Error::None_ {
137 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
138 }
139 Ok(isl_rs_result)
140 }
141
142 pub fn get_ctx(&self) -> Context {
144 let hmap = self;
145 let hmap = hmap.ptr;
146 let isl_rs_result = unsafe { isl_id_to_ast_expr_get_ctx(hmap) };
147 let isl_rs_result = Context { ptr: isl_rs_result,
148 should_free_on_drop: false };
149 isl_rs_result
150 }
151
152 pub fn has(&self, key: &Id) -> Result<bool, LibISLError> {
154 let hmap = self;
155 let isl_rs_ctx = hmap.get_ctx();
156 let hmap = hmap.ptr;
157 let key = key.ptr;
158 let isl_rs_result = unsafe { isl_id_to_ast_expr_has(hmap, key) };
159 let isl_rs_result = match isl_rs_result {
160 0 => false,
161 1 => true,
162 _ => panic!("Got isl_bool = -1"),
163 };
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 is_equal(&self, hmap2: &IdToASTExpr) -> Result<bool, LibISLError> {
173 let hmap1 = self;
174 let isl_rs_ctx = hmap1.get_ctx();
175 let hmap1 = hmap1.ptr;
176 let hmap2 = hmap2.ptr;
177 let isl_rs_result = unsafe { isl_id_to_ast_expr_is_equal(hmap1, hmap2) };
178 let isl_rs_result = match isl_rs_result {
179 0 => false,
180 1 => true,
181 _ => panic!("Got isl_bool = -1"),
182 };
183 let err = isl_rs_ctx.last_error();
184 if err != Error::None_ {
185 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
186 }
187 Ok(isl_rs_result)
188 }
189
190 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<IdToASTExpr, LibISLError> {
192 let isl_rs_ctx = Context { ptr: ctx.ptr,
193 should_free_on_drop: false };
194 let ctx = ctx.ptr;
195 let str_ = CString::new(str_).unwrap();
196 let str_ = str_.as_ptr();
197 let isl_rs_result = unsafe { isl_id_to_ast_expr_read_from_str(ctx, str_) };
198 let isl_rs_result = IdToASTExpr { ptr: isl_rs_result,
199 should_free_on_drop: true };
200 let err = isl_rs_ctx.last_error();
201 if err != Error::None_ {
202 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
203 }
204 Ok(isl_rs_result)
205 }
206
207 pub fn set(self, key: Id, val: ASTExpr) -> Result<IdToASTExpr, LibISLError> {
209 let hmap = self;
210 let isl_rs_ctx = hmap.get_ctx();
211 let mut hmap = hmap;
212 hmap.do_not_free_on_drop();
213 let hmap = hmap.ptr;
214 let mut key = key;
215 key.do_not_free_on_drop();
216 let key = key.ptr;
217 let mut val = val;
218 val.do_not_free_on_drop();
219 let val = val.ptr;
220 let isl_rs_result = unsafe { isl_id_to_ast_expr_set(hmap, key, val) };
221 let isl_rs_result = IdToASTExpr { ptr: isl_rs_result,
222 should_free_on_drop: true };
223 let err = isl_rs_ctx.last_error();
224 if err != Error::None_ {
225 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
226 }
227 Ok(isl_rs_result)
228 }
229
230 pub fn to_str(&self) -> Result<&str, LibISLError> {
232 let hmap = self;
233 let isl_rs_ctx = hmap.get_ctx();
234 let hmap = hmap.ptr;
235 let isl_rs_result = unsafe { isl_id_to_ast_expr_to_str(hmap) };
236 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
237 let isl_rs_result = isl_rs_result.to_str().unwrap();
238 let err = isl_rs_ctx.last_error();
239 if err != Error::None_ {
240 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
241 }
242 Ok(isl_rs_result)
243 }
244
245 pub fn do_not_free_on_drop(&mut self) {
248 self.should_free_on_drop = false;
249 }
250}
251
252impl Drop for IdToASTExpr {
253 fn drop(&mut self) {
254 if self.should_free_on_drop {
255 unsafe {
256 isl_id_to_ast_expr_free(self.ptr);
257 }
258 }
259 }
260}