1use super::{Context, Error, LibISLError, Schedule, Set, UnionMap, UnionSet};
5use libc::uintptr_t;
6use std::ffi::{CStr, CString};
7use std::os::raw::c_char;
8
9pub struct ScheduleConstraints {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_schedule_constraints_apply(sc: uintptr_t, umap: uintptr_t) -> uintptr_t;
18
19 fn isl_schedule_constraints_compute_schedule(sc: uintptr_t) -> uintptr_t;
20
21 fn isl_schedule_constraints_copy(sc: uintptr_t) -> uintptr_t;
22
23 fn isl_schedule_constraints_dump(sc: uintptr_t) -> ();
24
25 fn isl_schedule_constraints_free(sc: uintptr_t) -> uintptr_t;
26
27 fn isl_schedule_constraints_get_coincidence(sc: uintptr_t) -> uintptr_t;
28
29 fn isl_schedule_constraints_get_conditional_validity(sc: uintptr_t) -> uintptr_t;
30
31 fn isl_schedule_constraints_get_conditional_validity_condition(sc: uintptr_t) -> uintptr_t;
32
33 fn isl_schedule_constraints_get_context(sc: uintptr_t) -> uintptr_t;
34
35 fn isl_schedule_constraints_get_ctx(sc: uintptr_t) -> uintptr_t;
36
37 fn isl_schedule_constraints_get_domain(sc: uintptr_t) -> uintptr_t;
38
39 fn isl_schedule_constraints_get_proximity(sc: uintptr_t) -> uintptr_t;
40
41 fn isl_schedule_constraints_get_validity(sc: uintptr_t) -> uintptr_t;
42
43 fn isl_schedule_constraints_on_domain(domain: uintptr_t) -> uintptr_t;
44
45 fn isl_schedule_constraints_read_from_str(ctx: uintptr_t, str_: *const c_char) -> uintptr_t;
46
47 fn isl_schedule_constraints_set_coincidence(sc: uintptr_t, coincidence: uintptr_t)
48 -> uintptr_t;
49
50 fn isl_schedule_constraints_set_conditional_validity(sc: uintptr_t, condition: uintptr_t,
51 validity: uintptr_t)
52 -> uintptr_t;
53
54 fn isl_schedule_constraints_set_context(sc: uintptr_t, context: uintptr_t) -> uintptr_t;
55
56 fn isl_schedule_constraints_set_proximity(sc: uintptr_t, proximity: uintptr_t) -> uintptr_t;
57
58 fn isl_schedule_constraints_set_validity(sc: uintptr_t, validity: uintptr_t) -> uintptr_t;
59
60 fn isl_schedule_constraints_to_str(sc: uintptr_t) -> *const c_char;
61
62}
63
64impl ScheduleConstraints {
65 pub fn apply(self, umap: UnionMap) -> Result<ScheduleConstraints, LibISLError> {
67 let sc = self;
68 let isl_rs_ctx = sc.get_ctx();
69 let mut sc = sc;
70 sc.do_not_free_on_drop();
71 let sc = sc.ptr;
72 let mut umap = umap;
73 umap.do_not_free_on_drop();
74 let umap = umap.ptr;
75 let isl_rs_result = unsafe { isl_schedule_constraints_apply(sc, umap) };
76 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
77 should_free_on_drop: true };
78 let err = isl_rs_ctx.last_error();
79 if err != Error::None_ {
80 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
81 }
82 Ok(isl_rs_result)
83 }
84
85 pub fn compute_schedule(self) -> Result<Schedule, LibISLError> {
87 let sc = self;
88 let isl_rs_ctx = sc.get_ctx();
89 let mut sc = sc;
90 sc.do_not_free_on_drop();
91 let sc = sc.ptr;
92 let isl_rs_result = unsafe { isl_schedule_constraints_compute_schedule(sc) };
93 let isl_rs_result = Schedule { ptr: isl_rs_result,
94 should_free_on_drop: true };
95 let err = isl_rs_ctx.last_error();
96 if err != Error::None_ {
97 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
98 }
99 Ok(isl_rs_result)
100 }
101
102 pub fn copy(&self) -> Result<ScheduleConstraints, LibISLError> {
104 let sc = self;
105 let isl_rs_ctx = sc.get_ctx();
106 let sc = sc.ptr;
107 let isl_rs_result = unsafe { isl_schedule_constraints_copy(sc) };
108 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
109 should_free_on_drop: true };
110 let err = isl_rs_ctx.last_error();
111 if err != Error::None_ {
112 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
113 }
114 Ok(isl_rs_result)
115 }
116
117 pub fn dump(&self) -> Result<(), LibISLError> {
119 let sc = self;
120 let isl_rs_ctx = sc.get_ctx();
121 let sc = sc.ptr;
122 let isl_rs_result = unsafe { isl_schedule_constraints_dump(sc) };
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 free(self) -> Result<ScheduleConstraints, LibISLError> {
132 let sc = self;
133 let isl_rs_ctx = sc.get_ctx();
134 let mut sc = sc;
135 sc.do_not_free_on_drop();
136 let sc = sc.ptr;
137 let isl_rs_result = unsafe { isl_schedule_constraints_free(sc) };
138 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
139 should_free_on_drop: true };
140 let err = isl_rs_ctx.last_error();
141 if err != Error::None_ {
142 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
143 }
144 Ok(isl_rs_result)
145 }
146
147 pub fn get_coincidence(&self) -> Result<UnionMap, LibISLError> {
149 let sc = self;
150 let isl_rs_ctx = sc.get_ctx();
151 let sc = sc.ptr;
152 let isl_rs_result = unsafe { isl_schedule_constraints_get_coincidence(sc) };
153 let isl_rs_result = UnionMap { ptr: isl_rs_result,
154 should_free_on_drop: true };
155 let err = isl_rs_ctx.last_error();
156 if err != Error::None_ {
157 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
158 }
159 Ok(isl_rs_result)
160 }
161
162 pub fn get_conditional_validity(&self) -> Result<UnionMap, LibISLError> {
164 let sc = self;
165 let isl_rs_ctx = sc.get_ctx();
166 let sc = sc.ptr;
167 let isl_rs_result = unsafe { isl_schedule_constraints_get_conditional_validity(sc) };
168 let isl_rs_result = UnionMap { ptr: isl_rs_result,
169 should_free_on_drop: true };
170 let err = isl_rs_ctx.last_error();
171 if err != Error::None_ {
172 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
173 }
174 Ok(isl_rs_result)
175 }
176
177 pub fn get_conditional_validity_condition(&self) -> Result<UnionMap, LibISLError> {
179 let sc = self;
180 let isl_rs_ctx = sc.get_ctx();
181 let sc = sc.ptr;
182 let isl_rs_result =
183 unsafe { isl_schedule_constraints_get_conditional_validity_condition(sc) };
184 let isl_rs_result = UnionMap { ptr: isl_rs_result,
185 should_free_on_drop: true };
186 let err = isl_rs_ctx.last_error();
187 if err != Error::None_ {
188 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
189 }
190 Ok(isl_rs_result)
191 }
192
193 pub fn get_context(&self) -> Result<Set, LibISLError> {
195 let sc = self;
196 let isl_rs_ctx = sc.get_ctx();
197 let sc = sc.ptr;
198 let isl_rs_result = unsafe { isl_schedule_constraints_get_context(sc) };
199 let isl_rs_result = Set { ptr: isl_rs_result,
200 should_free_on_drop: true };
201 let err = isl_rs_ctx.last_error();
202 if err != Error::None_ {
203 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
204 }
205 Ok(isl_rs_result)
206 }
207
208 pub fn get_ctx(&self) -> Context {
210 let sc = self;
211 let sc = sc.ptr;
212 let isl_rs_result = unsafe { isl_schedule_constraints_get_ctx(sc) };
213 let isl_rs_result = Context { ptr: isl_rs_result,
214 should_free_on_drop: false };
215 isl_rs_result
216 }
217
218 pub fn get_domain(&self) -> Result<UnionSet, LibISLError> {
220 let sc = self;
221 let isl_rs_ctx = sc.get_ctx();
222 let sc = sc.ptr;
223 let isl_rs_result = unsafe { isl_schedule_constraints_get_domain(sc) };
224 let isl_rs_result = UnionSet { ptr: isl_rs_result,
225 should_free_on_drop: true };
226 let err = isl_rs_ctx.last_error();
227 if err != Error::None_ {
228 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
229 }
230 Ok(isl_rs_result)
231 }
232
233 pub fn get_proximity(&self) -> Result<UnionMap, LibISLError> {
235 let sc = self;
236 let isl_rs_ctx = sc.get_ctx();
237 let sc = sc.ptr;
238 let isl_rs_result = unsafe { isl_schedule_constraints_get_proximity(sc) };
239 let isl_rs_result = UnionMap { ptr: isl_rs_result,
240 should_free_on_drop: true };
241 let err = isl_rs_ctx.last_error();
242 if err != Error::None_ {
243 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
244 }
245 Ok(isl_rs_result)
246 }
247
248 pub fn get_validity(&self) -> Result<UnionMap, LibISLError> {
250 let sc = self;
251 let isl_rs_ctx = sc.get_ctx();
252 let sc = sc.ptr;
253 let isl_rs_result = unsafe { isl_schedule_constraints_get_validity(sc) };
254 let isl_rs_result = UnionMap { ptr: isl_rs_result,
255 should_free_on_drop: true };
256 let err = isl_rs_ctx.last_error();
257 if err != Error::None_ {
258 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
259 }
260 Ok(isl_rs_result)
261 }
262
263 pub fn on_domain(domain: UnionSet) -> Result<ScheduleConstraints, LibISLError> {
265 let isl_rs_ctx = domain.get_ctx();
266 let mut domain = domain;
267 domain.do_not_free_on_drop();
268 let domain = domain.ptr;
269 let isl_rs_result = unsafe { isl_schedule_constraints_on_domain(domain) };
270 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
271 should_free_on_drop: true };
272 let err = isl_rs_ctx.last_error();
273 if err != Error::None_ {
274 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
275 }
276 Ok(isl_rs_result)
277 }
278
279 pub fn read_from_str(ctx: &Context, str_: &str) -> Result<ScheduleConstraints, LibISLError> {
281 let isl_rs_ctx = Context { ptr: ctx.ptr,
282 should_free_on_drop: false };
283 let ctx = ctx.ptr;
284 let str_ = CString::new(str_).unwrap();
285 let str_ = str_.as_ptr();
286 let isl_rs_result = unsafe { isl_schedule_constraints_read_from_str(ctx, str_) };
287 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
288 should_free_on_drop: true };
289 let err = isl_rs_ctx.last_error();
290 if err != Error::None_ {
291 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
292 }
293 Ok(isl_rs_result)
294 }
295
296 pub fn set_coincidence(self, coincidence: UnionMap)
298 -> Result<ScheduleConstraints, LibISLError> {
299 let sc = self;
300 let isl_rs_ctx = sc.get_ctx();
301 let mut sc = sc;
302 sc.do_not_free_on_drop();
303 let sc = sc.ptr;
304 let mut coincidence = coincidence;
305 coincidence.do_not_free_on_drop();
306 let coincidence = coincidence.ptr;
307 let isl_rs_result = unsafe { isl_schedule_constraints_set_coincidence(sc, coincidence) };
308 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
309 should_free_on_drop: true };
310 let err = isl_rs_ctx.last_error();
311 if err != Error::None_ {
312 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
313 }
314 Ok(isl_rs_result)
315 }
316
317 pub fn set_conditional_validity(self, condition: UnionMap, validity: UnionMap)
319 -> Result<ScheduleConstraints, LibISLError> {
320 let sc = self;
321 let isl_rs_ctx = sc.get_ctx();
322 let mut sc = sc;
323 sc.do_not_free_on_drop();
324 let sc = sc.ptr;
325 let mut condition = condition;
326 condition.do_not_free_on_drop();
327 let condition = condition.ptr;
328 let mut validity = validity;
329 validity.do_not_free_on_drop();
330 let validity = validity.ptr;
331 let isl_rs_result =
332 unsafe { isl_schedule_constraints_set_conditional_validity(sc, condition, validity) };
333 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
334 should_free_on_drop: true };
335 let err = isl_rs_ctx.last_error();
336 if err != Error::None_ {
337 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
338 }
339 Ok(isl_rs_result)
340 }
341
342 pub fn set_context(self, context: Set) -> Result<ScheduleConstraints, LibISLError> {
344 let sc = self;
345 let isl_rs_ctx = sc.get_ctx();
346 let mut sc = sc;
347 sc.do_not_free_on_drop();
348 let sc = sc.ptr;
349 let mut context = context;
350 context.do_not_free_on_drop();
351 let context = context.ptr;
352 let isl_rs_result = unsafe { isl_schedule_constraints_set_context(sc, context) };
353 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
354 should_free_on_drop: true };
355 let err = isl_rs_ctx.last_error();
356 if err != Error::None_ {
357 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
358 }
359 Ok(isl_rs_result)
360 }
361
362 pub fn set_proximity(self, proximity: UnionMap) -> Result<ScheduleConstraints, LibISLError> {
364 let sc = self;
365 let isl_rs_ctx = sc.get_ctx();
366 let mut sc = sc;
367 sc.do_not_free_on_drop();
368 let sc = sc.ptr;
369 let mut proximity = proximity;
370 proximity.do_not_free_on_drop();
371 let proximity = proximity.ptr;
372 let isl_rs_result = unsafe { isl_schedule_constraints_set_proximity(sc, proximity) };
373 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
374 should_free_on_drop: true };
375 let err = isl_rs_ctx.last_error();
376 if err != Error::None_ {
377 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
378 }
379 Ok(isl_rs_result)
380 }
381
382 pub fn set_validity(self, validity: UnionMap) -> Result<ScheduleConstraints, LibISLError> {
384 let sc = self;
385 let isl_rs_ctx = sc.get_ctx();
386 let mut sc = sc;
387 sc.do_not_free_on_drop();
388 let sc = sc.ptr;
389 let mut validity = validity;
390 validity.do_not_free_on_drop();
391 let validity = validity.ptr;
392 let isl_rs_result = unsafe { isl_schedule_constraints_set_validity(sc, validity) };
393 let isl_rs_result = ScheduleConstraints { ptr: isl_rs_result,
394 should_free_on_drop: true };
395 let err = isl_rs_ctx.last_error();
396 if err != Error::None_ {
397 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
398 }
399 Ok(isl_rs_result)
400 }
401
402 pub fn to_str(&self) -> Result<&str, LibISLError> {
404 let sc = self;
405 let isl_rs_ctx = sc.get_ctx();
406 let sc = sc.ptr;
407 let isl_rs_result = unsafe { isl_schedule_constraints_to_str(sc) };
408 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
409 let isl_rs_result = isl_rs_result.to_str().unwrap();
410 let err = isl_rs_ctx.last_error();
411 if err != Error::None_ {
412 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
413 }
414 Ok(isl_rs_result)
415 }
416
417 pub fn do_not_free_on_drop(&mut self) {
420 self.should_free_on_drop = false;
421 }
422}
423
424impl Drop for ScheduleConstraints {
425 fn drop(&mut self) {
426 if self.should_free_on_drop {
427 unsafe {
428 isl_schedule_constraints_free(self.ptr);
429 }
430 }
431 }
432}