Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'lib/la-arena/src/lib.rs')
| -rw-r--r-- | lib/la-arena/src/lib.rs | 46 |
1 files changed, 44 insertions, 2 deletions
diff --git a/lib/la-arena/src/lib.rs b/lib/la-arena/src/lib.rs index f6597efd8f..07608a4185 100644 --- a/lib/la-arena/src/lib.rs +++ b/lib/la-arena/src/lib.rs @@ -4,8 +4,9 @@ #![warn(missing_docs)] use std::{ - fmt, + cmp, fmt, hash::{Hash, Hasher}, + iter::Enumerate, marker::PhantomData, ops::{Index, IndexMut, Range, RangeInclusive}, }; @@ -47,6 +48,18 @@ pub struct Idx<T> { _ty: PhantomData<fn() -> T>, } +impl<T> Ord for Idx<T> { + fn cmp(&self, other: &Self) -> cmp::Ordering { + self.raw.cmp(&other.raw) + } +} + +impl<T> PartialOrd for Idx<T> { + fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> { + self.raw.partial_cmp(&other.raw) + } +} + impl<T> Clone for Idx<T> { fn clone(&self) -> Self { *self @@ -335,7 +348,7 @@ impl<T> Arena<T> { /// assert_eq!(iterator.next(), Some(&40)); /// assert_eq!(iterator.next(), Some(&60)); /// ``` - pub fn values(&mut self) -> impl Iterator<Item = &T> + ExactSizeIterator + DoubleEndedIterator { + pub fn values(&self) -> impl Iterator<Item = &T> + ExactSizeIterator + DoubleEndedIterator { self.data.iter() } @@ -410,3 +423,32 @@ impl<T> FromIterator<T> for Arena<T> { Arena { data: Vec::from_iter(iter) } } } + +/// An iterator over the arena’s elements. +pub struct IntoIter<T>(Enumerate<<Vec<T> as IntoIterator>::IntoIter>); + +impl<T> Iterator for IntoIter<T> { + type Item = (Idx<T>, T); + + fn next(&mut self) -> Option<Self::Item> { + self.0.next().map(|(idx, value)| (Idx::from_raw(RawIdx(idx as u32)), value)) + } +} + +impl<T> IntoIterator for Arena<T> { + type Item = (Idx<T>, T); + + type IntoIter = IntoIter<T>; + + fn into_iter(self) -> Self::IntoIter { + IntoIter(self.data.into_iter().enumerate()) + } +} + +impl<T> Extend<T> for Arena<T> { + fn extend<II: IntoIterator<Item = T>>(&mut self, iter: II) { + for t in iter { + self.alloc(t); + } + } +} |