use super::{Context, Error, LibISLError, Schedule, UnionFlow, UnionMap};
use libc::uintptr_t;
use std::ffi::CStr;
use std::os::raw::c_char;
pub struct UnionAccessInfo {
pub ptr: uintptr_t,
pub should_free_on_drop: bool,
}
extern "C" {
fn isl_union_access_info_compute_flow(access: uintptr_t) -> uintptr_t;
fn isl_union_access_info_copy(access: uintptr_t) -> uintptr_t;
fn isl_union_access_info_free(access: uintptr_t) -> uintptr_t;
fn isl_union_access_info_from_sink(sink: uintptr_t) -> uintptr_t;
fn isl_union_access_info_get_ctx(access: uintptr_t) -> uintptr_t;
fn isl_union_access_info_set_kill(access: uintptr_t, kill: uintptr_t) -> uintptr_t;
fn isl_union_access_info_set_may_source(access: uintptr_t, may_source: uintptr_t) -> uintptr_t;
fn isl_union_access_info_set_must_source(access: uintptr_t, must_source: uintptr_t)
-> uintptr_t;
fn isl_union_access_info_set_schedule(access: uintptr_t, schedule: uintptr_t) -> uintptr_t;
fn isl_union_access_info_set_schedule_map(access: uintptr_t, schedule_map: uintptr_t)
-> uintptr_t;
fn isl_union_access_info_to_str(access: uintptr_t) -> *const c_char;
}
impl UnionAccessInfo {
pub fn compute_flow(self) -> Result<UnionFlow, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let mut access = access;
access.do_not_free_on_drop();
let access = access.ptr;
let isl_rs_result = unsafe { isl_union_access_info_compute_flow(access) };
let isl_rs_result = UnionFlow { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn copy(&self) -> Result<UnionAccessInfo, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let access = access.ptr;
let isl_rs_result = unsafe { isl_union_access_info_copy(access) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn free(self) -> Result<UnionAccessInfo, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let mut access = access;
access.do_not_free_on_drop();
let access = access.ptr;
let isl_rs_result = unsafe { isl_union_access_info_free(access) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn from_sink(sink: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
let isl_rs_ctx = sink.get_ctx();
let mut sink = sink;
sink.do_not_free_on_drop();
let sink = sink.ptr;
let isl_rs_result = unsafe { isl_union_access_info_from_sink(sink) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn get_ctx(&self) -> Context {
let access = self;
let access = access.ptr;
let isl_rs_result = unsafe { isl_union_access_info_get_ctx(access) };
let isl_rs_result = Context { ptr: isl_rs_result,
should_free_on_drop: false };
isl_rs_result
}
pub fn set_kill(self, kill: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let mut access = access;
access.do_not_free_on_drop();
let access = access.ptr;
let mut kill = kill;
kill.do_not_free_on_drop();
let kill = kill.ptr;
let isl_rs_result = unsafe { isl_union_access_info_set_kill(access, kill) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn set_may_source(self, may_source: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let mut access = access;
access.do_not_free_on_drop();
let access = access.ptr;
let mut may_source = may_source;
may_source.do_not_free_on_drop();
let may_source = may_source.ptr;
let isl_rs_result = unsafe { isl_union_access_info_set_may_source(access, may_source) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn set_must_source(self, must_source: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let mut access = access;
access.do_not_free_on_drop();
let access = access.ptr;
let mut must_source = must_source;
must_source.do_not_free_on_drop();
let must_source = must_source.ptr;
let isl_rs_result = unsafe { isl_union_access_info_set_must_source(access, must_source) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn set_schedule(self, schedule: Schedule) -> Result<UnionAccessInfo, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let mut access = access;
access.do_not_free_on_drop();
let access = access.ptr;
let mut schedule = schedule;
schedule.do_not_free_on_drop();
let schedule = schedule.ptr;
let isl_rs_result = unsafe { isl_union_access_info_set_schedule(access, schedule) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn set_schedule_map(self, schedule_map: UnionMap) -> Result<UnionAccessInfo, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let mut access = access;
access.do_not_free_on_drop();
let access = access.ptr;
let mut schedule_map = schedule_map;
schedule_map.do_not_free_on_drop();
let schedule_map = schedule_map.ptr;
let isl_rs_result = unsafe { isl_union_access_info_set_schedule_map(access, schedule_map) };
let isl_rs_result = UnionAccessInfo { ptr: isl_rs_result,
should_free_on_drop: true };
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn to_str(&self) -> Result<&str, LibISLError> {
let access = self;
let isl_rs_ctx = access.get_ctx();
let access = access.ptr;
let isl_rs_result = unsafe { isl_union_access_info_to_str(access) };
let isl_rs_result = unsafe { CStr::from_ptr(isl_rs_result) };
let isl_rs_result = isl_rs_result.to_str().unwrap();
let err = isl_rs_ctx.last_error();
if err != Error::None_ {
let err_msg = isl_rs_ctx.last_error_msg();
isl_rs_ctx.reset_error();
return Err(LibISLError::new(err, err_msg));
}
Ok(isl_rs_result)
}
pub fn do_not_free_on_drop(&mut self) {
self.should_free_on_drop = false;
}
}
impl Drop for UnionAccessInfo {
fn drop(&mut self) {
if self.should_free_on_drop {
unsafe {
isl_union_access_info_free(self.ptr);
}
}
}
}