Skip to content

Commit

Permalink
Document replacement behavior in some collections
Browse files Browse the repository at this point in the history
{BTree,Hash}{Map,Set} will not update their key if it already exists, which
can matter with more complex keys. This behavior is now documented.

Fixes #26888
  • Loading branch information
steveklabnik committed Oct 23, 2015
1 parent 87e26ef commit e8e3c6f
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 8 deletions.
10 changes: 8 additions & 2 deletions src/libcollections/btree/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -315,8 +315,14 @@ impl<K: Ord, V> BTreeMap<K, V> {
// 2) While ODS may potentially return the pair we *just* inserted after
// the split, we will never do this. Again, this shouldn't effect the analysis.

/// Inserts a key-value pair into the map. If the key already had a value
/// present in the map, that value is returned. Otherwise, `None` is returned.
/// Inserts a key-value pair into the map.
///
/// If the map did not have this key present, `None` is returned.
///
/// If the map did have this key present, that value is returned, and the
/// entry is not updated. See the [module-level documentation] for more.
///
/// [module-level documentation]: index.html#insert-and-complex-keys
///
/// # Examples
///
Expand Down
10 changes: 8 additions & 2 deletions src/libcollections/btree/set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -430,8 +430,14 @@ impl<T: Ord> BTreeSet<T> {
other.is_subset(self)
}

/// Adds a value to the set. Returns `true` if the value was not already
/// present in the set.
/// Adds a value to the set.
///
/// If the set did not have a value present, `true` is returned.
///
/// If the set did have this key present, that value is returned, and the
/// entry is not updated. See the [module-level documentation] for more.
///
/// [module-level documentation]: index.html#insert-and-complex-keys
///
/// # Examples
///
Expand Down
10 changes: 8 additions & 2 deletions src/libstd/collections/hash/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1101,8 +1101,14 @@ impl<K, V, S> HashMap<K, V, S>
self.search_mut(k).map(|bucket| bucket.into_mut_refs().1)
}

/// Inserts a key-value pair into the map. If the key already had a value
/// present in the map, that value is returned. Otherwise, `None` is returned.
/// Inserts a key-value pair into the map.
///
/// If the map did not have this key present, `None` is returned.
///
/// If the map did have this key present, that value is returned, and the
/// entry is not updated. See the [module-level documentation] for more.
///
/// [module-level documentation]: index.html#insert-and-complex-keys
///
/// # Examples
///
Expand Down
10 changes: 8 additions & 2 deletions src/libstd/collections/hash/set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -540,8 +540,14 @@ impl<T, S> HashSet<T, S>
other.is_subset(self)
}

/// Adds a value to the set. Returns `true` if the value was not already
/// present in the set.
/// Adds a value to the set.
///
/// If the set did not have a value present, `true` is returned.
///
/// If the set did have this key present, that value is returned, and the
/// entry is not updated. See the [module-level documentation] for more.
///
/// [module-level documentation]: index.html#insert-and-complex-keys
///
/// # Examples
///
Expand Down
46 changes: 46 additions & 0 deletions src/libstd/collections/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,52 @@
//! }
//! }
//! ```
//!
//! # Insert and complex keys
//!
//! If we have a more complex key, calls to `insert()` will
//! not update the value of the key. For example:
//!
//! ```
//! use std::cmp::Ordering;
//! use std::collections::BTreeMap;
//! use std::hash::{Hash, Hasher};
//!
//! #[derive(Debug)]
//! struct Foo {
//! a: u32,
//! b: &'static str,
//! }
//!
//! // we will compare `Foo`s by their `a` value only.
//! impl PartialEq for Foo {
//! fn eq(&self, other: &Self) -> bool { self.a == other.a }
//! }
//!
//! impl Eq for Foo {}
//!
//! // we will hash `Foo`s by their `a` value only.
//! impl Hash for Foo {
//! fn hash<H: Hasher>(&self, h: &mut H) { self.a.hash(h); }
//! }
//!
//! impl PartialOrd for Foo {
//! fn partial_cmp(&self, other: &Self) -> Option<Ordering> { self.a.partial_cmp(&other.a) }
//! }
//!
//! impl Ord for Foo {
//! fn cmp(&self, other: &Self) -> Ordering { self.a.cmp(&other.a) }
//! }
//!
//! let mut map = BTreeMap::new();
//! map.insert(Foo { a: 1, b: "baz" }, ());
//!
//! // We already have a Foo with an a of 1, so this will be updating the value.
//! map.insert(Foo { a: 1, b: "xyz" }, ());
//!
//! // ... but the key hasn't changed. b is still "baz", not "xyz"
//! assert_eq!(map.keys().next().unwrap().b, "baz");
//! ```
#![stable(feature = "rust1", since = "1.0.0")]

Expand Down

0 comments on commit e8e3c6f

Please sign in to comment.