1 #[cfg(feature = "vec_map")] 2 pub use vec_map::{Values, VecMap}; 3 4 #[cfg(not(feature = "vec_map"))] 5 pub use self::vec_map::{Values, VecMap}; 6 7 #[cfg(not(feature = "vec_map"))] 8 mod vec_map { 9 use std::collections::BTreeMap; 10 use std::collections::btree_map; 11 use std::fmt::{self, Debug, Formatter}; 12 13 #[derive(Clone, Default, Debug)] 14 pub struct VecMap<V> { 15 inner: BTreeMap<usize, V>, 16 } 17 18 impl<V> VecMap<V> { new() -> Self19 pub fn new() -> Self { 20 VecMap { 21 inner: Default::default(), 22 } 23 } 24 len(&self) -> usize25 pub fn len(&self) -> usize { self.inner.len() } 26 is_empty(&self) -> bool27 pub fn is_empty(&self) -> bool { self.inner.is_empty() } 28 insert(&mut self, key: usize, value: V) -> Option<V>29 pub fn insert(&mut self, key: usize, value: V) -> Option<V> { 30 self.inner.insert(key, value) 31 } 32 values(&self) -> Values<V>33 pub fn values(&self) -> Values<V> { self.inner.values() } 34 iter(&self) -> Iter<V>35 pub fn iter(&self) -> Iter<V> { 36 Iter { 37 inner: self.inner.iter(), 38 } 39 } 40 contains_key(&self, key: usize) -> bool41 pub fn contains_key(&self, key: usize) -> bool { self.inner.contains_key(&key) } 42 entry(&mut self, key: usize) -> Entry<V>43 pub fn entry(&mut self, key: usize) -> Entry<V> { self.inner.entry(key) } 44 get(&self, key: usize) -> Option<&V>45 pub fn get(&self, key: usize) -> Option<&V> { self.inner.get(&key) } 46 } 47 48 pub type Values<'a, V> = btree_map::Values<'a, usize, V>; 49 50 pub type Entry<'a, V> = btree_map::Entry<'a, usize, V>; 51 52 #[derive(Clone)] 53 pub struct Iter<'a, V: 'a> { 54 inner: btree_map::Iter<'a, usize, V>, 55 } 56 57 impl<'a, V: 'a + Debug> Debug for Iter<'a, V> { fmt(&self, f: &mut Formatter) -> fmt::Result58 fn fmt(&self, f: &mut Formatter) -> fmt::Result { 59 f.debug_list().entries(self.inner.clone()).finish() 60 } 61 } 62 63 impl<'a, V: 'a> Iterator for Iter<'a, V> { 64 type Item = (usize, &'a V); 65 next(&mut self) -> Option<Self::Item>66 fn next(&mut self) -> Option<Self::Item> { self.inner.next().map(|(k, v)| (*k, v)) } 67 } 68 69 impl<'a, V: 'a> DoubleEndedIterator for Iter<'a, V> { next_back(&mut self) -> Option<Self::Item>70 fn next_back(&mut self) -> Option<Self::Item> { 71 self.inner.next_back().map(|(k, v)| (*k, v)) 72 } 73 } 74 } 75