isl_rs/bindings/
stride_info.rs1use super::{Aff, Context, Error, LibISLError, Val};
5use libc::uintptr_t;
6
7pub struct StrideInfo {
9 pub ptr: uintptr_t,
10 pub should_free_on_drop: bool,
11}
12
13extern "C" {
14
15 fn isl_stride_info_copy(si: uintptr_t) -> uintptr_t;
16
17 fn isl_stride_info_free(si: uintptr_t) -> uintptr_t;
18
19 fn isl_stride_info_get_ctx(si: uintptr_t) -> uintptr_t;
20
21 fn isl_stride_info_get_offset(si: uintptr_t) -> uintptr_t;
22
23 fn isl_stride_info_get_stride(si: uintptr_t) -> uintptr_t;
24
25}
26
27impl StrideInfo {
28 pub fn copy(&self) -> Result<StrideInfo, LibISLError> {
30 let si = self;
31 let isl_rs_ctx = si.get_ctx();
32 let si = si.ptr;
33 let isl_rs_result = unsafe { isl_stride_info_copy(si) };
34 let isl_rs_result = StrideInfo { ptr: isl_rs_result,
35 should_free_on_drop: true };
36 let err = isl_rs_ctx.last_error();
37 if err != Error::None_ {
38 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
39 }
40 Ok(isl_rs_result)
41 }
42
43 pub fn free(self) -> Result<StrideInfo, LibISLError> {
45 let si = self;
46 let isl_rs_ctx = si.get_ctx();
47 let mut si = si;
48 si.do_not_free_on_drop();
49 let si = si.ptr;
50 let isl_rs_result = unsafe { isl_stride_info_free(si) };
51 let isl_rs_result = StrideInfo { ptr: isl_rs_result,
52 should_free_on_drop: true };
53 let err = isl_rs_ctx.last_error();
54 if err != Error::None_ {
55 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
56 }
57 Ok(isl_rs_result)
58 }
59
60 pub fn get_ctx(&self) -> Context {
62 let si = self;
63 let si = si.ptr;
64 let isl_rs_result = unsafe { isl_stride_info_get_ctx(si) };
65 let isl_rs_result = Context { ptr: isl_rs_result,
66 should_free_on_drop: false };
67 isl_rs_result
68 }
69
70 pub fn get_offset(&self) -> Result<Aff, LibISLError> {
72 let si = self;
73 let isl_rs_ctx = si.get_ctx();
74 let si = si.ptr;
75 let isl_rs_result = unsafe { isl_stride_info_get_offset(si) };
76 let isl_rs_result = Aff { 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_stride(&self) -> Result<Val, LibISLError> {
87 let si = self;
88 let isl_rs_ctx = si.get_ctx();
89 let si = si.ptr;
90 let isl_rs_result = unsafe { isl_stride_info_get_stride(si) };
91 let isl_rs_result = Val { ptr: isl_rs_result,
92 should_free_on_drop: true };
93 let err = isl_rs_ctx.last_error();
94 if err != Error::None_ {
95 return Err(LibISLError::new(err, isl_rs_ctx.last_error_msg()));
96 }
97 Ok(isl_rs_result)
98 }
99
100 pub fn do_not_free_on_drop(&mut self) {
103 self.should_free_on_drop = false;
104 }
105}
106
107impl Drop for StrideInfo {
108 fn drop(&mut self) {
109 if self.should_free_on_drop {
110 unsafe {
111 isl_stride_info_free(self.ptr);
112 }
113 }
114 }
115}