isl_rs/bindings/
context.rs1use libc::uintptr_t;
5use std::ffi::{CStr, CString};
6use std::os::raw::c_char;
7
8pub struct Context {
10 pub ptr: uintptr_t,
11 pub should_free_on_drop: bool,
12}
13
14extern "C" {
15
16 fn isl_ctx_alloc() -> uintptr_t;
17
18 fn isl_ctx_ref(ctx: uintptr_t);
19
20 fn isl_ctx_deref(ctx: uintptr_t);
21
22 fn isl_ctx_free(ctx: uintptr_t);
23
24 fn isl_ctx_abort(ctx: uintptr_t);
25
26 fn isl_ctx_resume(ctx: uintptr_t);
27
28 fn isl_ctx_aborted(ctx: uintptr_t) -> i32;
29
30 fn isl_ctx_set_max_operations(ctx: uintptr_t, max_operations: u64);
31
32 fn isl_ctx_get_max_operations(ctx: uintptr_t) -> u64;
33
34 fn isl_ctx_reset_operations(ctx: uintptr_t);
35
36 fn isl_ctx_last_error_msg(ctx: uintptr_t) -> *const c_char;
37
38 fn isl_ctx_last_error_file(ctx: uintptr_t) -> *const c_char;
39
40 fn isl_ctx_last_error_line(ctx: uintptr_t) -> i32;
41
42 fn isl_ctx_reset_error(ctx: uintptr_t);
43
44}
45
46impl Context {
47 pub fn alloc() -> Context {
49 let isl_rs_result = unsafe { isl_ctx_alloc() };
50 let isl_rs_result = Context { ptr: isl_rs_result,
51 should_free_on_drop: true };
52 isl_rs_result
53 }
54
55 pub fn incref(&self) {
57 let ctx = self;
58 let ctx = ctx.ptr;
59 let isl_rs_result = unsafe { isl_ctx_ref(ctx) };
60 isl_rs_result
61 }
62
63 pub fn deref(&self) {
65 let ctx = self;
66 let ctx = ctx.ptr;
67 let isl_rs_result = unsafe { isl_ctx_deref(ctx) };
68 isl_rs_result
69 }
70
71 pub fn free(&self) {
73 let ctx = self;
74 let ctx = ctx.ptr;
75 let isl_rs_result = unsafe { isl_ctx_free(ctx) };
76 isl_rs_result
77 }
78
79 pub fn abort(&self) {
81 let ctx = self;
82 let ctx = ctx.ptr;
83 let isl_rs_result = unsafe { isl_ctx_abort(ctx) };
84 isl_rs_result
85 }
86
87 pub fn resume(&self) {
89 let ctx = self;
90 let ctx = ctx.ptr;
91 let isl_rs_result = unsafe { isl_ctx_resume(ctx) };
92 isl_rs_result
93 }
94
95 pub fn aborted(&self) -> i32 {
97 let ctx = self;
98 let ctx = ctx.ptr;
99 let isl_rs_result = unsafe { isl_ctx_aborted(ctx) };
100 isl_rs_result
101 }
102
103 pub fn set_max_operations(&self, max_operations: u64) {
105 let ctx = self;
106 let ctx = ctx.ptr;
107 let isl_rs_result = unsafe { isl_ctx_set_max_operations(ctx, max_operations) };
108 isl_rs_result
109 }
110
111 pub fn get_max_operations(&self) -> u64 {
113 let ctx = self;
114 let ctx = ctx.ptr;
115 let isl_rs_result = unsafe { isl_ctx_get_max_operations(ctx) };
116 isl_rs_result
117 }
118
119 pub fn reset_operations(&self) {
121 let ctx = self;
122 let ctx = ctx.ptr;
123 let isl_rs_result = unsafe { isl_ctx_reset_operations(ctx) };
124 isl_rs_result
125 }
126
127 pub fn last_error_msg(&self) -> &str {
129 let ctx = self;
130 let ctx = ctx.ptr;
131 let isl_rs_result = unsafe { isl_ctx_last_error_msg(ctx) };
132 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
133 let isl_rs_result = isl_rs_result.to_str().unwrap();
134 isl_rs_result
135 }
136
137 pub fn last_error_file(&self) -> &str {
139 let ctx = self;
140 let ctx = ctx.ptr;
141 let isl_rs_result = unsafe { isl_ctx_last_error_file(ctx) };
142 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
143 let isl_rs_result = isl_rs_result.to_str().unwrap();
144 isl_rs_result
145 }
146
147 pub fn last_error_line(&self) -> i32 {
149 let ctx = self;
150 let ctx = ctx.ptr;
151 let isl_rs_result = unsafe { isl_ctx_last_error_line(ctx) };
152 isl_rs_result
153 }
154
155 pub fn reset_error(&self) {
157 let ctx = self;
158 let ctx = ctx.ptr;
159 let isl_rs_result = unsafe { isl_ctx_reset_error(ctx) };
160 isl_rs_result
161 }
162
163 pub fn do_not_free_on_drop(&mut self) {
165 self.should_free_on_drop = false;
166 }
167}
168
169impl Drop for Context {
170 fn drop(&mut self) {
171 if self.should_free_on_drop {
172 unsafe {
173 isl_ctx_free(self.ptr);
174 }
175 }
176 }
177}