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