isl_rs/bindings/
vertex.rs1use super::{BasicSet, Context, Error, LibISLError, MultiAff};
5use libc::uintptr_t;
6
7pub struct Vertex {
9 pub ptr: uintptr_t,
10 pub should_free_on_drop: bool,
11}
12
13extern "C" {
14
15 fn isl_vertex_free(vertex: uintptr_t) -> uintptr_t;
16
17 fn isl_vertex_get_ctx(vertex: uintptr_t) -> uintptr_t;
18
19 fn isl_vertex_get_domain(vertex: uintptr_t) -> uintptr_t;
20
21 fn isl_vertex_get_expr(vertex: uintptr_t) -> uintptr_t;
22
23 fn isl_vertex_get_id(vertex: uintptr_t) -> i32;
24
25}
26
27impl Vertex {
28 pub fn free(self) -> Result<Vertex, LibISLError> {
30 let vertex = self;
31 let isl_rs_ctx = vertex.get_ctx();
32 let mut vertex = vertex;
33 vertex.do_not_free_on_drop();
34 let vertex = vertex.ptr;
35 let isl_rs_result = unsafe { isl_vertex_free(vertex) };
36 let isl_rs_result = Vertex { ptr: isl_rs_result,
37 should_free_on_drop: true };
38 let err = isl_rs_ctx.last_error();
39 if err != Error::None_ {
40 let err_msg = isl_rs_ctx.last_error_msg();
41 isl_rs_ctx.reset_error();
42 return Err(LibISLError::new(err, err_msg));
43 }
44 Ok(isl_rs_result)
45 }
46
47 pub fn get_ctx(&self) -> Context {
49 let vertex = self;
50 let vertex = vertex.ptr;
51 let isl_rs_result = unsafe { isl_vertex_get_ctx(vertex) };
52 let isl_rs_result = Context { ptr: isl_rs_result,
53 should_free_on_drop: false };
54 isl_rs_result
55 }
56
57 pub fn get_domain(&self) -> Result<BasicSet, LibISLError> {
59 let vertex = self;
60 let isl_rs_ctx = vertex.get_ctx();
61 let vertex = vertex.ptr;
62 let isl_rs_result = unsafe { isl_vertex_get_domain(vertex) };
63 let isl_rs_result = BasicSet { ptr: isl_rs_result,
64 should_free_on_drop: true };
65 let err = isl_rs_ctx.last_error();
66 if err != Error::None_ {
67 let err_msg = isl_rs_ctx.last_error_msg();
68 isl_rs_ctx.reset_error();
69 return Err(LibISLError::new(err, err_msg));
70 }
71 Ok(isl_rs_result)
72 }
73
74 pub fn get_expr(&self) -> Result<MultiAff, LibISLError> {
76 let vertex = self;
77 let isl_rs_ctx = vertex.get_ctx();
78 let vertex = vertex.ptr;
79 let isl_rs_result = unsafe { isl_vertex_get_expr(vertex) };
80 let isl_rs_result = MultiAff { 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_id(&self) -> Result<i32, LibISLError> {
93 let vertex = self;
94 let isl_rs_ctx = vertex.get_ctx();
95 let vertex = vertex.ptr;
96 let isl_rs_result = unsafe { isl_vertex_get_id(vertex) };
97 let err = isl_rs_ctx.last_error();
98 if err != Error::None_ {
99 let err_msg = isl_rs_ctx.last_error_msg();
100 isl_rs_ctx.reset_error();
101 return Err(LibISLError::new(err, err_msg));
102 }
103 Ok(isl_rs_result)
104 }
105
106 pub fn do_not_free_on_drop(&mut self) {
109 self.should_free_on_drop = false;
110 }
111}
112
113impl Drop for Vertex {
114 fn drop(&mut self) {
115 if self.should_free_on_drop {
116 unsafe {
117 isl_vertex_free(self.ptr);
118 }
119 }
120 }
121}