#![allow(dead_code)]
use crate::btor::Btor;
use boolector_sys::*;
use std::borrow::Borrow;
pub struct Sort<R: Borrow<Btor> + Clone> {
btor: R,
sort: BoolectorSort,
}
unsafe impl<R: Borrow<Btor> + Clone + Send> Send for Sort<R> {}
unsafe impl<R: Borrow<Btor> + Clone + Sync> Sync for Sort<R> {}
impl<R: Borrow<Btor> + Clone> Sort<R> {
pub(crate) fn from_raw(btor: R, sort: BoolectorSort) -> Self {
Self { btor, sort }
}
pub(crate) fn as_raw(&self) -> BoolectorSort {
self.sort
}
pub fn bitvector(btor: R, width: u32) -> Self {
assert!(width > 0, "boolector: cannot create 0-width bitvector sort");
Self::from_raw(btor.clone(), unsafe {
boolector_bitvec_sort(btor.borrow().as_raw(), width)
})
}
pub fn bool(btor: R) -> Self {
Self::from_raw(btor.clone(), unsafe {
boolector_bool_sort(btor.borrow().as_raw())
})
}
pub fn array(btor: R, index: &Sort<R>, element: &Sort<R>) -> Self {
Self::from_raw(btor.clone(), unsafe {
boolector_array_sort(btor.borrow().as_raw(), index.as_raw(), element.as_raw())
})
}
pub fn is_array_sort(&self) -> bool {
unsafe { boolector_is_array_sort(self.btor.borrow().as_raw(), self.as_raw()) }
}
pub fn is_bv_sort(&self) -> bool {
unsafe { boolector_is_bitvec_sort(self.btor.borrow().as_raw(), self.as_raw()) }
}
pub fn is_fun_sort(&self) -> bool {
unsafe { boolector_is_fun_sort(self.btor.borrow().as_raw(), self.as_raw()) }
}
}
impl<R: Borrow<Btor> + Clone> Drop for Sort<R> {
fn drop(&mut self) {
unsafe { boolector_release_sort(self.btor.borrow().as_raw(), self.as_raw()) }
}
}