119625d8cSopenharmony_ci#![allow(dead_code)] 219625d8cSopenharmony_ci 319625d8cSopenharmony_ciuse std::borrow::Borrow; 419625d8cSopenharmony_ci 519625d8cSopenharmony_ci/// Flat (Vec) backed set 619625d8cSopenharmony_ci/// 719625d8cSopenharmony_ci/// This preserves insertion order 819625d8cSopenharmony_ci#[derive(Clone, Debug, PartialEq, Eq)] 919625d8cSopenharmony_cipub(crate) struct FlatSet<T> { 1019625d8cSopenharmony_ci inner: Vec<T>, 1119625d8cSopenharmony_ci} 1219625d8cSopenharmony_ci 1319625d8cSopenharmony_ciimpl<T: PartialEq + Eq> FlatSet<T> { 1419625d8cSopenharmony_ci pub(crate) fn new() -> Self { 1519625d8cSopenharmony_ci Default::default() 1619625d8cSopenharmony_ci } 1719625d8cSopenharmony_ci 1819625d8cSopenharmony_ci pub(crate) fn insert(&mut self, value: T) -> bool { 1919625d8cSopenharmony_ci for existing in &self.inner { 2019625d8cSopenharmony_ci if *existing == value { 2119625d8cSopenharmony_ci return false; 2219625d8cSopenharmony_ci } 2319625d8cSopenharmony_ci } 2419625d8cSopenharmony_ci self.inner.push(value); 2519625d8cSopenharmony_ci true 2619625d8cSopenharmony_ci } 2719625d8cSopenharmony_ci 2819625d8cSopenharmony_ci pub fn contains<Q: ?Sized>(&self, value: &Q) -> bool 2919625d8cSopenharmony_ci where 3019625d8cSopenharmony_ci T: Borrow<Q>, 3119625d8cSopenharmony_ci Q: Eq, 3219625d8cSopenharmony_ci { 3319625d8cSopenharmony_ci for existing in &self.inner { 3419625d8cSopenharmony_ci if existing.borrow() == value { 3519625d8cSopenharmony_ci return true; 3619625d8cSopenharmony_ci } 3719625d8cSopenharmony_ci } 3819625d8cSopenharmony_ci false 3919625d8cSopenharmony_ci } 4019625d8cSopenharmony_ci 4119625d8cSopenharmony_ci pub fn retain<F>(&mut self, f: F) 4219625d8cSopenharmony_ci where 4319625d8cSopenharmony_ci F: FnMut(&T) -> bool, 4419625d8cSopenharmony_ci { 4519625d8cSopenharmony_ci self.inner.retain(f); 4619625d8cSopenharmony_ci } 4719625d8cSopenharmony_ci 4819625d8cSopenharmony_ci pub(crate) fn is_empty(&self) -> bool { 4919625d8cSopenharmony_ci self.inner.is_empty() 5019625d8cSopenharmony_ci } 5119625d8cSopenharmony_ci 5219625d8cSopenharmony_ci pub(crate) fn iter(&self) -> std::slice::Iter<'_, T> { 5319625d8cSopenharmony_ci self.inner.iter() 5419625d8cSopenharmony_ci } 5519625d8cSopenharmony_ci 5619625d8cSopenharmony_ci pub fn sort_by_key<K, F>(&mut self, f: F) 5719625d8cSopenharmony_ci where 5819625d8cSopenharmony_ci F: FnMut(&T) -> K, 5919625d8cSopenharmony_ci K: Ord, 6019625d8cSopenharmony_ci { 6119625d8cSopenharmony_ci self.inner.sort_by_key(f); 6219625d8cSopenharmony_ci } 6319625d8cSopenharmony_ci} 6419625d8cSopenharmony_ci 6519625d8cSopenharmony_ciimpl<T: PartialEq + Eq> Default for FlatSet<T> { 6619625d8cSopenharmony_ci fn default() -> Self { 6719625d8cSopenharmony_ci Self { 6819625d8cSopenharmony_ci inner: Default::default(), 6919625d8cSopenharmony_ci } 7019625d8cSopenharmony_ci } 7119625d8cSopenharmony_ci} 7219625d8cSopenharmony_ci 7319625d8cSopenharmony_ciimpl<T: PartialEq + Eq> IntoIterator for FlatSet<T> { 7419625d8cSopenharmony_ci type Item = T; 7519625d8cSopenharmony_ci type IntoIter = std::vec::IntoIter<T>; 7619625d8cSopenharmony_ci 7719625d8cSopenharmony_ci fn into_iter(self) -> Self::IntoIter { 7819625d8cSopenharmony_ci self.inner.into_iter() 7919625d8cSopenharmony_ci } 8019625d8cSopenharmony_ci} 8119625d8cSopenharmony_ci 8219625d8cSopenharmony_ciimpl<'s, T: PartialEq + Eq> IntoIterator for &'s FlatSet<T> { 8319625d8cSopenharmony_ci type Item = &'s T; 8419625d8cSopenharmony_ci type IntoIter = std::slice::Iter<'s, T>; 8519625d8cSopenharmony_ci 8619625d8cSopenharmony_ci fn into_iter(self) -> Self::IntoIter { 8719625d8cSopenharmony_ci self.inner.iter() 8819625d8cSopenharmony_ci } 8919625d8cSopenharmony_ci} 9019625d8cSopenharmony_ci 9119625d8cSopenharmony_ciimpl<T: PartialEq + Eq> Extend<T> for FlatSet<T> { 9219625d8cSopenharmony_ci fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) { 9319625d8cSopenharmony_ci for value in iter { 9419625d8cSopenharmony_ci self.insert(value); 9519625d8cSopenharmony_ci } 9619625d8cSopenharmony_ci } 9719625d8cSopenharmony_ci} 9819625d8cSopenharmony_ci 9919625d8cSopenharmony_ciimpl<T: PartialEq + Eq> FromIterator<T> for FlatSet<T> { 10019625d8cSopenharmony_ci fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self { 10119625d8cSopenharmony_ci let mut set = Self::new(); 10219625d8cSopenharmony_ci for value in iter { 10319625d8cSopenharmony_ci set.insert(value); 10419625d8cSopenharmony_ci } 10519625d8cSopenharmony_ci set 10619625d8cSopenharmony_ci } 10719625d8cSopenharmony_ci} 108