Skip to main content

sim_lib_sequence/mutable/
ordered_set.rs

1/// Mutable insertion-ordered set with caller-defined key equivalence.
2#[derive(Debug)]
3pub struct OrderedSet<K, E> {
4    table: OrderedTable<K, (), E>,
5}
6impl<K, E> OrderedSet<K, E>
7where
8    E: KeyEquivalence<K>,
9{
10    /// Construct an empty set using `equivalence` for membership.
11    pub fn new(equivalence: E) -> Self {
12        Self {
13            table: OrderedTable::new(equivalence),
14        }
15    }
16
17    /// Return the number of members.
18    pub fn len(&self) -> usize {
19        self.table.len()
20    }
21
22    /// Return whether the set contains no members.
23    pub fn is_empty(&self) -> bool {
24        self.table.is_empty()
25    }
26
27    /// Return whether an equivalent member is present.
28    pub fn contains(&self, key: &K) -> bool {
29        self.table.get(key).is_some()
30    }
31
32    /// Insert `key`, returning whether it was newly added.
33    pub fn insert(&self, key: K) -> bool {
34        self.table.insert(key, ()).is_none()
35    }
36
37    /// Remove an equivalent member, returning whether it was present.
38    pub fn remove(&self, key: &K) -> bool {
39        self.table.remove(key).is_some()
40    }
41
42    /// Create a live insertion-order iterator.
43    pub fn iter(&self) -> OrderedSetIter<K> {
44        OrderedSetIter {
45            inner: self.table.iter(),
46        }
47    }
48
49    /// Compact tombstones under the table's position and work rules.
50    pub fn compact(&self, max_work: usize) -> CompactionResult {
51        self.table.compact(max_work)
52    }
53}
54
55/// Live iterator over cloned insertion-ordered set members.
56pub struct OrderedSetIter<K> {
57    inner: OrderedTableIter<K, ()>,
58}
59
60impl<K> Clone for OrderedSetIter<K> {
61    fn clone(&self) -> Self {
62        Self {
63            inner: self.inner.clone(),
64        }
65    }
66}
67
68impl<K> Iterator for OrderedSetIter<K>
69where
70    K: Clone,
71{
72    type Item = K;
73
74    fn next(&mut self) -> Option<Self::Item> {
75        self.inner.next().map(|(key, ())| key)
76    }
77}