blob: ca816cff7300827dd4ab698a0ad0c83ed01dea03 [file] [log] [blame]
David Tolnay7db73692019-10-20 14:51:12 -04001use std::collections::HashSet;
2use std::hash::Hash;
3use std::slice;
4
5pub struct OrderedSet<'a, T> {
6 set: HashSet<&'a T>,
7 vec: Vec<&'a T>,
8}
9
10impl<'a, T> OrderedSet<'a, T>
11where
12 T: Hash + Eq,
13{
14 pub fn new() -> Self {
15 OrderedSet {
16 set: HashSet::new(),
17 vec: Vec::new(),
18 }
19 }
20
21 pub fn insert(&mut self, value: &'a T) {
22 if self.set.insert(value) {
23 self.vec.push(value);
24 }
25 }
26
27 pub fn contains(&self, value: &T) -> bool {
28 self.set.contains(value)
29 }
30}
31
32impl<'s, 'a, T> IntoIterator for &'s OrderedSet<'a, T> {
33 type Item = &'a T;
34 type IntoIter = Iter<'s, 'a, T>;
35 fn into_iter(self) -> Self::IntoIter {
36 Iter(self.vec.iter())
37 }
38}
39
40pub struct Iter<'s, 'a, T>(slice::Iter<'s, &'a T>);
41
42impl<'s, 'a, T> Iterator for Iter<'s, 'a, T> {
43 type Item = &'a T;
44 fn next(&mut self) -> Option<Self::Item> {
45 self.0.next().copied()
46 }
47}