From 300f3a1b43d13b08b2dcd01bdfb992456e3cc012 Mon Sep 17 00:00:00 2001 From: oxalica Date: Sat, 6 May 2023 21:15:49 +0800 Subject: [PATCH 1/5] Impl `ExactSizeIterator` for `IdxRange` --- lib/la-arena/src/lib.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/la-arena/src/lib.rs b/lib/la-arena/src/lib.rs index b03fa5b61d..c793fff848 100644 --- a/lib/la-arena/src/lib.rs +++ b/lib/la-arena/src/lib.rs @@ -176,9 +176,14 @@ impl IdxRange { impl Iterator for IdxRange { type Item = Idx; + fn next(&mut self) -> Option { self.range.next().map(|raw| Idx::from_raw(raw.into())) } + + fn size_hint(&self) -> (usize, Option) { + self.range.size_hint() + } } impl DoubleEndedIterator for IdxRange { @@ -187,6 +192,8 @@ impl DoubleEndedIterator for IdxRange { } } +impl ExactSizeIterator for IdxRange {} + impl fmt::Debug for IdxRange { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple(&format!("IdxRange::<{}>", std::any::type_name::())) From 4e4940e21ee2bdcdeb084e6d2ed675cdac746dfe Mon Sep 17 00:00:00 2001 From: oxalica Date: Sat, 6 May 2023 21:21:00 +0800 Subject: [PATCH 2/5] Add `Arena::alloc_many` to easily get `IdxRange` There are no currently ways to get `IdxRange` without manually offseting `Idx`. Providing a method for multiple-allocation simplifies this process and makes it less error-prone. --- lib/la-arena/src/lib.rs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/lib/la-arena/src/lib.rs b/lib/la-arena/src/lib.rs index c793fff848..bb7f21788c 100644 --- a/lib/la-arena/src/lib.rs +++ b/lib/la-arena/src/lib.rs @@ -312,6 +312,21 @@ impl Arena { idx } + /// Densely allocates multiple values, returning the values’ index range. + /// + /// ``` + /// let mut arena = la_arena::Arena::new(); + /// let range = arena.alloc_many(0..4); + /// + /// assert_eq!(arena[range], [0, 1, 2, 3]); + /// ``` + pub fn alloc_many>(&mut self, iter: II) -> IdxRange { + let start = self.next_idx(); + self.extend(iter); + let end = self.next_idx(); + IdxRange::new(start..end) + } + /// Returns an iterator over the arena’s elements. /// /// ``` From 86eaf536004ef348df4b3490a81ccf16aeba440f Mon Sep 17 00:00:00 2001 From: oxalica Date: Sat, 6 May 2023 21:27:35 +0800 Subject: [PATCH 3/5] Fix typo in docs --- lib/la-arena/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/la-arena/src/lib.rs b/lib/la-arena/src/lib.rs index bb7f21788c..eac9802e3e 100644 --- a/lib/la-arena/src/lib.rs +++ b/lib/la-arena/src/lib.rs @@ -168,7 +168,7 @@ impl IdxRange { Idx::from_raw(RawIdx::from(self.range.start)) } - /// Returns the start of the index range. + /// Returns the end of the index range. pub fn end(&self) -> Idx { Idx::from_raw(RawIdx::from(self.range.end)) } From 665c0cb547e044e6ff744e1b2c4b84e6232c97a6 Mon Sep 17 00:00:00 2001 From: oxalica Date: Sat, 6 May 2023 21:59:03 +0800 Subject: [PATCH 4/5] Forward `Iterator::{count,last,nth}` for `IdxRange` random access --- lib/la-arena/src/lib.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/la-arena/src/lib.rs b/lib/la-arena/src/lib.rs index eac9802e3e..63827e0ba9 100644 --- a/lib/la-arena/src/lib.rs +++ b/lib/la-arena/src/lib.rs @@ -184,6 +184,24 @@ impl Iterator for IdxRange { fn size_hint(&self) -> (usize, Option) { self.range.size_hint() } + + fn count(self) -> usize + where + Self: Sized, + { + self.range.count() + } + + fn last(self) -> Option + where + Self: Sized, + { + self.range.last().map(|raw| Idx::from_raw(raw.into())) + } + + fn nth(&mut self, n: usize) -> Option { + self.range.nth(n).map(|raw| Idx::from_raw(raw.into())) + } } impl DoubleEndedIterator for IdxRange { From add94d3b9ca53921796ad1336aa67701b6cf888a Mon Sep 17 00:00:00 2001 From: oxalica Date: Sat, 6 May 2023 22:02:30 +0800 Subject: [PATCH 5/5] Impl `FusedIterator` for `IdxRange` --- lib/la-arena/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/la-arena/src/lib.rs b/lib/la-arena/src/lib.rs index 63827e0ba9..1f8ef01a5b 100644 --- a/lib/la-arena/src/lib.rs +++ b/lib/la-arena/src/lib.rs @@ -6,7 +6,7 @@ use std::{ cmp, fmt, hash::{Hash, Hasher}, - iter::Enumerate, + iter::{Enumerate, FusedIterator}, marker::PhantomData, ops::{Index, IndexMut, Range, RangeInclusive}, }; @@ -212,6 +212,8 @@ impl DoubleEndedIterator for IdxRange { impl ExactSizeIterator for IdxRange {} +impl FusedIterator for IdxRange {} + impl fmt::Debug for IdxRange { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple(&format!("IdxRange::<{}>", std::any::type_name::()))