1use super::{Error, Options};
5use libc::uintptr_t;
6use std::ffi::CStr;
7use std::os::raw::c_char;
8
9pub struct Context {
11 pub ptr: uintptr_t,
12 pub should_free_on_drop: bool,
13}
14
15extern "C" {
16
17 fn isl_ctx_abort(ctx: uintptr_t) -> ();
18
19 fn isl_ctx_aborted(ctx: uintptr_t) -> i32;
20
21 fn isl_ctx_alloc() -> uintptr_t;
22
23 fn isl_ctx_deref(ctx: uintptr_t) -> ();
24
25 fn isl_ctx_free(ctx: uintptr_t) -> ();
26
27 fn isl_ctx_get_max_operations(ctx: uintptr_t) -> u64;
28
29 fn isl_ctx_last_error(ctx: uintptr_t) -> i32;
30
31 fn isl_ctx_last_error_file(ctx: uintptr_t) -> *const c_char;
32
33 fn isl_ctx_last_error_line(ctx: uintptr_t) -> i32;
34
35 fn isl_ctx_last_error_msg(ctx: uintptr_t) -> *const c_char;
36
37 fn isl_ctx_options(ctx: uintptr_t) -> uintptr_t;
38
39 fn isl_ctx_ref(ctx: uintptr_t) -> ();
40
41 fn isl_ctx_reset_error(ctx: uintptr_t) -> ();
42
43 fn isl_ctx_reset_operations(ctx: uintptr_t) -> ();
44
45 fn isl_ctx_resume(ctx: uintptr_t) -> ();
46
47 fn isl_ctx_set_error(ctx: uintptr_t, error: i32) -> ();
48
49 fn isl_ctx_set_max_operations(ctx: uintptr_t, max_operations: u64) -> ();
50
51}
52
53impl Context {
54 pub fn abort(&self) -> () {
56 let ctx = self;
57 let ctx = ctx.ptr;
58 let isl_rs_result = unsafe { isl_ctx_abort(ctx) };
59 isl_rs_result
60 }
61
62 pub fn aborted(&self) -> i32 {
64 let ctx = self;
65 let ctx = ctx.ptr;
66 let isl_rs_result = unsafe { isl_ctx_aborted(ctx) };
67 isl_rs_result
68 }
69
70 pub fn alloc() -> Context {
72 let isl_rs_result = unsafe { isl_ctx_alloc() };
73 let isl_rs_result = Context { ptr: isl_rs_result,
74 should_free_on_drop: true };
75 isl_rs_result
76 }
77
78 pub fn deref(&self) -> () {
80 let ctx = self;
81 let ctx = ctx.ptr;
82 let isl_rs_result = unsafe { isl_ctx_deref(ctx) };
83 isl_rs_result
84 }
85
86 pub fn free(&self) -> () {
88 let ctx = self;
89 let ctx = ctx.ptr;
90 let isl_rs_result = unsafe { isl_ctx_free(ctx) };
91 isl_rs_result
92 }
93
94 pub fn get_max_operations(&self) -> u64 {
96 let ctx = self;
97 let ctx = ctx.ptr;
98 let isl_rs_result = unsafe { isl_ctx_get_max_operations(ctx) };
99 isl_rs_result
100 }
101
102 pub fn last_error(&self) -> Error {
104 let ctx = self;
105 let ctx = ctx.ptr;
106 let isl_rs_result = unsafe { isl_ctx_last_error(ctx) };
107 let isl_rs_result = Error::from_i32(isl_rs_result);
108 isl_rs_result
109 }
110
111 pub fn last_error_file(&self) -> &str {
113 let ctx = self;
114 let ctx = ctx.ptr;
115 let isl_rs_result = unsafe { isl_ctx_last_error_file(ctx) };
116 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
117 let isl_rs_result = isl_rs_result.to_str().unwrap();
118 isl_rs_result
119 }
120
121 pub fn last_error_line(&self) -> i32 {
123 let ctx = self;
124 let ctx = ctx.ptr;
125 let isl_rs_result = unsafe { isl_ctx_last_error_line(ctx) };
126 isl_rs_result
127 }
128
129 pub fn last_error_msg(&self) -> &str {
131 let ctx = self;
132 let ctx = ctx.ptr;
133 let isl_rs_result = unsafe { isl_ctx_last_error_msg(ctx) };
134 let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
135 let isl_rs_result = isl_rs_result.to_str().unwrap();
136 isl_rs_result
137 }
138
139 pub fn options(&self) -> Options {
141 let ctx = self;
142 let ctx = ctx.ptr;
143 let isl_rs_result = unsafe { isl_ctx_options(ctx) };
144 let isl_rs_result = Options { ptr: isl_rs_result,
145 should_free_on_drop: true };
146 isl_rs_result
147 }
148
149 pub fn incref(&self) -> () {
151 let ctx = self;
152 let ctx = ctx.ptr;
153 let isl_rs_result = unsafe { isl_ctx_ref(ctx) };
154 isl_rs_result
155 }
156
157 pub fn reset_error(&self) -> () {
159 let ctx = self;
160 let ctx = ctx.ptr;
161 let isl_rs_result = unsafe { isl_ctx_reset_error(ctx) };
162 isl_rs_result
163 }
164
165 pub fn reset_operations(&self) -> () {
167 let ctx = self;
168 let ctx = ctx.ptr;
169 let isl_rs_result = unsafe { isl_ctx_reset_operations(ctx) };
170 isl_rs_result
171 }
172
173 pub fn resume(&self) -> () {
175 let ctx = self;
176 let ctx = ctx.ptr;
177 let isl_rs_result = unsafe { isl_ctx_resume(ctx) };
178 isl_rs_result
179 }
180
181 pub fn set_error(&self, error: Error) -> () {
183 let ctx = self;
184 let ctx = ctx.ptr;
185 let error = error.to_i32();
186 let isl_rs_result = unsafe { isl_ctx_set_error(ctx, error) };
187 isl_rs_result
188 }
189
190 pub fn set_max_operations(&self, max_operations: u64) -> () {
192 let ctx = self;
193 let ctx = ctx.ptr;
194 let isl_rs_result = unsafe { isl_ctx_set_max_operations(ctx, max_operations) };
195 isl_rs_result
196 }
197
198 pub fn do_not_free_on_drop(&mut self) {
200 self.should_free_on_drop = false;
201 }
202}
203
204impl Drop for Context {
205 fn drop(&mut self) {
206 if self.should_free_on_drop {
207 unsafe {
208 isl_ctx_free(self.ptr);
209 }
210 }
211 }
212}