diff options
| author | Corey Farwell <coreyf@rwell.org> | 2016-03-30 19:12:29 -0400 |
|---|---|---|
| committer | Corey Farwell <coreyf@rwell.org> | 2016-04-01 18:36:08 -0400 |
| commit | 2084f2ed77e28d78c8dfbd378251b29068a8c579 (patch) | |
| tree | 4b658d05bb54edb8a1621669399b78e5912d1645 /src/libcollections | |
| parent | 5972b22b7cdf2c4de2729ee874c1742a4ae97589 (diff) | |
| download | rust-2084f2ed77e28d78c8dfbd378251b29068a8c579.tar.gz rust-2084f2ed77e28d78c8dfbd378251b29068a8c579.zip | |
Implement `values_mut` on `BTreeMap`.
https://github.com/rust-lang/rust/issues/32551
Diffstat (limited to 'src/libcollections')
| -rw-r--r-- | src/libcollections/btree/map.rs | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/libcollections/btree/map.rs b/src/libcollections/btree/map.rs index 7819c7ef796..de40568fd67 100644 --- a/src/libcollections/btree/map.rs +++ b/src/libcollections/btree/map.rs @@ -285,6 +285,12 @@ pub struct Values<'a, K: 'a, V: 'a> { inner: Iter<'a, K, V>, } +/// A mutable iterator over a BTreeMap's values. +#[unstable(feature = "map_values_mut", reason = "recently added", issue = "32551")] +pub struct ValuesMut<'a, K: 'a, V: 'a> { + inner: IterMut<'a, K, V>, +} + /// An iterator over a sub-range of BTreeMap's entries. pub struct Range<'a, K: 'a, V: 'a> { front: Handle<NodeRef<marker::Immut<'a>, K, V, marker::Leaf>, marker::Edge>, @@ -1006,6 +1012,33 @@ impl<'a, K, V> Iterator for Range<'a, K, V> { } } +#[unstable(feature = "map_values_mut", reason = "recently added", issue = "32551")] +impl<'a, K, V> Iterator for ValuesMut<'a, K, V> { + type Item = &'a mut V; + + fn next(&mut self) -> Option<&'a mut V> { + self.inner.next().map(|(_, v)| v) + } + + fn size_hint(&self) -> (usize, Option<usize>) { + self.inner.size_hint() + } +} + +#[unstable(feature = "map_values_mut", reason = "recently added", issue = "32551")] +impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V> { + fn next_back(&mut self) -> Option<&'a mut V> { + self.inner.next_back().map(|(_, v)| v) + } +} + +#[unstable(feature = "map_values_mut", reason = "recently added", issue = "32551")] +impl<'a, K, V> ExactSizeIterator for ValuesMut<'a, K, V> { + fn len(&self) -> usize { + self.inner.len() + } +} + impl<'a, K, V> Range<'a, K, V> { unsafe fn next_unchecked(&mut self) -> (&'a K, &'a V) { let handle = self.front; @@ -1403,6 +1436,33 @@ impl<K, V> BTreeMap<K, V> { Values { inner: self.iter() } } + /// Gets a mutable iterator over the values of the map, in order by key. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// # #![feature(map_values_mut)] + /// use std::collections::BTreeMap; + /// + /// let mut a = BTreeMap::new(); + /// a.insert(1, String::from("hello")); + /// a.insert(2, String::from("goodbye")); + /// + /// for value in a.values_mut() { + /// value.push_str("!"); + /// } + /// + /// let values: Vec<String> = a.values().cloned().collect(); + /// assert_eq!(values, [String::from("hello!"), + /// String::from("goodbye!")]); + /// ``` + #[unstable(feature = "map_values_mut", reason = "recently added", issue = "32551")] + pub fn values_mut<'a>(&'a mut self) -> ValuesMut<'a, K, V> { + ValuesMut { inner: self.iter_mut() } + } + /// Returns the number of elements in the map. /// /// # Examples |
