about summary refs log tree commit diff
path: root/lib
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2021-04-03 23:45:27 +0200
committerJonas Schievink <jonasschievink@gmail.com>2021-04-03 23:45:27 +0200
commitd1bce6070def3b4d5045c3fc4bb66904d50d0a40 (patch)
treef671f0e97d91f9392f90911ebcb62df8eea958ea /lib
parentb78f1a0a4d90276c7bd99bd0e5ac6959578be76a (diff)
downloadrust-d1bce6070def3b4d5045c3fc4bb66904d50d0a40.tar.gz
rust-d1bce6070def3b4d5045c3fc4bb66904d50d0a40.zip
Use shrink_to_fit to reduce DefMap sizes
Diffstat (limited to 'lib')
-rw-r--r--lib/arena/src/lib.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/lib/arena/src/lib.rs b/lib/arena/src/lib.rs
index 230a502910e..bce15c8679f 100644
--- a/lib/arena/src/lib.rs
+++ b/lib/arena/src/lib.rs
@@ -194,6 +194,29 @@ impl<T> Arena<T> {
         self.data.iter().enumerate().map(|(idx, value)| (Idx::from_raw(RawIdx(idx as u32)), value))
     }
 
+    /// Returns an iterator over the arena’s mutable elements.
+    ///
+    /// ```
+    /// let mut arena = la_arena::Arena::new();
+    /// let idx1 = arena.alloc(20);
+    ///
+    /// assert_eq!(arena[idx1], 20);
+    ///
+    /// let mut iterator = arena.iter_mut();
+    /// *iterator.next().unwrap().1 = 10;
+    /// drop(iterator);
+    ///
+    /// assert_eq!(arena[idx1], 10);
+    /// ```
+    pub fn iter_mut(
+        &mut self,
+    ) -> impl Iterator<Item = (Idx<T>, &mut T)> + ExactSizeIterator + DoubleEndedIterator {
+        self.data
+            .iter_mut()
+            .enumerate()
+            .map(|(idx, value)| (Idx::from_raw(RawIdx(idx as u32)), value))
+    }
+
     /// Reallocates the arena to make it take up as little space as possible.
     pub fn shrink_to_fit(&mut self) {
         self.data.shrink_to_fit();