/// A sorted map that allows multiple values for each key. pub use dup_tree_map::DupTreeMap; pub use dup_tree_set::DupTreeSet; mod known_size_iter { pub struct KnownSizeIterator { pub iter: I, pub size: usize, } impl Iterator for KnownSizeIterator { type Item = I::Item; fn next(&mut self) -> Option { let next = self.iter.next(); if next.is_some() { self.size -= 1; } next } fn size_hint(&self) -> (usize, Option) { (self.size, Some(self.size)) } } // unsafe impl iter::TrustedLen for KnownSizeIterator {} } mod tuple { mod sealed { pub trait Sealed {} } pub trait Tuple: sealed::Sealed { type First; type Second; } impl sealed::Sealed for (A, B) {} impl Tuple for (A, B) { type First = A; type Second = B; } } mod dup_tree_map { use super::known_size_iter::KnownSizeIterator; use super::tuple::Tuple; use smallvec::SmallVec; use std::collections::BTreeMap; use std::iter; type OneOrMore = SmallVec<[V; 1]>; type DupTreeMapInternal = BTreeMap>; #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct DupTreeMap { map: DupTreeMapInternal, size: usize, } // Generic types and functions to construct the iterators for this struct. type ZipRepeatIter = iter::Zip< iter::Repeat<::First>, <::Second as IntoIterator>::IntoIter, >; type DupTreeMapIter = KnownSizeIterator< iter::FlatMap< ::IntoIter, ZipRepeatIter<::Item>, fn( ::Item, ) -> ZipRepeatIter<::Item>, >, >; fn zip_repeat<'a, K, I>((k, iter): (K, I)) -> ZipRepeatIter<(K, I)> where K: Clone, I: IntoIterator, { iter::repeat(k).zip(iter.into_iter()) } fn make_map_iter(map: M, size: usize) -> DupTreeMapIter where M: IntoIterator, K: Clone, I: IntoIterator, { KnownSizeIterator { iter: map.into_iter().flat_map(zip_repeat), size, } } pub type IterMut<'a, K, V> = DupTreeMapIter<&'a mut DupTreeMapInternal>; pub type Iter<'a, K, V> = DupTreeMapIter<&'a DupTreeMapInternal>; pub type IntoIter = DupTreeMapIter>; impl DupTreeMap { pub fn new() -> Self { DupTreeMap { map: BTreeMap::new(), size: 0, } } pub fn insert(&mut self, key: K, value: V) { self.map.entry(key).or_default().push(value); self.size += 1; } pub fn len(&self) -> usize { self.size } pub fn is_empty(&self) -> bool { self.size == 0 } pub fn iter(&self) -> Iter<'_, K, V> { make_map_iter(&self.map, self.size) } pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { make_map_iter(&mut self.map, self.size) } } impl Default for DupTreeMap where K: Ord, { fn default() -> Self { Self::new() } } impl IntoIterator for DupTreeMap where K: Ord + Clone, { type Item = (K, V); type IntoIter = IntoIter; fn into_iter(self) -> Self::IntoIter { make_map_iter(self.map, self.size) } } impl<'a, K, V> IntoIterator for &'a DupTreeMap where K: Ord + 'a, V: 'a, { type Item = (&'a K, &'a V); type IntoIter = Iter<'a, K, V>; fn into_iter(self) -> Self::IntoIter { self.iter() } } impl<'a, K, V> IntoIterator for &'a mut DupTreeMap where K: Ord + 'a, V: 'a, { type Item = (&'a K, &'a mut V); type IntoIter = IterMut<'a, K, V>; fn into_iter(self) -> Self::IntoIter { self.iter_mut() } } impl iter::FromIterator<(K, V)> for DupTreeMap where K: Ord, { fn from_iter(iter: T) -> Self where T: IntoIterator, { let mut map = DupTreeMap::new(); for (k, v) in iter { map.insert(k, v); } map } } } mod dup_tree_set { use super::tuple::Tuple; use super::DupTreeMap; use std::iter; #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct DupTreeSet { map: DupTreeMap, } type DupTreeSetIter = iter::Map< ::IntoIter, fn( ::Item, ) -> <::Item as Tuple>::First, >; pub type Iter<'a, K> = DupTreeSetIter<&'a DupTreeMap>; pub type IntoIter = DupTreeSetIter>; fn drop_second((a, _): (A, B)) -> A { a } impl DupTreeSet { pub fn new() -> Self { DupTreeSet { map: DupTreeMap::new(), } } pub fn len(&self) -> usize { self.map.len() } pub fn is_empty(&self) -> bool { self.map.is_empty() } pub fn iter<'a>(&'a self) -> Iter<'a, K> { self.map.iter().map(drop_second) } } impl Default for DupTreeSet where K: Ord, { fn default() -> Self { Self::new() } } impl IntoIterator for DupTreeSet where K: Ord + Clone, { type Item = K; type IntoIter = IntoIter; fn into_iter(self) -> Self::IntoIter { self.map.into_iter().map(drop_second) } } impl<'a, K> IntoIterator for &'a DupTreeSet where K: Ord + 'a, { type Item = &'a K; type IntoIter = Iter<'a, K>; fn into_iter(self) -> Self::IntoIter { self.iter() } } impl iter::FromIterator for DupTreeSet where K: Ord, { fn from_iter(iter: T) -> Self where T: IntoIterator, { let map = iter.into_iter().map(|k| (k, ())).collect(); DupTreeSet { map } } } }