blob: ee490e9c08746ddefb1790462512543f62ffc105 [file] [log] [blame]
David Tolnay599fad82020-10-03 19:42:16 -07001use std::fmt::{self, Debug};
David Tolnay7db73692019-10-20 14:51:12 -04002use std::slice;
3
David Tolnayecdd2d22020-11-03 19:36:12 -08004pub use self::ordered::OrderedSet;
David Tolnay7db73692019-10-20 14:51:12 -04005
David Tolnayecdd2d22020-11-03 19:36:12 -08006mod ordered {
7 use super::Iter;
8 use std::borrow::Borrow;
9 use std::collections::HashSet;
10 use std::hash::Hash;
11
12 pub struct OrderedSet<T> {
13 set: HashSet<T>,
14 vec: Vec<T>,
15 }
16
17 impl<'a, T> OrderedSet<&'a T>
18 where
19 T: Hash + Eq,
20 {
21 pub fn new() -> Self {
22 OrderedSet {
23 set: HashSet::new(),
24 vec: Vec::new(),
25 }
26 }
27
28 pub fn insert(&mut self, value: &'a T) -> bool {
29 let new = self.set.insert(value);
30 if new {
31 self.vec.push(value);
32 }
33 new
34 }
35
36 pub fn contains<Q>(&self, value: &Q) -> bool
37 where
38 &'a T: Borrow<Q>,
39 Q: ?Sized + Hash + Eq,
40 {
41 self.set.contains(value)
42 }
43
44 pub fn get<Q>(&self, value: &Q) -> Option<&'a T>
45 where
46 &'a T: Borrow<Q>,
47 Q: ?Sized + Hash + Eq,
48 {
49 self.set.get(value).copied()
David Tolnay7db73692019-10-20 14:51:12 -040050 }
51 }
52
David Tolnayecdd2d22020-11-03 19:36:12 -080053 impl<'s, 'a, T> IntoIterator for &'s OrderedSet<&'a T> {
54 type Item = &'a T;
55 type IntoIter = Iter<'s, 'a, T>;
56 fn into_iter(self) -> Self::IntoIter {
57 Iter(self.vec.iter())
David Tolnay7db73692019-10-20 14:51:12 -040058 }
David Tolnay7db73692019-10-20 14:51:12 -040059 }
60}
61
62pub struct Iter<'s, 'a, T>(slice::Iter<'s, &'a T>);
63
64impl<'s, 'a, T> Iterator for Iter<'s, 'a, T> {
65 type Item = &'a T;
66 fn next(&mut self) -> Option<Self::Item> {
67 self.0.next().copied()
68 }
69}
David Tolnay599fad82020-10-03 19:42:16 -070070
71impl<'a, T> Debug for OrderedSet<&'a T>
72where
73 T: Debug,
74{
75 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
76 formatter.debug_set().entries(self).finish()
77 }
78}