use crate::scip::ScipPtr;
use crate::{ffi, Row};
use std::rc::Rc;
#[derive(Debug, Clone)]
#[allow(dead_code)]
pub struct Constraint {
pub(crate) raw: *mut ffi::SCIP_CONS,
pub(crate) scip: Rc<ScipPtr>,
}
impl Constraint {
pub fn inner(&self) -> *mut ffi::SCIP_CONS {
self.raw
}
pub fn name(&self) -> String {
unsafe {
let name = ffi::SCIPconsGetName(self.raw);
String::from(std::ffi::CStr::from_ptr(name).to_str().unwrap())
}
}
pub fn row(&self) -> Option<Row> {
let row_ptr = unsafe { ffi::SCIPconsGetRow(self.scip.raw, self.raw) };
if row_ptr.is_null() {
None
} else {
Some(Row {
raw: row_ptr,
scip: Rc::clone(&self.scip),
})
}
}
}
#[cfg(test)]
mod tests {
use crate::prelude::*;
#[test]
fn test_constraint_mem_safety() {
let mut model = Model::new()
.hide_output()
.include_default_plugins()
.create_prob("test")
.set_obj_sense(ObjSense::Maximize);
let x1 = model.add_var(0., f64::INFINITY, 3., "x1", VarType::Integer);
let cons = model.add_cons(vec![&x1], &[1.], 4., 4., "cons");
drop(model);
assert_eq!(cons.name(), "cons");
}
}