Auto merge of #131148 - Urgau:hashbrown-0.15, r=Amanieu · qinheping/verify-rust-std@2b4f6ec (original) (raw)

`@@ -909,8 +909,11 @@ where

`

909

909

`` /// Attempts to get mutable references to N values in the map at once.

``

910

910

`///

`

911

911

`` /// Returns an array of length N with the results of each query. For soundness, at most one

``

912

``

`` -

/// mutable reference will be returned to any value. None will be returned if any of the

``

913

``

`-

/// keys are duplicates or missing.

`

``

912

`` +

/// mutable reference will be returned to any value. None will be used if the key is missing.

``

``

913

`+

///

`

``

914

`+

/// # Panics

`

``

915

`+

///

`

``

916

`+

/// Panics if any keys are overlapping.

`

914

917

`///

`

915

918

`/// # Examples

`

916

919

`///

`

`@@ -924,35 +927,55 @@ where

`

924

927

`/// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);

`

925

928

`/// libraries.insert("Library of Congress".to_string(), 1800);

`

926

929

`///

`

``

930

`+

/// // Get Athenæum and Bodleian Library

`

``

931

`+

/// let [Some(a), Some(b)] = libraries.get_many_mut([

`

``

932

`+

/// "Athenæum",

`

``

933

`+

/// "Bodleian Library",

`

``

934

`+

/// ]) else { panic!() };

`

``

935

`+

///

`

``

936

`+

/// // Assert values of Athenæum and Library of Congress

`

927

937

`/// let got = libraries.get_many_mut([

`

928

938

`/// "Athenæum",

`

929

939

`/// "Library of Congress",

`

930

940

`/// ]);

`

931

941

`/// assert_eq!(

`

932

942

`/// got,

`

933

``

`-

/// Some([

`

934

``

`-

/// &mut 1807,

`

935

``

`-

/// &mut 1800,

`

936

``

`-

/// ]),

`

``

943

`+

/// [

`

``

944

`+

/// Some(&mut 1807),

`

``

945

`+

/// Some(&mut 1800),

`

``

946

`+

/// ],

`

937

947

`/// );

`

938

948

`///

`

939

949

`/// // Missing keys result in None

`

940

950

`/// let got = libraries.get_many_mut([

`

941

951

`/// "Athenæum",

`

942

952

`/// "New York Public Library",

`

943

953

`/// ]);

`

944

``

`-

/// assert_eq!(got, None);

`

``

954

`+

/// assert_eq!(

`

``

955

`+

/// got,

`

``

956

`+

/// [

`

``

957

`+

/// Some(&mut 1807),

`

``

958

`+

/// None

`

``

959

`+

/// ]

`

``

960

`+

/// );

`

``

961


/// ```

``

962

`+

///

`

``

963


/// ```should_panic

``

964

`+

/// #![feature(map_many_mut)]

`

``

965

`+

/// use std::collections::HashMap;

`

945

966

`///

`

946

``

`-

/// // Duplicate keys result in None

`

``

967

`+

/// let mut libraries = HashMap::new();

`

``

968

`+

/// libraries.insert("Athenæum".to_string(), 1807);

`

``

969

`+

///

`

``

970

`+

/// // Duplicate keys panic!

`

947

971

`/// let got = libraries.get_many_mut([

`

948

972

`/// "Athenæum",

`

949

973

`/// "Athenæum",

`

950

974

`/// ]);

`

951

``

`-

/// assert_eq!(got, None);

`

952

975

```` /// ```


`953`

`976`

`#[inline]

`

`954`

`977`

`#[unstable(feature = "map_many_mut", issue = "97601")]

`

`955`

``

`-

pub fn get_many_mut<Q: ?Sized, const N: usize>(&mut self, ks: [&Q; N]) -> Option<[&'_ mut V; N]>

`

``

`978`

`+

pub fn get_many_mut<Q: ?Sized, const N: usize>(&mut self, ks: [&Q; N]) -> [Option<&'_ mut V>; N]

`

