use crate::builder::CanBeAddedToModel;
use crate::{Model, NodeSel, ProblemCreated};
pub struct NodeSelBuilder<N: NodeSel> {
name: Option<String>,
desc: Option<String>,
std_priority: i32,
mem_save_priority: i32,
nodesel: N,
}
impl<N: NodeSel> NodeSelBuilder<N> {
pub fn new(nodesel: N) -> Self {
NodeSelBuilder {
name: None,
desc: None,
std_priority: 1000000,
mem_save_priority: 1000000,
nodesel,
}
}
pub fn name(mut self, name: &str) -> Self {
self.name = Some(name.to_string());
self
}
pub fn desc(mut self, desc: &str) -> Self {
self.desc = Some(desc.to_string());
self
}
pub fn std_priority(mut self, priority: i32) -> Self {
self.std_priority = priority;
self
}
pub fn mem_save_priority(mut self, priority: i32) -> Self {
self.mem_save_priority = priority;
self
}
}
pub fn nodesel<N: NodeSel>(nodesel: N) -> NodeSelBuilder<N> {
NodeSelBuilder::new(nodesel)
}
impl<N: NodeSel + 'static> CanBeAddedToModel<ProblemCreated> for NodeSelBuilder<N> {
type Return = ();
fn add(self, model: &mut Model<ProblemCreated>) {
let name = self.name.unwrap_or_else(|| "".into());
let desc = self.desc.unwrap_or_else(|| "".into());
let nodesel_box = Box::new(self.nodesel);
model.include_nodesel(
&name,
&desc,
self.std_priority,
self.mem_save_priority,
nodesel_box,
);
}
}
impl<N: NodeSel> From<N> for NodeSelBuilder<N> {
fn from(nodesel: N) -> Self {
NodeSelBuilder::new(nodesel)
}
}