pumpkin_core/constraints/
constraint_poster.rs1use log::warn;
2
3use super::Constraint;
4use super::NegatableConstraint;
5use crate::variables::Literal;
6use crate::ConstraintOperationError;
7use crate::Solver;
8
9#[derive(Debug)]
12pub struct ConstraintPoster<'solver, ConstraintImpl> {
13 solver: &'solver mut Solver,
14 constraint: Option<ConstraintImpl>,
15}
16
17impl<'a, ConstraintImpl> ConstraintPoster<'a, ConstraintImpl> {
18 pub(crate) fn new(solver: &'a mut Solver, constraint: ConstraintImpl) -> Self {
19 ConstraintPoster {
20 solver,
21 constraint: Some(constraint),
22 }
23 }
24}
25
26impl<ConstraintImpl: Constraint> ConstraintPoster<'_, ConstraintImpl> {
27 pub fn post(mut self) -> Result<(), ConstraintOperationError> {
32 self.constraint.take().unwrap().post(self.solver)
33 }
34
35 pub fn implied_by(
41 mut self,
42 reification_literal: Literal,
43 ) -> Result<(), ConstraintOperationError> {
44 self.constraint
45 .take()
46 .unwrap()
47 .implied_by(self.solver, reification_literal)
48 }
49}
50
51impl<ConstraintImpl: NegatableConstraint> ConstraintPoster<'_, ConstraintImpl> {
52 pub fn reify(mut self, reification_literal: Literal) -> Result<(), ConstraintOperationError> {
58 self.constraint
59 .take()
60 .unwrap()
61 .reify(self.solver, reification_literal)
62 }
63}
64
65impl<ConstraintImpl> Drop for ConstraintPoster<'_, ConstraintImpl> {
66 fn drop(&mut self) {
67 if self.constraint.is_some() {
68 warn!("A constraint poster is never used, this is likely a mistake.");
69 }
70 }
71}