isl_rs/bindings/
union_access_info.rs1use super::{Context, Error, LibISLError, Schedule, UnionFlow, UnionMap};
5use libc::uintptr_t;
6use std::ffi::CStr;
7use std::os::raw::c_char;
8
9pub struct UnionAccessInfo {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_union_access_info_compute_flow(access: uintptr_t) -> uintptr_t;
18
19 fn isl_union_access_info_copy(access: uintptr_t) -> uintptr_t;
20
21 fn isl_union_access_info_free(access: uintptr_t) -> uintptr_t;
22
23 fn isl_union_access_info_from_sink(sink: uintptr_t) -> uintptr_t;
24
25 fn isl_union_access_info_get_ctx(access: uintptr_t) -> uintptr_t;
26
27 fn isl_union_access_info_set_kill(access: uintptr_t, kill: uintptr_t) -> uintptr_t;
28
29 fn isl_union_access_info_set_may_source(access: uintptr_t, may_source: uintptr_t) -> uintptr_t;
30
31 fn isl_union_access_info_set_must_source(access: uintptr_t, must_source: uintptr_t)
32 -> uintptr_t;
33
34 fn isl_union_access_info_set_schedule(access: uintptr_t, schedule: uintptr_t) -> uintptr_t;
35
36 fn isl_union_access_info_set_schedule_map(access: uintptr_t, schedule_map: uintptr_t)
37 -> uintptr_t;
38
39 fn isl_union_access_info_to_str(access: uintptr_t) -> *const c_char;
40
41}
42
43impl UnionAccessInfo {
44 pub fn compute_flow(self) -> Result<UnionFlow, LibISLError> {
46 let access = self;
47 let isl_rs_ctx = access.get_ctx();
48 let mut access = access;
49 access.do_not_free_on_drop();
50 let access = access.ptr;
51 let isl_rs_result = unsafe { isl_union_access_info_compute_flow(access) };
52 let isl_rs_result = UnionFlow { ptr: isl_rs_result,
53 should_free_on_drop: true };
54 let err = isl_rs_ctx.last_error();
55 if err != Error::None_ {
56 let err_msg = isl_rs_ctx.last_error_msg();
57 isl_rs_ctx.reset_error();
58 return Err(LibISLError::new(err, err_msg));
59 }
60 Ok(isl_rs_result)
61 }
62
63 pub fn copy(&self) -> Result<UnionAccessInfo, LibISLError> {
65 let access = self;
66 let isl_rs_ctx = access.get_ctx();
67 let access = access.ptr;
68 let isl_rs_result = unsafe { isl_union_access_info_copy(access) };
69 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
70 should_free_on_drop: true };
71 let err = isl_rs_ctx.last_error();
72 if err != Error::None_ {
73 let err_msg = isl_rs_ctx.last_error_msg();
74 isl_rs_ctx.reset_error();
75 return Err(LibISLError::new(err, err_msg));
76 }
77 Ok(isl_rs_result)
78 }
79
80 pub fn free(self) -> Result<UnionAccessInfo, LibISLError> {
82 let access = self;
83 let isl_rs_ctx = access.get_ctx();
84 let mut access = access;
85 access.do_not_free_on_drop();
86 let access = access.ptr;
87 let isl_rs_result = unsafe { isl_union_access_info_free(access) };
88 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
89 should_free_on_drop: true };
90 let err = isl_rs_ctx.last_error();
91 if err != Error::None_ {
92 let err_msg = isl_rs_ctx.last_error_msg();
93 isl_rs_ctx.reset_error();
94 return Err(LibISLError::new(err, err_msg));
95 }
96 Ok(isl_rs_result)
97 }
98
99 pub fn from_sink(sink: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
101 let isl_rs_ctx = sink.get_ctx();
102 let mut sink = sink;
103 sink.do_not_free_on_drop();
104 let sink = sink.ptr;
105 let isl_rs_result = unsafe { isl_union_access_info_from_sink(sink) };
106 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
107 should_free_on_drop: true };
108 let err = isl_rs_ctx.last_error();
109 if err != Error::None_ {
110 let err_msg = isl_rs_ctx.last_error_msg();
111 isl_rs_ctx.reset_error();
112 return Err(LibISLError::new(err, err_msg));
113 }
114 Ok(isl_rs_result)
115 }
116
117 pub fn get_ctx(&self) -> Context {
119 let access = self;
120 let access = access.ptr;
121 let isl_rs_result = unsafe { isl_union_access_info_get_ctx(access) };
122 let isl_rs_result = Context { ptr: isl_rs_result,
123 should_free_on_drop: false };
124 isl_rs_result
125 }
126
127 pub fn set_kill(self, kill: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
129 let access = self;
130 let isl_rs_ctx = access.get_ctx();
131 let mut access = access;
132 access.do_not_free_on_drop();
133 let access = access.ptr;
134 let mut kill = kill;
135 kill.do_not_free_on_drop();
136 let kill = kill.ptr;
137 let isl_rs_result = unsafe { isl_union_access_info_set_kill(access, kill) };
138 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
139 should_free_on_drop: true };
140 let err = isl_rs_ctx.last_error();
141 if err != Error::None_ {
142 let err_msg = isl_rs_ctx.last_error_msg();
143 isl_rs_ctx.reset_error();
144 return Err(LibISLError::new(err, err_msg));
145 }
146 Ok(isl_rs_result)
147 }
148
149 pub fn set_may_source(self, may_source: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
151 let access = self;
152 let isl_rs_ctx = access.get_ctx();
153 let mut access = access;
154 access.do_not_free_on_drop();
155 let access = access.ptr;
156 let mut may_source = may_source;
157 may_source.do_not_free_on_drop();
158 let may_source = may_source.ptr;
159 let isl_rs_result = unsafe { isl_union_access_info_set_may_source(access, may_source) };
160 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
161 should_free_on_drop: true };
162 let err = isl_rs_ctx.last_error();
163 if err != Error::None_ {
164 let err_msg = isl_rs_ctx.last_error_msg();
165 isl_rs_ctx.reset_error();
166 return Err(LibISLError::new(err, err_msg));
167 }
168 Ok(isl_rs_result)
169 }
170
171 pub fn set_must_source(self, must_source: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
173 let access = self;
174 let isl_rs_ctx = access.get_ctx();
175 let mut access = access;
176 access.do_not_free_on_drop();
177 let access = access.ptr;
178 let mut must_source = must_source;
179 must_source.do_not_free_on_drop();
180 let must_source = must_source.ptr;
181 let isl_rs_result = unsafe { isl_union_access_info_set_must_source(access, must_source) };
182 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
183 should_free_on_drop: true };
184 let err = isl_rs_ctx.last_error();
185 if err != Error::None_ {
186 let err_msg = isl_rs_ctx.last_error_msg();
187 isl_rs_ctx.reset_error();
188 return Err(LibISLError::new(err, err_msg));
189 }
190 Ok(isl_rs_result)
191 }
192
193 pub fn set_schedule(self, schedule: Schedule) -> Result<UnionAccessInfo, LibISLError> {
195 let access = self;
196 let isl_rs_ctx = access.get_ctx();
197 let mut access = access;
198 access.do_not_free_on_drop();
199 let access = access.ptr;
200 let mut schedule = schedule;
201 schedule.do_not_free_on_drop();
202 let schedule = schedule.ptr;
203 let isl_rs_result = unsafe { isl_union_access_info_set_schedule(access, schedule) };
204 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
205 should_free_on_drop: true };
206 let err = isl_rs_ctx.last_error();
207 if err != Error::None_ {
208 let err_msg = isl_rs_ctx.last_error_msg();
209 isl_rs_ctx.reset_error();
210 return Err(LibISLError::new(err, err_msg));
211 }
212 Ok(isl_rs_result)
213 }
214
215 pub fn set_schedule_map(self, schedule_map: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
217 let access = self;
218 let isl_rs_ctx = access.get_ctx();
219 let mut access = access;
220 access.do_not_free_on_drop();
221 let access = access.ptr;
222 let mut schedule_map = schedule_map;
223 schedule_map.do_not_free_on_drop();
224 let schedule_map = schedule_map.ptr;
225 let isl_rs_result = unsafe { isl_union_access_info_set_schedule_map(access, schedule_map) };
226 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
227 should_free_on_drop: true };
228 let err = isl_rs_ctx.last_error();
229 if err != Error::None_ {
230 let err_msg = isl_rs_ctx.last_error_msg();
231 isl_rs_ctx.reset_error();
232 return Err(LibISLError::new(err, err_msg));
233 }
234 Ok(isl_rs_result)
235 }
236
237 pub fn to_str(&self) -> Result<&str, LibISLError> {
239 let access = self;
240 let isl_rs_ctx = access.get_ctx();
241 let access = access.ptr;
242 let isl_rs_result = unsafe { isl_union_access_info_to_str(access) };
243 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
244 let isl_rs_result = isl_rs_result.to_str().unwrap();
245 let err = isl_rs_ctx.last_error();
246 if err != Error::None_ {
247 let err_msg = isl_rs_ctx.last_error_msg();
248 isl_rs_ctx.reset_error();
249 return Err(LibISLError::new(err, err_msg));
250 }
251 Ok(isl_rs_result)
252 }
253
254 pub fn do_not_free_on_drop(&mut self) {
257 self.should_free_on_drop = false;
258 }
259}
260
261impl Drop for UnionAccessInfo {
262 fn drop(&mut self) {
263 if self.should_free_on_drop {
264 unsafe {
265 isl_union_access_info_free(self.ptr);
266 }
267 }
268 }
269}