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