1use super::{Context, DimType, Error, LibISLError, MultiVal, Set, Space, Val};
5use libc::uintptr_t;
6use std::ffi::CStr;
7use std::os::raw::c_char;
8
9pub struct Point {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_point_add_ui(pnt: uintptr_t, type_: i32, pos: i32, val: u32) -> uintptr_t;
18
19 fn isl_point_copy(pnt: uintptr_t) -> uintptr_t;
20
21 fn isl_point_dump(pnt: uintptr_t) -> ();
22
23 fn isl_point_free(pnt: uintptr_t) -> uintptr_t;
24
25 fn isl_point_get_coordinate_val(pnt: uintptr_t, type_: i32, pos: i32) -> uintptr_t;
26
27 fn isl_point_get_ctx(pnt: uintptr_t) -> uintptr_t;
28
29 fn isl_point_get_multi_val(pnt: uintptr_t) -> uintptr_t;
30
31 fn isl_point_get_space(pnt: uintptr_t) -> uintptr_t;
32
33 fn isl_point_is_void(pnt: uintptr_t) -> i32;
34
35 fn isl_point_set_coordinate_val(pnt: uintptr_t, type_: i32, pos: i32, v: uintptr_t)
36 -> uintptr_t;
37
38 fn isl_point_sub_ui(pnt: uintptr_t, type_: i32, pos: i32, val: u32) -> uintptr_t;
39
40 fn isl_point_to_set(pnt: uintptr_t) -> uintptr_t;
41
42 fn isl_point_to_str(pnt: uintptr_t) -> *const c_char;
43
44 fn isl_point_void(space: uintptr_t) -> uintptr_t;
45
46 fn isl_point_zero(space: uintptr_t) -> uintptr_t;
47
48}
49
50impl Point {
51 pub fn add_ui(self, type_: DimType, pos: i32, val: u32) -> Result<Point, LibISLError> {
53 let pnt = self;
54 let isl_rs_ctx = pnt.get_ctx();
55 let mut pnt = pnt;
56 pnt.do_not_free_on_drop();
57 let pnt = pnt.ptr;
58 let type_ = type_.to_i32();
59 let isl_rs_result = unsafe { isl_point_add_ui(pnt, type_, pos, val) };
60 let isl_rs_result = Point { ptr: isl_rs_result,
61 should_free_on_drop: true };
62 let err = isl_rs_ctx.last_error();
63 if err != Error::None_ {
64 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
65 }
66 Ok(isl_rs_result)
67 }
68
69 pub fn copy(&self) -> Result<Point, LibISLError> {
71 let pnt = self;
72 let isl_rs_ctx = pnt.get_ctx();
73 let pnt = pnt.ptr;
74 let isl_rs_result = unsafe { isl_point_copy(pnt) };
75 let isl_rs_result = Point { ptr: isl_rs_result,
76 should_free_on_drop: true };
77 let err = isl_rs_ctx.last_error();
78 if err != Error::None_ {
79 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
80 }
81 Ok(isl_rs_result)
82 }
83
84 pub fn dump(&self) -> Result<(), LibISLError> {
86 let pnt = self;
87 let isl_rs_ctx = pnt.get_ctx();
88 let pnt = pnt.ptr;
89 let isl_rs_result = unsafe { isl_point_dump(pnt) };
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 free(self) -> Result<Point, LibISLError> {
99 let pnt = self;
100 let isl_rs_ctx = pnt.get_ctx();
101 let mut pnt = pnt;
102 pnt.do_not_free_on_drop();
103 let pnt = pnt.ptr;
104 let isl_rs_result = unsafe { isl_point_free(pnt) };
105 let isl_rs_result = Point { 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 get_coordinate_val(&self, type_: DimType, pos: i32) -> Result<Val, LibISLError> {
116 let pnt = self;
117 let isl_rs_ctx = pnt.get_ctx();
118 let pnt = pnt.ptr;
119 let type_ = type_.to_i32();
120 let isl_rs_result = unsafe { isl_point_get_coordinate_val(pnt, type_, pos) };
121 let isl_rs_result = Val { ptr: isl_rs_result,
122 should_free_on_drop: true };
123 let err = isl_rs_ctx.last_error();
124 if err != Error::None_ {
125 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
126 }
127 Ok(isl_rs_result)
128 }
129
130 pub fn get_ctx(&self) -> Context {
132 let pnt = self;
133 let pnt = pnt.ptr;
134 let isl_rs_result = unsafe { isl_point_get_ctx(pnt) };
135 let isl_rs_result = Context { ptr: isl_rs_result,
136 should_free_on_drop: false };
137 isl_rs_result
138 }
139
140 pub fn get_multi_val(&self) -> Result<MultiVal, LibISLError> {
142 let pnt = self;
143 let isl_rs_ctx = pnt.get_ctx();
144 let pnt = pnt.ptr;
145 let isl_rs_result = unsafe { isl_point_get_multi_val(pnt) };
146 let isl_rs_result = MultiVal { ptr: isl_rs_result,
147 should_free_on_drop: true };
148 let err = isl_rs_ctx.last_error();
149 if err != Error::None_ {
150 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
151 }
152 Ok(isl_rs_result)
153 }
154
155 pub fn get_space(&self) -> Result<Space, LibISLError> {
157 let pnt = self;
158 let isl_rs_ctx = pnt.get_ctx();
159 let pnt = pnt.ptr;
160 let isl_rs_result = unsafe { isl_point_get_space(pnt) };
161 let isl_rs_result = Space { ptr: isl_rs_result,
162 should_free_on_drop: true };
163 let err = isl_rs_ctx.last_error();
164 if err != Error::None_ {
165 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
166 }
167 Ok(isl_rs_result)
168 }
169
170 pub fn is_void(&self) -> Result<bool, LibISLError> {
172 let pnt = self;
173 let isl_rs_ctx = pnt.get_ctx();
174 let pnt = pnt.ptr;
175 let isl_rs_result = unsafe { isl_point_is_void(pnt) };
176 let isl_rs_result = match isl_rs_result {
177 0 => false,
178 1 => true,
179 _ => panic!("Got isl_bool = -1"),
180 };
181 let err = isl_rs_ctx.last_error();
182 if err != Error::None_ {
183 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
184 }
185 Ok(isl_rs_result)
186 }
187
188 pub fn set_coordinate_val(self, type_: DimType, pos: i32, v: Val)
190 -> Result<Point, LibISLError> {
191 let pnt = self;
192 let isl_rs_ctx = pnt.get_ctx();
193 let mut pnt = pnt;
194 pnt.do_not_free_on_drop();
195 let pnt = pnt.ptr;
196 let type_ = type_.to_i32();
197 let mut v = v;
198 v.do_not_free_on_drop();
199 let v = v.ptr;
200 let isl_rs_result = unsafe { isl_point_set_coordinate_val(pnt, type_, pos, v) };
201 let isl_rs_result = Point { ptr: isl_rs_result,
202 should_free_on_drop: true };
203 let err = isl_rs_ctx.last_error();
204 if err != Error::None_ {
205 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
206 }
207 Ok(isl_rs_result)
208 }
209
210 pub fn sub_ui(self, type_: DimType, pos: i32, val: u32) -> Result<Point, LibISLError> {
212 let pnt = self;
213 let isl_rs_ctx = pnt.get_ctx();
214 let mut pnt = pnt;
215 pnt.do_not_free_on_drop();
216 let pnt = pnt.ptr;
217 let type_ = type_.to_i32();
218 let isl_rs_result = unsafe { isl_point_sub_ui(pnt, type_, pos, val) };
219 let isl_rs_result = Point { 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 to_set(self) -> Result<Set, LibISLError> {
230 let pnt = self;
231 let isl_rs_ctx = pnt.get_ctx();
232 let mut pnt = pnt;
233 pnt.do_not_free_on_drop();
234 let pnt = pnt.ptr;
235 let isl_rs_result = unsafe { isl_point_to_set(pnt) };
236 let isl_rs_result = Set { ptr: isl_rs_result,
237 should_free_on_drop: true };
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 to_str(&self) -> Result<&str, LibISLError> {
247 let pnt = self;
248 let isl_rs_ctx = pnt.get_ctx();
249 let pnt = pnt.ptr;
250 let isl_rs_result = unsafe { isl_point_to_str(pnt) };
251 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
252 let isl_rs_result = isl_rs_result.to_str().unwrap();
253 let err = isl_rs_ctx.last_error();
254 if err != Error::None_ {
255 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
256 }
257 Ok(isl_rs_result)
258 }
259
260 pub fn void(space: Space) -> Result<Point, LibISLError> {
262 let isl_rs_ctx = space.get_ctx();
263 let mut space = space;
264 space.do_not_free_on_drop();
265 let space = space.ptr;
266 let isl_rs_result = unsafe { isl_point_void(space) };
267 let isl_rs_result = Point { ptr: isl_rs_result,
268 should_free_on_drop: true };
269 let err = isl_rs_ctx.last_error();
270 if err != Error::None_ {
271 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
272 }
273 Ok(isl_rs_result)
274 }
275
276 pub fn zero(space: Space) -> Result<Point, LibISLError> {
278 let isl_rs_ctx = space.get_ctx();
279 let mut space = space;
280 space.do_not_free_on_drop();
281 let space = space.ptr;
282 let isl_rs_result = unsafe { isl_point_zero(space) };
283 let isl_rs_result = Point { ptr: isl_rs_result,
284 should_free_on_drop: true };
285 let err = isl_rs_ctx.last_error();
286 if err != Error::None_ {
287 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
288 }
289 Ok(isl_rs_result)
290 }
291
292 pub fn do_not_free_on_drop(&mut self) {
295 self.should_free_on_drop = false;
296 }
297}
298
299impl Drop for Point {
300 fn drop(&mut self) {
301 if self.should_free_on_drop {
302 unsafe {
303 isl_point_free(self.ptr);
304 }
305 }
306 }
307}