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