use super::{Error, Options};
use libc::uintptr_t;
use std::ffi::CStr;
use std::os::raw::c_char;
pub struct Context {
pub ptr: uintptr_t,
pub should_free_on_drop: bool,
}
extern "C" {
fn isl_ctx_abort(ctx: uintptr_t) -> ();
fn isl_ctx_aborted(ctx: uintptr_t) -> i32;
fn isl_ctx_alloc() -> uintptr_t;
fn isl_ctx_deref(ctx: uintptr_t) -> ();
fn isl_ctx_free(ctx: uintptr_t) -> ();
fn isl_ctx_get_max_operations(ctx: uintptr_t) -> u64;
fn isl_ctx_last_error(ctx: uintptr_t) -> i32;
fn isl_ctx_last_error_file(ctx: uintptr_t) -> *const c_char;
fn isl_ctx_last_error_line(ctx: uintptr_t) -> i32;
fn isl_ctx_last_error_msg(ctx: uintptr_t) -> *const c_char;
fn isl_ctx_options(ctx: uintptr_t) -> uintptr_t;
fn isl_ctx_ref(ctx: uintptr_t) -> ();
fn isl_ctx_reset_error(ctx: uintptr_t) -> ();
fn isl_ctx_reset_operations(ctx: uintptr_t) -> ();
fn isl_ctx_resume(ctx: uintptr_t) -> ();
fn isl_ctx_set_error(ctx: uintptr_t, error: i32) -> ();
fn isl_ctx_set_max_operations(ctx: uintptr_t, max_operations: u64) -> ();
}
impl Context {
pub fn abort(&self) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_abort(ctx) };
isl_rs_result
}
pub fn aborted(&self) -> i32 {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_aborted(ctx) };
isl_rs_result
}
pub fn alloc() -> Context {
let isl_rs_result = unsafe { isl_ctx_alloc() };
let isl_rs_result = Context { ptr: isl_rs_result,
should_free_on_drop: true };
isl_rs_result
}
pub fn deref(&self) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_deref(ctx) };
isl_rs_result
}
pub fn free(&self) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_free(ctx) };
isl_rs_result
}
pub fn get_max_operations(&self) -> u64 {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_get_max_operations(ctx) };
isl_rs_result
}
pub fn last_error(&self) -> Error {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_last_error(ctx) };
let isl_rs_result = Error::from_i32(isl_rs_result);
isl_rs_result
}
pub fn last_error_file(&self) -> &str {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_last_error_file(ctx) };
let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
let isl_rs_result = isl_rs_result.to_str().unwrap();
isl_rs_result
}
pub fn last_error_line(&self) -> i32 {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_last_error_line(ctx) };
isl_rs_result
}
pub fn last_error_msg(&self) -> &str {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_last_error_msg(ctx) };
let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
let isl_rs_result = isl_rs_result.to_str().unwrap();
isl_rs_result
}
pub fn options(&self) -> Options {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_options(ctx) };
let isl_rs_result = Options { ptr: isl_rs_result,
should_free_on_drop: true };
isl_rs_result
}
pub fn incref(&self) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_ref(ctx) };
isl_rs_result
}
pub fn reset_error(&self) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_reset_error(ctx) };
isl_rs_result
}
pub fn reset_operations(&self) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_reset_operations(ctx) };
isl_rs_result
}
pub fn resume(&self) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_resume(ctx) };
isl_rs_result
}
pub fn set_error(&self, error: Error) -> () {
let ctx = self;
let ctx = ctx.ptr;
let error = error.to_i32();
let isl_rs_result = unsafe { isl_ctx_set_error(ctx, error) };
isl_rs_result
}
pub fn set_max_operations(&self, max_operations: u64) -> () {
let ctx = self;
let ctx = ctx.ptr;
let isl_rs_result = unsafe { isl_ctx_set_max_operations(ctx, max_operations) };
isl_rs_result
}
pub fn do_not_free_on_drop(&mut self) {
self.should_free_on_drop = false;
}
}
impl Drop for Context {
fn drop(&mut self) {
if self.should_free_on_drop {
unsafe {
isl_ctx_free(self.ptr);
}
}
}
}