1use super::{
5 ASTLoopType, Context, Error, Id, LibISLError, MultiUnionPwAff, MultiVal, Schedule,
6 ScheduleNodeType, Set, Space, UnionMap, UnionPwMultiAff, UnionSet, UnionSetList,
7};
8use libc::uintptr_t;
9use std::ffi::CStr;
10use std::os::raw::c_char;
11
12pub struct ScheduleNode {
14 pub ptr: uintptr_t,
15 pub should_free_on_drop: bool,
16}
17
18extern "C" {
19
20 fn isl_schedule_node_align_params(node: uintptr_t, space: uintptr_t) -> uintptr_t;
21
22 fn isl_schedule_node_ancestor(node: uintptr_t, generation: i32) -> uintptr_t;
23
24 fn isl_schedule_node_band_get_ast_build_options(node: uintptr_t) -> uintptr_t;
25
26 fn isl_schedule_node_band_get_ast_isolate_option(node: uintptr_t) -> uintptr_t;
27
28 fn isl_schedule_node_band_get_partial_schedule(node: uintptr_t) -> uintptr_t;
29
30 fn isl_schedule_node_band_get_partial_schedule_union_map(node: uintptr_t) -> uintptr_t;
31
32 fn isl_schedule_node_band_get_permutable(node: uintptr_t) -> i32;
33
34 fn isl_schedule_node_band_get_space(node: uintptr_t) -> uintptr_t;
35
36 fn isl_schedule_node_band_member_get_ast_loop_type(node: uintptr_t, pos: i32) -> i32;
37
38 fn isl_schedule_node_band_member_get_coincident(node: uintptr_t, pos: i32) -> i32;
39
40 fn isl_schedule_node_band_member_get_isolate_ast_loop_type(node: uintptr_t, pos: i32) -> i32;
41
42 fn isl_schedule_node_band_member_set_ast_loop_type(node: uintptr_t, pos: i32, type_: i32)
43 -> uintptr_t;
44
45 fn isl_schedule_node_band_member_set_coincident(node: uintptr_t, pos: i32, coincident: i32)
46 -> uintptr_t;
47
48 fn isl_schedule_node_band_member_set_isolate_ast_loop_type(node: uintptr_t, pos: i32,
49 type_: i32)
50 -> uintptr_t;
51
52 fn isl_schedule_node_band_mod(node: uintptr_t, mv: uintptr_t) -> uintptr_t;
53
54 fn isl_schedule_node_band_n_member(node: uintptr_t) -> i32;
55
56 fn isl_schedule_node_band_scale(node: uintptr_t, mv: uintptr_t) -> uintptr_t;
57
58 fn isl_schedule_node_band_scale_down(node: uintptr_t, mv: uintptr_t) -> uintptr_t;
59
60 fn isl_schedule_node_band_set_ast_build_options(node: uintptr_t, options: uintptr_t)
61 -> uintptr_t;
62
63 fn isl_schedule_node_band_set_permutable(node: uintptr_t, permutable: i32) -> uintptr_t;
64
65 fn isl_schedule_node_band_shift(node: uintptr_t, shift: uintptr_t) -> uintptr_t;
66
67 fn isl_schedule_node_band_sink(node: uintptr_t) -> uintptr_t;
68
69 fn isl_schedule_node_band_split(node: uintptr_t, pos: i32) -> uintptr_t;
70
71 fn isl_schedule_node_band_tile(node: uintptr_t, sizes: uintptr_t) -> uintptr_t;
72
73 fn isl_schedule_node_child(node: uintptr_t, pos: i32) -> uintptr_t;
74
75 fn isl_schedule_node_context_get_context(node: uintptr_t) -> uintptr_t;
76
77 fn isl_schedule_node_copy(node: uintptr_t) -> uintptr_t;
78
79 fn isl_schedule_node_cut(node: uintptr_t) -> uintptr_t;
80
81 fn isl_schedule_node_delete(node: uintptr_t) -> uintptr_t;
82
83 fn isl_schedule_node_domain_get_domain(node: uintptr_t) -> uintptr_t;
84
85 fn isl_schedule_node_dump(node: uintptr_t) -> ();
86
87 fn isl_schedule_node_expansion_get_contraction(node: uintptr_t) -> uintptr_t;
88
89 fn isl_schedule_node_expansion_get_expansion(node: uintptr_t) -> uintptr_t;
90
91 fn isl_schedule_node_extension_get_extension(node: uintptr_t) -> uintptr_t;
92
93 fn isl_schedule_node_filter_get_filter(node: uintptr_t) -> uintptr_t;
94
95 fn isl_schedule_node_first_child(node: uintptr_t) -> uintptr_t;
96
97 fn isl_schedule_node_free(node: uintptr_t) -> uintptr_t;
98
99 fn isl_schedule_node_from_domain(domain: uintptr_t) -> uintptr_t;
100
101 fn isl_schedule_node_from_extension(extension: uintptr_t) -> uintptr_t;
102
103 fn isl_schedule_node_get_ancestor_child_position(node: uintptr_t, ancestor: uintptr_t) -> i32;
104
105 fn isl_schedule_node_get_child(node: uintptr_t, pos: i32) -> uintptr_t;
106
107 fn isl_schedule_node_get_child_position(node: uintptr_t) -> i32;
108
109 fn isl_schedule_node_get_ctx(node: uintptr_t) -> uintptr_t;
110
111 fn isl_schedule_node_get_domain(node: uintptr_t) -> uintptr_t;
112
113 fn isl_schedule_node_get_parent_type(node: uintptr_t) -> i32;
114
115 fn isl_schedule_node_get_prefix_schedule_multi_union_pw_aff(node: uintptr_t) -> uintptr_t;
116
117 fn isl_schedule_node_get_prefix_schedule_relation(node: uintptr_t) -> uintptr_t;
118
119 fn isl_schedule_node_get_prefix_schedule_union_map(node: uintptr_t) -> uintptr_t;
120
121 fn isl_schedule_node_get_prefix_schedule_union_pw_multi_aff(node: uintptr_t) -> uintptr_t;
122
123 fn isl_schedule_node_get_schedule(node: uintptr_t) -> uintptr_t;
124
125 fn isl_schedule_node_get_schedule_depth(node: uintptr_t) -> i32;
126
127 fn isl_schedule_node_get_shared_ancestor(node1: uintptr_t, node2: uintptr_t) -> uintptr_t;
128
129 fn isl_schedule_node_get_subtree_contraction(node: uintptr_t) -> uintptr_t;
130
131 fn isl_schedule_node_get_subtree_expansion(node: uintptr_t) -> uintptr_t;
132
133 fn isl_schedule_node_get_subtree_schedule_union_map(node: uintptr_t) -> uintptr_t;
134
135 fn isl_schedule_node_get_tree_depth(node: uintptr_t) -> i32;
136
137 fn isl_schedule_node_get_type(node: uintptr_t) -> i32;
138
139 fn isl_schedule_node_get_universe_domain(node: uintptr_t) -> uintptr_t;
140
141 fn isl_schedule_node_graft_after(node: uintptr_t, graft: uintptr_t) -> uintptr_t;
142
143 fn isl_schedule_node_graft_before(node: uintptr_t, graft: uintptr_t) -> uintptr_t;
144
145 fn isl_schedule_node_grandchild(node: uintptr_t, pos1: i32, pos2: i32) -> uintptr_t;
146
147 fn isl_schedule_node_grandparent(node: uintptr_t) -> uintptr_t;
148
149 fn isl_schedule_node_group(node: uintptr_t, group_id: uintptr_t) -> uintptr_t;
150
151 fn isl_schedule_node_guard_get_guard(node: uintptr_t) -> uintptr_t;
152
153 fn isl_schedule_node_has_children(node: uintptr_t) -> i32;
154
155 fn isl_schedule_node_has_next_sibling(node: uintptr_t) -> i32;
156
157 fn isl_schedule_node_has_parent(node: uintptr_t) -> i32;
158
159 fn isl_schedule_node_has_previous_sibling(node: uintptr_t) -> i32;
160
161 fn isl_schedule_node_insert_context(node: uintptr_t, context: uintptr_t) -> uintptr_t;
162
163 fn isl_schedule_node_insert_filter(node: uintptr_t, filter: uintptr_t) -> uintptr_t;
164
165 fn isl_schedule_node_insert_guard(node: uintptr_t, context: uintptr_t) -> uintptr_t;
166
167 fn isl_schedule_node_insert_mark(node: uintptr_t, mark: uintptr_t) -> uintptr_t;
168
169 fn isl_schedule_node_insert_partial_schedule(node: uintptr_t, schedule: uintptr_t)
170 -> uintptr_t;
171
172 fn isl_schedule_node_insert_sequence(node: uintptr_t, filters: uintptr_t) -> uintptr_t;
173
174 fn isl_schedule_node_insert_set(node: uintptr_t, filters: uintptr_t) -> uintptr_t;
175
176 fn isl_schedule_node_is_equal(node1: uintptr_t, node2: uintptr_t) -> i32;
177
178 fn isl_schedule_node_is_subtree_anchored(node: uintptr_t) -> i32;
179
180 fn isl_schedule_node_mark_get_id(node: uintptr_t) -> uintptr_t;
181
182 fn isl_schedule_node_n_children(node: uintptr_t) -> i32;
183
184 fn isl_schedule_node_next_sibling(node: uintptr_t) -> uintptr_t;
185
186 fn isl_schedule_node_order_after(node: uintptr_t, filter: uintptr_t) -> uintptr_t;
187
188 fn isl_schedule_node_order_before(node: uintptr_t, filter: uintptr_t) -> uintptr_t;
189
190 fn isl_schedule_node_parent(node: uintptr_t) -> uintptr_t;
191
192 fn isl_schedule_node_previous_sibling(node: uintptr_t) -> uintptr_t;
193
194 fn isl_schedule_node_reset_user(node: uintptr_t) -> uintptr_t;
195
196 fn isl_schedule_node_root(node: uintptr_t) -> uintptr_t;
197
198 fn isl_schedule_node_sequence_splice_child(node: uintptr_t, pos: i32) -> uintptr_t;
199
200 fn isl_schedule_node_sequence_splice_children(node: uintptr_t) -> uintptr_t;
201
202 fn isl_schedule_node_to_str(node: uintptr_t) -> *const c_char;
203
204}
205
206impl ScheduleNode {
207 pub fn align_params(self, space: Space) -> Result<ScheduleNode, LibISLError> {
209 let node = self;
210 let isl_rs_ctx = node.get_ctx();
211 let mut node = node;
212 node.do_not_free_on_drop();
213 let node = node.ptr;
214 let mut space = space;
215 space.do_not_free_on_drop();
216 let space = space.ptr;
217 let isl_rs_result = unsafe { isl_schedule_node_align_params(node, space) };
218 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
219 should_free_on_drop: true };
220 let err = isl_rs_ctx.last_error();
221 if err != Error::None_ {
222 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
223 }
224 Ok(isl_rs_result)
225 }
226
227 pub fn ancestor(self, generation: i32) -> Result<ScheduleNode, LibISLError> {
229 let node = self;
230 let isl_rs_ctx = node.get_ctx();
231 let mut node = node;
232 node.do_not_free_on_drop();
233 let node = node.ptr;
234 let isl_rs_result = unsafe { isl_schedule_node_ancestor(node, generation) };
235 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
236 should_free_on_drop: true };
237 let err = isl_rs_ctx.last_error();
238 if err != Error::None_ {
239 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
240 }
241 Ok(isl_rs_result)
242 }
243
244 pub fn band_get_ast_build_options(&self) -> Result<UnionSet, LibISLError> {
246 let node = self;
247 let isl_rs_ctx = node.get_ctx();
248 let node = node.ptr;
249 let isl_rs_result = unsafe { isl_schedule_node_band_get_ast_build_options(node) };
250 let isl_rs_result = UnionSet { ptr: isl_rs_result,
251 should_free_on_drop: true };
252 let err = isl_rs_ctx.last_error();
253 if err != Error::None_ {
254 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
255 }
256 Ok(isl_rs_result)
257 }
258
259 pub fn band_get_ast_isolate_option(&self) -> Result<Set, LibISLError> {
261 let node = self;
262 let isl_rs_ctx = node.get_ctx();
263 let node = node.ptr;
264 let isl_rs_result = unsafe { isl_schedule_node_band_get_ast_isolate_option(node) };
265 let isl_rs_result = Set { ptr: isl_rs_result,
266 should_free_on_drop: true };
267 let err = isl_rs_ctx.last_error();
268 if err != Error::None_ {
269 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
270 }
271 Ok(isl_rs_result)
272 }
273
274 pub fn band_get_partial_schedule(&self) -> Result<MultiUnionPwAff, LibISLError> {
276 let node = self;
277 let isl_rs_ctx = node.get_ctx();
278 let node = node.ptr;
279 let isl_rs_result = unsafe { isl_schedule_node_band_get_partial_schedule(node) };
280 let isl_rs_result = MultiUnionPwAff { ptr: isl_rs_result,
281 should_free_on_drop: true };
282 let err = isl_rs_ctx.last_error();
283 if err != Error::None_ {
284 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
285 }
286 Ok(isl_rs_result)
287 }
288
289 pub fn band_get_partial_schedule_union_map(&self) -> Result<UnionMap, LibISLError> {
291 let node = self;
292 let isl_rs_ctx = node.get_ctx();
293 let node = node.ptr;
294 let isl_rs_result = unsafe { isl_schedule_node_band_get_partial_schedule_union_map(node) };
295 let isl_rs_result = UnionMap { ptr: isl_rs_result,
296 should_free_on_drop: true };
297 let err = isl_rs_ctx.last_error();
298 if err != Error::None_ {
299 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
300 }
301 Ok(isl_rs_result)
302 }
303
304 pub fn band_get_permutable(&self) -> Result<bool, LibISLError> {
306 let node = self;
307 let isl_rs_ctx = node.get_ctx();
308 let node = node.ptr;
309 let isl_rs_result = unsafe { isl_schedule_node_band_get_permutable(node) };
310 let isl_rs_result = match isl_rs_result {
311 0 => false,
312 1 => true,
313 _ => panic!("Got isl_bool = -1"),
314 };
315 let err = isl_rs_ctx.last_error();
316 if err != Error::None_ {
317 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
318 }
319 Ok(isl_rs_result)
320 }
321
322 pub fn band_get_space(&self) -> Result<Space, LibISLError> {
324 let node = self;
325 let isl_rs_ctx = node.get_ctx();
326 let node = node.ptr;
327 let isl_rs_result = unsafe { isl_schedule_node_band_get_space(node) };
328 let isl_rs_result = Space { ptr: isl_rs_result,
329 should_free_on_drop: true };
330 let err = isl_rs_ctx.last_error();
331 if err != Error::None_ {
332 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
333 }
334 Ok(isl_rs_result)
335 }
336
337 pub fn band_member_get_ast_loop_type(&self, pos: i32) -> Result<ASTLoopType, LibISLError> {
339 let node = self;
340 let isl_rs_ctx = node.get_ctx();
341 let node = node.ptr;
342 let isl_rs_result = unsafe { isl_schedule_node_band_member_get_ast_loop_type(node, pos) };
343 let isl_rs_result = ASTLoopType::from_i32(isl_rs_result);
344 let err = isl_rs_ctx.last_error();
345 if err != Error::None_ {
346 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
347 }
348 Ok(isl_rs_result)
349 }
350
351 pub fn band_member_get_coincident(&self, pos: i32) -> Result<bool, LibISLError> {
353 let node = self;
354 let isl_rs_ctx = node.get_ctx();
355 let node = node.ptr;
356 let isl_rs_result = unsafe { isl_schedule_node_band_member_get_coincident(node, pos) };
357 let isl_rs_result = match isl_rs_result {
358 0 => false,
359 1 => true,
360 _ => panic!("Got isl_bool = -1"),
361 };
362 let err = isl_rs_ctx.last_error();
363 if err != Error::None_ {
364 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
365 }
366 Ok(isl_rs_result)
367 }
368
369 pub fn band_member_get_isolate_ast_loop_type(&self, pos: i32)
371 -> Result<ASTLoopType, LibISLError> {
372 let node = self;
373 let isl_rs_ctx = node.get_ctx();
374 let node = node.ptr;
375 let isl_rs_result =
376 unsafe { isl_schedule_node_band_member_get_isolate_ast_loop_type(node, pos) };
377 let isl_rs_result = ASTLoopType::from_i32(isl_rs_result);
378 let err = isl_rs_ctx.last_error();
379 if err != Error::None_ {
380 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
381 }
382 Ok(isl_rs_result)
383 }
384
385 pub fn band_member_set_ast_loop_type(self, pos: i32, type_: ASTLoopType)
387 -> Result<ScheduleNode, LibISLError> {
388 let node = self;
389 let isl_rs_ctx = node.get_ctx();
390 let mut node = node;
391 node.do_not_free_on_drop();
392 let node = node.ptr;
393 let type_ = type_.to_i32();
394 let isl_rs_result =
395 unsafe { isl_schedule_node_band_member_set_ast_loop_type(node, pos, type_) };
396 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
397 should_free_on_drop: true };
398 let err = isl_rs_ctx.last_error();
399 if err != Error::None_ {
400 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
401 }
402 Ok(isl_rs_result)
403 }
404
405 pub fn band_member_set_coincident(self, pos: i32, coincident: i32)
407 -> Result<ScheduleNode, LibISLError> {
408 let node = self;
409 let isl_rs_ctx = node.get_ctx();
410 let mut node = node;
411 node.do_not_free_on_drop();
412 let node = node.ptr;
413 let isl_rs_result =
414 unsafe { isl_schedule_node_band_member_set_coincident(node, pos, coincident) };
415 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
416 should_free_on_drop: true };
417 let err = isl_rs_ctx.last_error();
418 if err != Error::None_ {
419 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
420 }
421 Ok(isl_rs_result)
422 }
423
424 pub fn band_member_set_isolate_ast_loop_type(self, pos: i32, type_: ASTLoopType)
426 -> Result<ScheduleNode, LibISLError> {
427 let node = self;
428 let isl_rs_ctx = node.get_ctx();
429 let mut node = node;
430 node.do_not_free_on_drop();
431 let node = node.ptr;
432 let type_ = type_.to_i32();
433 let isl_rs_result =
434 unsafe { isl_schedule_node_band_member_set_isolate_ast_loop_type(node, pos, type_) };
435 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
436 should_free_on_drop: true };
437 let err = isl_rs_ctx.last_error();
438 if err != Error::None_ {
439 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
440 }
441 Ok(isl_rs_result)
442 }
443
444 pub fn band_mod(self, mv: MultiVal) -> Result<ScheduleNode, LibISLError> {
446 let node = self;
447 let isl_rs_ctx = node.get_ctx();
448 let mut node = node;
449 node.do_not_free_on_drop();
450 let node = node.ptr;
451 let mut mv = mv;
452 mv.do_not_free_on_drop();
453 let mv = mv.ptr;
454 let isl_rs_result = unsafe { isl_schedule_node_band_mod(node, mv) };
455 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
456 should_free_on_drop: true };
457 let err = isl_rs_ctx.last_error();
458 if err != Error::None_ {
459 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
460 }
461 Ok(isl_rs_result)
462 }
463
464 pub fn band_n_member(&self) -> Result<i32, LibISLError> {
466 let node = self;
467 let isl_rs_ctx = node.get_ctx();
468 let node = node.ptr;
469 let isl_rs_result = unsafe { isl_schedule_node_band_n_member(node) };
470 let err = isl_rs_ctx.last_error();
471 if err != Error::None_ {
472 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
473 }
474 Ok(isl_rs_result)
475 }
476
477 pub fn band_scale(self, mv: MultiVal) -> Result<ScheduleNode, LibISLError> {
479 let node = self;
480 let isl_rs_ctx = node.get_ctx();
481 let mut node = node;
482 node.do_not_free_on_drop();
483 let node = node.ptr;
484 let mut mv = mv;
485 mv.do_not_free_on_drop();
486 let mv = mv.ptr;
487 let isl_rs_result = unsafe { isl_schedule_node_band_scale(node, mv) };
488 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
489 should_free_on_drop: true };
490 let err = isl_rs_ctx.last_error();
491 if err != Error::None_ {
492 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
493 }
494 Ok(isl_rs_result)
495 }
496
497 pub fn band_scale_down(self, mv: MultiVal) -> Result<ScheduleNode, LibISLError> {
499 let node = self;
500 let isl_rs_ctx = node.get_ctx();
501 let mut node = node;
502 node.do_not_free_on_drop();
503 let node = node.ptr;
504 let mut mv = mv;
505 mv.do_not_free_on_drop();
506 let mv = mv.ptr;
507 let isl_rs_result = unsafe { isl_schedule_node_band_scale_down(node, mv) };
508 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
509 should_free_on_drop: true };
510 let err = isl_rs_ctx.last_error();
511 if err != Error::None_ {
512 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
513 }
514 Ok(isl_rs_result)
515 }
516
517 pub fn band_set_ast_build_options(self, options: UnionSet)
519 -> Result<ScheduleNode, LibISLError> {
520 let node = self;
521 let isl_rs_ctx = node.get_ctx();
522 let mut node = node;
523 node.do_not_free_on_drop();
524 let node = node.ptr;
525 let mut options = options;
526 options.do_not_free_on_drop();
527 let options = options.ptr;
528 let isl_rs_result = unsafe { isl_schedule_node_band_set_ast_build_options(node, options) };
529 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
530 should_free_on_drop: true };
531 let err = isl_rs_ctx.last_error();
532 if err != Error::None_ {
533 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
534 }
535 Ok(isl_rs_result)
536 }
537
538 pub fn band_set_permutable(self, permutable: i32) -> Result<ScheduleNode, LibISLError> {
540 let node = self;
541 let isl_rs_ctx = node.get_ctx();
542 let mut node = node;
543 node.do_not_free_on_drop();
544 let node = node.ptr;
545 let isl_rs_result = unsafe { isl_schedule_node_band_set_permutable(node, permutable) };
546 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
547 should_free_on_drop: true };
548 let err = isl_rs_ctx.last_error();
549 if err != Error::None_ {
550 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
551 }
552 Ok(isl_rs_result)
553 }
554
555 pub fn band_shift(self, shift: MultiUnionPwAff) -> Result<ScheduleNode, LibISLError> {
557 let node = self;
558 let isl_rs_ctx = node.get_ctx();
559 let mut node = node;
560 node.do_not_free_on_drop();
561 let node = node.ptr;
562 let mut shift = shift;
563 shift.do_not_free_on_drop();
564 let shift = shift.ptr;
565 let isl_rs_result = unsafe { isl_schedule_node_band_shift(node, shift) };
566 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
567 should_free_on_drop: true };
568 let err = isl_rs_ctx.last_error();
569 if err != Error::None_ {
570 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
571 }
572 Ok(isl_rs_result)
573 }
574
575 pub fn band_sink(self) -> Result<ScheduleNode, LibISLError> {
577 let node = self;
578 let isl_rs_ctx = node.get_ctx();
579 let mut node = node;
580 node.do_not_free_on_drop();
581 let node = node.ptr;
582 let isl_rs_result = unsafe { isl_schedule_node_band_sink(node) };
583 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
584 should_free_on_drop: true };
585 let err = isl_rs_ctx.last_error();
586 if err != Error::None_ {
587 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
588 }
589 Ok(isl_rs_result)
590 }
591
592 pub fn band_split(self, pos: i32) -> Result<ScheduleNode, LibISLError> {
594 let node = self;
595 let isl_rs_ctx = node.get_ctx();
596 let mut node = node;
597 node.do_not_free_on_drop();
598 let node = node.ptr;
599 let isl_rs_result = unsafe { isl_schedule_node_band_split(node, pos) };
600 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
601 should_free_on_drop: true };
602 let err = isl_rs_ctx.last_error();
603 if err != Error::None_ {
604 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
605 }
606 Ok(isl_rs_result)
607 }
608
609 pub fn band_tile(self, sizes: MultiVal) -> Result<ScheduleNode, LibISLError> {
611 let node = self;
612 let isl_rs_ctx = node.get_ctx();
613 let mut node = node;
614 node.do_not_free_on_drop();
615 let node = node.ptr;
616 let mut sizes = sizes;
617 sizes.do_not_free_on_drop();
618 let sizes = sizes.ptr;
619 let isl_rs_result = unsafe { isl_schedule_node_band_tile(node, sizes) };
620 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
621 should_free_on_drop: true };
622 let err = isl_rs_ctx.last_error();
623 if err != Error::None_ {
624 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
625 }
626 Ok(isl_rs_result)
627 }
628
629 pub fn child(self, pos: i32) -> Result<ScheduleNode, LibISLError> {
631 let node = self;
632 let isl_rs_ctx = node.get_ctx();
633 let mut node = node;
634 node.do_not_free_on_drop();
635 let node = node.ptr;
636 let isl_rs_result = unsafe { isl_schedule_node_child(node, pos) };
637 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
638 should_free_on_drop: true };
639 let err = isl_rs_ctx.last_error();
640 if err != Error::None_ {
641 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
642 }
643 Ok(isl_rs_result)
644 }
645
646 pub fn context_get_context(&self) -> Result<Set, LibISLError> {
648 let node = self;
649 let isl_rs_ctx = node.get_ctx();
650 let node = node.ptr;
651 let isl_rs_result = unsafe { isl_schedule_node_context_get_context(node) };
652 let isl_rs_result = Set { ptr: isl_rs_result,
653 should_free_on_drop: true };
654 let err = isl_rs_ctx.last_error();
655 if err != Error::None_ {
656 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
657 }
658 Ok(isl_rs_result)
659 }
660
661 pub fn copy(&self) -> Result<ScheduleNode, LibISLError> {
663 let node = self;
664 let isl_rs_ctx = node.get_ctx();
665 let node = node.ptr;
666 let isl_rs_result = unsafe { isl_schedule_node_copy(node) };
667 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
668 should_free_on_drop: true };
669 let err = isl_rs_ctx.last_error();
670 if err != Error::None_ {
671 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
672 }
673 Ok(isl_rs_result)
674 }
675
676 pub fn cut(self) -> Result<ScheduleNode, LibISLError> {
678 let node = self;
679 let isl_rs_ctx = node.get_ctx();
680 let mut node = node;
681 node.do_not_free_on_drop();
682 let node = node.ptr;
683 let isl_rs_result = unsafe { isl_schedule_node_cut(node) };
684 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
685 should_free_on_drop: true };
686 let err = isl_rs_ctx.last_error();
687 if err != Error::None_ {
688 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
689 }
690 Ok(isl_rs_result)
691 }
692
693 pub fn delete(self) -> Result<ScheduleNode, LibISLError> {
695 let node = self;
696 let isl_rs_ctx = node.get_ctx();
697 let mut node = node;
698 node.do_not_free_on_drop();
699 let node = node.ptr;
700 let isl_rs_result = unsafe { isl_schedule_node_delete(node) };
701 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
702 should_free_on_drop: true };
703 let err = isl_rs_ctx.last_error();
704 if err != Error::None_ {
705 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
706 }
707 Ok(isl_rs_result)
708 }
709
710 pub fn domain_get_domain(&self) -> Result<UnionSet, LibISLError> {
712 let node = self;
713 let isl_rs_ctx = node.get_ctx();
714 let node = node.ptr;
715 let isl_rs_result = unsafe { isl_schedule_node_domain_get_domain(node) };
716 let isl_rs_result = UnionSet { ptr: isl_rs_result,
717 should_free_on_drop: true };
718 let err = isl_rs_ctx.last_error();
719 if err != Error::None_ {
720 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
721 }
722 Ok(isl_rs_result)
723 }
724
725 pub fn dump(&self) -> Result<(), LibISLError> {
727 let node = self;
728 let isl_rs_ctx = node.get_ctx();
729 let node = node.ptr;
730 let isl_rs_result = unsafe { isl_schedule_node_dump(node) };
731 let err = isl_rs_ctx.last_error();
732 if err != Error::None_ {
733 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
734 }
735 Ok(isl_rs_result)
736 }
737
738 pub fn expansion_get_contraction(&self) -> Result<UnionPwMultiAff, LibISLError> {
740 let node = self;
741 let isl_rs_ctx = node.get_ctx();
742 let node = node.ptr;
743 let isl_rs_result = unsafe { isl_schedule_node_expansion_get_contraction(node) };
744 let isl_rs_result = UnionPwMultiAff { ptr: isl_rs_result,
745 should_free_on_drop: true };
746 let err = isl_rs_ctx.last_error();
747 if err != Error::None_ {
748 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
749 }
750 Ok(isl_rs_result)
751 }
752
753 pub fn expansion_get_expansion(&self) -> Result<UnionMap, LibISLError> {
755 let node = self;
756 let isl_rs_ctx = node.get_ctx();
757 let node = node.ptr;
758 let isl_rs_result = unsafe { isl_schedule_node_expansion_get_expansion(node) };
759 let isl_rs_result = UnionMap { ptr: isl_rs_result,
760 should_free_on_drop: true };
761 let err = isl_rs_ctx.last_error();
762 if err != Error::None_ {
763 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
764 }
765 Ok(isl_rs_result)
766 }
767
768 pub fn extension_get_extension(&self) -> Result<UnionMap, LibISLError> {
770 let node = self;
771 let isl_rs_ctx = node.get_ctx();
772 let node = node.ptr;
773 let isl_rs_result = unsafe { isl_schedule_node_extension_get_extension(node) };
774 let isl_rs_result = UnionMap { ptr: isl_rs_result,
775 should_free_on_drop: true };
776 let err = isl_rs_ctx.last_error();
777 if err != Error::None_ {
778 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
779 }
780 Ok(isl_rs_result)
781 }
782
783 pub fn filter_get_filter(&self) -> Result<UnionSet, LibISLError> {
785 let node = self;
786 let isl_rs_ctx = node.get_ctx();
787 let node = node.ptr;
788 let isl_rs_result = unsafe { isl_schedule_node_filter_get_filter(node) };
789 let isl_rs_result = UnionSet { ptr: isl_rs_result,
790 should_free_on_drop: true };
791 let err = isl_rs_ctx.last_error();
792 if err != Error::None_ {
793 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
794 }
795 Ok(isl_rs_result)
796 }
797
798 pub fn first_child(self) -> Result<ScheduleNode, LibISLError> {
800 let node = self;
801 let isl_rs_ctx = node.get_ctx();
802 let mut node = node;
803 node.do_not_free_on_drop();
804 let node = node.ptr;
805 let isl_rs_result = unsafe { isl_schedule_node_first_child(node) };
806 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
807 should_free_on_drop: true };
808 let err = isl_rs_ctx.last_error();
809 if err != Error::None_ {
810 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
811 }
812 Ok(isl_rs_result)
813 }
814
815 pub fn free(self) -> Result<ScheduleNode, LibISLError> {
817 let node = self;
818 let isl_rs_ctx = node.get_ctx();
819 let mut node = node;
820 node.do_not_free_on_drop();
821 let node = node.ptr;
822 let isl_rs_result = unsafe { isl_schedule_node_free(node) };
823 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
824 should_free_on_drop: true };
825 let err = isl_rs_ctx.last_error();
826 if err != Error::None_ {
827 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
828 }
829 Ok(isl_rs_result)
830 }
831
832 pub fn from_domain(domain: UnionSet) -> Result<ScheduleNode, LibISLError> {
834 let isl_rs_ctx = domain.get_ctx();
835 let mut domain = domain;
836 domain.do_not_free_on_drop();
837 let domain = domain.ptr;
838 let isl_rs_result = unsafe { isl_schedule_node_from_domain(domain) };
839 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
840 should_free_on_drop: true };
841 let err = isl_rs_ctx.last_error();
842 if err != Error::None_ {
843 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
844 }
845 Ok(isl_rs_result)
846 }
847
848 pub fn from_extension(extension: UnionMap) -> Result<ScheduleNode, LibISLError> {
850 let isl_rs_ctx = extension.get_ctx();
851 let mut extension = extension;
852 extension.do_not_free_on_drop();
853 let extension = extension.ptr;
854 let isl_rs_result = unsafe { isl_schedule_node_from_extension(extension) };
855 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
856 should_free_on_drop: true };
857 let err = isl_rs_ctx.last_error();
858 if err != Error::None_ {
859 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
860 }
861 Ok(isl_rs_result)
862 }
863
864 pub fn get_ancestor_child_position(&self, ancestor: &ScheduleNode) -> Result<i32, LibISLError> {
866 let node = self;
867 let isl_rs_ctx = node.get_ctx();
868 let node = node.ptr;
869 let ancestor = ancestor.ptr;
870 let isl_rs_result =
871 unsafe { isl_schedule_node_get_ancestor_child_position(node, ancestor) };
872 let err = isl_rs_ctx.last_error();
873 if err != Error::None_ {
874 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
875 }
876 Ok(isl_rs_result)
877 }
878
879 pub fn get_child(&self, pos: i32) -> Result<ScheduleNode, LibISLError> {
881 let node = self;
882 let isl_rs_ctx = node.get_ctx();
883 let node = node.ptr;
884 let isl_rs_result = unsafe { isl_schedule_node_get_child(node, pos) };
885 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
886 should_free_on_drop: true };
887 let err = isl_rs_ctx.last_error();
888 if err != Error::None_ {
889 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
890 }
891 Ok(isl_rs_result)
892 }
893
894 pub fn get_child_position(&self) -> Result<i32, LibISLError> {
896 let node = self;
897 let isl_rs_ctx = node.get_ctx();
898 let node = node.ptr;
899 let isl_rs_result = unsafe { isl_schedule_node_get_child_position(node) };
900 let err = isl_rs_ctx.last_error();
901 if err != Error::None_ {
902 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
903 }
904 Ok(isl_rs_result)
905 }
906
907 pub fn get_ctx(&self) -> Context {
909 let node = self;
910 let node = node.ptr;
911 let isl_rs_result = unsafe { isl_schedule_node_get_ctx(node) };
912 let isl_rs_result = Context { ptr: isl_rs_result,
913 should_free_on_drop: false };
914 isl_rs_result
915 }
916
917 pub fn get_domain(&self) -> Result<UnionSet, LibISLError> {
919 let node = self;
920 let isl_rs_ctx = node.get_ctx();
921 let node = node.ptr;
922 let isl_rs_result = unsafe { isl_schedule_node_get_domain(node) };
923 let isl_rs_result = UnionSet { ptr: isl_rs_result,
924 should_free_on_drop: true };
925 let err = isl_rs_ctx.last_error();
926 if err != Error::None_ {
927 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
928 }
929 Ok(isl_rs_result)
930 }
931
932 pub fn get_parent_type(&self) -> Result<ScheduleNodeType, LibISLError> {
934 let node = self;
935 let isl_rs_ctx = node.get_ctx();
936 let node = node.ptr;
937 let isl_rs_result = unsafe { isl_schedule_node_get_parent_type(node) };
938 let isl_rs_result = ScheduleNodeType::from_i32(isl_rs_result);
939 let err = isl_rs_ctx.last_error();
940 if err != Error::None_ {
941 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
942 }
943 Ok(isl_rs_result)
944 }
945
946 pub fn get_prefix_schedule_multi_union_pw_aff(&self) -> Result<MultiUnionPwAff, LibISLError> {
948 let node = self;
949 let isl_rs_ctx = node.get_ctx();
950 let node = node.ptr;
951 let isl_rs_result =
952 unsafe { isl_schedule_node_get_prefix_schedule_multi_union_pw_aff(node) };
953 let isl_rs_result = MultiUnionPwAff { ptr: isl_rs_result,
954 should_free_on_drop: true };
955 let err = isl_rs_ctx.last_error();
956 if err != Error::None_ {
957 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
958 }
959 Ok(isl_rs_result)
960 }
961
962 pub fn get_prefix_schedule_relation(&self) -> Result<UnionMap, LibISLError> {
964 let node = self;
965 let isl_rs_ctx = node.get_ctx();
966 let node = node.ptr;
967 let isl_rs_result = unsafe { isl_schedule_node_get_prefix_schedule_relation(node) };
968 let isl_rs_result = UnionMap { ptr: isl_rs_result,
969 should_free_on_drop: true };
970 let err = isl_rs_ctx.last_error();
971 if err != Error::None_ {
972 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
973 }
974 Ok(isl_rs_result)
975 }
976
977 pub fn get_prefix_schedule_union_map(&self) -> Result<UnionMap, LibISLError> {
979 let node = self;
980 let isl_rs_ctx = node.get_ctx();
981 let node = node.ptr;
982 let isl_rs_result = unsafe { isl_schedule_node_get_prefix_schedule_union_map(node) };
983 let isl_rs_result = UnionMap { ptr: isl_rs_result,
984 should_free_on_drop: true };
985 let err = isl_rs_ctx.last_error();
986 if err != Error::None_ {
987 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
988 }
989 Ok(isl_rs_result)
990 }
991
992 pub fn get_prefix_schedule_union_pw_multi_aff(&self) -> Result<UnionPwMultiAff, LibISLError> {
994 let node = self;
995 let isl_rs_ctx = node.get_ctx();
996 let node = node.ptr;
997 let isl_rs_result =
998 unsafe { isl_schedule_node_get_prefix_schedule_union_pw_multi_aff(node) };
999 let isl_rs_result = UnionPwMultiAff { ptr: isl_rs_result,
1000 should_free_on_drop: true };
1001 let err = isl_rs_ctx.last_error();
1002 if err != Error::None_ {
1003 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1004 }
1005 Ok(isl_rs_result)
1006 }
1007
1008 pub fn get_schedule(&self) -> Result<Schedule, LibISLError> {
1010 let node = self;
1011 let isl_rs_ctx = node.get_ctx();
1012 let node = node.ptr;
1013 let isl_rs_result = unsafe { isl_schedule_node_get_schedule(node) };
1014 let isl_rs_result = Schedule { ptr: isl_rs_result,
1015 should_free_on_drop: true };
1016 let err = isl_rs_ctx.last_error();
1017 if err != Error::None_ {
1018 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1019 }
1020 Ok(isl_rs_result)
1021 }
1022
1023 pub fn get_schedule_depth(&self) -> Result<i32, LibISLError> {
1025 let node = self;
1026 let isl_rs_ctx = node.get_ctx();
1027 let node = node.ptr;
1028 let isl_rs_result = unsafe { isl_schedule_node_get_schedule_depth(node) };
1029 let err = isl_rs_ctx.last_error();
1030 if err != Error::None_ {
1031 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1032 }
1033 Ok(isl_rs_result)
1034 }
1035
1036 pub fn get_shared_ancestor(&self, node2: &ScheduleNode) -> Result<ScheduleNode, LibISLError> {
1038 let node1 = self;
1039 let isl_rs_ctx = node1.get_ctx();
1040 let node1 = node1.ptr;
1041 let node2 = node2.ptr;
1042 let isl_rs_result = unsafe { isl_schedule_node_get_shared_ancestor(node1, node2) };
1043 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1044 should_free_on_drop: true };
1045 let err = isl_rs_ctx.last_error();
1046 if err != Error::None_ {
1047 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1048 }
1049 Ok(isl_rs_result)
1050 }
1051
1052 pub fn get_subtree_contraction(&self) -> Result<UnionPwMultiAff, LibISLError> {
1054 let node = self;
1055 let isl_rs_ctx = node.get_ctx();
1056 let node = node.ptr;
1057 let isl_rs_result = unsafe { isl_schedule_node_get_subtree_contraction(node) };
1058 let isl_rs_result = UnionPwMultiAff { ptr: isl_rs_result,
1059 should_free_on_drop: true };
1060 let err = isl_rs_ctx.last_error();
1061 if err != Error::None_ {
1062 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1063 }
1064 Ok(isl_rs_result)
1065 }
1066
1067 pub fn get_subtree_expansion(&self) -> Result<UnionMap, LibISLError> {
1069 let node = self;
1070 let isl_rs_ctx = node.get_ctx();
1071 let node = node.ptr;
1072 let isl_rs_result = unsafe { isl_schedule_node_get_subtree_expansion(node) };
1073 let isl_rs_result = UnionMap { ptr: isl_rs_result,
1074 should_free_on_drop: true };
1075 let err = isl_rs_ctx.last_error();
1076 if err != Error::None_ {
1077 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1078 }
1079 Ok(isl_rs_result)
1080 }
1081
1082 pub fn get_subtree_schedule_union_map(&self) -> Result<UnionMap, LibISLError> {
1084 let node = self;
1085 let isl_rs_ctx = node.get_ctx();
1086 let node = node.ptr;
1087 let isl_rs_result = unsafe { isl_schedule_node_get_subtree_schedule_union_map(node) };
1088 let isl_rs_result = UnionMap { ptr: isl_rs_result,
1089 should_free_on_drop: true };
1090 let err = isl_rs_ctx.last_error();
1091 if err != Error::None_ {
1092 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1093 }
1094 Ok(isl_rs_result)
1095 }
1096
1097 pub fn get_tree_depth(&self) -> Result<i32, LibISLError> {
1099 let node = self;
1100 let isl_rs_ctx = node.get_ctx();
1101 let node = node.ptr;
1102 let isl_rs_result = unsafe { isl_schedule_node_get_tree_depth(node) };
1103 let err = isl_rs_ctx.last_error();
1104 if err != Error::None_ {
1105 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1106 }
1107 Ok(isl_rs_result)
1108 }
1109
1110 pub fn get_type(&self) -> Result<ScheduleNodeType, LibISLError> {
1112 let node = self;
1113 let isl_rs_ctx = node.get_ctx();
1114 let node = node.ptr;
1115 let isl_rs_result = unsafe { isl_schedule_node_get_type(node) };
1116 let isl_rs_result = ScheduleNodeType::from_i32(isl_rs_result);
1117 let err = isl_rs_ctx.last_error();
1118 if err != Error::None_ {
1119 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1120 }
1121 Ok(isl_rs_result)
1122 }
1123
1124 pub fn get_universe_domain(&self) -> Result<UnionSet, LibISLError> {
1126 let node = self;
1127 let isl_rs_ctx = node.get_ctx();
1128 let node = node.ptr;
1129 let isl_rs_result = unsafe { isl_schedule_node_get_universe_domain(node) };
1130 let isl_rs_result = UnionSet { ptr: isl_rs_result,
1131 should_free_on_drop: true };
1132 let err = isl_rs_ctx.last_error();
1133 if err != Error::None_ {
1134 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1135 }
1136 Ok(isl_rs_result)
1137 }
1138
1139 pub fn graft_after(self, graft: ScheduleNode) -> Result<ScheduleNode, LibISLError> {
1141 let node = self;
1142 let isl_rs_ctx = node.get_ctx();
1143 let mut node = node;
1144 node.do_not_free_on_drop();
1145 let node = node.ptr;
1146 let mut graft = graft;
1147 graft.do_not_free_on_drop();
1148 let graft = graft.ptr;
1149 let isl_rs_result = unsafe { isl_schedule_node_graft_after(node, graft) };
1150 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1151 should_free_on_drop: true };
1152 let err = isl_rs_ctx.last_error();
1153 if err != Error::None_ {
1154 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1155 }
1156 Ok(isl_rs_result)
1157 }
1158
1159 pub fn graft_before(self, graft: ScheduleNode) -> Result<ScheduleNode, LibISLError> {
1161 let node = self;
1162 let isl_rs_ctx = node.get_ctx();
1163 let mut node = node;
1164 node.do_not_free_on_drop();
1165 let node = node.ptr;
1166 let mut graft = graft;
1167 graft.do_not_free_on_drop();
1168 let graft = graft.ptr;
1169 let isl_rs_result = unsafe { isl_schedule_node_graft_before(node, graft) };
1170 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1171 should_free_on_drop: true };
1172 let err = isl_rs_ctx.last_error();
1173 if err != Error::None_ {
1174 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1175 }
1176 Ok(isl_rs_result)
1177 }
1178
1179 pub fn grandchild(self, pos1: i32, pos2: i32) -> Result<ScheduleNode, LibISLError> {
1181 let node = self;
1182 let isl_rs_ctx = node.get_ctx();
1183 let mut node = node;
1184 node.do_not_free_on_drop();
1185 let node = node.ptr;
1186 let isl_rs_result = unsafe { isl_schedule_node_grandchild(node, pos1, pos2) };
1187 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1188 should_free_on_drop: true };
1189 let err = isl_rs_ctx.last_error();
1190 if err != Error::None_ {
1191 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1192 }
1193 Ok(isl_rs_result)
1194 }
1195
1196 pub fn grandparent(self) -> Result<ScheduleNode, LibISLError> {
1198 let node = self;
1199 let isl_rs_ctx = node.get_ctx();
1200 let mut node = node;
1201 node.do_not_free_on_drop();
1202 let node = node.ptr;
1203 let isl_rs_result = unsafe { isl_schedule_node_grandparent(node) };
1204 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1205 should_free_on_drop: true };
1206 let err = isl_rs_ctx.last_error();
1207 if err != Error::None_ {
1208 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1209 }
1210 Ok(isl_rs_result)
1211 }
1212
1213 pub fn group(self, group_id: Id) -> Result<ScheduleNode, LibISLError> {
1215 let node = self;
1216 let isl_rs_ctx = node.get_ctx();
1217 let mut node = node;
1218 node.do_not_free_on_drop();
1219 let node = node.ptr;
1220 let mut group_id = group_id;
1221 group_id.do_not_free_on_drop();
1222 let group_id = group_id.ptr;
1223 let isl_rs_result = unsafe { isl_schedule_node_group(node, group_id) };
1224 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1225 should_free_on_drop: true };
1226 let err = isl_rs_ctx.last_error();
1227 if err != Error::None_ {
1228 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1229 }
1230 Ok(isl_rs_result)
1231 }
1232
1233 pub fn guard_get_guard(&self) -> Result<Set, LibISLError> {
1235 let node = self;
1236 let isl_rs_ctx = node.get_ctx();
1237 let node = node.ptr;
1238 let isl_rs_result = unsafe { isl_schedule_node_guard_get_guard(node) };
1239 let isl_rs_result = Set { ptr: isl_rs_result,
1240 should_free_on_drop: true };
1241 let err = isl_rs_ctx.last_error();
1242 if err != Error::None_ {
1243 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1244 }
1245 Ok(isl_rs_result)
1246 }
1247
1248 pub fn has_children(&self) -> Result<bool, LibISLError> {
1250 let node = self;
1251 let isl_rs_ctx = node.get_ctx();
1252 let node = node.ptr;
1253 let isl_rs_result = unsafe { isl_schedule_node_has_children(node) };
1254 let isl_rs_result = match isl_rs_result {
1255 0 => false,
1256 1 => true,
1257 _ => panic!("Got isl_bool = -1"),
1258 };
1259 let err = isl_rs_ctx.last_error();
1260 if err != Error::None_ {
1261 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1262 }
1263 Ok(isl_rs_result)
1264 }
1265
1266 pub fn has_next_sibling(&self) -> Result<bool, LibISLError> {
1268 let node = self;
1269 let isl_rs_ctx = node.get_ctx();
1270 let node = node.ptr;
1271 let isl_rs_result = unsafe { isl_schedule_node_has_next_sibling(node) };
1272 let isl_rs_result = match isl_rs_result {
1273 0 => false,
1274 1 => true,
1275 _ => panic!("Got isl_bool = -1"),
1276 };
1277 let err = isl_rs_ctx.last_error();
1278 if err != Error::None_ {
1279 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1280 }
1281 Ok(isl_rs_result)
1282 }
1283
1284 pub fn has_parent(&self) -> Result<bool, LibISLError> {
1286 let node = self;
1287 let isl_rs_ctx = node.get_ctx();
1288 let node = node.ptr;
1289 let isl_rs_result = unsafe { isl_schedule_node_has_parent(node) };
1290 let isl_rs_result = match isl_rs_result {
1291 0 => false,
1292 1 => true,
1293 _ => panic!("Got isl_bool = -1"),
1294 };
1295 let err = isl_rs_ctx.last_error();
1296 if err != Error::None_ {
1297 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1298 }
1299 Ok(isl_rs_result)
1300 }
1301
1302 pub fn has_previous_sibling(&self) -> Result<bool, LibISLError> {
1304 let node = self;
1305 let isl_rs_ctx = node.get_ctx();
1306 let node = node.ptr;
1307 let isl_rs_result = unsafe { isl_schedule_node_has_previous_sibling(node) };
1308 let isl_rs_result = match isl_rs_result {
1309 0 => false,
1310 1 => true,
1311 _ => panic!("Got isl_bool = -1"),
1312 };
1313 let err = isl_rs_ctx.last_error();
1314 if err != Error::None_ {
1315 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1316 }
1317 Ok(isl_rs_result)
1318 }
1319
1320 pub fn insert_context(self, context: Set) -> Result<ScheduleNode, LibISLError> {
1322 let node = self;
1323 let isl_rs_ctx = node.get_ctx();
1324 let mut node = node;
1325 node.do_not_free_on_drop();
1326 let node = node.ptr;
1327 let mut context = context;
1328 context.do_not_free_on_drop();
1329 let context = context.ptr;
1330 let isl_rs_result = unsafe { isl_schedule_node_insert_context(node, context) };
1331 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1332 should_free_on_drop: true };
1333 let err = isl_rs_ctx.last_error();
1334 if err != Error::None_ {
1335 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1336 }
1337 Ok(isl_rs_result)
1338 }
1339
1340 pub fn insert_filter(self, filter: UnionSet) -> Result<ScheduleNode, LibISLError> {
1342 let node = self;
1343 let isl_rs_ctx = node.get_ctx();
1344 let mut node = node;
1345 node.do_not_free_on_drop();
1346 let node = node.ptr;
1347 let mut filter = filter;
1348 filter.do_not_free_on_drop();
1349 let filter = filter.ptr;
1350 let isl_rs_result = unsafe { isl_schedule_node_insert_filter(node, filter) };
1351 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1352 should_free_on_drop: true };
1353 let err = isl_rs_ctx.last_error();
1354 if err != Error::None_ {
1355 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1356 }
1357 Ok(isl_rs_result)
1358 }
1359
1360 pub fn insert_guard(self, context: Set) -> Result<ScheduleNode, LibISLError> {
1362 let node = self;
1363 let isl_rs_ctx = node.get_ctx();
1364 let mut node = node;
1365 node.do_not_free_on_drop();
1366 let node = node.ptr;
1367 let mut context = context;
1368 context.do_not_free_on_drop();
1369 let context = context.ptr;
1370 let isl_rs_result = unsafe { isl_schedule_node_insert_guard(node, context) };
1371 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1372 should_free_on_drop: true };
1373 let err = isl_rs_ctx.last_error();
1374 if err != Error::None_ {
1375 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1376 }
1377 Ok(isl_rs_result)
1378 }
1379
1380 pub fn insert_mark(self, mark: Id) -> Result<ScheduleNode, LibISLError> {
1382 let node = self;
1383 let isl_rs_ctx = node.get_ctx();
1384 let mut node = node;
1385 node.do_not_free_on_drop();
1386 let node = node.ptr;
1387 let mut mark = mark;
1388 mark.do_not_free_on_drop();
1389 let mark = mark.ptr;
1390 let isl_rs_result = unsafe { isl_schedule_node_insert_mark(node, mark) };
1391 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1392 should_free_on_drop: true };
1393 let err = isl_rs_ctx.last_error();
1394 if err != Error::None_ {
1395 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1396 }
1397 Ok(isl_rs_result)
1398 }
1399
1400 pub fn insert_partial_schedule(self, schedule: MultiUnionPwAff)
1402 -> Result<ScheduleNode, LibISLError> {
1403 let node = self;
1404 let isl_rs_ctx = node.get_ctx();
1405 let mut node = node;
1406 node.do_not_free_on_drop();
1407 let node = node.ptr;
1408 let mut schedule = schedule;
1409 schedule.do_not_free_on_drop();
1410 let schedule = schedule.ptr;
1411 let isl_rs_result = unsafe { isl_schedule_node_insert_partial_schedule(node, schedule) };
1412 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1413 should_free_on_drop: true };
1414 let err = isl_rs_ctx.last_error();
1415 if err != Error::None_ {
1416 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1417 }
1418 Ok(isl_rs_result)
1419 }
1420
1421 pub fn insert_sequence(self, filters: UnionSetList) -> Result<ScheduleNode, LibISLError> {
1423 let node = self;
1424 let isl_rs_ctx = node.get_ctx();
1425 let mut node = node;
1426 node.do_not_free_on_drop();
1427 let node = node.ptr;
1428 let mut filters = filters;
1429 filters.do_not_free_on_drop();
1430 let filters = filters.ptr;
1431 let isl_rs_result = unsafe { isl_schedule_node_insert_sequence(node, filters) };
1432 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1433 should_free_on_drop: true };
1434 let err = isl_rs_ctx.last_error();
1435 if err != Error::None_ {
1436 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1437 }
1438 Ok(isl_rs_result)
1439 }
1440
1441 pub fn insert_set(self, filters: UnionSetList) -> Result<ScheduleNode, LibISLError> {
1443 let node = self;
1444 let isl_rs_ctx = node.get_ctx();
1445 let mut node = node;
1446 node.do_not_free_on_drop();
1447 let node = node.ptr;
1448 let mut filters = filters;
1449 filters.do_not_free_on_drop();
1450 let filters = filters.ptr;
1451 let isl_rs_result = unsafe { isl_schedule_node_insert_set(node, filters) };
1452 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1453 should_free_on_drop: true };
1454 let err = isl_rs_ctx.last_error();
1455 if err != Error::None_ {
1456 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1457 }
1458 Ok(isl_rs_result)
1459 }
1460
1461 pub fn is_equal(&self, node2: &ScheduleNode) -> Result<bool, LibISLError> {
1463 let node1 = self;
1464 let isl_rs_ctx = node1.get_ctx();
1465 let node1 = node1.ptr;
1466 let node2 = node2.ptr;
1467 let isl_rs_result = unsafe { isl_schedule_node_is_equal(node1, node2) };
1468 let isl_rs_result = match isl_rs_result {
1469 0 => false,
1470 1 => true,
1471 _ => panic!("Got isl_bool = -1"),
1472 };
1473 let err = isl_rs_ctx.last_error();
1474 if err != Error::None_ {
1475 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1476 }
1477 Ok(isl_rs_result)
1478 }
1479
1480 pub fn is_subtree_anchored(&self) -> Result<bool, LibISLError> {
1482 let node = self;
1483 let isl_rs_ctx = node.get_ctx();
1484 let node = node.ptr;
1485 let isl_rs_result = unsafe { isl_schedule_node_is_subtree_anchored(node) };
1486 let isl_rs_result = match isl_rs_result {
1487 0 => false,
1488 1 => true,
1489 _ => panic!("Got isl_bool = -1"),
1490 };
1491 let err = isl_rs_ctx.last_error();
1492 if err != Error::None_ {
1493 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1494 }
1495 Ok(isl_rs_result)
1496 }
1497
1498 pub fn mark_get_id(&self) -> Result<Id, LibISLError> {
1500 let node = self;
1501 let isl_rs_ctx = node.get_ctx();
1502 let node = node.ptr;
1503 let isl_rs_result = unsafe { isl_schedule_node_mark_get_id(node) };
1504 let isl_rs_result = Id { ptr: isl_rs_result,
1505 should_free_on_drop: true };
1506 let err = isl_rs_ctx.last_error();
1507 if err != Error::None_ {
1508 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1509 }
1510 Ok(isl_rs_result)
1511 }
1512
1513 pub fn n_children(&self) -> Result<i32, LibISLError> {
1515 let node = self;
1516 let isl_rs_ctx = node.get_ctx();
1517 let node = node.ptr;
1518 let isl_rs_result = unsafe { isl_schedule_node_n_children(node) };
1519 let err = isl_rs_ctx.last_error();
1520 if err != Error::None_ {
1521 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1522 }
1523 Ok(isl_rs_result)
1524 }
1525
1526 pub fn next_sibling(self) -> Result<ScheduleNode, LibISLError> {
1528 let node = self;
1529 let isl_rs_ctx = node.get_ctx();
1530 let mut node = node;
1531 node.do_not_free_on_drop();
1532 let node = node.ptr;
1533 let isl_rs_result = unsafe { isl_schedule_node_next_sibling(node) };
1534 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1535 should_free_on_drop: true };
1536 let err = isl_rs_ctx.last_error();
1537 if err != Error::None_ {
1538 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1539 }
1540 Ok(isl_rs_result)
1541 }
1542
1543 pub fn order_after(self, filter: UnionSet) -> Result<ScheduleNode, LibISLError> {
1545 let node = self;
1546 let isl_rs_ctx = node.get_ctx();
1547 let mut node = node;
1548 node.do_not_free_on_drop();
1549 let node = node.ptr;
1550 let mut filter = filter;
1551 filter.do_not_free_on_drop();
1552 let filter = filter.ptr;
1553 let isl_rs_result = unsafe { isl_schedule_node_order_after(node, filter) };
1554 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1555 should_free_on_drop: true };
1556 let err = isl_rs_ctx.last_error();
1557 if err != Error::None_ {
1558 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1559 }
1560 Ok(isl_rs_result)
1561 }
1562
1563 pub fn order_before(self, filter: UnionSet) -> Result<ScheduleNode, LibISLError> {
1565 let node = self;
1566 let isl_rs_ctx = node.get_ctx();
1567 let mut node = node;
1568 node.do_not_free_on_drop();
1569 let node = node.ptr;
1570 let mut filter = filter;
1571 filter.do_not_free_on_drop();
1572 let filter = filter.ptr;
1573 let isl_rs_result = unsafe { isl_schedule_node_order_before(node, filter) };
1574 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1575 should_free_on_drop: true };
1576 let err = isl_rs_ctx.last_error();
1577 if err != Error::None_ {
1578 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1579 }
1580 Ok(isl_rs_result)
1581 }
1582
1583 pub fn parent(self) -> Result<ScheduleNode, LibISLError> {
1585 let node = self;
1586 let isl_rs_ctx = node.get_ctx();
1587 let mut node = node;
1588 node.do_not_free_on_drop();
1589 let node = node.ptr;
1590 let isl_rs_result = unsafe { isl_schedule_node_parent(node) };
1591 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1592 should_free_on_drop: true };
1593 let err = isl_rs_ctx.last_error();
1594 if err != Error::None_ {
1595 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1596 }
1597 Ok(isl_rs_result)
1598 }
1599
1600 pub fn previous_sibling(self) -> Result<ScheduleNode, LibISLError> {
1602 let node = self;
1603 let isl_rs_ctx = node.get_ctx();
1604 let mut node = node;
1605 node.do_not_free_on_drop();
1606 let node = node.ptr;
1607 let isl_rs_result = unsafe { isl_schedule_node_previous_sibling(node) };
1608 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1609 should_free_on_drop: true };
1610 let err = isl_rs_ctx.last_error();
1611 if err != Error::None_ {
1612 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1613 }
1614 Ok(isl_rs_result)
1615 }
1616
1617 pub fn reset_user(self) -> Result<ScheduleNode, LibISLError> {
1619 let node = self;
1620 let isl_rs_ctx = node.get_ctx();
1621 let mut node = node;
1622 node.do_not_free_on_drop();
1623 let node = node.ptr;
1624 let isl_rs_result = unsafe { isl_schedule_node_reset_user(node) };
1625 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1626 should_free_on_drop: true };
1627 let err = isl_rs_ctx.last_error();
1628 if err != Error::None_ {
1629 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1630 }
1631 Ok(isl_rs_result)
1632 }
1633
1634 pub fn root(self) -> Result<ScheduleNode, LibISLError> {
1636 let node = self;
1637 let isl_rs_ctx = node.get_ctx();
1638 let mut node = node;
1639 node.do_not_free_on_drop();
1640 let node = node.ptr;
1641 let isl_rs_result = unsafe { isl_schedule_node_root(node) };
1642 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1643 should_free_on_drop: true };
1644 let err = isl_rs_ctx.last_error();
1645 if err != Error::None_ {
1646 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1647 }
1648 Ok(isl_rs_result)
1649 }
1650
1651 pub fn sequence_splice_child(self, pos: i32) -> Result<ScheduleNode, LibISLError> {
1653 let node = self;
1654 let isl_rs_ctx = node.get_ctx();
1655 let mut node = node;
1656 node.do_not_free_on_drop();
1657 let node = node.ptr;
1658 let isl_rs_result = unsafe { isl_schedule_node_sequence_splice_child(node, pos) };
1659 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1660 should_free_on_drop: true };
1661 let err = isl_rs_ctx.last_error();
1662 if err != Error::None_ {
1663 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1664 }
1665 Ok(isl_rs_result)
1666 }
1667
1668 pub fn sequence_splice_children(self) -> Result<ScheduleNode, LibISLError> {
1670 let node = self;
1671 let isl_rs_ctx = node.get_ctx();
1672 let mut node = node;
1673 node.do_not_free_on_drop();
1674 let node = node.ptr;
1675 let isl_rs_result = unsafe { isl_schedule_node_sequence_splice_children(node) };
1676 let isl_rs_result = ScheduleNode { ptr: isl_rs_result,
1677 should_free_on_drop: true };
1678 let err = isl_rs_ctx.last_error();
1679 if err != Error::None_ {
1680 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1681 }
1682 Ok(isl_rs_result)
1683 }
1684
1685 pub fn to_str(&self) -> Result<&str, LibISLError> {
1687 let node = self;
1688 let isl_rs_ctx = node.get_ctx();
1689 let node = node.ptr;
1690 let isl_rs_result = unsafe { isl_schedule_node_to_str(node) };
1691 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
1692 let isl_rs_result = isl_rs_result.to_str().unwrap();
1693 let err = isl_rs_ctx.last_error();
1694 if err != Error::None_ {
1695 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
1696 }
1697 Ok(isl_rs_result)
1698 }
1699
1700 pub fn do_not_free_on_drop(&mut self) {
1703 self.should_free_on_drop = false;
1704 }
1705}
1706
1707impl Drop for ScheduleNode {
1708 fn drop(&mut self) {
1709 if self.should_free_on_drop {
1710 unsafe {
1711 isl_schedule_node_free(self.ptr);
1712 }
1713 }
1714 }
1715}