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 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
41 }
42 Ok(isl_rs_result)
43 }
44
45 pub fn get_ctx(&self) -> Context {
47 let vertex = self;
48 let vertex = vertex.ptr;
49 let isl_rs_result = unsafe { isl_vertex_get_ctx(vertex) };
50 let isl_rs_result = Context { ptr: isl_rs_result,
51 should_free_on_drop: false };
52 isl_rs_result
53 }
54
55 pub fn get_domain(&self) -> Result<BasicSet, LibISLError> {
57 let vertex = self;
58 let isl_rs_ctx = vertex.get_ctx();
59 let vertex = vertex.ptr;
60 let isl_rs_result = unsafe { isl_vertex_get_domain(vertex) };
61 let isl_rs_result = BasicSet { ptr: isl_rs_result,
62 should_free_on_drop: true };
63 let err = isl_rs_ctx.last_error();
64 if err != Error::None_ {
65 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
66 }
67 Ok(isl_rs_result)
68 }
69
70 pub fn get_expr(&self) -> Result<MultiAff, LibISLError> {
72 let vertex = self;
73 let isl_rs_ctx = vertex.get_ctx();
74 let vertex = vertex.ptr;
75 let isl_rs_result = unsafe { isl_vertex_get_expr(vertex) };
76 let isl_rs_result = MultiAff { 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 get_id(&self) -> Result<i32, LibISLError> {
87 let vertex = self;
88 let isl_rs_ctx = vertex.get_ctx();
89 let vertex = vertex.ptr;
90 let isl_rs_result = unsafe { isl_vertex_get_id(vertex) };
91 let err = isl_rs_ctx.last_error();
92 if err != Error::None_ {
93 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
94 }
95 Ok(isl_rs_result)
96 }
97
98 pub fn do_not_free_on_drop(&mut self) {
101 self.should_free_on_drop = false;
102 }
103}
104
105impl Drop for Vertex {
106 fn drop(&mut self) {
107 if self.should_free_on_drop {
108 unsafe {
109 isl_vertex_free(self.ptr);
110 }
111 }
112 }
113}