isl_rs/bindings/
term.rs

1// Automatically generated by isl_bindings_generator.
2// LICENSE: MIT
3
4use super::{Aff, Context, DimType, Error, LibISLError, Val};
5use libc::uintptr_t;
6
7/// Wraps `isl_term`.
8pub struct Term {
9    pub ptr: uintptr_t,
10    pub should_free_on_drop: bool,
11}
12
13extern "C" {
14
15    fn isl_term_copy(term: uintptr_t) -> uintptr_t;
16
17    fn isl_term_dim(term: uintptr_t, type_: i32) -> i32;
18
19    fn isl_term_free(term: uintptr_t) -> uintptr_t;
20
21    fn isl_term_get_coefficient_val(term: uintptr_t) -> uintptr_t;
22
23    fn isl_term_get_ctx(term: uintptr_t) -> uintptr_t;
24
25    fn isl_term_get_div(term: uintptr_t, pos: u32) -> uintptr_t;
26
27    fn isl_term_get_exp(term: uintptr_t, type_: i32, pos: u32) -> i32;
28
29}
30
31impl Term {
32    /// Wraps `isl_term_copy`.
33    pub fn copy(&self) -> Result<Term, LibISLError> {
34        let term = self;
35        let isl_rs_ctx = term.get_ctx();
36        let term = term.ptr;
37        let isl_rs_result = unsafe { isl_term_copy(term) };
38        let isl_rs_result = Term { ptr: isl_rs_result,
39                                   should_free_on_drop: true };
40        let err = isl_rs_ctx.last_error();
41        if err != Error::None_ {
42            let err_msg = isl_rs_ctx.last_error_msg();
43            isl_rs_ctx.reset_error();
44            return Err(LibISLError::new(err, err_msg));
45        }
46        Ok(isl_rs_result)
47    }
48
49    /// Wraps `isl_term_dim`.
50    pub fn dim(&self, type_: DimType) -> Result<i32, LibISLError> {
51        let term = self;
52        let isl_rs_ctx = term.get_ctx();
53        let term = term.ptr;
54        let type_ = type_.to_i32();
55        let isl_rs_result = unsafe { isl_term_dim(term, type_) };
56        let err = isl_rs_ctx.last_error();
57        if err != Error::None_ {
58            let err_msg = isl_rs_ctx.last_error_msg();
59            isl_rs_ctx.reset_error();
60            return Err(LibISLError::new(err, err_msg));
61        }
62        Ok(isl_rs_result)
63    }
64
65    /// Wraps `isl_term_free`.
66    pub fn free(self) -> Result<Term, LibISLError> {
67        let term = self;
68        let isl_rs_ctx = term.get_ctx();
69        let mut term = term;
70        term.do_not_free_on_drop();
71        let term = term.ptr;
72        let isl_rs_result = unsafe { isl_term_free(term) };
73        let isl_rs_result = Term { ptr: isl_rs_result,
74                                   should_free_on_drop: true };
75        let err = isl_rs_ctx.last_error();
76        if err != Error::None_ {
77            let err_msg = isl_rs_ctx.last_error_msg();
78            isl_rs_ctx.reset_error();
79            return Err(LibISLError::new(err, err_msg));
80        }
81        Ok(isl_rs_result)
82    }
83
84    /// Wraps `isl_term_get_coefficient_val`.
85    pub fn get_coefficient_val(&self) -> Result<Val, LibISLError> {
86        let term = self;
87        let isl_rs_ctx = term.get_ctx();
88        let term = term.ptr;
89        let isl_rs_result = unsafe { isl_term_get_coefficient_val(term) };
90        let isl_rs_result = Val { ptr: isl_rs_result,
91                                  should_free_on_drop: true };
92        let err = isl_rs_ctx.last_error();
93        if err != Error::None_ {
94            let err_msg = isl_rs_ctx.last_error_msg();
95            isl_rs_ctx.reset_error();
96            return Err(LibISLError::new(err, err_msg));
97        }
98        Ok(isl_rs_result)
99    }
100
101    /// Wraps `isl_term_get_ctx`.
102    pub fn get_ctx(&self) -> Context {
103        let term = self;
104        let term = term.ptr;
105        let isl_rs_result = unsafe { isl_term_get_ctx(term) };
106        let isl_rs_result = Context { ptr: isl_rs_result,
107                                      should_free_on_drop: false };
108        isl_rs_result
109    }
110
111    /// Wraps `isl_term_get_div`.
112    pub fn get_div(&self, pos: u32) -> Result<Aff, LibISLError> {
113        let term = self;
114        let isl_rs_ctx = term.get_ctx();
115        let term = term.ptr;
116        let isl_rs_result = unsafe { isl_term_get_div(term, pos) };
117        let isl_rs_result = Aff { ptr: isl_rs_result,
118                                  should_free_on_drop: true };
119        let err = isl_rs_ctx.last_error();
120        if err != Error::None_ {
121            let err_msg = isl_rs_ctx.last_error_msg();
122            isl_rs_ctx.reset_error();
123            return Err(LibISLError::new(err, err_msg));
124        }
125        Ok(isl_rs_result)
126    }
127
128    /// Wraps `isl_term_get_exp`.
129    pub fn get_exp(&self, type_: DimType, pos: u32) -> Result<i32, LibISLError> {
130        let term = self;
131        let isl_rs_ctx = term.get_ctx();
132        let term = term.ptr;
133        let type_ = type_.to_i32();
134        let isl_rs_result = unsafe { isl_term_get_exp(term, type_, pos) };
135        let err = isl_rs_ctx.last_error();
136        if err != Error::None_ {
137            let err_msg = isl_rs_ctx.last_error_msg();
138            isl_rs_ctx.reset_error();
139            return Err(LibISLError::new(err, err_msg));
140        }
141        Ok(isl_rs_result)
142    }
143
144    /// Does not call isl_term_free() on being dropped. (For internal use only.)
145    pub fn do_not_free_on_drop(&mut self) {
146        self.should_free_on_drop = false;
147    }
148}
149
150impl Drop for Term {
151    fn drop(&mut self) {
152        if self.should_free_on_drop {
153            unsafe {
154                isl_term_free(self.ptr);
155            }
156        }
157    }
158}