use log::warn;
use super::Constraint;
use super::NegatableConstraint;
use crate::Solver;
use crate::variables::Literal;
#[derive(Debug)]
pub struct ConstraintPoster<'solver, ConstraintImpl> {
solver: &'solver mut Solver,
constraint: Option<ConstraintImpl>,
}
impl<'a, ConstraintImpl> ConstraintPoster<'a, ConstraintImpl> {
pub(crate) fn new(solver: &'a mut Solver, constraint: ConstraintImpl) -> Self {
ConstraintPoster {
solver,
constraint: Some(constraint),
}
}
}
impl<ConstraintImpl: Constraint> ConstraintPoster<'_, ConstraintImpl> {
pub fn post(mut self) {
self.constraint.take().unwrap().post(self.solver)
}
pub fn implied_by(mut self, reification_literal: Literal) {
self.constraint
.take()
.unwrap()
.implied_by(self.solver, reification_literal)
}
}
impl<ConstraintImpl: NegatableConstraint> ConstraintPoster<'_, ConstraintImpl> {
pub fn reify(mut self, reification_literal: Literal) {
self.constraint
.take()
.unwrap()
.reify(self.solver, reification_literal)
}
}
impl<ConstraintImpl> Drop for ConstraintPoster<'_, ConstraintImpl> {
fn drop(&mut self) {
if self.constraint.is_some() {
warn!("A constraint poster is never used, this is likely a mistake.");
}
}
}