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 impl<'a, T> IntoIterator for OrderedSet<&'a T> {
55 type Item = &'a T;
56 type IntoIter = <Vec<&'a T> as IntoIterator>::IntoIter;
57 fn into_iter(self) -> Self::IntoIter {
58 self.vec.into_iter()
59 }
60 }
61}
62
63mod unordered {
64 use std::borrow::Borrow;
65 use std::collections::HashSet;
66 use std::hash::Hash;
67
68 pub(crate) struct UnorderedSet<T>(HashSet<T>);
71
72 impl<T> UnorderedSet<T>
73 where
74 T: Hash + Eq,
75 {
76 pub(crate) fn new() -> Self {
77 UnorderedSet(HashSet::new())
78 }
79
80 pub(crate) fn insert(&mut self, value: T) -> bool {
81 self.0.insert(value)
82 }
83
84 pub(crate) fn contains<Q>(&self, value: &Q) -> bool
85 where
86 T: Borrow<Q>,
87 Q: ?Sized + Hash + Eq,
88 {
89 self.0.contains(value)
90 }
91
92 #[allow(dead_code)] pub(crate) fn get<Q>(&self, value: &Q) -> Option<&T>
94 where
95 T: Borrow<Q>,
96 Q: ?Sized + Hash + Eq,
97 {
98 self.0.get(value)
99 }
100
101 pub(crate) fn retain(&mut self, f: impl FnMut(&T) -> bool) {
102 self.0.retain(f);
103 }
104 }
105}
106
107pub(crate) struct Iter<'s, 'a, T>(slice::Iter<'s, &'a T>);
108
109impl<'s, 'a, T> Iterator for Iter<'s, 'a, T> {
110 type Item = &'a T;
111
112 fn next(&mut self) -> Option<Self::Item> {
113 self.0.next().copied()
114 }
115
116 fn size_hint(&self) -> (usize, Option<usize>) {
117 self.0.size_hint()
118 }
119}
120
121impl<T> Debug for OrderedSet<&T>
122where
123 T: Debug,
124{
125 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
126 formatter.debug_set().entries(self).finish()
127 }
128}