`956`

`979`

`where

`

`957`

`980`

`K: Borrow<Q>,

`

`958`

`981`

`Q: Hash + Eq,

`

`@@ -963,10 +986,10 @@ where

`

`963`

`986`

`` /// Attempts to get mutable references to `N` values in the map at once, without validating that

``

`964`

`987`

`/// the values are unique.

`

`965`

`988`

`///

`

`966`

``

`` -

/// Returns an array of length `N` with the results of each query. `None` will be returned if

``

`967`

``

`-

/// any of the keys are missing.

`

``

`989`

`` +

/// Returns an array of length `N` with the results of each query. `None` will be used if

``

``

`990`

`+

/// the key is missing.

`

`968`

`991`

`///

`

`969`

``

`` -

/// For a safe alternative see [`get_many_mut`](Self::get_many_mut).

``

``

`992`

`` +

/// For a safe alternative see [`get_many_mut`](`HashMap::get_many_mut`).

``

`970`

`993`

`///

`

`971`

`994`

`/// # Safety

`

`972`

`995`

`///

`

`@@ -987,31 +1010,39 @@ where

`

`987`

`1010`

`/// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);

`

`988`

`1011`

`/// libraries.insert("Library of Congress".to_string(), 1800);

`

`989`

`1012`

`///

`

`990`

``

`-

/// let got = libraries.get_many_mut([

`

``

`1013`

`+

/// // SAFETY: The keys do not overlap.

`

``

`1014`

`+

/// let [Some(a), Some(b)] = (unsafe { libraries.get_many_unchecked_mut([

`

``

`1015`

`+

/// "Athenæum",

`

``

`1016`

`+

/// "Bodleian Library",

`

``

`1017`

`+

/// ]) }) else { panic!() };

`

``

`1018`

`+

///

`

``

`1019`

`+

/// // SAFETY: The keys do not overlap.

`

``

`1020`

`+

/// let got = unsafe { libraries.get_many_unchecked_mut([

`

`991`

`1021`

`/// "Athenæum",

`

`992`

`1022`

`/// "Library of Congress",

`

`993`

``

`-

/// ]);

`

``

`1023`

`+

/// ]) };

`

`994`

`1024`

`/// assert_eq!(

`

`995`

`1025`

`/// got,

`

`996`

``

`-

/// Some([

`

`997`

``

`-

/// &mut 1807,

`

`998`

``

`-

/// &mut 1800,

`

`999`

``

`-

/// ]),

`

``

`1026`

`+

/// [

`

``

`1027`

`+

/// Some(&mut 1807),

`

``

`1028`

`+

/// Some(&mut 1800),

`

``

`1029`

`+

/// ],

`

`1000`

`1030`

`/// );

`

`1001`

`1031`

`///

`

`1002`

``

`-

/// // Missing keys result in None

`

`1003`

``

`-

/// let got = libraries.get_many_mut([

`

``

`1032`

`+

/// // SAFETY: The keys do not overlap.

`

``

`1033`

`+

/// let got = unsafe { libraries.get_many_unchecked_mut([

`

`1004`

`1034`

`/// "Athenæum",

`

`1005`

`1035`

`/// "New York Public Library",

`

`1006`

``

`-

/// ]);

`

`1007`

``

`-

/// assert_eq!(got, None);

`

``

`1036`

`+

/// ]) };

`

``

`1037`

`+

/// // Missing keys result in None

`

``

`1038`

`+

/// assert_eq!(got, [Some(&mut 1807), None]);

`

`1008`

`1039`

```` /// ```

1009

1040

`#[inline]

`

1010

1041

`#[unstable(feature = "map_many_mut", issue = "97601")]

`

1011

1042

`pub unsafe fn get_many_unchecked_mut<Q: ?Sized, const N: usize>(

`

1012

1043

`&mut self,

`

1013

1044

`ks: [&Q; N],

`

