@@ -896,6 +896,119 @@ where
896
896
self . base . get_key_value ( k)
897
897
}
898
898
899
+ /// Attempts to get mutable references to `N` values in the map at once.
900
+ ///
901
+ /// Returns an array of length `N` with the results of each query. For soundness, at most one
902
+ /// mutable reference will be returned to any value. `None` will be returned if any of the
903
+ /// keys are duplicates or missing.
904
+ ///
905
+ /// # Examples
906
+ ///
907
+ /// ```
908
+ /// #![feature(map_many_mut)]
909
+ /// use std::collections::HashMap;
910
+ ///
911
+ /// let mut libraries = HashMap::new();
912
+ /// libraries.insert("Bodleian Library".to_string(), 1602);
913
+ /// libraries.insert("Athenæum".to_string(), 1807);
914
+ /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
915
+ /// libraries.insert("Library of Congress".to_string(), 1800);
916
+ ///
917
+ /// let got = libraries.get_many_mut([
918
+ /// "Athenæum",
919
+ /// "Library of Congress",
920
+ /// ]);
921
+ /// assert_eq!(
922
+ /// got,
923
+ /// Some([
924
+ /// &mut 1807,
925
+ /// &mut 1800,
926
+ /// ]),
927
+ /// );
928
+ ///
929
+ /// // Missing keys result in None
930
+ /// let got = libraries.get_many_mut([
931
+ /// "Athenæum",
932
+ /// "New York Public Library",
933
+ /// ]);
934
+ /// assert_eq!(got, None);
935
+ ///
936
+ /// // Duplicate keys result in None
937
+ /// let got = libraries.get_many_mut([
938
+ /// "Athenæum",
939
+ /// "Athenæum",
940
+ /// ]);
941
+ /// assert_eq!(got, None);
942
+ /// ```
943
+ #[ inline]
944
+ #[ unstable( feature = "map_many_mut" , issue = "97601" ) ]
945
+ pub fn get_many_mut < Q : ?Sized , const N : usize > ( & mut self , ks : [ & Q ; N ] ) -> Option < [ & ' _ mut V ; N ] >
946
+ where
947
+ K : Borrow < Q > ,
948
+ Q : Hash + Eq ,
949
+ {
950
+ self . base . get_many_mut ( ks)
951
+ }
952
+
953
+ /// Attempts to get mutable references to `N` values in the map at once, without validating that
954
+ /// the values are unique.
955
+ ///
956
+ /// Returns an array of length `N` with the results of each query. `None` will be returned if
957
+ /// any of the keys are missing.
958
+ ///
959
+ /// For a safe alternative see [`get_many_mut`](Self::get_many_mut).
960
+ ///
961
+ /// # Safety
962
+ ///
963
+ /// Calling this method with overlapping keys is *[undefined behavior]* even if the resulting
964
+ /// references are not used.
965
+ ///
966
+ /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
967
+ ///
968
+ /// # Examples
969
+ ///
970
+ /// ```
971
+ /// #![feature(map_many_mut)]
972
+ /// use std::collections::HashMap;
973
+ ///
974
+ /// let mut libraries = HashMap::new();
975
+ /// libraries.insert("Bodleian Library".to_string(), 1602);
976
+ /// libraries.insert("Athenæum".to_string(), 1807);
977
+ /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
978
+ /// libraries.insert("Library of Congress".to_string(), 1800);
979
+ ///
980
+ /// let got = libraries.get_many_mut([
981
+ /// "Athenæum",
982
+ /// "Library of Congress",
983
+ /// ]);
984
+ /// assert_eq!(
985
+ /// got,
986
+ /// Some([
987
+ /// &mut 1807,
988
+ /// &mut 1800,
989
+ /// ]),
990
+ /// );
991
+ ///
992
+ /// // Missing keys result in None
993
+ /// let got = libraries.get_many_mut([
994
+ /// "Athenæum",
995
+ /// "New York Public Library",
996
+ /// ]);
997
+ /// assert_eq!(got, None);
998
+ /// ```
999
+ #[ inline]
1000
+ #[ unstable( feature = "map_many_mut" , issue = "97601" ) ]
1001
+ pub unsafe fn get_many_unchecked_mut < Q : ?Sized , const N : usize > (
1002
+ & mut self ,
1003
+ ks : [ & Q ; N ] ,
1004
+ ) -> Option < [ & ' _ mut V ; N ] >
1005
+ where
1006
+ K : Borrow < Q > ,
1007
+ Q : Hash + Eq ,
1008
+ {
1009
+ self . base . get_many_unchecked_mut ( ks)
1010
+ }
1011
+
899
1012
/// Returns `true` if the map contains a value for the specified key.
900
1013
///
901
1014
/// The key may be any borrowed form of the map's key type, but
0 commit comments