csp_solver/domain/
finite.rs1use super::traits::Domain;
4
5#[derive(Debug, Clone, PartialEq)]
11pub struct FiniteDomain<T: Clone + PartialEq + std::fmt::Debug> {
12 values: Vec<T>,
13}
14
15impl<T: Clone + PartialEq + std::fmt::Debug> FiniteDomain<T> {
16 pub fn new(values: Vec<T>) -> Self {
18 Self { values }
19 }
20}
21
22impl<T: Clone + PartialEq + std::fmt::Debug> Domain for FiniteDomain<T> {
23 type Value = T;
24
25 fn size(&self) -> usize {
26 self.values.len()
27 }
28
29 fn contains(&self, val: &T) -> bool {
30 self.values.contains(val)
31 }
32
33 fn remove(&mut self, val: &T) -> bool {
34 if let Some(pos) = self.values.iter().position(|v| v == val) {
35 self.values.swap_remove(pos);
36 true
37 } else {
38 false
39 }
40 }
41
42 fn add(&mut self, val: &T) {
43 if !self.values.contains(val) {
44 self.values.push(val.clone());
45 }
46 }
47
48 fn values(&self) -> Vec<T> {
49 self.values.clone()
50 }
51
52 fn iter(&self) -> impl Iterator<Item = T> {
53 self.values.clone().into_iter()
54 }
55}