Skip to content

Commit

Permalink
Implement values_mut on BTreeMap.
Browse files Browse the repository at this point in the history
  • Loading branch information
frewsxcv committed Apr 1, 2016
1 parent 5972b22 commit 2084f2e
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 0 deletions.
60 changes: 60 additions & 0 deletions src/libcollections/btree/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>,
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
15 changes: 15 additions & 0 deletions src/libcollectionstest/btree/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,21 @@ fn test_iter_rev() {
test(size, map.into_iter().rev());
}

#[test]
fn test_values_mut() {
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!")]);
}

#[test]
fn test_iter_mixed() {
let size = 10000;
Expand Down
1 change: 1 addition & 0 deletions src/libcollectionstest/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#![feature(enumset)]
#![feature(iter_arith)]
#![feature(map_entry_keys)]
#![feature(map_values_mut)]
#![feature(pattern)]
#![feature(rand)]
#![feature(set_recovery)]
Expand Down

0 comments on commit 2084f2e

Please sign in to comment.