Specify behavior of HashSet::insert
`HashSet::insert` does not replace the value with equal value. Fixes #107581.
This commit is contained in:
parent
f3126500f2
commit
e800d5a0ec
@ -875,7 +875,9 @@ where
|
||||
/// Returns whether the value was newly inserted. That is:
|
||||
///
|
||||
/// - If the set did not previously contain this value, `true` is returned.
|
||||
/// - If the set already contained this value, `false` is returned.
|
||||
/// - If the set already contained this value, `false` is returned,
|
||||
/// and the set is not modified: original value is not replaced,
|
||||
/// and the value passed as argument is dropped.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
|
@ -3,6 +3,7 @@ use super::HashSet;
|
||||
|
||||
use crate::panic::{catch_unwind, AssertUnwindSafe};
|
||||
use crate::sync::atomic::{AtomicU32, Ordering};
|
||||
use crate::sync::Arc;
|
||||
|
||||
#[test]
|
||||
fn test_zero_capacities() {
|
||||
@ -502,3 +503,22 @@ fn const_with_hasher() {
|
||||
const X: HashSet<(), ()> = HashSet::with_hasher(());
|
||||
assert_eq!(X.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_insert_does_not_overwrite_the_value() {
|
||||
let first_value = Arc::new(17);
|
||||
let second_value = Arc::new(17);
|
||||
|
||||
let mut set = HashSet::new();
|
||||
let inserted = set.insert(first_value.clone());
|
||||
assert!(inserted);
|
||||
|
||||
let inserted = set.insert(second_value);
|
||||
assert!(!inserted);
|
||||
|
||||
assert!(
|
||||
Arc::ptr_eq(set.iter().next().unwrap(), &first_value),
|
||||
"Insert must not overwrite the value, so the contained value pointer \
|
||||
must be the same as first value pointer we inserted"
|
||||
);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user