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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
57 }
58 Ok(isl_rs_result)
59 }
60
61 pub fn copy(&self) -> Result<UnionAccessInfo, LibISLError> {
63 let access = self;
64 let isl_rs_ctx = access.get_ctx();
65 let access = access.ptr;
66 let isl_rs_result = unsafe { isl_union_access_info_copy(access) };
67 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
68 should_free_on_drop: true };
69 let err = isl_rs_ctx.last_error();
70 if err != Error::None_ {
71 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
72 }
73 Ok(isl_rs_result)
74 }
75
76 pub fn free(self) -> Result<UnionAccessInfo, LibISLError> {
78 let access = self;
79 let isl_rs_ctx = access.get_ctx();
80 let mut access = access;
81 access.do_not_free_on_drop();
82 let access = access.ptr;
83 let isl_rs_result = unsafe { isl_union_access_info_free(access) };
84 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
85 should_free_on_drop: true };
86 let err = isl_rs_ctx.last_error();
87 if err != Error::None_ {
88 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
89 }
90 Ok(isl_rs_result)
91 }
92
93 pub fn from_sink(sink: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
95 let isl_rs_ctx = sink.get_ctx();
96 let mut sink = sink;
97 sink.do_not_free_on_drop();
98 let sink = sink.ptr;
99 let isl_rs_result = unsafe { isl_union_access_info_from_sink(sink) };
100 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
101 should_free_on_drop: true };
102 let err = isl_rs_ctx.last_error();
103 if err != Error::None_ {
104 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
105 }
106 Ok(isl_rs_result)
107 }
108
109 pub fn get_ctx(&self) -> Context {
111 let access = self;
112 let access = access.ptr;
113 let isl_rs_result = unsafe { isl_union_access_info_get_ctx(access) };
114 let isl_rs_result = Context { ptr: isl_rs_result,
115 should_free_on_drop: false };
116 isl_rs_result
117 }
118
119 pub fn set_kill(self, kill: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
121 let access = self;
122 let isl_rs_ctx = access.get_ctx();
123 let mut access = access;
124 access.do_not_free_on_drop();
125 let access = access.ptr;
126 let mut kill = kill;
127 kill.do_not_free_on_drop();
128 let kill = kill.ptr;
129 let isl_rs_result = unsafe { isl_union_access_info_set_kill(access, kill) };
130 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
131 should_free_on_drop: true };
132 let err = isl_rs_ctx.last_error();
133 if err != Error::None_ {
134 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
135 }
136 Ok(isl_rs_result)
137 }
138
139 pub fn set_may_source(self, may_source: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
141 let access = self;
142 let isl_rs_ctx = access.get_ctx();
143 let mut access = access;
144 access.do_not_free_on_drop();
145 let access = access.ptr;
146 let mut may_source = may_source;
147 may_source.do_not_free_on_drop();
148 let may_source = may_source.ptr;
149 let isl_rs_result = unsafe { isl_union_access_info_set_may_source(access, may_source) };
150 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
151 should_free_on_drop: true };
152 let err = isl_rs_ctx.last_error();
153 if err != Error::None_ {
154 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
155 }
156 Ok(isl_rs_result)
157 }
158
159 pub fn set_must_source(self, must_source: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
161 let access = self;
162 let isl_rs_ctx = access.get_ctx();
163 let mut access = access;
164 access.do_not_free_on_drop();
165 let access = access.ptr;
166 let mut must_source = must_source;
167 must_source.do_not_free_on_drop();
168 let must_source = must_source.ptr;
169 let isl_rs_result = unsafe { isl_union_access_info_set_must_source(access, must_source) };
170 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
171 should_free_on_drop: true };
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 set_schedule(self, schedule: Schedule) -> Result<UnionAccessInfo, LibISLError> {
181 let access = self;
182 let isl_rs_ctx = access.get_ctx();
183 let mut access = access;
184 access.do_not_free_on_drop();
185 let access = access.ptr;
186 let mut schedule = schedule;
187 schedule.do_not_free_on_drop();
188 let schedule = schedule.ptr;
189 let isl_rs_result = unsafe { isl_union_access_info_set_schedule(access, schedule) };
190 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
191 should_free_on_drop: true };
192 let err = isl_rs_ctx.last_error();
193 if err != Error::None_ {
194 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
195 }
196 Ok(isl_rs_result)
197 }
198
199 pub fn set_schedule_map(self, schedule_map: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
201 let access = self;
202 let isl_rs_ctx = access.get_ctx();
203 let mut access = access;
204 access.do_not_free_on_drop();
205 let access = access.ptr;
206 let mut schedule_map = schedule_map;
207 schedule_map.do_not_free_on_drop();
208 let schedule_map = schedule_map.ptr;
209 let isl_rs_result = unsafe { isl_union_access_info_set_schedule_map(access, schedule_map) };
210 let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
211 should_free_on_drop: true };
212 let err = isl_rs_ctx.last_error();
213 if err != Error::None_ {
214 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
215 }
216 Ok(isl_rs_result)
217 }
218
219 pub fn to_str(&self) -> Result<&str, LibISLError> {
221 let access = self;
222 let isl_rs_ctx = access.get_ctx();
223 let access = access.ptr;
224 let isl_rs_result = unsafe { isl_union_access_info_to_str(access) };
225 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
226 let isl_rs_result = isl_rs_result.to_str().unwrap();
227 let err = isl_rs_ctx.last_error();
228 if err != Error::None_ {
229 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
230 }
231 Ok(isl_rs_result)
232 }
233
234 pub fn do_not_free_on_drop(&mut self) {
237 self.should_free_on_drop = false;
238 }
239}
240
241impl Drop for UnionAccessInfo {
242 fn drop(&mut self) {
243 if self.should_free_on_drop {
244 unsafe {
245 isl_union_access_info_free(self.ptr);
246 }
247 }
248 }
249}