119625d8cSopenharmony_ci#![allow(dead_code)]
219625d8cSopenharmony_ci
319625d8cSopenharmony_ciuse std::borrow::Borrow;
419625d8cSopenharmony_ci
519625d8cSopenharmony_ci/// Flat (Vec) backed map
619625d8cSopenharmony_ci///
719625d8cSopenharmony_ci/// This preserves insertion order
819625d8cSopenharmony_ci#[derive(Clone, Debug, PartialEq, Eq)]
919625d8cSopenharmony_cipub(crate) struct FlatMap<K, V> {
1019625d8cSopenharmony_ci    keys: Vec<K>,
1119625d8cSopenharmony_ci    values: Vec<V>,
1219625d8cSopenharmony_ci}
1319625d8cSopenharmony_ci
1419625d8cSopenharmony_ciimpl<K: PartialEq + Eq, V> FlatMap<K, V> {
1519625d8cSopenharmony_ci    pub(crate) fn new() -> Self {
1619625d8cSopenharmony_ci        Default::default()
1719625d8cSopenharmony_ci    }
1819625d8cSopenharmony_ci
1919625d8cSopenharmony_ci    pub(crate) fn insert(&mut self, key: K, mut value: V) -> Option<V> {
2019625d8cSopenharmony_ci        for (index, existing) in self.keys.iter().enumerate() {
2119625d8cSopenharmony_ci            if *existing == key {
2219625d8cSopenharmony_ci                std::mem::swap(&mut self.values[index], &mut value);
2319625d8cSopenharmony_ci                return Some(value);
2419625d8cSopenharmony_ci            }
2519625d8cSopenharmony_ci        }
2619625d8cSopenharmony_ci
2719625d8cSopenharmony_ci        self.insert_unchecked(key, value);
2819625d8cSopenharmony_ci        None
2919625d8cSopenharmony_ci    }
3019625d8cSopenharmony_ci
3119625d8cSopenharmony_ci    pub(crate) fn insert_unchecked(&mut self, key: K, value: V) {
3219625d8cSopenharmony_ci        self.keys.push(key);
3319625d8cSopenharmony_ci        self.values.push(value);
3419625d8cSopenharmony_ci    }
3519625d8cSopenharmony_ci
3619625d8cSopenharmony_ci    pub(crate) fn extend_unchecked(&mut self, iter: impl IntoIterator<Item = (K, V)>) {
3719625d8cSopenharmony_ci        for (key, value) in iter {
3819625d8cSopenharmony_ci            self.insert_unchecked(key, value);
3919625d8cSopenharmony_ci        }
4019625d8cSopenharmony_ci    }
4119625d8cSopenharmony_ci
4219625d8cSopenharmony_ci    pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
4319625d8cSopenharmony_ci    where
4419625d8cSopenharmony_ci        K: Borrow<Q>,
4519625d8cSopenharmony_ci        Q: Eq,
4619625d8cSopenharmony_ci    {
4719625d8cSopenharmony_ci        for existing in &self.keys {
4819625d8cSopenharmony_ci            if existing.borrow() == key {
4919625d8cSopenharmony_ci                return true;
5019625d8cSopenharmony_ci            }
5119625d8cSopenharmony_ci        }
5219625d8cSopenharmony_ci        false
5319625d8cSopenharmony_ci    }
5419625d8cSopenharmony_ci
5519625d8cSopenharmony_ci    pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
5619625d8cSopenharmony_ci    where
5719625d8cSopenharmony_ci        K: Borrow<Q>,
5819625d8cSopenharmony_ci        Q: std::hash::Hash + Eq,
5919625d8cSopenharmony_ci    {
6019625d8cSopenharmony_ci        self.remove_entry(key).map(|(_, v)| v)
6119625d8cSopenharmony_ci    }
6219625d8cSopenharmony_ci
6319625d8cSopenharmony_ci    pub fn remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
6419625d8cSopenharmony_ci    where
6519625d8cSopenharmony_ci        K: Borrow<Q>,
6619625d8cSopenharmony_ci        Q: std::hash::Hash + Eq,
6719625d8cSopenharmony_ci    {
6819625d8cSopenharmony_ci        let index = some!(self
6919625d8cSopenharmony_ci            .keys
7019625d8cSopenharmony_ci            .iter()
7119625d8cSopenharmony_ci            .enumerate()
7219625d8cSopenharmony_ci            .find_map(|(i, k)| (k.borrow() == key).then_some(i)));
7319625d8cSopenharmony_ci        let key = self.keys.remove(index);
7419625d8cSopenharmony_ci        let value = self.values.remove(index);
7519625d8cSopenharmony_ci        Some((key, value))
7619625d8cSopenharmony_ci    }
7719625d8cSopenharmony_ci
7819625d8cSopenharmony_ci    pub(crate) fn is_empty(&self) -> bool {
7919625d8cSopenharmony_ci        self.keys.is_empty()
8019625d8cSopenharmony_ci    }
8119625d8cSopenharmony_ci
8219625d8cSopenharmony_ci    pub fn entry(&mut self, key: K) -> Entry<K, V> {
8319625d8cSopenharmony_ci        for (index, existing) in self.keys.iter().enumerate() {
8419625d8cSopenharmony_ci            if *existing == key {
8519625d8cSopenharmony_ci                return Entry::Occupied(OccupiedEntry { v: self, index });
8619625d8cSopenharmony_ci            }
8719625d8cSopenharmony_ci        }
8819625d8cSopenharmony_ci        Entry::Vacant(VacantEntry { v: self, key })
8919625d8cSopenharmony_ci    }
9019625d8cSopenharmony_ci
9119625d8cSopenharmony_ci    pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
9219625d8cSopenharmony_ci    where
9319625d8cSopenharmony_ci        K: Borrow<Q>,
9419625d8cSopenharmony_ci        Q: Eq,
9519625d8cSopenharmony_ci    {
9619625d8cSopenharmony_ci        for (index, existing) in self.keys.iter().enumerate() {
9719625d8cSopenharmony_ci            if existing.borrow() == k {
9819625d8cSopenharmony_ci                return Some(&self.values[index]);
9919625d8cSopenharmony_ci            }
10019625d8cSopenharmony_ci        }
10119625d8cSopenharmony_ci        None
10219625d8cSopenharmony_ci    }
10319625d8cSopenharmony_ci
10419625d8cSopenharmony_ci    pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>
10519625d8cSopenharmony_ci    where
10619625d8cSopenharmony_ci        K: Borrow<Q>,
10719625d8cSopenharmony_ci        Q: Eq,
10819625d8cSopenharmony_ci    {
10919625d8cSopenharmony_ci        for (index, existing) in self.keys.iter().enumerate() {
11019625d8cSopenharmony_ci            if existing.borrow() == k {
11119625d8cSopenharmony_ci                return Some(&mut self.values[index]);
11219625d8cSopenharmony_ci            }
11319625d8cSopenharmony_ci        }
11419625d8cSopenharmony_ci        None
11519625d8cSopenharmony_ci    }
11619625d8cSopenharmony_ci
11719625d8cSopenharmony_ci    pub fn keys(&self) -> std::slice::Iter<'_, K> {
11819625d8cSopenharmony_ci        self.keys.iter()
11919625d8cSopenharmony_ci    }
12019625d8cSopenharmony_ci
12119625d8cSopenharmony_ci    pub fn iter(&self) -> Iter<K, V> {
12219625d8cSopenharmony_ci        Iter {
12319625d8cSopenharmony_ci            keys: self.keys.iter(),
12419625d8cSopenharmony_ci            values: self.values.iter(),
12519625d8cSopenharmony_ci        }
12619625d8cSopenharmony_ci    }
12719625d8cSopenharmony_ci
12819625d8cSopenharmony_ci    pub fn iter_mut(&mut self) -> IterMut<K, V> {
12919625d8cSopenharmony_ci        IterMut {
13019625d8cSopenharmony_ci            keys: self.keys.iter_mut(),
13119625d8cSopenharmony_ci            values: self.values.iter_mut(),
13219625d8cSopenharmony_ci        }
13319625d8cSopenharmony_ci    }
13419625d8cSopenharmony_ci}
13519625d8cSopenharmony_ci
13619625d8cSopenharmony_ciimpl<K: PartialEq + Eq, V> Default for FlatMap<K, V> {
13719625d8cSopenharmony_ci    fn default() -> Self {
13819625d8cSopenharmony_ci        Self {
13919625d8cSopenharmony_ci            keys: Default::default(),
14019625d8cSopenharmony_ci            values: Default::default(),
14119625d8cSopenharmony_ci        }
14219625d8cSopenharmony_ci    }
14319625d8cSopenharmony_ci}
14419625d8cSopenharmony_ci
14519625d8cSopenharmony_cipub enum Entry<'a, K: 'a, V: 'a> {
14619625d8cSopenharmony_ci    Vacant(VacantEntry<'a, K, V>),
14719625d8cSopenharmony_ci    Occupied(OccupiedEntry<'a, K, V>),
14819625d8cSopenharmony_ci}
14919625d8cSopenharmony_ci
15019625d8cSopenharmony_ciimpl<'a, K: 'a, V: 'a> Entry<'a, K, V> {
15119625d8cSopenharmony_ci    pub fn or_insert(self, default: V) -> &'a mut V {
15219625d8cSopenharmony_ci        match self {
15319625d8cSopenharmony_ci            Entry::Occupied(entry) => &mut entry.v.values[entry.index],
15419625d8cSopenharmony_ci            Entry::Vacant(entry) => {
15519625d8cSopenharmony_ci                entry.v.keys.push(entry.key);
15619625d8cSopenharmony_ci                entry.v.values.push(default);
15719625d8cSopenharmony_ci                entry.v.values.last_mut().unwrap()
15819625d8cSopenharmony_ci            }
15919625d8cSopenharmony_ci        }
16019625d8cSopenharmony_ci    }
16119625d8cSopenharmony_ci
16219625d8cSopenharmony_ci    pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
16319625d8cSopenharmony_ci        match self {
16419625d8cSopenharmony_ci            Entry::Occupied(entry) => &mut entry.v.values[entry.index],
16519625d8cSopenharmony_ci            Entry::Vacant(entry) => {
16619625d8cSopenharmony_ci                entry.v.keys.push(entry.key);
16719625d8cSopenharmony_ci                entry.v.values.push(default());
16819625d8cSopenharmony_ci                entry.v.values.last_mut().unwrap()
16919625d8cSopenharmony_ci            }
17019625d8cSopenharmony_ci        }
17119625d8cSopenharmony_ci    }
17219625d8cSopenharmony_ci}
17319625d8cSopenharmony_ci
17419625d8cSopenharmony_cipub struct VacantEntry<'a, K: 'a, V: 'a> {
17519625d8cSopenharmony_ci    v: &'a mut FlatMap<K, V>,
17619625d8cSopenharmony_ci    key: K,
17719625d8cSopenharmony_ci}
17819625d8cSopenharmony_ci
17919625d8cSopenharmony_cipub struct OccupiedEntry<'a, K: 'a, V: 'a> {
18019625d8cSopenharmony_ci    v: &'a mut FlatMap<K, V>,
18119625d8cSopenharmony_ci    index: usize,
18219625d8cSopenharmony_ci}
18319625d8cSopenharmony_ci
18419625d8cSopenharmony_cipub struct Iter<'a, K: 'a, V: 'a> {
18519625d8cSopenharmony_ci    keys: std::slice::Iter<'a, K>,
18619625d8cSopenharmony_ci    values: std::slice::Iter<'a, V>,
18719625d8cSopenharmony_ci}
18819625d8cSopenharmony_ci
18919625d8cSopenharmony_ciimpl<'a, K, V> Iterator for Iter<'a, K, V> {
19019625d8cSopenharmony_ci    type Item = (&'a K, &'a V);
19119625d8cSopenharmony_ci
19219625d8cSopenharmony_ci    fn next(&mut self) -> Option<(&'a K, &'a V)> {
19319625d8cSopenharmony_ci        match self.keys.next() {
19419625d8cSopenharmony_ci            Some(k) => {
19519625d8cSopenharmony_ci                let v = self.values.next().unwrap();
19619625d8cSopenharmony_ci                Some((k, v))
19719625d8cSopenharmony_ci            }
19819625d8cSopenharmony_ci            None => None,
19919625d8cSopenharmony_ci        }
20019625d8cSopenharmony_ci    }
20119625d8cSopenharmony_ci    fn size_hint(&self) -> (usize, Option<usize>) {
20219625d8cSopenharmony_ci        self.keys.size_hint()
20319625d8cSopenharmony_ci    }
20419625d8cSopenharmony_ci}
20519625d8cSopenharmony_ci
20619625d8cSopenharmony_ciimpl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
20719625d8cSopenharmony_ci    fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
20819625d8cSopenharmony_ci        match self.keys.next_back() {
20919625d8cSopenharmony_ci            Some(k) => {
21019625d8cSopenharmony_ci                let v = self.values.next_back().unwrap();
21119625d8cSopenharmony_ci                Some((k, v))
21219625d8cSopenharmony_ci            }
21319625d8cSopenharmony_ci            None => None,
21419625d8cSopenharmony_ci        }
21519625d8cSopenharmony_ci    }
21619625d8cSopenharmony_ci}
21719625d8cSopenharmony_ci
21819625d8cSopenharmony_ciimpl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {}
21919625d8cSopenharmony_ci
22019625d8cSopenharmony_cipub struct IterMut<'a, K: 'a, V: 'a> {
22119625d8cSopenharmony_ci    keys: std::slice::IterMut<'a, K>,
22219625d8cSopenharmony_ci    values: std::slice::IterMut<'a, V>,
22319625d8cSopenharmony_ci}
22419625d8cSopenharmony_ci
22519625d8cSopenharmony_ciimpl<'a, K, V> Iterator for IterMut<'a, K, V> {
22619625d8cSopenharmony_ci    type Item = (&'a K, &'a mut V);
22719625d8cSopenharmony_ci
22819625d8cSopenharmony_ci    fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
22919625d8cSopenharmony_ci        match self.keys.next() {
23019625d8cSopenharmony_ci            Some(k) => {
23119625d8cSopenharmony_ci                let v = self.values.next().unwrap();
23219625d8cSopenharmony_ci                Some((k, v))
23319625d8cSopenharmony_ci            }
23419625d8cSopenharmony_ci            None => None,
23519625d8cSopenharmony_ci        }
23619625d8cSopenharmony_ci    }
23719625d8cSopenharmony_ci    fn size_hint(&self) -> (usize, Option<usize>) {
23819625d8cSopenharmony_ci        self.keys.size_hint()
23919625d8cSopenharmony_ci    }
24019625d8cSopenharmony_ci}
24119625d8cSopenharmony_ci
24219625d8cSopenharmony_ciimpl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
24319625d8cSopenharmony_ci    fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
24419625d8cSopenharmony_ci        match self.keys.next_back() {
24519625d8cSopenharmony_ci            Some(k) => {
24619625d8cSopenharmony_ci                let v = self.values.next_back().unwrap();
24719625d8cSopenharmony_ci                Some((k, v))
24819625d8cSopenharmony_ci            }
24919625d8cSopenharmony_ci            None => None,
25019625d8cSopenharmony_ci        }
25119625d8cSopenharmony_ci    }
25219625d8cSopenharmony_ci}
25319625d8cSopenharmony_ci
25419625d8cSopenharmony_ciimpl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {}
255