Auto merge of #131148 - Urgau:hashbrown-0.15, r=Amanieu
Update hashbrown to 0.15 and adjust some methods This PR updates `hashbrown` to 0.15 in the standard library and adjust some methods as well as removing some as they no longer exists in Hashbrown it-self. - `HashMap::get_many_mut` change API to return array-of-Option - `HashMap::{replace_entry, replace_key}` are removed, FCP close [already finished](https://github.com/rust-lang/rust/issues/44286#issuecomment-2293825619) - `HashSet::get_or_insert_owned` is removed as it no longer exists in hashbrown Closes https://github.com/rust-lang/rust/issues/44286 r? `@Amanieu`
This commit is contained in:
commit
ad9c494835
@ -402,18 +402,18 @@ macro_rules! ins {
|
|||||||
// Get all values map at once otherwise it would be costly.
|
// Get all values map at once otherwise it would be costly.
|
||||||
// (8 values * 220 targets ~= 1760 times, at the time of writing this comment).
|
// (8 values * 220 targets ~= 1760 times, at the time of writing this comment).
|
||||||
let [
|
let [
|
||||||
values_target_abi,
|
Some(values_target_abi),
|
||||||
values_target_arch,
|
Some(values_target_arch),
|
||||||
values_target_endian,
|
Some(values_target_endian),
|
||||||
values_target_env,
|
Some(values_target_env),
|
||||||
values_target_family,
|
Some(values_target_family),
|
||||||
values_target_os,
|
Some(values_target_os),
|
||||||
values_target_pointer_width,
|
Some(values_target_pointer_width),
|
||||||
values_target_vendor,
|
Some(values_target_vendor),
|
||||||
] = self
|
] = self.expecteds.get_many_mut(VALUES)
|
||||||
.expecteds
|
else {
|
||||||
.get_many_mut(VALUES)
|
panic!("unable to get all the check-cfg values buckets");
|
||||||
.expect("unable to get all the check-cfg values buckets");
|
};
|
||||||
|
|
||||||
for target in TARGETS
|
for target in TARGETS
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -135,9 +135,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "hashbrown"
|
name = "hashbrown"
|
||||||
version = "0.14.5"
|
version = "0.15.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"allocator-api2",
|
"allocator-api2",
|
||||||
"compiler_builtins",
|
"compiler_builtins",
|
||||||
|
@ -20,7 +20,7 @@ core = { path = "../core", public = true }
|
|||||||
compiler_builtins = { version = "0.1.130" }
|
compiler_builtins = { version = "0.1.130" }
|
||||||
profiler_builtins = { path = "../profiler_builtins", optional = true }
|
profiler_builtins = { path = "../profiler_builtins", optional = true }
|
||||||
unwind = { path = "../unwind" }
|
unwind = { path = "../unwind" }
|
||||||
hashbrown = { version = "0.14", default-features = false, features = [
|
hashbrown = { version = "0.15", default-features = false, features = [
|
||||||
'rustc-dep-of-std',
|
'rustc-dep-of-std',
|
||||||
] }
|
] }
|
||||||
# FIXME(#127890): `object` depends on `memchr`, but `memchr` > v2.5 causes
|
# FIXME(#127890): `object` depends on `memchr`, but `memchr` > v2.5 causes
|
||||||
|
@ -909,8 +909,11 @@ pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
|
|||||||
/// Attempts to get mutable references to `N` values in the map at once.
|
/// Attempts to get mutable references to `N` values in the map at once.
|
||||||
///
|
///
|
||||||
/// Returns an array of length `N` with the results of each query. For soundness, at most one
|
/// Returns an array of length `N` with the results of each query. For soundness, at most one
|
||||||
/// mutable reference will be returned to any value. `None` will be returned if any of the
|
/// mutable reference will be returned to any value. `None` will be used if the key is missing.
|
||||||
/// keys are duplicates or missing.
|
///
|
||||||
|
/// # Panics
|
||||||
|
///
|
||||||
|
/// Panics if any keys are overlapping.
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
@ -924,16 +927,23 @@ pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
|
|||||||
/// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
|
/// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
|
||||||
/// libraries.insert("Library of Congress".to_string(), 1800);
|
/// libraries.insert("Library of Congress".to_string(), 1800);
|
||||||
///
|
///
|
||||||
|
/// // Get Athenæum and Bodleian Library
|
||||||
|
/// let [Some(a), Some(b)] = libraries.get_many_mut([
|
||||||
|
/// "Athenæum",
|
||||||
|
/// "Bodleian Library",
|
||||||
|
/// ]) else { panic!() };
|
||||||
|
///
|
||||||
|
/// // Assert values of Athenæum and Library of Congress
|
||||||
/// let got = libraries.get_many_mut([
|
/// let got = libraries.get_many_mut([
|
||||||
/// "Athenæum",
|
/// "Athenæum",
|
||||||
/// "Library of Congress",
|
/// "Library of Congress",
|
||||||
/// ]);
|
/// ]);
|
||||||
/// assert_eq!(
|
/// assert_eq!(
|
||||||
/// got,
|
/// got,
|
||||||
/// Some([
|
/// [
|
||||||
/// &mut 1807,
|
/// Some(&mut 1807),
|
||||||
/// &mut 1800,
|
/// Some(&mut 1800),
|
||||||
/// ]),
|
/// ],
|
||||||
/// );
|
/// );
|
||||||
///
|
///
|
||||||
/// // Missing keys result in None
|
/// // Missing keys result in None
|
||||||
@ -941,18 +951,31 @@ pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
|
|||||||
/// "Athenæum",
|
/// "Athenæum",
|
||||||
/// "New York Public Library",
|
/// "New York Public Library",
|
||||||
/// ]);
|
/// ]);
|
||||||
/// assert_eq!(got, None);
|
/// assert_eq!(
|
||||||
|
/// got,
|
||||||
|
/// [
|
||||||
|
/// Some(&mut 1807),
|
||||||
|
/// None
|
||||||
|
/// ]
|
||||||
|
/// );
|
||||||
|
/// ```
|
||||||
///
|
///
|
||||||
/// // Duplicate keys result in None
|
/// ```should_panic
|
||||||
|
/// #![feature(map_many_mut)]
|
||||||
|
/// use std::collections::HashMap;
|
||||||
|
///
|
||||||
|
/// let mut libraries = HashMap::new();
|
||||||
|
/// libraries.insert("Athenæum".to_string(), 1807);
|
||||||
|
///
|
||||||
|
/// // Duplicate keys panic!
|
||||||
/// let got = libraries.get_many_mut([
|
/// let got = libraries.get_many_mut([
|
||||||
/// "Athenæum",
|
/// "Athenæum",
|
||||||
/// "Athenæum",
|
/// "Athenæum",
|
||||||
/// ]);
|
/// ]);
|
||||||
/// assert_eq!(got, None);
|
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "map_many_mut", issue = "97601")]
|
#[unstable(feature = "map_many_mut", issue = "97601")]
|
||||||
pub fn get_many_mut<Q: ?Sized, const N: usize>(&mut self, ks: [&Q; N]) -> Option<[&'_ mut V; N]>
|
pub fn get_many_mut<Q: ?Sized, const N: usize>(&mut self, ks: [&Q; N]) -> [Option<&'_ mut V>; N]
|
||||||
where
|
where
|
||||||
K: Borrow<Q>,
|
K: Borrow<Q>,
|
||||||
Q: Hash + Eq,
|
Q: Hash + Eq,
|
||||||
@ -963,10 +986,10 @@ pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
|
|||||||
/// Attempts to get mutable references to `N` values in the map at once, without validating that
|
/// Attempts to get mutable references to `N` values in the map at once, without validating that
|
||||||
/// the values are unique.
|
/// the values are unique.
|
||||||
///
|
///
|
||||||
/// Returns an array of length `N` with the results of each query. `None` will be returned if
|
/// Returns an array of length `N` with the results of each query. `None` will be used if
|
||||||
/// any of the keys are missing.
|
/// the key is missing.
|
||||||
///
|
///
|
||||||
/// For a safe alternative see [`get_many_mut`](Self::get_many_mut).
|
/// For a safe alternative see [`get_many_mut`](`HashMap::get_many_mut`).
|
||||||
///
|
///
|
||||||
/// # Safety
|
/// # Safety
|
||||||
///
|
///
|
||||||
@ -987,31 +1010,39 @@ pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
|
|||||||
/// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
|
/// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
|
||||||
/// libraries.insert("Library of Congress".to_string(), 1800);
|
/// libraries.insert("Library of Congress".to_string(), 1800);
|
||||||
///
|
///
|
||||||
/// let got = libraries.get_many_mut([
|
/// // SAFETY: The keys do not overlap.
|
||||||
|
/// let [Some(a), Some(b)] = (unsafe { libraries.get_many_unchecked_mut([
|
||||||
|
/// "Athenæum",
|
||||||
|
/// "Bodleian Library",
|
||||||
|
/// ]) }) else { panic!() };
|
||||||
|
///
|
||||||
|
/// // SAFETY: The keys do not overlap.
|
||||||
|
/// let got = unsafe { libraries.get_many_unchecked_mut([
|
||||||
/// "Athenæum",
|
/// "Athenæum",
|
||||||
/// "Library of Congress",
|
/// "Library of Congress",
|
||||||
/// ]);
|
/// ]) };
|
||||||
/// assert_eq!(
|
/// assert_eq!(
|
||||||
/// got,
|
/// got,
|
||||||
/// Some([
|
/// [
|
||||||
/// &mut 1807,
|
/// Some(&mut 1807),
|
||||||
/// &mut 1800,
|
/// Some(&mut 1800),
|
||||||
/// ]),
|
/// ],
|
||||||
/// );
|
/// );
|
||||||
///
|
///
|
||||||
/// // Missing keys result in None
|
/// // SAFETY: The keys do not overlap.
|
||||||
/// let got = libraries.get_many_mut([
|
/// let got = unsafe { libraries.get_many_unchecked_mut([
|
||||||
/// "Athenæum",
|
/// "Athenæum",
|
||||||
/// "New York Public Library",
|
/// "New York Public Library",
|
||||||
/// ]);
|
/// ]) };
|
||||||
/// assert_eq!(got, None);
|
/// // Missing keys result in None
|
||||||
|
/// assert_eq!(got, [Some(&mut 1807), None]);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
#[unstable(feature = "map_many_mut", issue = "97601")]
|
#[unstable(feature = "map_many_mut", issue = "97601")]
|
||||||
pub unsafe fn get_many_unchecked_mut<Q: ?Sized, const N: usize>(
|
pub unsafe fn get_many_unchecked_mut<Q: ?Sized, const N: usize>(
|
||||||
&mut self,
|
&mut self,
|
||||||
ks: [&Q; N],
|
ks: [&Q; N],
|
||||||
) -> Option<[&'_ mut V; N]>
|
) -> [Option<&'_ mut V>; N]
|
||||||
where
|
where
|
||||||
K: Borrow<Q>,
|
K: Borrow<Q>,
|
||||||
Q: Hash + Eq,
|
Q: Hash + Eq,
|
||||||
@ -2978,64 +3009,6 @@ pub fn insert(&mut self, value: V) -> V {
|
|||||||
pub fn remove(self) -> V {
|
pub fn remove(self) -> V {
|
||||||
self.base.remove()
|
self.base.remove()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Replaces the entry, returning the old key and value. The new key in the hash map will be
|
|
||||||
/// the key used to create this entry.
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// #![feature(map_entry_replace)]
|
|
||||||
/// use std::collections::hash_map::{Entry, HashMap};
|
|
||||||
/// use std::rc::Rc;
|
|
||||||
///
|
|
||||||
/// let mut map: HashMap<Rc<String>, u32> = HashMap::new();
|
|
||||||
/// map.insert(Rc::new("Stringthing".to_string()), 15);
|
|
||||||
///
|
|
||||||
/// let my_key = Rc::new("Stringthing".to_string());
|
|
||||||
///
|
|
||||||
/// if let Entry::Occupied(entry) = map.entry(my_key) {
|
|
||||||
/// // Also replace the key with a handle to our other key.
|
|
||||||
/// let (old_key, old_value): (Rc<String>, u32) = entry.replace_entry(16);
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
#[inline]
|
|
||||||
#[unstable(feature = "map_entry_replace", issue = "44286")]
|
|
||||||
pub fn replace_entry(self, value: V) -> (K, V) {
|
|
||||||
self.base.replace_entry(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Replaces the key in the hash map with the key used to create this entry.
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// #![feature(map_entry_replace)]
|
|
||||||
/// use std::collections::hash_map::{Entry, HashMap};
|
|
||||||
/// use std::rc::Rc;
|
|
||||||
///
|
|
||||||
/// let mut map: HashMap<Rc<String>, u32> = HashMap::new();
|
|
||||||
/// let known_strings: Vec<Rc<String>> = Vec::new();
|
|
||||||
///
|
|
||||||
/// // Initialise known strings, run program, etc.
|
|
||||||
///
|
|
||||||
/// reclaim_memory(&mut map, &known_strings);
|
|
||||||
///
|
|
||||||
/// fn reclaim_memory(map: &mut HashMap<Rc<String>, u32>, known_strings: &[Rc<String>] ) {
|
|
||||||
/// for s in known_strings {
|
|
||||||
/// if let Entry::Occupied(entry) = map.entry(Rc::clone(s)) {
|
|
||||||
/// // Replaces the entry's key with our version of it in `known_strings`.
|
|
||||||
/// entry.replace_key();
|
|
||||||
/// }
|
|
||||||
/// }
|
|
||||||
/// }
|
|
||||||
/// ```
|
|
||||||
#[inline]
|
|
||||||
#[unstable(feature = "map_entry_replace", issue = "44286")]
|
|
||||||
pub fn replace_key(self) -> K {
|
|
||||||
self.base.replace_key()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {
|
impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {
|
||||||
|
@ -724,38 +724,6 @@ pub fn get_or_insert(&mut self, value: T) -> &T {
|
|||||||
self.base.get_or_insert(value)
|
self.base.get_or_insert(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inserts an owned copy of the given `value` into the set if it is not
|
|
||||||
/// present, then returns a reference to the value in the set.
|
|
||||||
///
|
|
||||||
/// # Examples
|
|
||||||
///
|
|
||||||
/// ```
|
|
||||||
/// #![feature(hash_set_entry)]
|
|
||||||
///
|
|
||||||
/// use std::collections::HashSet;
|
|
||||||
///
|
|
||||||
/// let mut set: HashSet<String> = ["cat", "dog", "horse"]
|
|
||||||
/// .iter().map(|&pet| pet.to_owned()).collect();
|
|
||||||
///
|
|
||||||
/// assert_eq!(set.len(), 3);
|
|
||||||
/// for &pet in &["cat", "dog", "fish"] {
|
|
||||||
/// let value = set.get_or_insert_owned(pet);
|
|
||||||
/// assert_eq!(value, pet);
|
|
||||||
/// }
|
|
||||||
/// assert_eq!(set.len(), 4); // a new "fish" was inserted
|
|
||||||
/// ```
|
|
||||||
#[inline]
|
|
||||||
#[unstable(feature = "hash_set_entry", issue = "60896")]
|
|
||||||
pub fn get_or_insert_owned<Q: ?Sized>(&mut self, value: &Q) -> &T
|
|
||||||
where
|
|
||||||
T: Borrow<Q>,
|
|
||||||
Q: Hash + Eq + ToOwned<Owned = T>,
|
|
||||||
{
|
|
||||||
// Although the raw entry gives us `&mut T`, we only return `&T` to be consistent with
|
|
||||||
// `get`. Key mutation is "raw" because you're not supposed to affect `Eq` or `Hash`.
|
|
||||||
self.base.get_or_insert_owned(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Inserts a value computed from `f` into the set if the given `value` is
|
/// Inserts a value computed from `f` into the set if the given `value` is
|
||||||
/// not present, then returns a reference to the value in the set.
|
/// not present, then returns a reference to the value in the set.
|
||||||
///
|
///
|
||||||
|
@ -6,7 +6,6 @@ const EXPECTED = [
|
|||||||
{ 'path': 'std::collections::hash_set::HashSet', 'name': 'insert' },
|
{ 'path': 'std::collections::hash_set::HashSet', 'name': 'insert' },
|
||||||
{ 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert' },
|
{ 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert' },
|
||||||
{ 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_with' },
|
{ 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_with' },
|
||||||
{ 'path': 'std::collections::hash_set::HashSet', 'name': 'get_or_insert_owned' },
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user