mod intvar;
pub use intvar::*;
use std::fmt::Display;
use crate::utils::{HandleT, ModelObject};
use crate::{CHOCO_BACKEND, CHOCO_LIB, Sealed};
#[allow(private_bounds)]
#[doc(hidden)]
pub unsafe trait Variable<'model>: ModelObject<'model> + Sealed {
fn name(&self) -> String {
CHOCO_BACKEND.with(|backend|
unsafe {
let name_ptr = CHOCO_LIB.Java_org_chocosolver_capi_VariableApi_getName(backend.thread,self.get_raw_handle());
debug_assert!(!name_ptr.is_null(), "Variable name pointer is null");
let c_str = std::ffi::CStr::from_ptr(name_ptr);
c_str.to_string_lossy().into_owned()
})
}
fn is_instantiated(&self) -> bool {
CHOCO_BACKEND.with(|backend|
unsafe {
let result = CHOCO_LIB.Java_org_chocosolver_capi_VariableApi_isInstantiated(backend.thread, self.get_raw_handle());
result != 0
})
}
fn is_view(&self) -> bool {
CHOCO_BACKEND.with(|backend|
unsafe {
let result = CHOCO_LIB.Java_org_chocosolver_capi_VariableApi_isView(backend.thread, self.get_raw_handle());
result != 0
})
}
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn test_variable_name() {
let model = Model::new(Some("TestModel"));
let var = model.int_var(0, Some("TestVar"));
assert_eq!(var.name(), "TestVar");
}
#[test]
fn test_is_view() {
let model = Model::new(Some("TestModel"));
let var = model.int_var(0, Some("TestVar"));
assert!(!var.is_view());
}
}