Skip to main content

csp_solver/domain/
finite.rs

1//! FiniteDomain<T> — a generic finite domain backed by Vec<T>.
2
3use super::traits::Domain;
4
5/// A generic finite domain holding arbitrary values.
6///
7/// Uses `Vec<T>` internally. Operations are O(n) where n is the domain size.
8/// Suitable for domains with non-integer values or when bitset representation
9/// is not appropriate.
10#[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    /// Create a new finite domain from a list of values.
17    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}