1use super::{Context, Error, IdList, LibISLError};
5use libc::uintptr_t;
6use std::ffi::{CStr, CString};
7use std::os::raw::c_char;
8
9pub struct Id {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_id_copy(id: uintptr_t) -> uintptr_t;
18
19 fn isl_id_dump(id: uintptr_t) -> ();
20
21 fn isl_id_free(id: uintptr_t) -> uintptr_t;
22
23 fn isl_id_get_ctx(id: uintptr_t) -> uintptr_t;
24
25 fn isl_id_get_free_user(id: uintptr_t) -> ();
26
27 fn isl_id_get_hash(id: uintptr_t) -> u32;
28
29 fn isl_id_get_name(id: uintptr_t) -> *const c_char;
30
31 fn isl_id_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
32
33 fn isl_id_to_list(el: uintptr_t) -> uintptr_t;
34
35 fn isl_id_to_str(id: uintptr_t) -> *const c_char;
36
37}
38
39impl Id {
40 pub fn copy(&self) -> Result<Id, LibISLError> {
42 let id = self;
43 let isl_rs_ctx = id.get_ctx();
44 let id = id.ptr;
45 let isl_rs_result = unsafe { isl_id_copy(id) };
46 let isl_rs_result = Id { ptr: isl_rs_result,
47 should_free_on_drop: true };
48 let err = isl_rs_ctx.last_error();
49 if err != Error::None_ {
50 let err_msg = isl_rs_ctx.last_error_msg();
51 isl_rs_ctx.reset_error();
52 return Err(LibISLError::new(err, err_msg));
53 }
54 Ok(isl_rs_result)
55 }
56
57 pub fn dump(&self) -> Result<(), LibISLError> {
59 let id = self;
60 let isl_rs_ctx = id.get_ctx();
61 let id = id.ptr;
62 let isl_rs_result = unsafe { isl_id_dump(id) };
63 let err = isl_rs_ctx.last_error();
64 if err != Error::None_ {
65 let err_msg = isl_rs_ctx.last_error_msg();
66 isl_rs_ctx.reset_error();
67 return Err(LibISLError::new(err, err_msg));
68 }
69 Ok(isl_rs_result)
70 }
71
72 pub fn free(self) -> Result<Id, LibISLError> {
74 let id = self;
75 let isl_rs_ctx = id.get_ctx();
76 let mut id = id;
77 id.do_not_free_on_drop();
78 let id = id.ptr;
79 let isl_rs_result = unsafe { isl_id_free(id) };
80 let isl_rs_result = Id { ptr: isl_rs_result,
81 should_free_on_drop: true };
82 let err = isl_rs_ctx.last_error();
83 if err != Error::None_ {
84 let err_msg = isl_rs_ctx.last_error_msg();
85 isl_rs_ctx.reset_error();
86 return Err(LibISLError::new(err, err_msg));
87 }
88 Ok(isl_rs_result)
89 }
90
91 pub fn get_ctx(&self) -> Context {
93 let id = self;
94 let id = id.ptr;
95 let isl_rs_result = unsafe { isl_id_get_ctx(id) };
96 let isl_rs_result = Context { ptr: isl_rs_result,
97 should_free_on_drop: false };
98 isl_rs_result
99 }
100
101 pub fn get_free_user(&self) -> Result<(), LibISLError> {
103 let id = self;
104 let isl_rs_ctx = id.get_ctx();
105 let id = id.ptr;
106 let isl_rs_result = unsafe { isl_id_get_free_user(id) };
107 let err = isl_rs_ctx.last_error();
108 if err != Error::None_ {
109 let err_msg = isl_rs_ctx.last_error_msg();
110 isl_rs_ctx.reset_error();
111 return Err(LibISLError::new(err, err_msg));
112 }
113 Ok(isl_rs_result)
114 }
115
116 pub fn get_hash(&self) -> Result<u32, LibISLError> {
118 let id = self;
119 let isl_rs_ctx = id.get_ctx();
120 let id = id.ptr;
121 let isl_rs_result = unsafe { isl_id_get_hash(id) };
122 let err = isl_rs_ctx.last_error();
123 if err != Error::None_ {
124 let err_msg = isl_rs_ctx.last_error_msg();
125 isl_rs_ctx.reset_error();
126 return Err(LibISLError::new(err, err_msg));
127 }
128 Ok(isl_rs_result)
129 }
130
131 pub fn get_name(&self) -> Result<&str, LibISLError> {
133 let id = self;
134 let isl_rs_ctx = id.get_ctx();
135 let id = id.ptr;
136 let isl_rs_result = unsafe { isl_id_get_name(id) };
137 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
138 let isl_rs_result = isl_rs_result.to_str().unwrap();
139 let err = isl_rs_ctx.last_error();
140 if err != Error::None_ {
141 let err_msg = isl_rs_ctx.last_error_msg();
142 isl_rs_ctx.reset_error();
143 return Err(LibISLError::new(err, err_msg));
144 }
145 Ok(isl_rs_result)
146 }
147
148 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<Id, LibISLError> {
150 let isl_rs_ctx = Context { ptr: ctx.ptr,
151 should_free_on_drop: false };
152 let ctx = ctx.ptr;
153 let str_ = CString::new(str_).unwrap();
154 let str_ = str_.as_ptr();
155 let isl_rs_result = unsafe { isl_id_read_from_str(ctx, str_) };
156 let isl_rs_result = Id { ptr: isl_rs_result,
157 should_free_on_drop: true };
158 let err = isl_rs_ctx.last_error();
159 if err != Error::None_ {
160 let err_msg = isl_rs_ctx.last_error_msg();
161 isl_rs_ctx.reset_error();
162 return Err(LibISLError::new(err, err_msg));
163 }
164 Ok(isl_rs_result)
165 }
166
167 pub fn to_list(self) -> Result<IdList, LibISLError> {
169 let el = self;
170 let isl_rs_ctx = el.get_ctx();
171 let mut el = el;
172 el.do_not_free_on_drop();
173 let el = el.ptr;
174 let isl_rs_result = unsafe { isl_id_to_list(el) };
175 let isl_rs_result = IdList { ptr: isl_rs_result,
176 should_free_on_drop: true };
177 let err = isl_rs_ctx.last_error();
178 if err != Error::None_ {
179 let err_msg = isl_rs_ctx.last_error_msg();
180 isl_rs_ctx.reset_error();
181 return Err(LibISLError::new(err, err_msg));
182 }
183 Ok(isl_rs_result)
184 }
185
186 pub fn to_str(&self) -> Result<&str, LibISLError> {
188 let id = self;
189 let isl_rs_ctx = id.get_ctx();
190 let id = id.ptr;
191 let isl_rs_result = unsafe { isl_id_to_str(id) };
192 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
193 let isl_rs_result = isl_rs_result.to_str().unwrap();
194 let err = isl_rs_ctx.last_error();
195 if err != Error::None_ {
196 let err_msg = isl_rs_ctx.last_error_msg();
197 isl_rs_ctx.reset_error();
198 return Err(LibISLError::new(err, err_msg));
199 }
200 Ok(isl_rs_result)
201 }
202
203 pub fn do_not_free_on_drop(&mut self) {
205 self.should_free_on_drop = false;
206 }
207}
208
209impl Drop for Id {
210 fn drop(&mut self) {
211 if self.should_free_on_drop {
212 unsafe {
213 isl_id_free(self.ptr);
214 }
215 }
216 }
217}