133d722a9Sopenharmony_ciuse std::fmt::{self, Debug};
233d722a9Sopenharmony_ciuse std::slice;
333d722a9Sopenharmony_ci
433d722a9Sopenharmony_cipub use self::ordered::OrderedSet;
533d722a9Sopenharmony_cipub use self::unordered::UnorderedSet;
633d722a9Sopenharmony_ci
733d722a9Sopenharmony_cimod ordered {
833d722a9Sopenharmony_ci    use super::{Iter, UnorderedSet};
933d722a9Sopenharmony_ci    use std::borrow::Borrow;
1033d722a9Sopenharmony_ci    use std::hash::Hash;
1133d722a9Sopenharmony_ci
1233d722a9Sopenharmony_ci    pub struct OrderedSet<T> {
1333d722a9Sopenharmony_ci        set: UnorderedSet<T>,
1433d722a9Sopenharmony_ci        vec: Vec<T>,
1533d722a9Sopenharmony_ci    }
1633d722a9Sopenharmony_ci
1733d722a9Sopenharmony_ci    impl<'a, T> OrderedSet<&'a T>
1833d722a9Sopenharmony_ci    where
1933d722a9Sopenharmony_ci        T: Hash + Eq,
2033d722a9Sopenharmony_ci    {
2133d722a9Sopenharmony_ci        pub fn new() -> Self {
2233d722a9Sopenharmony_ci            OrderedSet {
2333d722a9Sopenharmony_ci                set: UnorderedSet::new(),
2433d722a9Sopenharmony_ci                vec: Vec::new(),
2533d722a9Sopenharmony_ci            }
2633d722a9Sopenharmony_ci        }
2733d722a9Sopenharmony_ci
2833d722a9Sopenharmony_ci        pub fn insert(&mut self, value: &'a T) -> bool {
2933d722a9Sopenharmony_ci            let new = self.set.insert(value);
3033d722a9Sopenharmony_ci            if new {
3133d722a9Sopenharmony_ci                self.vec.push(value);
3233d722a9Sopenharmony_ci            }
3333d722a9Sopenharmony_ci            new
3433d722a9Sopenharmony_ci        }
3533d722a9Sopenharmony_ci
3633d722a9Sopenharmony_ci        pub fn contains<Q>(&self, value: &Q) -> bool
3733d722a9Sopenharmony_ci        where
3833d722a9Sopenharmony_ci            &'a T: Borrow<Q>,
3933d722a9Sopenharmony_ci            Q: ?Sized + Hash + Eq,
4033d722a9Sopenharmony_ci        {
4133d722a9Sopenharmony_ci            self.set.contains(value)
4233d722a9Sopenharmony_ci        }
4333d722a9Sopenharmony_ci
4433d722a9Sopenharmony_ci        pub fn get<Q>(&self, value: &Q) -> Option<&'a T>
4533d722a9Sopenharmony_ci        where
4633d722a9Sopenharmony_ci            &'a T: Borrow<Q>,
4733d722a9Sopenharmony_ci            Q: ?Sized + Hash + Eq,
4833d722a9Sopenharmony_ci        {
4933d722a9Sopenharmony_ci            self.set.get(value).copied()
5033d722a9Sopenharmony_ci        }
5133d722a9Sopenharmony_ci    }
5233d722a9Sopenharmony_ci
5333d722a9Sopenharmony_ci    impl<'a, T> OrderedSet<&'a T> {
5433d722a9Sopenharmony_ci        pub fn is_empty(&self) -> bool {
5533d722a9Sopenharmony_ci            self.vec.is_empty()
5633d722a9Sopenharmony_ci        }
5733d722a9Sopenharmony_ci
5833d722a9Sopenharmony_ci        pub fn iter(&self) -> Iter<'_, 'a, T> {
5933d722a9Sopenharmony_ci            Iter(self.vec.iter())
6033d722a9Sopenharmony_ci        }
6133d722a9Sopenharmony_ci    }
6233d722a9Sopenharmony_ci
6333d722a9Sopenharmony_ci    impl<'s, 'a, T> IntoIterator for &'s OrderedSet<&'a T> {
6433d722a9Sopenharmony_ci        type Item = &'a T;
6533d722a9Sopenharmony_ci        type IntoIter = Iter<'s, 'a, T>;
6633d722a9Sopenharmony_ci        fn into_iter(self) -> Self::IntoIter {
6733d722a9Sopenharmony_ci            self.iter()
6833d722a9Sopenharmony_ci        }
6933d722a9Sopenharmony_ci    }
7033d722a9Sopenharmony_ci}
7133d722a9Sopenharmony_ci
7233d722a9Sopenharmony_cimod unordered {
7333d722a9Sopenharmony_ci    use std::borrow::Borrow;
7433d722a9Sopenharmony_ci    use std::collections::HashSet;
7533d722a9Sopenharmony_ci    use std::hash::Hash;
7633d722a9Sopenharmony_ci
7733d722a9Sopenharmony_ci    // Wrapper prohibits accidentally introducing iteration over the set, which
7833d722a9Sopenharmony_ci    // could lead to nondeterministic generated code.
7933d722a9Sopenharmony_ci    pub struct UnorderedSet<T>(HashSet<T>);
8033d722a9Sopenharmony_ci
8133d722a9Sopenharmony_ci    impl<T> UnorderedSet<T>
8233d722a9Sopenharmony_ci    where
8333d722a9Sopenharmony_ci        T: Hash + Eq,
8433d722a9Sopenharmony_ci    {
8533d722a9Sopenharmony_ci        pub fn new() -> Self {
8633d722a9Sopenharmony_ci            UnorderedSet(HashSet::new())
8733d722a9Sopenharmony_ci        }
8833d722a9Sopenharmony_ci
8933d722a9Sopenharmony_ci        pub fn insert(&mut self, value: T) -> bool {
9033d722a9Sopenharmony_ci            self.0.insert(value)
9133d722a9Sopenharmony_ci        }
9233d722a9Sopenharmony_ci
9333d722a9Sopenharmony_ci        pub fn contains<Q>(&self, value: &Q) -> bool
9433d722a9Sopenharmony_ci        where
9533d722a9Sopenharmony_ci            T: Borrow<Q>,
9633d722a9Sopenharmony_ci            Q: ?Sized + Hash + Eq,
9733d722a9Sopenharmony_ci        {
9833d722a9Sopenharmony_ci            self.0.contains(value)
9933d722a9Sopenharmony_ci        }
10033d722a9Sopenharmony_ci
10133d722a9Sopenharmony_ci        pub fn get<Q>(&self, value: &Q) -> Option<&T>
10233d722a9Sopenharmony_ci        where
10333d722a9Sopenharmony_ci            T: Borrow<Q>,
10433d722a9Sopenharmony_ci            Q: ?Sized + Hash + Eq,
10533d722a9Sopenharmony_ci        {
10633d722a9Sopenharmony_ci            self.0.get(value)
10733d722a9Sopenharmony_ci        }
10833d722a9Sopenharmony_ci
10933d722a9Sopenharmony_ci        pub fn retain(&mut self, f: impl FnMut(&T) -> bool) {
11033d722a9Sopenharmony_ci            self.0.retain(f);
11133d722a9Sopenharmony_ci        }
11233d722a9Sopenharmony_ci    }
11333d722a9Sopenharmony_ci}
11433d722a9Sopenharmony_ci
11533d722a9Sopenharmony_cipub struct Iter<'s, 'a, T>(slice::Iter<'s, &'a T>);
11633d722a9Sopenharmony_ci
11733d722a9Sopenharmony_ciimpl<'s, 'a, T> Iterator for Iter<'s, 'a, T> {
11833d722a9Sopenharmony_ci    type Item = &'a T;
11933d722a9Sopenharmony_ci
12033d722a9Sopenharmony_ci    fn next(&mut self) -> Option<Self::Item> {
12133d722a9Sopenharmony_ci        self.0.next().copied()
12233d722a9Sopenharmony_ci    }
12333d722a9Sopenharmony_ci
12433d722a9Sopenharmony_ci    fn size_hint(&self) -> (usize, Option<usize>) {
12533d722a9Sopenharmony_ci        self.0.size_hint()
12633d722a9Sopenharmony_ci    }
12733d722a9Sopenharmony_ci}
12833d722a9Sopenharmony_ci
12933d722a9Sopenharmony_ciimpl<'a, T> Debug for OrderedSet<&'a T>
13033d722a9Sopenharmony_ciwhere
13133d722a9Sopenharmony_ci    T: Debug,
13233d722a9Sopenharmony_ci{
13333d722a9Sopenharmony_ci    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
13433d722a9Sopenharmony_ci        formatter.debug_set().entries(self).finish()
13533d722a9Sopenharmony_ci    }
13633d722a9Sopenharmony_ci}
137