1014

``

`-

) -> Option<[&'_ mut V; N]>

`

``

1045

`+

) -> [Option<&'_ mut V>; N]

`

1015

1046

`where

`

1016

1047

`K: Borrow,

`

1017

1048

`Q: Hash + Eq,

`

`@@ -2978,64 +3009,6 @@ impl<'a, K, V> OccupiedEntry<'a, K, V> {

`

2978

3009

`pub fn remove(self) -> V {

`

2979

3010

`self.base.remove()

`

2980

3011

`}

`

2981

``

-

2982

``

`-

/// Replaces the entry, returning the old key and value. The new key in the hash map will be

`

2983

``

`-

/// the key used to create this entry.

`

2984

``

`-

///

`

2985

``

`-

/// # Examples

`

2986

``

`-

///

`

2987

``


/// ```

2988

``

`-

/// #![feature(map_entry_replace)]

`

2989

``

`-

/// use std::collections::hash_map::{Entry, HashMap};

`

2990

``

`-

/// use std::rc::Rc;

`

2991

``

`-

///

`

2992

``

`-

/// let mut map: HashMap<Rc, u32> = HashMap::new();

`

2993

``

`-

/// map.insert(Rc::new("Stringthing".to_string()), 15);

`

2994

``

`-

///

`

2995

``

`-

/// let my_key = Rc::new("Stringthing".to_string());

`

2996

``

`-

///

`

2997

``

`-

/// if let Entry::Occupied(entry) = map.entry(my_key) {

`

2998

``

`-

/// // Also replace the key with a handle to our other key.

`

2999

``

`-

/// let (old_key, old_value): (Rc, u32) = entry.replace_entry(16);

`

3000

``

`-

/// }

`

3001

``

`-

///

`

3002

``


/// ```

3003

``

`-

#[inline]

`

3004

``

`-

#[unstable(feature = "map_entry_replace", issue = "44286")]

`

3005

``

`-

pub fn replace_entry(self, value: V) -> (K, V) {

`

3006

``

`-

self.base.replace_entry(value)

`

3007

``

`-

}

`

3008

``

-

3009

``

`-

/// Replaces the key in the hash map with the key used to create this entry.

`

3010

``

`-

///

`

3011

``

`-

/// # Examples

`

3012

``

`-

///

`

3013

``


/// ```

3014

``

`-

/// #![feature(map_entry_replace)]

`

3015

``

`-

/// use std::collections::hash_map::{Entry, HashMap};

`

3016

``

`-

/// use std::rc::Rc;

`

3017

``

`-

///

`

3018

``

`-

/// let mut map: HashMap<Rc, u32> = HashMap::new();

`

3019

``

`-

/// let known_strings: Vec<Rc> = Vec::new();

`

3020

``

`-

///

`

3021

``

`-

/// // Initialise known strings, run program, etc.

`

3022

``

`-

///

`

3023

``

`-

/// reclaim_memory(&mut map, &known_strings);

`

3024

``

`-

///

`

3025

``

`-

/// fn reclaim_memory(map: &mut HashMap<Rc, u32>, known_strings: &[Rc] ) {

`

3026

``

`-

/// for s in known_strings {

`

3027

``

`-

/// if let Entry::Occupied(entry) = map.entry(Rc::clone(s)) {

`

3028

``

`` -

/// // Replaces the entry's key with our version of it in known_strings.

``

3029

``

`-

/// entry.replace_key();

`

3030

``

`-

/// }

`

3031

``

`-

/// }

`

3032

``

`-

/// }

`

3033

``


/// ```

3034

``

`-

#[inline]

`

3035

``

`-

#[unstable(feature = "map_entry_replace", issue = "44286")]

`

3036

``

`-

pub fn replace_key(self) -> K {

`

3037

``

`-

self.base.replace_key()

`

3038

``

`-

}

`

3039

3012

`}

`

3040

3013

``

3041

3014

`impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {

`