1use std::fmt::{self, Debug};
2use std::slice;
3
4pub(crate) use self::ordered::OrderedSet;
5pub(crate) use self::unordered::UnorderedSet;
6
7mod ordered {
8 use super::{Iter, UnorderedSet};
9 use std::hash::Hash;
10
11 pub(crate) struct OrderedSet<T> {
12 set: UnorderedSet<T>,
13 vec: Vec<T>,
14 }
15
16 impl<'a, T> OrderedSet<&'a T>
17 where
18 T: Hash + Eq,
19 {
20 pub(crate) fn new() -> Self {
21 OrderedSet {
22 set: UnorderedSet::new(),
23 vec: Vec::new(),
24 }
25 }
26
27 pub(crate) fn insert(&mut self, value: &'a T) -> bool {
28 let new = self.set.insert(value);
29 if new {
30 self.vec.push(value);
31 }
32 new
33 }
34 }
35
36 impl<'a, T> OrderedSet<&'a T> {
37 pub(crate) fn is_empty(&self) -> bool {
38 self.vec.is_empty()
39 }
40
41 pub(crate) fn iter(&self) -> Iter<'_, 'a, T> {
42 Iter(self.vec.iter())
43 }
44 }
45
46 impl<'s, 'a, T> IntoIterator for &'s OrderedSet<&'a T> {
47 type Item = &'a T;
48 type IntoIter = Iter<'s, 'a, T>;
49 fn into_iter(self) -> Self::IntoIter {
50 self.iter()
51 }
52 }
53}
54
55mod unordered {
56 use std::borrow::Borrow;
57 use std::collections::HashSet;
58 use std::hash::Hash;
59
60 pub(crate) struct UnorderedSet<T>(HashSet<T>);
63
64 impl<T> UnorderedSet<T>
65 where
66 T: Hash + Eq,
67 {
68 pub(crate) fn new() -> Self {
69 UnorderedSet(HashSet::new())
70 }
71
72 pub(crate) fn insert(&mut self, value: T) -> bool {
73 self.0.insert(value)
74 }
75
76 pub(crate) fn contains<Q>(&self, value: &Q) -> bool
77 where
78 T: Borrow<Q>,
79 Q: ?Sized + Hash + Eq,
80 {
81 self.0.contains(value)
82 }
83
84 #[allow(dead_code)] pub(crate) fn get<Q>(&self, value: &Q) -> Option<&T>
86 where
87 T: Borrow<Q>,
88 Q: ?Sized + Hash + Eq,
89 {
90 self.0.get(value)
91 }
92
93 pub(crate) fn retain(&mut self, f: impl FnMut(&T) -> bool) {
94 self.0.retain(f);
95 }
96 }
97}
98
99pub(crate) struct Iter<'s, 'a, T>(slice::Iter<'s, &'a T>);
100
101impl<'s, 'a, T> Iterator for Iter<'s, 'a, T> {
102 type Item = &'a T;
103
104 fn next(&mut self) -> Option<Self::Item> {
105 self.0.next().copied()
106 }
107
108 fn size_hint(&self) -> (usize, Option<usize>) {
109 self.0.size_hint()
110 }
111}
112
113impl<T> Debug for OrderedSet<&T>
114where
115 T: Debug,
116{
117 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
118 formatter.debug_set().entries(self).finish()
119 }
120}