prefix_tree/
set.rs

1use map::{Iter as MapIter, PrefixMap};
2use std::hash::{Hash, Hasher};
3use std::iter::{FromIterator, FusedIterator};
4
5/// A set implemented as a `PrefixMap` where the value is `()`.
6#[derive(Debug, Default)]
7pub struct PrefixSet<T> {
8    map: PrefixMap<T, ()>,
9}
10
11impl<T: Eq + Clone> PrefixSet<T> {
12    /// Creates an empty `PrefixSet`.
13    ///
14    /// # Examples
15    ///
16    /// ```
17    /// use prefix_tree::PrefixSet;
18    ///
19    /// let mut set: PrefixSet<u8> = PrefixSet::new();
20    /// ```
21    pub fn new() -> PrefixSet<T> {
22        PrefixSet {
23            map: PrefixMap::new(),
24        }
25    }
26
27    /// Clears the set, removing all key-value pairs.
28    ///
29    /// # Examples
30    ///
31    /// ```
32    /// use prefix_tree::PrefixSet;
33    ///
34    /// let mut set: PrefixSet<u8> = PrefixSet::new();
35    /// set.insert("foo");
36    /// set.clear();
37    /// assert!(set.is_empty());
38    /// ```
39    pub fn clear(&mut self) {
40        self.map.clear()
41    }
42
43    /// Returns `true` if the set contains a value.
44    ///
45    /// # Examples
46    ///
47    /// ```
48    /// use prefix_tree::PrefixSet;
49    ///
50    /// let mut set: PrefixSet<u8> = PrefixSet::new();
51    /// set.insert("1");
52    /// assert_eq!(set.contains("1"), true);
53    /// assert_eq!(set.contains("2"), false);
54    /// ```
55    pub fn contains<Q>(&self, key: Q) -> bool
56    where
57        Q: AsRef<[T]>,
58    {
59        self.map.get(key).is_some()
60    }
61
62    /// Adds a value to the set.
63    ///
64    /// # Examples
65    ///
66    /// ```
67    /// use prefix_tree::PrefixSet;
68    ///
69    /// let mut set: PrefixSet<u8> = PrefixSet::new();
70    /// assert_eq!(set.insert("1"), true);
71    /// assert_eq!(set.insert("1"), false);
72    /// assert_eq!(set.contains("1"), true);
73    /// ```
74    pub fn insert<Q>(&mut self, key: Q) -> bool
75    where
76        Q: AsRef<[T]>,
77    {
78        self.map.insert(key, ()).is_none()
79    }
80
81    /// Removes a value from the set. Returns whether the value was present in the set.
82    ///
83    /// # Examples
84    ///
85    ///
86    /// ```
87    /// use prefix_tree::PrefixSet;
88    ///
89    /// let mut set: PrefixSet<u8> = PrefixSet::new();
90    /// set.insert("1");
91    /// assert_eq!(set.remove("1"), true);
92    /// assert_eq!(set.remove("1"), false);
93    /// ```
94    pub fn remove<Q>(&mut self, key: Q) -> bool
95    where
96        Q: AsRef<[T]>,
97    {
98        self.map.remove(key).is_some()
99    }
100
101    /// Returns `true` if the set contains no elements.
102    ///
103    /// # Examples
104    ///
105    /// ```
106    /// use prefix_tree::PrefixSet;
107    ///
108    /// let mut set: PrefixSet<u8> = PrefixSet::new();
109    /// assert_eq!(set.is_empty(), true);
110    /// set.insert("foo");
111    /// assert_eq!(set.is_empty(), false);
112    /// ```
113    pub fn is_empty(&self) -> bool {
114        self.map.is_empty()
115    }
116
117    /// Returns the number of elements in the set.
118    ///
119    /// # Examples
120    ///
121    /// ```
122    /// use prefix_tree::PrefixSet;
123    ///
124    /// let mut set: PrefixSet<u8> = PrefixSet::new();
125    /// assert_eq!(set.len(), 0);
126    /// set.insert("foo");
127    /// assert_eq!(set.len(), 1);
128    /// ```
129    pub fn len(&self) -> usize {
130        self.map.len()
131    }
132
133    /// Gets an iterator that visits the values in `PrefixSet`.
134    ///
135    /// # Examples
136    ///
137    /// ```
138    /// use prefix_tree::PrefixSet;
139    ///
140    /// let mut set: PrefixSet<u8> = PrefixSet::new();
141    /// set.insert("1");
142    /// set.insert("2");
143    /// let mut iter = set.iter();
144    /// assert_eq!(iter.next(), Some(vec![b'1']));
145    /// assert_eq!(iter.next(), Some(vec![b'2']));
146    /// ```
147    pub fn iter(&self) -> Iter<T> {
148        Iter {
149            iter: self.map.iter(),
150        }
151    }
152}
153
154impl<'a, T: 'a + Eq + Clone> FromIterator<&'a [T]> for PrefixSet<T> {
155    fn from_iter<I>(iter: I) -> PrefixSet<T>
156    where
157        I: IntoIterator<Item = &'a [T]>,
158    {
159        let mut set = PrefixSet::new();
160        iter.into_iter().for_each(|x| {
161            set.insert(x);
162        });
163        set
164    }
165}
166
167impl<'a, T: 'a + Eq + Clone> IntoIterator for &'a PrefixSet<T> {
168    type Item = Vec<T>;
169
170    type IntoIter = Iter<'a, T>;
171
172    fn into_iter(self) -> Self::IntoIter {
173        self.iter()
174    }
175}
176
177pub struct Iter<'a, T> {
178    iter: MapIter<'a, T, ()>,
179}
180
181impl<'a, T: 'a + Eq + Clone> Iterator for Iter<'a, T> {
182    type Item = Vec<T>;
183
184    fn next(&mut self) -> Option<Self::Item> {
185        self.iter.next().map(|(k, _)| k)
186    }
187}
188
189impl<'a, T: 'a + Eq + Clone> ExactSizeIterator for Iter<'a, T> {
190    fn len(&self) -> usize {
191        self.iter.len()
192    }
193}
194
195impl<'a, T: 'a + Eq + Clone> FusedIterator for Iter<'a, T> {}
196
197impl<T: Eq + Clone> PartialEq<PrefixSet<T>> for PrefixSet<T> {
198    fn eq(&self, other: &PrefixSet<T>) -> bool {
199        self.len() == other.len() && self.iter().zip(other).all(|(a, b)| a == b)
200    }
201}
202
203impl<T: Eq + Clone> Eq for PrefixSet<T> {}
204
205impl<T: Eq + Clone + Hash> Hash for PrefixSet<T> {
206    fn hash<H: Hasher>(&self, state: &mut H) {
207        self.iter().for_each(|x| x.hash(state))
208    }
209}