pumpkin_core/engine/variables/
integer_variable.rs1use std::fmt::Debug;
2
3use enumset::EnumSet;
4use pumpkin_checking::CheckerVariable;
5
6use super::TransformableVariable;
7use crate::engine::Assignments;
8use crate::engine::notifications::DomainEvent;
9use crate::engine::notifications::OpaqueDomainEvent;
10use crate::engine::notifications::Watchers;
11use crate::engine::predicates::predicate_constructor::PredicateConstructor;
12use crate::predicates::Predicate;
13
14pub trait IntegerVariable:
17 Clone
18 + PredicateConstructor<Value = i32>
19 + TransformableVariable<Self::AffineView>
20 + Debug
21 + CheckerVariable<Predicate>
22{
23 type AffineView: IntegerVariable;
24
25 fn lower_bound(&self, assignment: &Assignments) -> i32;
27
28 fn lower_bound_at_trail_position(&self, assignment: &Assignments, trail_position: usize)
30 -> i32;
31
32 fn upper_bound(&self, assignment: &Assignments) -> i32;
34
35 fn upper_bound_at_trail_position(&self, assignment: &Assignments, trail_position: usize)
37 -> i32;
38
39 fn contains(&self, assignment: &Assignments, value: i32) -> bool;
41
42 fn contains_at_trail_position(
44 &self,
45 assignment: &Assignments,
46 value: i32,
47 trail_position: usize,
48 ) -> bool;
49
50 fn iterate_domain(&self, assignment: &Assignments) -> impl Iterator<Item = i32>;
52
53 fn watch_all(&self, watchers: &mut Watchers<'_>, events: EnumSet<DomainEvent>);
55
56 fn unwatch_all(&self, watchers: &mut Watchers<'_>);
58
59 fn watch_all_backtrack(&self, watchers: &mut Watchers<'_>, events: EnumSet<DomainEvent>);
60
61 fn unpack_event(&self, event: OpaqueDomainEvent) -> DomainEvent;
63
64 fn get_holes_at_current_checkpoint(
66 &self,
67 assignments: &Assignments,
68 ) -> impl Iterator<Item = i32>;
69
70 fn get_holes(&self, assignments: &Assignments) -> impl Iterator<Item = i32>;
72}