]> git.lizzy.rs Git - rust.git/blob - library/std/src/collections/hash/map.rs
Implement Error for OccupiedError.
[rust.git] / library / std / src / collections / hash / map.rs
1 #[cfg(test)]
2 mod tests;
3
4 use self::Entry::*;
5
6 use hashbrown::hash_map as base;
7
8 use crate::borrow::Borrow;
9 use crate::cell::Cell;
10 use crate::collections::TryReserveError;
11 use crate::fmt::{self, Debug};
12 #[allow(deprecated)]
13 use crate::hash::{BuildHasher, Hash, Hasher, SipHasher13};
14 use crate::iter::{FromIterator, FusedIterator};
15 use crate::ops::Index;
16 use crate::sys;
17
18 /// A hash map implemented with quadratic probing and SIMD lookup.
19 ///
20 /// By default, `HashMap` uses a hashing algorithm selected to provide
21 /// resistance against HashDoS attacks. The algorithm is randomly seeded, and a
22 /// reasonable best-effort is made to generate this seed from a high quality,
23 /// secure source of randomness provided by the host without blocking the
24 /// program. Because of this, the randomness of the seed depends on the output
25 /// quality of the system's random number generator when the seed is created.
26 /// In particular, seeds generated when the system's entropy pool is abnormally
27 /// low such as during system boot may be of a lower quality.
28 ///
29 /// The default hashing algorithm is currently SipHash 1-3, though this is
30 /// subject to change at any point in the future. While its performance is very
31 /// competitive for medium sized keys, other hashing algorithms will outperform
32 /// it for small keys such as integers as well as large keys such as long
33 /// strings, though those algorithms will typically *not* protect against
34 /// attacks such as HashDoS.
35 ///
36 /// The hashing algorithm can be replaced on a per-`HashMap` basis using the
37 /// [`default`], [`with_hasher`], and [`with_capacity_and_hasher`] methods.
38 /// There are many alternative [hashing algorithms available on crates.io].
39 ///
40 /// It is required that the keys implement the [`Eq`] and [`Hash`] traits, although
41 /// this can frequently be achieved by using `#[derive(PartialEq, Eq, Hash)]`.
42 /// If you implement these yourself, it is important that the following
43 /// property holds:
44 ///
45 /// ```text
46 /// k1 == k2 -> hash(k1) == hash(k2)
47 /// ```
48 ///
49 /// In other words, if two keys are equal, their hashes must be equal.
50 ///
51 /// It is a logic error for a key to be modified in such a way that the key's
52 /// hash, as determined by the [`Hash`] trait, or its equality, as determined by
53 /// the [`Eq`] trait, changes while it is in the map. This is normally only
54 /// possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code.
55 /// The behavior resulting from such a logic error is not specified, but will
56 /// not result in undefined behavior. This could include panics, incorrect results,
57 /// aborts, memory leaks, and non-termination.
58 ///
59 /// The hash table implementation is a Rust port of Google's [SwissTable].
60 /// The original C++ version of SwissTable can be found [here], and this
61 /// [CppCon talk] gives an overview of how the algorithm works.
62 ///
63 /// [hashing algorithms available on crates.io]: https://crates.io/keywords/hasher
64 /// [SwissTable]: https://abseil.io/blog/20180927-swisstables
65 /// [here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h
66 /// [CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4
67 ///
68 /// # Examples
69 ///
70 /// ```
71 /// use std::collections::HashMap;
72 ///
73 /// // Type inference lets us omit an explicit type signature (which
74 /// // would be `HashMap<String, String>` in this example).
75 /// let mut book_reviews = HashMap::new();
76 ///
77 /// // Review some books.
78 /// book_reviews.insert(
79 ///     "Adventures of Huckleberry Finn".to_string(),
80 ///     "My favorite book.".to_string(),
81 /// );
82 /// book_reviews.insert(
83 ///     "Grimms' Fairy Tales".to_string(),
84 ///     "Masterpiece.".to_string(),
85 /// );
86 /// book_reviews.insert(
87 ///     "Pride and Prejudice".to_string(),
88 ///     "Very enjoyable.".to_string(),
89 /// );
90 /// book_reviews.insert(
91 ///     "The Adventures of Sherlock Holmes".to_string(),
92 ///     "Eye lyked it alot.".to_string(),
93 /// );
94 ///
95 /// // Check for a specific one.
96 /// // When collections store owned values (String), they can still be
97 /// // queried using references (&str).
98 /// if !book_reviews.contains_key("Les Misérables") {
99 ///     println!("We've got {} reviews, but Les Misérables ain't one.",
100 ///              book_reviews.len());
101 /// }
102 ///
103 /// // oops, this review has a lot of spelling mistakes, let's delete it.
104 /// book_reviews.remove("The Adventures of Sherlock Holmes");
105 ///
106 /// // Look up the values associated with some keys.
107 /// let to_find = ["Pride and Prejudice", "Alice's Adventure in Wonderland"];
108 /// for &book in &to_find {
109 ///     match book_reviews.get(book) {
110 ///         Some(review) => println!("{}: {}", book, review),
111 ///         None => println!("{} is unreviewed.", book)
112 ///     }
113 /// }
114 ///
115 /// // Look up the value for a key (will panic if the key is not found).
116 /// println!("Review for Jane: {}", book_reviews["Pride and Prejudice"]);
117 ///
118 /// // Iterate over everything.
119 /// for (book, review) in &book_reviews {
120 ///     println!("{}: \"{}\"", book, review);
121 /// }
122 /// ```
123 ///
124 /// `HashMap` also implements an [`Entry API`](#method.entry), which allows
125 /// for more complex methods of getting, setting, updating and removing keys and
126 /// their values:
127 ///
128 /// ```
129 /// use std::collections::HashMap;
130 ///
131 /// // type inference lets us omit an explicit type signature (which
132 /// // would be `HashMap<&str, u8>` in this example).
133 /// let mut player_stats = HashMap::new();
134 ///
135 /// fn random_stat_buff() -> u8 {
136 ///     // could actually return some random value here - let's just return
137 ///     // some fixed value for now
138 ///     42
139 /// }
140 ///
141 /// // insert a key only if it doesn't already exist
142 /// player_stats.entry("health").or_insert(100);
143 ///
144 /// // insert a key using a function that provides a new value only if it
145 /// // doesn't already exist
146 /// player_stats.entry("defence").or_insert_with(random_stat_buff);
147 ///
148 /// // update a key, guarding against the key possibly not being set
149 /// let stat = player_stats.entry("attack").or_insert(100);
150 /// *stat += random_stat_buff();
151 /// ```
152 ///
153 /// The easiest way to use `HashMap` with a custom key type is to derive [`Eq`] and [`Hash`].
154 /// We must also derive [`PartialEq`].
155 ///
156 /// [`RefCell`]: crate::cell::RefCell
157 /// [`Cell`]: crate::cell::Cell
158 /// [`default`]: Default::default
159 /// [`with_hasher`]: Self::with_hasher
160 /// [`with_capacity_and_hasher`]: Self::with_capacity_and_hasher
161 ///
162 /// ```
163 /// use std::collections::HashMap;
164 ///
165 /// #[derive(Hash, Eq, PartialEq, Debug)]
166 /// struct Viking {
167 ///     name: String,
168 ///     country: String,
169 /// }
170 ///
171 /// impl Viking {
172 ///     /// Creates a new Viking.
173 ///     fn new(name: &str, country: &str) -> Viking {
174 ///         Viking { name: name.to_string(), country: country.to_string() }
175 ///     }
176 /// }
177 ///
178 /// // Use a HashMap to store the vikings' health points.
179 /// let mut vikings = HashMap::new();
180 ///
181 /// vikings.insert(Viking::new("Einar", "Norway"), 25);
182 /// vikings.insert(Viking::new("Olaf", "Denmark"), 24);
183 /// vikings.insert(Viking::new("Harald", "Iceland"), 12);
184 ///
185 /// // Use derived implementation to print the status of the vikings.
186 /// for (viking, health) in &vikings {
187 ///     println!("{:?} has {} hp", viking, health);
188 /// }
189 /// ```
190 ///
191 /// A `HashMap` with fixed list of elements can be initialized from an array:
192 ///
193 /// ```
194 /// use std::collections::HashMap;
195 ///
196 /// let timber_resources: HashMap<&str, i32> = [("Norway", 100), ("Denmark", 50), ("Iceland", 10)]
197 ///     .iter().cloned().collect();
198 /// // use the values stored in map
199 /// ```
200
201 #[cfg_attr(not(test), rustc_diagnostic_item = "hashmap_type")]
202 #[stable(feature = "rust1", since = "1.0.0")]
203 pub struct HashMap<K, V, S = RandomState> {
204     base: base::HashMap<K, V, S>,
205 }
206
207 impl<K, V> HashMap<K, V, RandomState> {
208     /// Creates an empty `HashMap`.
209     ///
210     /// The hash map is initially created with a capacity of 0, so it will not allocate until it
211     /// is first inserted into.
212     ///
213     /// # Examples
214     ///
215     /// ```
216     /// use std::collections::HashMap;
217     /// let mut map: HashMap<&str, i32> = HashMap::new();
218     /// ```
219     #[inline]
220     #[stable(feature = "rust1", since = "1.0.0")]
221     pub fn new() -> HashMap<K, V, RandomState> {
222         Default::default()
223     }
224
225     /// Creates an empty `HashMap` with the specified capacity.
226     ///
227     /// The hash map will be able to hold at least `capacity` elements without
228     /// reallocating. If `capacity` is 0, the hash map will not allocate.
229     ///
230     /// # Examples
231     ///
232     /// ```
233     /// use std::collections::HashMap;
234     /// let mut map: HashMap<&str, i32> = HashMap::with_capacity(10);
235     /// ```
236     #[inline]
237     #[stable(feature = "rust1", since = "1.0.0")]
238     pub fn with_capacity(capacity: usize) -> HashMap<K, V, RandomState> {
239         HashMap::with_capacity_and_hasher(capacity, Default::default())
240     }
241 }
242
243 impl<K, V, S> HashMap<K, V, S> {
244     /// Creates an empty `HashMap` which will use the given hash builder to hash
245     /// keys.
246     ///
247     /// The created map has the default initial capacity.
248     ///
249     /// Warning: `hash_builder` is normally randomly generated, and
250     /// is designed to allow HashMaps to be resistant to attacks that
251     /// cause many collisions and very poor performance. Setting it
252     /// manually using this function can expose a DoS attack vector.
253     ///
254     /// The `hash_builder` passed should implement the [`BuildHasher`] trait for
255     /// the HashMap to be useful, see its documentation for details.
256     ///
257     /// # Examples
258     ///
259     /// ```
260     /// use std::collections::HashMap;
261     /// use std::collections::hash_map::RandomState;
262     ///
263     /// let s = RandomState::new();
264     /// let mut map = HashMap::with_hasher(s);
265     /// map.insert(1, 2);
266     /// ```
267     #[inline]
268     #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
269     pub fn with_hasher(hash_builder: S) -> HashMap<K, V, S> {
270         HashMap { base: base::HashMap::with_hasher(hash_builder) }
271     }
272
273     /// Creates an empty `HashMap` with the specified capacity, using `hash_builder`
274     /// to hash the keys.
275     ///
276     /// The hash map will be able to hold at least `capacity` elements without
277     /// reallocating. If `capacity` is 0, the hash map will not allocate.
278     ///
279     /// Warning: `hash_builder` is normally randomly generated, and
280     /// is designed to allow HashMaps to be resistant to attacks that
281     /// cause many collisions and very poor performance. Setting it
282     /// manually using this function can expose a DoS attack vector.
283     ///
284     /// The `hash_builder` passed should implement the [`BuildHasher`] trait for
285     /// the HashMap to be useful, see its documentation for details.
286     ///
287     /// # Examples
288     ///
289     /// ```
290     /// use std::collections::HashMap;
291     /// use std::collections::hash_map::RandomState;
292     ///
293     /// let s = RandomState::new();
294     /// let mut map = HashMap::with_capacity_and_hasher(10, s);
295     /// map.insert(1, 2);
296     /// ```
297     #[inline]
298     #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
299     pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> HashMap<K, V, S> {
300         HashMap { base: base::HashMap::with_capacity_and_hasher(capacity, hash_builder) }
301     }
302
303     /// Returns the number of elements the map can hold without reallocating.
304     ///
305     /// This number is a lower bound; the `HashMap<K, V>` might be able to hold
306     /// more, but is guaranteed to be able to hold at least this many.
307     ///
308     /// # Examples
309     ///
310     /// ```
311     /// use std::collections::HashMap;
312     /// let map: HashMap<i32, i32> = HashMap::with_capacity(100);
313     /// assert!(map.capacity() >= 100);
314     /// ```
315     #[inline]
316     #[stable(feature = "rust1", since = "1.0.0")]
317     pub fn capacity(&self) -> usize {
318         self.base.capacity()
319     }
320
321     /// An iterator visiting all keys in arbitrary order.
322     /// The iterator element type is `&'a K`.
323     ///
324     /// # Examples
325     ///
326     /// ```
327     /// use std::collections::HashMap;
328     ///
329     /// let mut map = HashMap::new();
330     /// map.insert("a", 1);
331     /// map.insert("b", 2);
332     /// map.insert("c", 3);
333     ///
334     /// for key in map.keys() {
335     ///     println!("{}", key);
336     /// }
337     /// ```
338     #[stable(feature = "rust1", since = "1.0.0")]
339     pub fn keys(&self) -> Keys<'_, K, V> {
340         Keys { inner: self.iter() }
341     }
342
343     /// An iterator visiting all values in arbitrary order.
344     /// The iterator element type is `&'a V`.
345     ///
346     /// # Examples
347     ///
348     /// ```
349     /// use std::collections::HashMap;
350     ///
351     /// let mut map = HashMap::new();
352     /// map.insert("a", 1);
353     /// map.insert("b", 2);
354     /// map.insert("c", 3);
355     ///
356     /// for val in map.values() {
357     ///     println!("{}", val);
358     /// }
359     /// ```
360     #[stable(feature = "rust1", since = "1.0.0")]
361     pub fn values(&self) -> Values<'_, K, V> {
362         Values { inner: self.iter() }
363     }
364
365     /// An iterator visiting all values mutably in arbitrary order.
366     /// The iterator element type is `&'a mut V`.
367     ///
368     /// # Examples
369     ///
370     /// ```
371     /// use std::collections::HashMap;
372     ///
373     /// let mut map = HashMap::new();
374     ///
375     /// map.insert("a", 1);
376     /// map.insert("b", 2);
377     /// map.insert("c", 3);
378     ///
379     /// for val in map.values_mut() {
380     ///     *val = *val + 10;
381     /// }
382     ///
383     /// for val in map.values() {
384     ///     println!("{}", val);
385     /// }
386     /// ```
387     #[stable(feature = "map_values_mut", since = "1.10.0")]
388     pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
389         ValuesMut { inner: self.iter_mut() }
390     }
391
392     /// An iterator visiting all key-value pairs in arbitrary order.
393     /// The iterator element type is `(&'a K, &'a V)`.
394     ///
395     /// # Examples
396     ///
397     /// ```
398     /// use std::collections::HashMap;
399     ///
400     /// let mut map = HashMap::new();
401     /// map.insert("a", 1);
402     /// map.insert("b", 2);
403     /// map.insert("c", 3);
404     ///
405     /// for (key, val) in map.iter() {
406     ///     println!("key: {} val: {}", key, val);
407     /// }
408     /// ```
409     #[stable(feature = "rust1", since = "1.0.0")]
410     pub fn iter(&self) -> Iter<'_, K, V> {
411         Iter { base: self.base.iter() }
412     }
413
414     /// An iterator visiting all key-value pairs in arbitrary order,
415     /// with mutable references to the values.
416     /// The iterator element type is `(&'a K, &'a mut V)`.
417     ///
418     /// # Examples
419     ///
420     /// ```
421     /// use std::collections::HashMap;
422     ///
423     /// let mut map = HashMap::new();
424     /// map.insert("a", 1);
425     /// map.insert("b", 2);
426     /// map.insert("c", 3);
427     ///
428     /// // Update all values
429     /// for (_, val) in map.iter_mut() {
430     ///     *val *= 2;
431     /// }
432     ///
433     /// for (key, val) in &map {
434     ///     println!("key: {} val: {}", key, val);
435     /// }
436     /// ```
437     #[stable(feature = "rust1", since = "1.0.0")]
438     pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
439         IterMut { base: self.base.iter_mut() }
440     }
441
442     /// Returns the number of elements in the map.
443     ///
444     /// # Examples
445     ///
446     /// ```
447     /// use std::collections::HashMap;
448     ///
449     /// let mut a = HashMap::new();
450     /// assert_eq!(a.len(), 0);
451     /// a.insert(1, "a");
452     /// assert_eq!(a.len(), 1);
453     /// ```
454     #[doc(alias = "length")]
455     #[stable(feature = "rust1", since = "1.0.0")]
456     pub fn len(&self) -> usize {
457         self.base.len()
458     }
459
460     /// Returns `true` if the map contains no elements.
461     ///
462     /// # Examples
463     ///
464     /// ```
465     /// use std::collections::HashMap;
466     ///
467     /// let mut a = HashMap::new();
468     /// assert!(a.is_empty());
469     /// a.insert(1, "a");
470     /// assert!(!a.is_empty());
471     /// ```
472     #[inline]
473     #[stable(feature = "rust1", since = "1.0.0")]
474     pub fn is_empty(&self) -> bool {
475         self.base.is_empty()
476     }
477
478     /// Clears the map, returning all key-value pairs as an iterator. Keeps the
479     /// allocated memory for reuse.
480     ///
481     /// # Examples
482     ///
483     /// ```
484     /// use std::collections::HashMap;
485     ///
486     /// let mut a = HashMap::new();
487     /// a.insert(1, "a");
488     /// a.insert(2, "b");
489     ///
490     /// for (k, v) in a.drain().take(1) {
491     ///     assert!(k == 1 || k == 2);
492     ///     assert!(v == "a" || v == "b");
493     /// }
494     ///
495     /// assert!(a.is_empty());
496     /// ```
497     #[inline]
498     #[stable(feature = "drain", since = "1.6.0")]
499     pub fn drain(&mut self) -> Drain<'_, K, V> {
500         Drain { base: self.base.drain() }
501     }
502
503     /// Creates an iterator which uses a closure to determine if an element should be removed.
504     ///
505     /// If the closure returns true, the element is removed from the map and yielded.
506     /// If the closure returns false, or panics, the element remains in the map and will not be
507     /// yielded.
508     ///
509     /// Note that `drain_filter` lets you mutate every value in the filter closure, regardless of
510     /// whether you choose to keep or remove it.
511     ///
512     /// If the iterator is only partially consumed or not consumed at all, each of the remaining
513     /// elements will still be subjected to the closure and removed and dropped if it returns true.
514     ///
515     /// It is unspecified how many more elements will be subjected to the closure
516     /// if a panic occurs in the closure, or a panic occurs while dropping an element,
517     /// or if the `DrainFilter` value is leaked.
518     ///
519     /// # Examples
520     ///
521     /// Splitting a map into even and odd keys, reusing the original map:
522     ///
523     /// ```
524     /// #![feature(hash_drain_filter)]
525     /// use std::collections::HashMap;
526     ///
527     /// let mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();
528     /// let drained: HashMap<i32, i32> = map.drain_filter(|k, _v| k % 2 == 0).collect();
529     ///
530     /// let mut evens = drained.keys().copied().collect::<Vec<_>>();
531     /// let mut odds = map.keys().copied().collect::<Vec<_>>();
532     /// evens.sort();
533     /// odds.sort();
534     ///
535     /// assert_eq!(evens, vec![0, 2, 4, 6]);
536     /// assert_eq!(odds, vec![1, 3, 5, 7]);
537     /// ```
538     #[inline]
539     #[unstable(feature = "hash_drain_filter", issue = "59618")]
540     pub fn drain_filter<F>(&mut self, pred: F) -> DrainFilter<'_, K, V, F>
541     where
542         F: FnMut(&K, &mut V) -> bool,
543     {
544         DrainFilter { base: self.base.drain_filter(pred) }
545     }
546
547     /// Clears the map, removing all key-value pairs. Keeps the allocated memory
548     /// for reuse.
549     ///
550     /// # Examples
551     ///
552     /// ```
553     /// use std::collections::HashMap;
554     ///
555     /// let mut a = HashMap::new();
556     /// a.insert(1, "a");
557     /// a.clear();
558     /// assert!(a.is_empty());
559     /// ```
560     #[inline]
561     #[stable(feature = "rust1", since = "1.0.0")]
562     pub fn clear(&mut self) {
563         self.base.clear();
564     }
565
566     /// Returns a reference to the map's [`BuildHasher`].
567     ///
568     /// # Examples
569     ///
570     /// ```
571     /// use std::collections::HashMap;
572     /// use std::collections::hash_map::RandomState;
573     ///
574     /// let hasher = RandomState::new();
575     /// let map: HashMap<i32, i32> = HashMap::with_hasher(hasher);
576     /// let hasher: &RandomState = map.hasher();
577     /// ```
578     #[inline]
579     #[stable(feature = "hashmap_public_hasher", since = "1.9.0")]
580     pub fn hasher(&self) -> &S {
581         self.base.hasher()
582     }
583 }
584
585 impl<K, V, S> HashMap<K, V, S>
586 where
587     K: Eq + Hash,
588     S: BuildHasher,
589 {
590     /// Reserves capacity for at least `additional` more elements to be inserted
591     /// in the `HashMap`. The collection may reserve more space to avoid
592     /// frequent reallocations.
593     ///
594     /// # Panics
595     ///
596     /// Panics if the new allocation size overflows [`usize`].
597     ///
598     /// # Examples
599     ///
600     /// ```
601     /// use std::collections::HashMap;
602     /// let mut map: HashMap<&str, i32> = HashMap::new();
603     /// map.reserve(10);
604     /// ```
605     #[inline]
606     #[stable(feature = "rust1", since = "1.0.0")]
607     pub fn reserve(&mut self, additional: usize) {
608         self.base.reserve(additional)
609     }
610
611     /// Tries to reserve capacity for at least `additional` more elements to be inserted
612     /// in the given `HashMap<K, V>`. The collection may reserve more space to avoid
613     /// frequent reallocations.
614     ///
615     /// # Errors
616     ///
617     /// If the capacity overflows, or the allocator reports a failure, then an error
618     /// is returned.
619     ///
620     /// # Examples
621     ///
622     /// ```
623     /// #![feature(try_reserve)]
624     /// use std::collections::HashMap;
625     ///
626     /// let mut map: HashMap<&str, isize> = HashMap::new();
627     /// map.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?");
628     /// ```
629     #[inline]
630     #[unstable(feature = "try_reserve", reason = "new API", issue = "48043")]
631     pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
632         self.base.try_reserve(additional).map_err(map_try_reserve_error)
633     }
634
635     /// Shrinks the capacity of the map as much as possible. It will drop
636     /// down as much as possible while maintaining the internal rules
637     /// and possibly leaving some space in accordance with the resize policy.
638     ///
639     /// # Examples
640     ///
641     /// ```
642     /// use std::collections::HashMap;
643     ///
644     /// let mut map: HashMap<i32, i32> = HashMap::with_capacity(100);
645     /// map.insert(1, 2);
646     /// map.insert(3, 4);
647     /// assert!(map.capacity() >= 100);
648     /// map.shrink_to_fit();
649     /// assert!(map.capacity() >= 2);
650     /// ```
651     #[inline]
652     #[stable(feature = "rust1", since = "1.0.0")]
653     pub fn shrink_to_fit(&mut self) {
654         self.base.shrink_to_fit();
655     }
656
657     /// Shrinks the capacity of the map with a lower limit. It will drop
658     /// down no lower than the supplied limit while maintaining the internal rules
659     /// and possibly leaving some space in accordance with the resize policy.
660     ///
661     /// If the current capacity is less than the lower limit, this is a no-op.
662     ///
663     /// # Examples
664     ///
665     /// ```
666     /// #![feature(shrink_to)]
667     /// use std::collections::HashMap;
668     ///
669     /// let mut map: HashMap<i32, i32> = HashMap::with_capacity(100);
670     /// map.insert(1, 2);
671     /// map.insert(3, 4);
672     /// assert!(map.capacity() >= 100);
673     /// map.shrink_to(10);
674     /// assert!(map.capacity() >= 10);
675     /// map.shrink_to(0);
676     /// assert!(map.capacity() >= 2);
677     /// ```
678     #[inline]
679     #[unstable(feature = "shrink_to", reason = "new API", issue = "56431")]
680     pub fn shrink_to(&mut self, min_capacity: usize) {
681         self.base.shrink_to(min_capacity);
682     }
683
684     /// Gets the given key's corresponding entry in the map for in-place manipulation.
685     ///
686     /// # Examples
687     ///
688     /// ```
689     /// use std::collections::HashMap;
690     ///
691     /// let mut letters = HashMap::new();
692     ///
693     /// for ch in "a short treatise on fungi".chars() {
694     ///     let counter = letters.entry(ch).or_insert(0);
695     ///     *counter += 1;
696     /// }
697     ///
698     /// assert_eq!(letters[&'s'], 2);
699     /// assert_eq!(letters[&'t'], 3);
700     /// assert_eq!(letters[&'u'], 1);
701     /// assert_eq!(letters.get(&'y'), None);
702     /// ```
703     #[inline]
704     #[stable(feature = "rust1", since = "1.0.0")]
705     pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
706         map_entry(self.base.rustc_entry(key))
707     }
708
709     /// Returns a reference to the value corresponding to the key.
710     ///
711     /// The key may be any borrowed form of the map's key type, but
712     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
713     /// the key type.
714     ///
715     /// # Examples
716     ///
717     /// ```
718     /// use std::collections::HashMap;
719     ///
720     /// let mut map = HashMap::new();
721     /// map.insert(1, "a");
722     /// assert_eq!(map.get(&1), Some(&"a"));
723     /// assert_eq!(map.get(&2), None);
724     /// ```
725     #[stable(feature = "rust1", since = "1.0.0")]
726     #[inline]
727     pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
728     where
729         K: Borrow<Q>,
730         Q: Hash + Eq,
731     {
732         self.base.get(k)
733     }
734
735     /// Returns the key-value pair corresponding to the supplied key.
736     ///
737     /// The supplied key may be any borrowed form of the map's key type, but
738     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
739     /// the key type.
740     ///
741     /// # Examples
742     ///
743     /// ```
744     /// use std::collections::HashMap;
745     ///
746     /// let mut map = HashMap::new();
747     /// map.insert(1, "a");
748     /// assert_eq!(map.get_key_value(&1), Some((&1, &"a")));
749     /// assert_eq!(map.get_key_value(&2), None);
750     /// ```
751     #[inline]
752     #[stable(feature = "map_get_key_value", since = "1.40.0")]
753     pub fn get_key_value<Q: ?Sized>(&self, k: &Q) -> Option<(&K, &V)>
754     where
755         K: Borrow<Q>,
756         Q: Hash + Eq,
757     {
758         self.base.get_key_value(k)
759     }
760
761     /// Returns `true` if the map contains a value for the specified key.
762     ///
763     /// The key may be any borrowed form of the map's key type, but
764     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
765     /// the key type.
766     ///
767     /// # Examples
768     ///
769     /// ```
770     /// use std::collections::HashMap;
771     ///
772     /// let mut map = HashMap::new();
773     /// map.insert(1, "a");
774     /// assert_eq!(map.contains_key(&1), true);
775     /// assert_eq!(map.contains_key(&2), false);
776     /// ```
777     #[inline]
778     #[stable(feature = "rust1", since = "1.0.0")]
779     pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool
780     where
781         K: Borrow<Q>,
782         Q: Hash + Eq,
783     {
784         self.base.contains_key(k)
785     }
786
787     /// Returns a mutable reference to the value corresponding to the key.
788     ///
789     /// The key may be any borrowed form of the map's key type, but
790     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
791     /// the key type.
792     ///
793     /// # Examples
794     ///
795     /// ```
796     /// use std::collections::HashMap;
797     ///
798     /// let mut map = HashMap::new();
799     /// map.insert(1, "a");
800     /// if let Some(x) = map.get_mut(&1) {
801     ///     *x = "b";
802     /// }
803     /// assert_eq!(map[&1], "b");
804     /// ```
805     #[inline]
806     #[stable(feature = "rust1", since = "1.0.0")]
807     pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>
808     where
809         K: Borrow<Q>,
810         Q: Hash + Eq,
811     {
812         self.base.get_mut(k)
813     }
814
815     /// Inserts a key-value pair into the map.
816     ///
817     /// If the map did not have this key present, [`None`] is returned.
818     ///
819     /// If the map did have this key present, the value is updated, and the old
820     /// value is returned. The key is not updated, though; this matters for
821     /// types that can be `==` without being identical. See the [module-level
822     /// documentation] for more.
823     ///
824     /// [module-level documentation]: crate::collections#insert-and-complex-keys
825     ///
826     /// # Examples
827     ///
828     /// ```
829     /// use std::collections::HashMap;
830     ///
831     /// let mut map = HashMap::new();
832     /// assert_eq!(map.insert(37, "a"), None);
833     /// assert_eq!(map.is_empty(), false);
834     ///
835     /// map.insert(37, "b");
836     /// assert_eq!(map.insert(37, "c"), Some("b"));
837     /// assert_eq!(map[&37], "c");
838     /// ```
839     #[inline]
840     #[stable(feature = "rust1", since = "1.0.0")]
841     pub fn insert(&mut self, k: K, v: V) -> Option<V> {
842         self.base.insert(k, v)
843     }
844
845     /// Tries to insert a key-value pair into the map, and returns
846     /// a mutable reference to the value in the entry.
847     ///
848     /// If the map already had this key present, nothing is updated, and
849     /// an error containing the occupied entry and the value is returned.
850     ///
851     /// # Examples
852     ///
853     /// Basic usage:
854     ///
855     /// ```
856     /// #![feature(map_try_insert)]
857     ///
858     /// use std::collections::HashMap;
859     ///
860     /// let mut map = HashMap::new();
861     /// assert_eq!(map.try_insert(37, "a").unwrap(), &"a");
862     ///
863     /// let err = map.try_insert(37, "b").unwrap_err();
864     /// assert_eq!(err.entry.key(), &37);
865     /// assert_eq!(err.entry.get(), &"a");
866     /// assert_eq!(err.value, "b");
867     /// ```
868     #[unstable(feature = "map_try_insert", issue = "none")]
869     pub fn try_insert(&mut self, key: K, value: V) -> Result<&mut V, OccupiedError<'_, K, V>>
870     where
871         K: Ord,
872     {
873         match self.entry(key) {
874             Occupied(entry) => Err(OccupiedError { entry, value }),
875             Vacant(entry) => Ok(entry.insert(value)),
876         }
877     }
878
879     /// Removes a key from the map, returning the value at the key if the key
880     /// was previously in the map.
881     ///
882     /// The key may be any borrowed form of the map's key type, but
883     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
884     /// the key type.
885     ///
886     /// # Examples
887     ///
888     /// ```
889     /// use std::collections::HashMap;
890     ///
891     /// let mut map = HashMap::new();
892     /// map.insert(1, "a");
893     /// assert_eq!(map.remove(&1), Some("a"));
894     /// assert_eq!(map.remove(&1), None);
895     /// ```
896     #[doc(alias = "delete")]
897     #[inline]
898     #[stable(feature = "rust1", since = "1.0.0")]
899     pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<V>
900     where
901         K: Borrow<Q>,
902         Q: Hash + Eq,
903     {
904         self.base.remove(k)
905     }
906
907     /// Removes a key from the map, returning the stored key and value if the
908     /// key was previously in the map.
909     ///
910     /// The key may be any borrowed form of the map's key type, but
911     /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
912     /// the key type.
913     ///
914     /// # Examples
915     ///
916     /// ```
917     /// use std::collections::HashMap;
918     ///
919     /// # fn main() {
920     /// let mut map = HashMap::new();
921     /// map.insert(1, "a");
922     /// assert_eq!(map.remove_entry(&1), Some((1, "a")));
923     /// assert_eq!(map.remove(&1), None);
924     /// # }
925     /// ```
926     #[inline]
927     #[stable(feature = "hash_map_remove_entry", since = "1.27.0")]
928     pub fn remove_entry<Q: ?Sized>(&mut self, k: &Q) -> Option<(K, V)>
929     where
930         K: Borrow<Q>,
931         Q: Hash + Eq,
932     {
933         self.base.remove_entry(k)
934     }
935
936     /// Retains only the elements specified by the predicate.
937     ///
938     /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` returns `false`.
939     ///
940     /// # Examples
941     ///
942     /// ```
943     /// use std::collections::HashMap;
944     ///
945     /// let mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();
946     /// map.retain(|&k, _| k % 2 == 0);
947     /// assert_eq!(map.len(), 4);
948     /// ```
949     #[inline]
950     #[stable(feature = "retain_hash_collection", since = "1.18.0")]
951     pub fn retain<F>(&mut self, f: F)
952     where
953         F: FnMut(&K, &mut V) -> bool,
954     {
955         self.base.retain(f)
956     }
957
958     /// Creates a consuming iterator visiting all the keys in arbitrary order.
959     /// The map cannot be used after calling this.
960     /// The iterator element type is `K`.
961     ///
962     /// # Examples
963     ///
964     /// ```
965     /// #![feature(map_into_keys_values)]
966     /// use std::collections::HashMap;
967     ///
968     /// let mut map = HashMap::new();
969     /// map.insert("a", 1);
970     /// map.insert("b", 2);
971     /// map.insert("c", 3);
972     ///
973     /// let vec: Vec<&str> = map.into_keys().collect();
974     /// ```
975     #[inline]
976     #[unstable(feature = "map_into_keys_values", issue = "75294")]
977     pub fn into_keys(self) -> IntoKeys<K, V> {
978         IntoKeys { inner: self.into_iter() }
979     }
980
981     /// Creates a consuming iterator visiting all the values in arbitrary order.
982     /// The map cannot be used after calling this.
983     /// The iterator element type is `V`.
984     ///
985     /// # Examples
986     ///
987     /// ```
988     /// #![feature(map_into_keys_values)]
989     /// use std::collections::HashMap;
990     ///
991     /// let mut map = HashMap::new();
992     /// map.insert("a", 1);
993     /// map.insert("b", 2);
994     /// map.insert("c", 3);
995     ///
996     /// let vec: Vec<i32> = map.into_values().collect();
997     /// ```
998     #[inline]
999     #[unstable(feature = "map_into_keys_values", issue = "75294")]
1000     pub fn into_values(self) -> IntoValues<K, V> {
1001         IntoValues { inner: self.into_iter() }
1002     }
1003 }
1004
1005 impl<K, V, S> HashMap<K, V, S>
1006 where
1007     S: BuildHasher,
1008 {
1009     /// Creates a raw entry builder for the HashMap.
1010     ///
1011     /// Raw entries provide the lowest level of control for searching and
1012     /// manipulating a map. They must be manually initialized with a hash and
1013     /// then manually searched. After this, insertions into a vacant entry
1014     /// still require an owned key to be provided.
1015     ///
1016     /// Raw entries are useful for such exotic situations as:
1017     ///
1018     /// * Hash memoization
1019     /// * Deferring the creation of an owned key until it is known to be required
1020     /// * Using a search key that doesn't work with the Borrow trait
1021     /// * Using custom comparison logic without newtype wrappers
1022     ///
1023     /// Because raw entries provide much more low-level control, it's much easier
1024     /// to put the HashMap into an inconsistent state which, while memory-safe,
1025     /// will cause the map to produce seemingly random results. Higher-level and
1026     /// more foolproof APIs like `entry` should be preferred when possible.
1027     ///
1028     /// In particular, the hash used to initialized the raw entry must still be
1029     /// consistent with the hash of the key that is ultimately stored in the entry.
1030     /// This is because implementations of HashMap may need to recompute hashes
1031     /// when resizing, at which point only the keys are available.
1032     ///
1033     /// Raw entries give mutable access to the keys. This must not be used
1034     /// to modify how the key would compare or hash, as the map will not re-evaluate
1035     /// where the key should go, meaning the keys may become "lost" if their
1036     /// location does not reflect their state. For instance, if you change a key
1037     /// so that the map now contains keys which compare equal, search may start
1038     /// acting erratically, with two keys randomly masking each other. Implementations
1039     /// are free to assume this doesn't happen (within the limits of memory-safety).
1040     #[inline]
1041     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1042     pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S> {
1043         RawEntryBuilderMut { map: self }
1044     }
1045
1046     /// Creates a raw immutable entry builder for the HashMap.
1047     ///
1048     /// Raw entries provide the lowest level of control for searching and
1049     /// manipulating a map. They must be manually initialized with a hash and
1050     /// then manually searched.
1051     ///
1052     /// This is useful for
1053     /// * Hash memoization
1054     /// * Using a search key that doesn't work with the Borrow trait
1055     /// * Using custom comparison logic without newtype wrappers
1056     ///
1057     /// Unless you are in such a situation, higher-level and more foolproof APIs like
1058     /// `get` should be preferred.
1059     ///
1060     /// Immutable raw entries have very limited use; you might instead want `raw_entry_mut`.
1061     #[inline]
1062     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1063     pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S> {
1064         RawEntryBuilder { map: self }
1065     }
1066 }
1067
1068 #[stable(feature = "rust1", since = "1.0.0")]
1069 impl<K, V, S> Clone for HashMap<K, V, S>
1070 where
1071     K: Clone,
1072     V: Clone,
1073     S: Clone,
1074 {
1075     #[inline]
1076     fn clone(&self) -> Self {
1077         Self { base: self.base.clone() }
1078     }
1079
1080     #[inline]
1081     fn clone_from(&mut self, other: &Self) {
1082         self.base.clone_from(&other.base);
1083     }
1084 }
1085
1086 #[stable(feature = "rust1", since = "1.0.0")]
1087 impl<K, V, S> PartialEq for HashMap<K, V, S>
1088 where
1089     K: Eq + Hash,
1090     V: PartialEq,
1091     S: BuildHasher,
1092 {
1093     fn eq(&self, other: &HashMap<K, V, S>) -> bool {
1094         if self.len() != other.len() {
1095             return false;
1096         }
1097
1098         self.iter().all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
1099     }
1100 }
1101
1102 #[stable(feature = "rust1", since = "1.0.0")]
1103 impl<K, V, S> Eq for HashMap<K, V, S>
1104 where
1105     K: Eq + Hash,
1106     V: Eq,
1107     S: BuildHasher,
1108 {
1109 }
1110
1111 #[stable(feature = "rust1", since = "1.0.0")]
1112 impl<K, V, S> Debug for HashMap<K, V, S>
1113 where
1114     K: Debug,
1115     V: Debug,
1116 {
1117     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1118         f.debug_map().entries(self.iter()).finish()
1119     }
1120 }
1121
1122 #[stable(feature = "rust1", since = "1.0.0")]
1123 impl<K, V, S> Default for HashMap<K, V, S>
1124 where
1125     S: Default,
1126 {
1127     /// Creates an empty `HashMap<K, V, S>`, with the `Default` value for the hasher.
1128     #[inline]
1129     fn default() -> HashMap<K, V, S> {
1130         HashMap::with_hasher(Default::default())
1131     }
1132 }
1133
1134 #[stable(feature = "rust1", since = "1.0.0")]
1135 impl<K, Q: ?Sized, V, S> Index<&Q> for HashMap<K, V, S>
1136 where
1137     K: Eq + Hash + Borrow<Q>,
1138     Q: Eq + Hash,
1139     S: BuildHasher,
1140 {
1141     type Output = V;
1142
1143     /// Returns a reference to the value corresponding to the supplied key.
1144     ///
1145     /// # Panics
1146     ///
1147     /// Panics if the key is not present in the `HashMap`.
1148     #[inline]
1149     fn index(&self, key: &Q) -> &V {
1150         self.get(key).expect("no entry found for key")
1151     }
1152 }
1153
1154 /// An iterator over the entries of a `HashMap`.
1155 ///
1156 /// This `struct` is created by the [`iter`] method on [`HashMap`]. See its
1157 /// documentation for more.
1158 ///
1159 /// [`iter`]: HashMap::iter
1160 ///
1161 /// # Example
1162 ///
1163 /// ```
1164 /// use std::collections::HashMap;
1165 ///
1166 /// let mut map = HashMap::new();
1167 /// map.insert("a", 1);
1168 /// let iter = map.iter();
1169 /// ```
1170 #[stable(feature = "rust1", since = "1.0.0")]
1171 pub struct Iter<'a, K: 'a, V: 'a> {
1172     base: base::Iter<'a, K, V>,
1173 }
1174
1175 // FIXME(#26925) Remove in favor of `#[derive(Clone)]`
1176 #[stable(feature = "rust1", since = "1.0.0")]
1177 impl<K, V> Clone for Iter<'_, K, V> {
1178     #[inline]
1179     fn clone(&self) -> Self {
1180         Iter { base: self.base.clone() }
1181     }
1182 }
1183
1184 #[stable(feature = "std_debug", since = "1.16.0")]
1185 impl<K: Debug, V: Debug> fmt::Debug for Iter<'_, K, V> {
1186     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1187         f.debug_list().entries(self.clone()).finish()
1188     }
1189 }
1190
1191 /// A mutable iterator over the entries of a `HashMap`.
1192 ///
1193 /// This `struct` is created by the [`iter_mut`] method on [`HashMap`]. See its
1194 /// documentation for more.
1195 ///
1196 /// [`iter_mut`]: HashMap::iter_mut
1197 ///
1198 /// # Example
1199 ///
1200 /// ```
1201 /// use std::collections::HashMap;
1202 ///
1203 /// let mut map = HashMap::new();
1204 /// map.insert("a", 1);
1205 /// let iter = map.iter_mut();
1206 /// ```
1207 #[stable(feature = "rust1", since = "1.0.0")]
1208 pub struct IterMut<'a, K: 'a, V: 'a> {
1209     base: base::IterMut<'a, K, V>,
1210 }
1211
1212 impl<'a, K, V> IterMut<'a, K, V> {
1213     /// Returns a iterator of references over the remaining items.
1214     #[inline]
1215     pub(super) fn iter(&self) -> Iter<'_, K, V> {
1216         Iter { base: self.base.rustc_iter() }
1217     }
1218 }
1219
1220 /// An owning iterator over the entries of a `HashMap`.
1221 ///
1222 /// This `struct` is created by the [`into_iter`] method on [`HashMap`]
1223 /// (provided by the `IntoIterator` trait). See its documentation for more.
1224 ///
1225 /// [`into_iter`]: IntoIterator::into_iter
1226 ///
1227 /// # Example
1228 ///
1229 /// ```
1230 /// use std::collections::HashMap;
1231 ///
1232 /// let mut map = HashMap::new();
1233 /// map.insert("a", 1);
1234 /// let iter = map.into_iter();
1235 /// ```
1236 #[stable(feature = "rust1", since = "1.0.0")]
1237 pub struct IntoIter<K, V> {
1238     base: base::IntoIter<K, V>,
1239 }
1240
1241 impl<K, V> IntoIter<K, V> {
1242     /// Returns a iterator of references over the remaining items.
1243     #[inline]
1244     pub(super) fn iter(&self) -> Iter<'_, K, V> {
1245         Iter { base: self.base.rustc_iter() }
1246     }
1247 }
1248
1249 /// An iterator over the keys of a `HashMap`.
1250 ///
1251 /// This `struct` is created by the [`keys`] method on [`HashMap`]. See its
1252 /// documentation for more.
1253 ///
1254 /// [`keys`]: HashMap::keys
1255 ///
1256 /// # Example
1257 ///
1258 /// ```
1259 /// use std::collections::HashMap;
1260 ///
1261 /// let mut map = HashMap::new();
1262 /// map.insert("a", 1);
1263 /// let iter_keys = map.keys();
1264 /// ```
1265 #[stable(feature = "rust1", since = "1.0.0")]
1266 pub struct Keys<'a, K: 'a, V: 'a> {
1267     inner: Iter<'a, K, V>,
1268 }
1269
1270 // FIXME(#26925) Remove in favor of `#[derive(Clone)]`
1271 #[stable(feature = "rust1", since = "1.0.0")]
1272 impl<K, V> Clone for Keys<'_, K, V> {
1273     #[inline]
1274     fn clone(&self) -> Self {
1275         Keys { inner: self.inner.clone() }
1276     }
1277 }
1278
1279 #[stable(feature = "std_debug", since = "1.16.0")]
1280 impl<K: Debug, V> fmt::Debug for Keys<'_, K, V> {
1281     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1282         f.debug_list().entries(self.clone()).finish()
1283     }
1284 }
1285
1286 /// An iterator over the values of a `HashMap`.
1287 ///
1288 /// This `struct` is created by the [`values`] method on [`HashMap`]. See its
1289 /// documentation for more.
1290 ///
1291 /// [`values`]: HashMap::values
1292 ///
1293 /// # Example
1294 ///
1295 /// ```
1296 /// use std::collections::HashMap;
1297 ///
1298 /// let mut map = HashMap::new();
1299 /// map.insert("a", 1);
1300 /// let iter_values = map.values();
1301 /// ```
1302 #[stable(feature = "rust1", since = "1.0.0")]
1303 pub struct Values<'a, K: 'a, V: 'a> {
1304     inner: Iter<'a, K, V>,
1305 }
1306
1307 // FIXME(#26925) Remove in favor of `#[derive(Clone)]`
1308 #[stable(feature = "rust1", since = "1.0.0")]
1309 impl<K, V> Clone for Values<'_, K, V> {
1310     #[inline]
1311     fn clone(&self) -> Self {
1312         Values { inner: self.inner.clone() }
1313     }
1314 }
1315
1316 #[stable(feature = "std_debug", since = "1.16.0")]
1317 impl<K, V: Debug> fmt::Debug for Values<'_, K, V> {
1318     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1319         f.debug_list().entries(self.clone()).finish()
1320     }
1321 }
1322
1323 /// A draining iterator over the entries of a `HashMap`.
1324 ///
1325 /// This `struct` is created by the [`drain`] method on [`HashMap`]. See its
1326 /// documentation for more.
1327 ///
1328 /// [`drain`]: HashMap::drain
1329 ///
1330 /// # Example
1331 ///
1332 /// ```
1333 /// use std::collections::HashMap;
1334 ///
1335 /// let mut map = HashMap::new();
1336 /// map.insert("a", 1);
1337 /// let iter = map.drain();
1338 /// ```
1339 #[stable(feature = "drain", since = "1.6.0")]
1340 pub struct Drain<'a, K: 'a, V: 'a> {
1341     base: base::Drain<'a, K, V>,
1342 }
1343
1344 impl<'a, K, V> Drain<'a, K, V> {
1345     /// Returns a iterator of references over the remaining items.
1346     #[inline]
1347     pub(super) fn iter(&self) -> Iter<'_, K, V> {
1348         Iter { base: self.base.rustc_iter() }
1349     }
1350 }
1351
1352 /// A draining, filtering iterator over the entries of a `HashMap`.
1353 ///
1354 /// This `struct` is created by the [`drain_filter`] method on [`HashMap`].
1355 ///
1356 /// [`drain_filter`]: HashMap::drain_filter
1357 ///
1358 /// # Example
1359 ///
1360 /// ```
1361 /// #![feature(hash_drain_filter)]
1362 ///
1363 /// use std::collections::HashMap;
1364 ///
1365 /// let mut map = HashMap::new();
1366 /// map.insert("a", 1);
1367 /// let iter = map.drain_filter(|_k, v| *v % 2 == 0);
1368 /// ```
1369 #[unstable(feature = "hash_drain_filter", issue = "59618")]
1370 pub struct DrainFilter<'a, K, V, F>
1371 where
1372     F: FnMut(&K, &mut V) -> bool,
1373 {
1374     base: base::DrainFilter<'a, K, V, F>,
1375 }
1376
1377 /// A mutable iterator over the values of a `HashMap`.
1378 ///
1379 /// This `struct` is created by the [`values_mut`] method on [`HashMap`]. See its
1380 /// documentation for more.
1381 ///
1382 /// [`values_mut`]: HashMap::values_mut
1383 ///
1384 /// # Example
1385 ///
1386 /// ```
1387 /// use std::collections::HashMap;
1388 ///
1389 /// let mut map = HashMap::new();
1390 /// map.insert("a", 1);
1391 /// let iter_values = map.values_mut();
1392 /// ```
1393 #[stable(feature = "map_values_mut", since = "1.10.0")]
1394 pub struct ValuesMut<'a, K: 'a, V: 'a> {
1395     inner: IterMut<'a, K, V>,
1396 }
1397
1398 /// An owning iterator over the keys of a `HashMap`.
1399 ///
1400 /// This `struct` is created by the [`into_keys`] method on [`HashMap`].
1401 /// See its documentation for more.
1402 ///
1403 /// [`into_keys`]: HashMap::into_keys
1404 ///
1405 /// # Example
1406 ///
1407 /// ```
1408 /// #![feature(map_into_keys_values)]
1409 ///
1410 /// use std::collections::HashMap;
1411 ///
1412 /// let mut map = HashMap::new();
1413 /// map.insert("a", 1);
1414 /// let iter_keys = map.into_keys();
1415 /// ```
1416 #[unstable(feature = "map_into_keys_values", issue = "75294")]
1417 pub struct IntoKeys<K, V> {
1418     inner: IntoIter<K, V>,
1419 }
1420
1421 /// An owning iterator over the values of a `HashMap`.
1422 ///
1423 /// This `struct` is created by the [`into_values`] method on [`HashMap`].
1424 /// See its documentation for more.
1425 ///
1426 /// [`into_values`]: HashMap::into_values
1427 ///
1428 /// # Example
1429 ///
1430 /// ```
1431 /// #![feature(map_into_keys_values)]
1432 ///
1433 /// use std::collections::HashMap;
1434 ///
1435 /// let mut map = HashMap::new();
1436 /// map.insert("a", 1);
1437 /// let iter_keys = map.into_values();
1438 /// ```
1439 #[unstable(feature = "map_into_keys_values", issue = "75294")]
1440 pub struct IntoValues<K, V> {
1441     inner: IntoIter<K, V>,
1442 }
1443
1444 /// A builder for computing where in a HashMap a key-value pair would be stored.
1445 ///
1446 /// See the [`HashMap::raw_entry_mut`] docs for usage examples.
1447 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1448 pub struct RawEntryBuilderMut<'a, K: 'a, V: 'a, S: 'a> {
1449     map: &'a mut HashMap<K, V, S>,
1450 }
1451
1452 /// A view into a single entry in a map, which may either be vacant or occupied.
1453 ///
1454 /// This is a lower-level version of [`Entry`].
1455 ///
1456 /// This `enum` is constructed through the [`raw_entry_mut`] method on [`HashMap`],
1457 /// then calling one of the methods of that [`RawEntryBuilderMut`].
1458 ///
1459 /// [`raw_entry_mut`]: HashMap::raw_entry_mut
1460 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1461 pub enum RawEntryMut<'a, K: 'a, V: 'a, S: 'a> {
1462     /// An occupied entry.
1463     Occupied(RawOccupiedEntryMut<'a, K, V, S>),
1464     /// A vacant entry.
1465     Vacant(RawVacantEntryMut<'a, K, V, S>),
1466 }
1467
1468 /// A view into an occupied entry in a `HashMap`.
1469 /// It is part of the [`RawEntryMut`] enum.
1470 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1471 pub struct RawOccupiedEntryMut<'a, K: 'a, V: 'a, S: 'a> {
1472     base: base::RawOccupiedEntryMut<'a, K, V, S>,
1473 }
1474
1475 /// A view into a vacant entry in a `HashMap`.
1476 /// It is part of the [`RawEntryMut`] enum.
1477 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1478 pub struct RawVacantEntryMut<'a, K: 'a, V: 'a, S: 'a> {
1479     base: base::RawVacantEntryMut<'a, K, V, S>,
1480 }
1481
1482 /// A builder for computing where in a HashMap a key-value pair would be stored.
1483 ///
1484 /// See the [`HashMap::raw_entry`] docs for usage examples.
1485 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1486 pub struct RawEntryBuilder<'a, K: 'a, V: 'a, S: 'a> {
1487     map: &'a HashMap<K, V, S>,
1488 }
1489
1490 impl<'a, K, V, S> RawEntryBuilderMut<'a, K, V, S>
1491 where
1492     S: BuildHasher,
1493 {
1494     /// Creates a `RawEntryMut` from the given key.
1495     #[inline]
1496     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1497     pub fn from_key<Q: ?Sized>(self, k: &Q) -> RawEntryMut<'a, K, V, S>
1498     where
1499         K: Borrow<Q>,
1500         Q: Hash + Eq,
1501     {
1502         map_raw_entry(self.map.base.raw_entry_mut().from_key(k))
1503     }
1504
1505     /// Creates a `RawEntryMut` from the given key and its hash.
1506     #[inline]
1507     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1508     pub fn from_key_hashed_nocheck<Q: ?Sized>(self, hash: u64, k: &Q) -> RawEntryMut<'a, K, V, S>
1509     where
1510         K: Borrow<Q>,
1511         Q: Eq,
1512     {
1513         map_raw_entry(self.map.base.raw_entry_mut().from_key_hashed_nocheck(hash, k))
1514     }
1515
1516     /// Creates a `RawEntryMut` from the given hash.
1517     #[inline]
1518     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1519     pub fn from_hash<F>(self, hash: u64, is_match: F) -> RawEntryMut<'a, K, V, S>
1520     where
1521         for<'b> F: FnMut(&'b K) -> bool,
1522     {
1523         map_raw_entry(self.map.base.raw_entry_mut().from_hash(hash, is_match))
1524     }
1525 }
1526
1527 impl<'a, K, V, S> RawEntryBuilder<'a, K, V, S>
1528 where
1529     S: BuildHasher,
1530 {
1531     /// Access an entry by key.
1532     #[inline]
1533     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1534     pub fn from_key<Q: ?Sized>(self, k: &Q) -> Option<(&'a K, &'a V)>
1535     where
1536         K: Borrow<Q>,
1537         Q: Hash + Eq,
1538     {
1539         self.map.base.raw_entry().from_key(k)
1540     }
1541
1542     /// Access an entry by a key and its hash.
1543     #[inline]
1544     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1545     pub fn from_key_hashed_nocheck<Q: ?Sized>(self, hash: u64, k: &Q) -> Option<(&'a K, &'a V)>
1546     where
1547         K: Borrow<Q>,
1548         Q: Hash + Eq,
1549     {
1550         self.map.base.raw_entry().from_key_hashed_nocheck(hash, k)
1551     }
1552
1553     /// Access an entry by hash.
1554     #[inline]
1555     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1556     pub fn from_hash<F>(self, hash: u64, is_match: F) -> Option<(&'a K, &'a V)>
1557     where
1558         F: FnMut(&K) -> bool,
1559     {
1560         self.map.base.raw_entry().from_hash(hash, is_match)
1561     }
1562 }
1563
1564 impl<'a, K, V, S> RawEntryMut<'a, K, V, S> {
1565     /// Ensures a value is in the entry by inserting the default if empty, and returns
1566     /// mutable references to the key and value in the entry.
1567     ///
1568     /// # Examples
1569     ///
1570     /// ```
1571     /// #![feature(hash_raw_entry)]
1572     /// use std::collections::HashMap;
1573     ///
1574     /// let mut map: HashMap<&str, u32> = HashMap::new();
1575     ///
1576     /// map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 3);
1577     /// assert_eq!(map["poneyland"], 3);
1578     ///
1579     /// *map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 10).1 *= 2;
1580     /// assert_eq!(map["poneyland"], 6);
1581     /// ```
1582     #[inline]
1583     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1584     pub fn or_insert(self, default_key: K, default_val: V) -> (&'a mut K, &'a mut V)
1585     where
1586         K: Hash,
1587         S: BuildHasher,
1588     {
1589         match self {
1590             RawEntryMut::Occupied(entry) => entry.into_key_value(),
1591             RawEntryMut::Vacant(entry) => entry.insert(default_key, default_val),
1592         }
1593     }
1594
1595     /// Ensures a value is in the entry by inserting the result of the default function if empty,
1596     /// and returns mutable references to the key and value in the entry.
1597     ///
1598     /// # Examples
1599     ///
1600     /// ```
1601     /// #![feature(hash_raw_entry)]
1602     /// use std::collections::HashMap;
1603     ///
1604     /// let mut map: HashMap<&str, String> = HashMap::new();
1605     ///
1606     /// map.raw_entry_mut().from_key("poneyland").or_insert_with(|| {
1607     ///     ("poneyland", "hoho".to_string())
1608     /// });
1609     ///
1610     /// assert_eq!(map["poneyland"], "hoho".to_string());
1611     /// ```
1612     #[inline]
1613     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1614     pub fn or_insert_with<F>(self, default: F) -> (&'a mut K, &'a mut V)
1615     where
1616         F: FnOnce() -> (K, V),
1617         K: Hash,
1618         S: BuildHasher,
1619     {
1620         match self {
1621             RawEntryMut::Occupied(entry) => entry.into_key_value(),
1622             RawEntryMut::Vacant(entry) => {
1623                 let (k, v) = default();
1624                 entry.insert(k, v)
1625             }
1626         }
1627     }
1628
1629     /// Provides in-place mutable access to an occupied entry before any
1630     /// potential inserts into the map.
1631     ///
1632     /// # Examples
1633     ///
1634     /// ```
1635     /// #![feature(hash_raw_entry)]
1636     /// use std::collections::HashMap;
1637     ///
1638     /// let mut map: HashMap<&str, u32> = HashMap::new();
1639     ///
1640     /// map.raw_entry_mut()
1641     ///    .from_key("poneyland")
1642     ///    .and_modify(|_k, v| { *v += 1 })
1643     ///    .or_insert("poneyland", 42);
1644     /// assert_eq!(map["poneyland"], 42);
1645     ///
1646     /// map.raw_entry_mut()
1647     ///    .from_key("poneyland")
1648     ///    .and_modify(|_k, v| { *v += 1 })
1649     ///    .or_insert("poneyland", 0);
1650     /// assert_eq!(map["poneyland"], 43);
1651     /// ```
1652     #[inline]
1653     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1654     pub fn and_modify<F>(self, f: F) -> Self
1655     where
1656         F: FnOnce(&mut K, &mut V),
1657     {
1658         match self {
1659             RawEntryMut::Occupied(mut entry) => {
1660                 {
1661                     let (k, v) = entry.get_key_value_mut();
1662                     f(k, v);
1663                 }
1664                 RawEntryMut::Occupied(entry)
1665             }
1666             RawEntryMut::Vacant(entry) => RawEntryMut::Vacant(entry),
1667         }
1668     }
1669 }
1670
1671 impl<'a, K, V, S> RawOccupiedEntryMut<'a, K, V, S> {
1672     /// Gets a reference to the key in the entry.
1673     #[inline]
1674     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1675     pub fn key(&self) -> &K {
1676         self.base.key()
1677     }
1678
1679     /// Gets a mutable reference to the key in the entry.
1680     #[inline]
1681     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1682     pub fn key_mut(&mut self) -> &mut K {
1683         self.base.key_mut()
1684     }
1685
1686     /// Converts the entry into a mutable reference to the key in the entry
1687     /// with a lifetime bound to the map itself.
1688     #[inline]
1689     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1690     pub fn into_key(self) -> &'a mut K {
1691         self.base.into_key()
1692     }
1693
1694     /// Gets a reference to the value in the entry.
1695     #[inline]
1696     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1697     pub fn get(&self) -> &V {
1698         self.base.get()
1699     }
1700
1701     /// Converts the `OccupiedEntry` into a mutable reference to the value in the entry
1702     /// with a lifetime bound to the map itself.
1703     #[inline]
1704     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1705     pub fn into_mut(self) -> &'a mut V {
1706         self.base.into_mut()
1707     }
1708
1709     /// Gets a mutable reference to the value in the entry.
1710     #[inline]
1711     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1712     pub fn get_mut(&mut self) -> &mut V {
1713         self.base.get_mut()
1714     }
1715
1716     /// Gets a reference to the key and value in the entry.
1717     #[inline]
1718     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1719     pub fn get_key_value(&mut self) -> (&K, &V) {
1720         self.base.get_key_value()
1721     }
1722
1723     /// Gets a mutable reference to the key and value in the entry.
1724     #[inline]
1725     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1726     pub fn get_key_value_mut(&mut self) -> (&mut K, &mut V) {
1727         self.base.get_key_value_mut()
1728     }
1729
1730     /// Converts the `OccupiedEntry` into a mutable reference to the key and value in the entry
1731     /// with a lifetime bound to the map itself.
1732     #[inline]
1733     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1734     pub fn into_key_value(self) -> (&'a mut K, &'a mut V) {
1735         self.base.into_key_value()
1736     }
1737
1738     /// Sets the value of the entry, and returns the entry's old value.
1739     #[inline]
1740     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1741     pub fn insert(&mut self, value: V) -> V {
1742         self.base.insert(value)
1743     }
1744
1745     /// Sets the value of the entry, and returns the entry's old value.
1746     #[inline]
1747     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1748     pub fn insert_key(&mut self, key: K) -> K {
1749         self.base.insert_key(key)
1750     }
1751
1752     /// Takes the value out of the entry, and returns it.
1753     #[inline]
1754     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1755     pub fn remove(self) -> V {
1756         self.base.remove()
1757     }
1758
1759     /// Take the ownership of the key and value from the map.
1760     #[inline]
1761     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1762     pub fn remove_entry(self) -> (K, V) {
1763         self.base.remove_entry()
1764     }
1765 }
1766
1767 impl<'a, K, V, S> RawVacantEntryMut<'a, K, V, S> {
1768     /// Sets the value of the entry with the `VacantEntry`'s key,
1769     /// and returns a mutable reference to it.
1770     #[inline]
1771     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1772     pub fn insert(self, key: K, value: V) -> (&'a mut K, &'a mut V)
1773     where
1774         K: Hash,
1775         S: BuildHasher,
1776     {
1777         self.base.insert(key, value)
1778     }
1779
1780     /// Sets the value of the entry with the VacantEntry's key,
1781     /// and returns a mutable reference to it.
1782     #[inline]
1783     #[unstable(feature = "hash_raw_entry", issue = "56167")]
1784     pub fn insert_hashed_nocheck(self, hash: u64, key: K, value: V) -> (&'a mut K, &'a mut V)
1785     where
1786         K: Hash,
1787         S: BuildHasher,
1788     {
1789         self.base.insert_hashed_nocheck(hash, key, value)
1790     }
1791 }
1792
1793 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1794 impl<K, V, S> Debug for RawEntryBuilderMut<'_, K, V, S> {
1795     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1796         f.debug_struct("RawEntryBuilder").finish()
1797     }
1798 }
1799
1800 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1801 impl<K: Debug, V: Debug, S> Debug for RawEntryMut<'_, K, V, S> {
1802     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1803         match *self {
1804             RawEntryMut::Vacant(ref v) => f.debug_tuple("RawEntry").field(v).finish(),
1805             RawEntryMut::Occupied(ref o) => f.debug_tuple("RawEntry").field(o).finish(),
1806         }
1807     }
1808 }
1809
1810 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1811 impl<K: Debug, V: Debug, S> Debug for RawOccupiedEntryMut<'_, K, V, S> {
1812     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1813         f.debug_struct("RawOccupiedEntryMut")
1814             .field("key", self.key())
1815             .field("value", self.get())
1816             .finish()
1817     }
1818 }
1819
1820 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1821 impl<K, V, S> Debug for RawVacantEntryMut<'_, K, V, S> {
1822     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1823         f.debug_struct("RawVacantEntryMut").finish()
1824     }
1825 }
1826
1827 #[unstable(feature = "hash_raw_entry", issue = "56167")]
1828 impl<K, V, S> Debug for RawEntryBuilder<'_, K, V, S> {
1829     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1830         f.debug_struct("RawEntryBuilder").finish()
1831     }
1832 }
1833
1834 /// A view into a single entry in a map, which may either be vacant or occupied.
1835 ///
1836 /// This `enum` is constructed from the [`entry`] method on [`HashMap`].
1837 ///
1838 /// [`entry`]: HashMap::entry
1839 #[stable(feature = "rust1", since = "1.0.0")]
1840 pub enum Entry<'a, K: 'a, V: 'a> {
1841     /// An occupied entry.
1842     #[stable(feature = "rust1", since = "1.0.0")]
1843     Occupied(#[stable(feature = "rust1", since = "1.0.0")] OccupiedEntry<'a, K, V>),
1844
1845     /// A vacant entry.
1846     #[stable(feature = "rust1", since = "1.0.0")]
1847     Vacant(#[stable(feature = "rust1", since = "1.0.0")] VacantEntry<'a, K, V>),
1848 }
1849
1850 #[stable(feature = "debug_hash_map", since = "1.12.0")]
1851 impl<K: Debug, V: Debug> Debug for Entry<'_, K, V> {
1852     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1853         match *self {
1854             Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(),
1855             Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(),
1856         }
1857     }
1858 }
1859
1860 /// A view into an occupied entry in a `HashMap`.
1861 /// It is part of the [`Entry`] enum.
1862 #[stable(feature = "rust1", since = "1.0.0")]
1863 pub struct OccupiedEntry<'a, K: 'a, V: 'a> {
1864     base: base::RustcOccupiedEntry<'a, K, V>,
1865 }
1866
1867 #[stable(feature = "debug_hash_map", since = "1.12.0")]
1868 impl<K: Debug, V: Debug> Debug for OccupiedEntry<'_, K, V> {
1869     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1870         f.debug_struct("OccupiedEntry").field("key", self.key()).field("value", self.get()).finish()
1871     }
1872 }
1873
1874 /// A view into a vacant entry in a `HashMap`.
1875 /// It is part of the [`Entry`] enum.
1876 #[stable(feature = "rust1", since = "1.0.0")]
1877 pub struct VacantEntry<'a, K: 'a, V: 'a> {
1878     base: base::RustcVacantEntry<'a, K, V>,
1879 }
1880
1881 #[stable(feature = "debug_hash_map", since = "1.12.0")]
1882 impl<K: Debug, V> Debug for VacantEntry<'_, K, V> {
1883     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1884         f.debug_tuple("VacantEntry").field(self.key()).finish()
1885     }
1886 }
1887
1888 /// The error returned by [`try_insert`](HashMap::try_insert) when the key already exists.
1889 ///
1890 /// Contains the occupied entry, and the value that was not inserted.
1891 #[unstable(feature = "map_try_insert", issue = "none")]
1892 pub struct OccupiedError<'a, K: 'a, V: 'a> {
1893     /// The entry in the map that was already occupied.
1894     pub entry: OccupiedEntry<'a, K, V>,
1895     /// The value which was not inserted, because the entry was already occupied.
1896     pub value: V,
1897 }
1898
1899 #[unstable(feature = "map_try_insert", issue = "none")]
1900 impl<K: Debug, V: Debug> Debug for OccupiedError<'_, K, V> {
1901     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1902         f.debug_struct("OccupiedError")
1903             .field("key", self.entry.key())
1904             .field("old_value", self.entry.get())
1905             .field("new_value", &self.value)
1906             .finish()
1907     }
1908 }
1909
1910 #[unstable(feature = "map_try_insert", issue = "none")]
1911 impl<'a, K: Debug, V: Debug> fmt::Display for OccupiedError<'a, K, V> {
1912     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1913         write!(
1914             f,
1915             "failed to insert {:?}, key {:?} already exists with value {:?}",
1916             self.value,
1917             self.entry.key(),
1918             self.entry.get(),
1919         )
1920     }
1921 }
1922
1923 #[stable(feature = "rust1", since = "1.0.0")]
1924 impl<'a, K, V, S> IntoIterator for &'a HashMap<K, V, S> {
1925     type Item = (&'a K, &'a V);
1926     type IntoIter = Iter<'a, K, V>;
1927
1928     #[inline]
1929     fn into_iter(self) -> Iter<'a, K, V> {
1930         self.iter()
1931     }
1932 }
1933
1934 #[stable(feature = "rust1", since = "1.0.0")]
1935 impl<'a, K, V, S> IntoIterator for &'a mut HashMap<K, V, S> {
1936     type Item = (&'a K, &'a mut V);
1937     type IntoIter = IterMut<'a, K, V>;
1938
1939     #[inline]
1940     fn into_iter(self) -> IterMut<'a, K, V> {
1941         self.iter_mut()
1942     }
1943 }
1944
1945 #[stable(feature = "rust1", since = "1.0.0")]
1946 impl<K, V, S> IntoIterator for HashMap<K, V, S> {
1947     type Item = (K, V);
1948     type IntoIter = IntoIter<K, V>;
1949
1950     /// Creates a consuming iterator, that is, one that moves each key-value
1951     /// pair out of the map in arbitrary order. The map cannot be used after
1952     /// calling this.
1953     ///
1954     /// # Examples
1955     ///
1956     /// ```
1957     /// use std::collections::HashMap;
1958     ///
1959     /// let mut map = HashMap::new();
1960     /// map.insert("a", 1);
1961     /// map.insert("b", 2);
1962     /// map.insert("c", 3);
1963     ///
1964     /// // Not possible with .iter()
1965     /// let vec: Vec<(&str, i32)> = map.into_iter().collect();
1966     /// ```
1967     #[inline]
1968     fn into_iter(self) -> IntoIter<K, V> {
1969         IntoIter { base: self.base.into_iter() }
1970     }
1971 }
1972
1973 #[stable(feature = "rust1", since = "1.0.0")]
1974 impl<'a, K, V> Iterator for Iter<'a, K, V> {
1975     type Item = (&'a K, &'a V);
1976
1977     #[inline]
1978     fn next(&mut self) -> Option<(&'a K, &'a V)> {
1979         self.base.next()
1980     }
1981     #[inline]
1982     fn size_hint(&self) -> (usize, Option<usize>) {
1983         self.base.size_hint()
1984     }
1985 }
1986 #[stable(feature = "rust1", since = "1.0.0")]
1987 impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
1988     #[inline]
1989     fn len(&self) -> usize {
1990         self.base.len()
1991     }
1992 }
1993
1994 #[stable(feature = "fused", since = "1.26.0")]
1995 impl<K, V> FusedIterator for Iter<'_, K, V> {}
1996
1997 #[stable(feature = "rust1", since = "1.0.0")]
1998 impl<'a, K, V> Iterator for IterMut<'a, K, V> {
1999     type Item = (&'a K, &'a mut V);
2000
2001     #[inline]
2002     fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
2003         self.base.next()
2004     }
2005     #[inline]
2006     fn size_hint(&self) -> (usize, Option<usize>) {
2007         self.base.size_hint()
2008     }
2009 }
2010 #[stable(feature = "rust1", since = "1.0.0")]
2011 impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
2012     #[inline]
2013     fn len(&self) -> usize {
2014         self.base.len()
2015     }
2016 }
2017 #[stable(feature = "fused", since = "1.26.0")]
2018 impl<K, V> FusedIterator for IterMut<'_, K, V> {}
2019
2020 #[stable(feature = "std_debug", since = "1.16.0")]
2021 impl<K, V> fmt::Debug for IterMut<'_, K, V>
2022 where
2023     K: fmt::Debug,
2024     V: fmt::Debug,
2025 {
2026     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2027         f.debug_list().entries(self.iter()).finish()
2028     }
2029 }
2030
2031 #[stable(feature = "rust1", since = "1.0.0")]
2032 impl<K, V> Iterator for IntoIter<K, V> {
2033     type Item = (K, V);
2034
2035     #[inline]
2036     fn next(&mut self) -> Option<(K, V)> {
2037         self.base.next()
2038     }
2039     #[inline]
2040     fn size_hint(&self) -> (usize, Option<usize>) {
2041         self.base.size_hint()
2042     }
2043 }
2044 #[stable(feature = "rust1", since = "1.0.0")]
2045 impl<K, V> ExactSizeIterator for IntoIter<K, V> {
2046     #[inline]
2047     fn len(&self) -> usize {
2048         self.base.len()
2049     }
2050 }
2051 #[stable(feature = "fused", since = "1.26.0")]
2052 impl<K, V> FusedIterator for IntoIter<K, V> {}
2053
2054 #[stable(feature = "std_debug", since = "1.16.0")]
2055 impl<K: Debug, V: Debug> fmt::Debug for IntoIter<K, V> {
2056     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2057         f.debug_list().entries(self.iter()).finish()
2058     }
2059 }
2060
2061 #[stable(feature = "rust1", since = "1.0.0")]
2062 impl<'a, K, V> Iterator for Keys<'a, K, V> {
2063     type Item = &'a K;
2064
2065     #[inline]
2066     fn next(&mut self) -> Option<&'a K> {
2067         self.inner.next().map(|(k, _)| k)
2068     }
2069     #[inline]
2070     fn size_hint(&self) -> (usize, Option<usize>) {
2071         self.inner.size_hint()
2072     }
2073 }
2074 #[stable(feature = "rust1", since = "1.0.0")]
2075 impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
2076     #[inline]
2077     fn len(&self) -> usize {
2078         self.inner.len()
2079     }
2080 }
2081 #[stable(feature = "fused", since = "1.26.0")]
2082 impl<K, V> FusedIterator for Keys<'_, K, V> {}
2083
2084 #[stable(feature = "rust1", since = "1.0.0")]
2085 impl<'a, K, V> Iterator for Values<'a, K, V> {
2086     type Item = &'a V;
2087
2088     #[inline]
2089     fn next(&mut self) -> Option<&'a V> {
2090         self.inner.next().map(|(_, v)| v)
2091     }
2092     #[inline]
2093     fn size_hint(&self) -> (usize, Option<usize>) {
2094         self.inner.size_hint()
2095     }
2096 }
2097 #[stable(feature = "rust1", since = "1.0.0")]
2098 impl<K, V> ExactSizeIterator for Values<'_, K, V> {
2099     #[inline]
2100     fn len(&self) -> usize {
2101         self.inner.len()
2102     }
2103 }
2104 #[stable(feature = "fused", since = "1.26.0")]
2105 impl<K, V> FusedIterator for Values<'_, K, V> {}
2106
2107 #[stable(feature = "map_values_mut", since = "1.10.0")]
2108 impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
2109     type Item = &'a mut V;
2110
2111     #[inline]
2112     fn next(&mut self) -> Option<&'a mut V> {
2113         self.inner.next().map(|(_, v)| v)
2114     }
2115     #[inline]
2116     fn size_hint(&self) -> (usize, Option<usize>) {
2117         self.inner.size_hint()
2118     }
2119 }
2120 #[stable(feature = "map_values_mut", since = "1.10.0")]
2121 impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
2122     #[inline]
2123     fn len(&self) -> usize {
2124         self.inner.len()
2125     }
2126 }
2127 #[stable(feature = "fused", since = "1.26.0")]
2128 impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
2129
2130 #[stable(feature = "std_debug", since = "1.16.0")]
2131 impl<K, V: fmt::Debug> fmt::Debug for ValuesMut<'_, K, V> {
2132     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2133         f.debug_list().entries(self.inner.iter().map(|(_, val)| val)).finish()
2134     }
2135 }
2136
2137 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2138 impl<K, V> Iterator for IntoKeys<K, V> {
2139     type Item = K;
2140
2141     #[inline]
2142     fn next(&mut self) -> Option<K> {
2143         self.inner.next().map(|(k, _)| k)
2144     }
2145     #[inline]
2146     fn size_hint(&self) -> (usize, Option<usize>) {
2147         self.inner.size_hint()
2148     }
2149 }
2150 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2151 impl<K, V> ExactSizeIterator for IntoKeys<K, V> {
2152     #[inline]
2153     fn len(&self) -> usize {
2154         self.inner.len()
2155     }
2156 }
2157 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2158 impl<K, V> FusedIterator for IntoKeys<K, V> {}
2159
2160 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2161 impl<K: Debug, V> fmt::Debug for IntoKeys<K, V> {
2162     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2163         f.debug_list().entries(self.inner.iter().map(|(k, _)| k)).finish()
2164     }
2165 }
2166
2167 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2168 impl<K, V> Iterator for IntoValues<K, V> {
2169     type Item = V;
2170
2171     #[inline]
2172     fn next(&mut self) -> Option<V> {
2173         self.inner.next().map(|(_, v)| v)
2174     }
2175     #[inline]
2176     fn size_hint(&self) -> (usize, Option<usize>) {
2177         self.inner.size_hint()
2178     }
2179 }
2180 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2181 impl<K, V> ExactSizeIterator for IntoValues<K, V> {
2182     #[inline]
2183     fn len(&self) -> usize {
2184         self.inner.len()
2185     }
2186 }
2187 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2188 impl<K, V> FusedIterator for IntoValues<K, V> {}
2189
2190 #[unstable(feature = "map_into_keys_values", issue = "75294")]
2191 impl<K, V: Debug> fmt::Debug for IntoValues<K, V> {
2192     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2193         f.debug_list().entries(self.inner.iter().map(|(_, v)| v)).finish()
2194     }
2195 }
2196
2197 #[stable(feature = "drain", since = "1.6.0")]
2198 impl<'a, K, V> Iterator for Drain<'a, K, V> {
2199     type Item = (K, V);
2200
2201     #[inline]
2202     fn next(&mut self) -> Option<(K, V)> {
2203         self.base.next()
2204     }
2205     #[inline]
2206     fn size_hint(&self) -> (usize, Option<usize>) {
2207         self.base.size_hint()
2208     }
2209 }
2210 #[stable(feature = "drain", since = "1.6.0")]
2211 impl<K, V> ExactSizeIterator for Drain<'_, K, V> {
2212     #[inline]
2213     fn len(&self) -> usize {
2214         self.base.len()
2215     }
2216 }
2217 #[stable(feature = "fused", since = "1.26.0")]
2218 impl<K, V> FusedIterator for Drain<'_, K, V> {}
2219
2220 #[stable(feature = "std_debug", since = "1.16.0")]
2221 impl<K, V> fmt::Debug for Drain<'_, K, V>
2222 where
2223     K: fmt::Debug,
2224     V: fmt::Debug,
2225 {
2226     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2227         f.debug_list().entries(self.iter()).finish()
2228     }
2229 }
2230
2231 #[unstable(feature = "hash_drain_filter", issue = "59618")]
2232 impl<K, V, F> Iterator for DrainFilter<'_, K, V, F>
2233 where
2234     F: FnMut(&K, &mut V) -> bool,
2235 {
2236     type Item = (K, V);
2237
2238     #[inline]
2239     fn next(&mut self) -> Option<(K, V)> {
2240         self.base.next()
2241     }
2242     #[inline]
2243     fn size_hint(&self) -> (usize, Option<usize>) {
2244         self.base.size_hint()
2245     }
2246 }
2247
2248 #[unstable(feature = "hash_drain_filter", issue = "59618")]
2249 impl<K, V, F> FusedIterator for DrainFilter<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {}
2250
2251 #[unstable(feature = "hash_drain_filter", issue = "59618")]
2252 impl<'a, K, V, F> fmt::Debug for DrainFilter<'a, K, V, F>
2253 where
2254     F: FnMut(&K, &mut V) -> bool,
2255 {
2256     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2257         f.pad("DrainFilter { .. }")
2258     }
2259 }
2260
2261 impl<'a, K, V> Entry<'a, K, V> {
2262     /// Ensures a value is in the entry by inserting the default if empty, and returns
2263     /// a mutable reference to the value in the entry.
2264     ///
2265     /// # Examples
2266     ///
2267     /// ```
2268     /// use std::collections::HashMap;
2269     ///
2270     /// let mut map: HashMap<&str, u32> = HashMap::new();
2271     ///
2272     /// map.entry("poneyland").or_insert(3);
2273     /// assert_eq!(map["poneyland"], 3);
2274     ///
2275     /// *map.entry("poneyland").or_insert(10) *= 2;
2276     /// assert_eq!(map["poneyland"], 6);
2277     /// ```
2278     #[inline]
2279     #[stable(feature = "rust1", since = "1.0.0")]
2280     pub fn or_insert(self, default: V) -> &'a mut V {
2281         match self {
2282             Occupied(entry) => entry.into_mut(),
2283             Vacant(entry) => entry.insert(default),
2284         }
2285     }
2286
2287     /// Ensures a value is in the entry by inserting the result of the default function if empty,
2288     /// and returns a mutable reference to the value in the entry.
2289     ///
2290     /// # Examples
2291     ///
2292     /// ```
2293     /// use std::collections::HashMap;
2294     ///
2295     /// let mut map: HashMap<&str, String> = HashMap::new();
2296     /// let s = "hoho".to_string();
2297     ///
2298     /// map.entry("poneyland").or_insert_with(|| s);
2299     ///
2300     /// assert_eq!(map["poneyland"], "hoho".to_string());
2301     /// ```
2302     #[inline]
2303     #[stable(feature = "rust1", since = "1.0.0")]
2304     pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
2305         match self {
2306             Occupied(entry) => entry.into_mut(),
2307             Vacant(entry) => entry.insert(default()),
2308         }
2309     }
2310
2311     /// Ensures a value is in the entry by inserting, if empty, the result of the default function.
2312     /// This method allows for generating key-derived values for insertion by providing the default
2313     /// function a reference to the key that was moved during the `.entry(key)` method call.
2314     ///
2315     /// The reference to the moved key is provided so that cloning or copying the key is
2316     /// unnecessary, unlike with `.or_insert_with(|| ... )`.
2317     ///
2318     /// # Examples
2319     ///
2320     /// ```
2321     /// use std::collections::HashMap;
2322     ///
2323     /// let mut map: HashMap<&str, usize> = HashMap::new();
2324     ///
2325     /// map.entry("poneyland").or_insert_with_key(|key| key.chars().count());
2326     ///
2327     /// assert_eq!(map["poneyland"], 9);
2328     /// ```
2329     #[inline]
2330     #[stable(feature = "or_insert_with_key", since = "1.50.0")]
2331     pub fn or_insert_with_key<F: FnOnce(&K) -> V>(self, default: F) -> &'a mut V {
2332         match self {
2333             Occupied(entry) => entry.into_mut(),
2334             Vacant(entry) => {
2335                 let value = default(entry.key());
2336                 entry.insert(value)
2337             }
2338         }
2339     }
2340
2341     /// Returns a reference to this entry's key.
2342     ///
2343     /// # Examples
2344     ///
2345     /// ```
2346     /// use std::collections::HashMap;
2347     ///
2348     /// let mut map: HashMap<&str, u32> = HashMap::new();
2349     /// assert_eq!(map.entry("poneyland").key(), &"poneyland");
2350     /// ```
2351     #[inline]
2352     #[stable(feature = "map_entry_keys", since = "1.10.0")]
2353     pub fn key(&self) -> &K {
2354         match *self {
2355             Occupied(ref entry) => entry.key(),
2356             Vacant(ref entry) => entry.key(),
2357         }
2358     }
2359
2360     /// Provides in-place mutable access to an occupied entry before any
2361     /// potential inserts into the map.
2362     ///
2363     /// # Examples
2364     ///
2365     /// ```
2366     /// use std::collections::HashMap;
2367     ///
2368     /// let mut map: HashMap<&str, u32> = HashMap::new();
2369     ///
2370     /// map.entry("poneyland")
2371     ///    .and_modify(|e| { *e += 1 })
2372     ///    .or_insert(42);
2373     /// assert_eq!(map["poneyland"], 42);
2374     ///
2375     /// map.entry("poneyland")
2376     ///    .and_modify(|e| { *e += 1 })
2377     ///    .or_insert(42);
2378     /// assert_eq!(map["poneyland"], 43);
2379     /// ```
2380     #[inline]
2381     #[stable(feature = "entry_and_modify", since = "1.26.0")]
2382     pub fn and_modify<F>(self, f: F) -> Self
2383     where
2384         F: FnOnce(&mut V),
2385     {
2386         match self {
2387             Occupied(mut entry) => {
2388                 f(entry.get_mut());
2389                 Occupied(entry)
2390             }
2391             Vacant(entry) => Vacant(entry),
2392         }
2393     }
2394
2395     /// Sets the value of the entry, and returns an `OccupiedEntry`.
2396     ///
2397     /// # Examples
2398     ///
2399     /// ```
2400     /// #![feature(entry_insert)]
2401     /// use std::collections::HashMap;
2402     ///
2403     /// let mut map: HashMap<&str, String> = HashMap::new();
2404     /// let entry = map.entry("poneyland").insert("hoho".to_string());
2405     ///
2406     /// assert_eq!(entry.key(), &"poneyland");
2407     /// ```
2408     #[inline]
2409     #[unstable(feature = "entry_insert", issue = "65225")]
2410     pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V> {
2411         match self {
2412             Occupied(mut entry) => {
2413                 entry.insert(value);
2414                 entry
2415             }
2416             Vacant(entry) => entry.insert_entry(value),
2417         }
2418     }
2419 }
2420
2421 impl<'a, K, V: Default> Entry<'a, K, V> {
2422     /// Ensures a value is in the entry by inserting the default value if empty,
2423     /// and returns a mutable reference to the value in the entry.
2424     ///
2425     /// # Examples
2426     ///
2427     /// ```
2428     /// # fn main() {
2429     /// use std::collections::HashMap;
2430     ///
2431     /// let mut map: HashMap<&str, Option<u32>> = HashMap::new();
2432     /// map.entry("poneyland").or_default();
2433     ///
2434     /// assert_eq!(map["poneyland"], None);
2435     /// # }
2436     /// ```
2437     #[inline]
2438     #[stable(feature = "entry_or_default", since = "1.28.0")]
2439     pub fn or_default(self) -> &'a mut V {
2440         match self {
2441             Occupied(entry) => entry.into_mut(),
2442             Vacant(entry) => entry.insert(Default::default()),
2443         }
2444     }
2445 }
2446
2447 impl<'a, K, V> OccupiedEntry<'a, K, V> {
2448     /// Gets a reference to the key in the entry.
2449     ///
2450     /// # Examples
2451     ///
2452     /// ```
2453     /// use std::collections::HashMap;
2454     ///
2455     /// let mut map: HashMap<&str, u32> = HashMap::new();
2456     /// map.entry("poneyland").or_insert(12);
2457     /// assert_eq!(map.entry("poneyland").key(), &"poneyland");
2458     /// ```
2459     #[inline]
2460     #[stable(feature = "map_entry_keys", since = "1.10.0")]
2461     pub fn key(&self) -> &K {
2462         self.base.key()
2463     }
2464
2465     /// Take the ownership of the key and value from the map.
2466     ///
2467     /// # Examples
2468     ///
2469     /// ```
2470     /// use std::collections::HashMap;
2471     /// use std::collections::hash_map::Entry;
2472     ///
2473     /// let mut map: HashMap<&str, u32> = HashMap::new();
2474     /// map.entry("poneyland").or_insert(12);
2475     ///
2476     /// if let Entry::Occupied(o) = map.entry("poneyland") {
2477     ///     // We delete the entry from the map.
2478     ///     o.remove_entry();
2479     /// }
2480     ///
2481     /// assert_eq!(map.contains_key("poneyland"), false);
2482     /// ```
2483     #[inline]
2484     #[stable(feature = "map_entry_recover_keys2", since = "1.12.0")]
2485     pub fn remove_entry(self) -> (K, V) {
2486         self.base.remove_entry()
2487     }
2488
2489     /// Gets a reference to the value in the entry.
2490     ///
2491     /// # Examples
2492     ///
2493     /// ```
2494     /// use std::collections::HashMap;
2495     /// use std::collections::hash_map::Entry;
2496     ///
2497     /// let mut map: HashMap<&str, u32> = HashMap::new();
2498     /// map.entry("poneyland").or_insert(12);
2499     ///
2500     /// if let Entry::Occupied(o) = map.entry("poneyland") {
2501     ///     assert_eq!(o.get(), &12);
2502     /// }
2503     /// ```
2504     #[inline]
2505     #[stable(feature = "rust1", since = "1.0.0")]
2506     pub fn get(&self) -> &V {
2507         self.base.get()
2508     }
2509
2510     /// Gets a mutable reference to the value in the entry.
2511     ///
2512     /// If you need a reference to the `OccupiedEntry` which may outlive the
2513     /// destruction of the `Entry` value, see [`into_mut`].
2514     ///
2515     /// [`into_mut`]: Self::into_mut
2516     ///
2517     /// # Examples
2518     ///
2519     /// ```
2520     /// use std::collections::HashMap;
2521     /// use std::collections::hash_map::Entry;
2522     ///
2523     /// let mut map: HashMap<&str, u32> = HashMap::new();
2524     /// map.entry("poneyland").or_insert(12);
2525     ///
2526     /// assert_eq!(map["poneyland"], 12);
2527     /// if let Entry::Occupied(mut o) = map.entry("poneyland") {
2528     ///     *o.get_mut() += 10;
2529     ///     assert_eq!(*o.get(), 22);
2530     ///
2531     ///     // We can use the same Entry multiple times.
2532     ///     *o.get_mut() += 2;
2533     /// }
2534     ///
2535     /// assert_eq!(map["poneyland"], 24);
2536     /// ```
2537     #[inline]
2538     #[stable(feature = "rust1", since = "1.0.0")]
2539     pub fn get_mut(&mut self) -> &mut V {
2540         self.base.get_mut()
2541     }
2542
2543     /// Converts the `OccupiedEntry` into a mutable reference to the value in the entry
2544     /// with a lifetime bound to the map itself.
2545     ///
2546     /// If you need multiple references to the `OccupiedEntry`, see [`get_mut`].
2547     ///
2548     /// [`get_mut`]: Self::get_mut
2549     ///
2550     /// # Examples
2551     ///
2552     /// ```
2553     /// use std::collections::HashMap;
2554     /// use std::collections::hash_map::Entry;
2555     ///
2556     /// let mut map: HashMap<&str, u32> = HashMap::new();
2557     /// map.entry("poneyland").or_insert(12);
2558     ///
2559     /// assert_eq!(map["poneyland"], 12);
2560     /// if let Entry::Occupied(o) = map.entry("poneyland") {
2561     ///     *o.into_mut() += 10;
2562     /// }
2563     ///
2564     /// assert_eq!(map["poneyland"], 22);
2565     /// ```
2566     #[inline]
2567     #[stable(feature = "rust1", since = "1.0.0")]
2568     pub fn into_mut(self) -> &'a mut V {
2569         self.base.into_mut()
2570     }
2571
2572     /// Sets the value of the entry, and returns the entry's old value.
2573     ///
2574     /// # Examples
2575     ///
2576     /// ```
2577     /// use std::collections::HashMap;
2578     /// use std::collections::hash_map::Entry;
2579     ///
2580     /// let mut map: HashMap<&str, u32> = HashMap::new();
2581     /// map.entry("poneyland").or_insert(12);
2582     ///
2583     /// if let Entry::Occupied(mut o) = map.entry("poneyland") {
2584     ///     assert_eq!(o.insert(15), 12);
2585     /// }
2586     ///
2587     /// assert_eq!(map["poneyland"], 15);
2588     /// ```
2589     #[inline]
2590     #[stable(feature = "rust1", since = "1.0.0")]
2591     pub fn insert(&mut self, value: V) -> V {
2592         self.base.insert(value)
2593     }
2594
2595     /// Takes the value out of the entry, and returns it.
2596     ///
2597     /// # Examples
2598     ///
2599     /// ```
2600     /// use std::collections::HashMap;
2601     /// use std::collections::hash_map::Entry;
2602     ///
2603     /// let mut map: HashMap<&str, u32> = HashMap::new();
2604     /// map.entry("poneyland").or_insert(12);
2605     ///
2606     /// if let Entry::Occupied(o) = map.entry("poneyland") {
2607     ///     assert_eq!(o.remove(), 12);
2608     /// }
2609     ///
2610     /// assert_eq!(map.contains_key("poneyland"), false);
2611     /// ```
2612     #[inline]
2613     #[stable(feature = "rust1", since = "1.0.0")]
2614     pub fn remove(self) -> V {
2615         self.base.remove()
2616     }
2617
2618     /// Replaces the entry, returning the old key and value. The new key in the hash map will be
2619     /// the key used to create this entry.
2620     ///
2621     /// # Examples
2622     ///
2623     /// ```
2624     /// #![feature(map_entry_replace)]
2625     /// use std::collections::hash_map::{Entry, HashMap};
2626     /// use std::rc::Rc;
2627     ///
2628     /// let mut map: HashMap<Rc<String>, u32> = HashMap::new();
2629     /// map.insert(Rc::new("Stringthing".to_string()), 15);
2630     ///
2631     /// let my_key = Rc::new("Stringthing".to_string());
2632     ///
2633     /// if let Entry::Occupied(entry) = map.entry(my_key) {
2634     ///     // Also replace the key with a handle to our other key.
2635     ///     let (old_key, old_value): (Rc<String>, u32) = entry.replace_entry(16);
2636     /// }
2637     ///
2638     /// ```
2639     #[inline]
2640     #[unstable(feature = "map_entry_replace", issue = "44286")]
2641     pub fn replace_entry(self, value: V) -> (K, V) {
2642         self.base.replace_entry(value)
2643     }
2644
2645     /// Replaces the key in the hash map with the key used to create this entry.
2646     ///
2647     /// # Examples
2648     ///
2649     /// ```
2650     /// #![feature(map_entry_replace)]
2651     /// use std::collections::hash_map::{Entry, HashMap};
2652     /// use std::rc::Rc;
2653     ///
2654     /// let mut map: HashMap<Rc<String>, u32> = HashMap::new();
2655     /// let known_strings: Vec<Rc<String>> = Vec::new();
2656     ///
2657     /// // Initialise known strings, run program, etc.
2658     ///
2659     /// reclaim_memory(&mut map, &known_strings);
2660     ///
2661     /// fn reclaim_memory(map: &mut HashMap<Rc<String>, u32>, known_strings: &[Rc<String>] ) {
2662     ///     for s in known_strings {
2663     ///         if let Entry::Occupied(entry) = map.entry(Rc::clone(s)) {
2664     ///             // Replaces the entry's key with our version of it in `known_strings`.
2665     ///             entry.replace_key();
2666     ///         }
2667     ///     }
2668     /// }
2669     /// ```
2670     #[inline]
2671     #[unstable(feature = "map_entry_replace", issue = "44286")]
2672     pub fn replace_key(self) -> K {
2673         self.base.replace_key()
2674     }
2675 }
2676
2677 impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {
2678     /// Gets a reference to the key that would be used when inserting a value
2679     /// through the `VacantEntry`.
2680     ///
2681     /// # Examples
2682     ///
2683     /// ```
2684     /// use std::collections::HashMap;
2685     ///
2686     /// let mut map: HashMap<&str, u32> = HashMap::new();
2687     /// assert_eq!(map.entry("poneyland").key(), &"poneyland");
2688     /// ```
2689     #[inline]
2690     #[stable(feature = "map_entry_keys", since = "1.10.0")]
2691     pub fn key(&self) -> &K {
2692         self.base.key()
2693     }
2694
2695     /// Take ownership of the key.
2696     ///
2697     /// # Examples
2698     ///
2699     /// ```
2700     /// use std::collections::HashMap;
2701     /// use std::collections::hash_map::Entry;
2702     ///
2703     /// let mut map: HashMap<&str, u32> = HashMap::new();
2704     ///
2705     /// if let Entry::Vacant(v) = map.entry("poneyland") {
2706     ///     v.into_key();
2707     /// }
2708     /// ```
2709     #[inline]
2710     #[stable(feature = "map_entry_recover_keys2", since = "1.12.0")]
2711     pub fn into_key(self) -> K {
2712         self.base.into_key()
2713     }
2714
2715     /// Sets the value of the entry with the `VacantEntry`'s key,
2716     /// and returns a mutable reference to it.
2717     ///
2718     /// # Examples
2719     ///
2720     /// ```
2721     /// use std::collections::HashMap;
2722     /// use std::collections::hash_map::Entry;
2723     ///
2724     /// let mut map: HashMap<&str, u32> = HashMap::new();
2725     ///
2726     /// if let Entry::Vacant(o) = map.entry("poneyland") {
2727     ///     o.insert(37);
2728     /// }
2729     /// assert_eq!(map["poneyland"], 37);
2730     /// ```
2731     #[inline]
2732     #[stable(feature = "rust1", since = "1.0.0")]
2733     pub fn insert(self, value: V) -> &'a mut V {
2734         self.base.insert(value)
2735     }
2736
2737     /// Sets the value of the entry with the `VacantEntry`'s key,
2738     /// and returns an `OccupiedEntry`.
2739     ///
2740     /// # Examples
2741     ///
2742     /// ```
2743     /// use std::collections::HashMap;
2744     /// use std::collections::hash_map::Entry;
2745     ///
2746     /// let mut map: HashMap<&str, u32> = HashMap::new();
2747     ///
2748     /// if let Entry::Vacant(o) = map.entry("poneyland") {
2749     ///     o.insert(37);
2750     /// }
2751     /// assert_eq!(map["poneyland"], 37);
2752     /// ```
2753     #[inline]
2754     fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V> {
2755         let base = self.base.insert_entry(value);
2756         OccupiedEntry { base }
2757     }
2758 }
2759
2760 #[stable(feature = "rust1", since = "1.0.0")]
2761 impl<K, V, S> FromIterator<(K, V)> for HashMap<K, V, S>
2762 where
2763     K: Eq + Hash,
2764     S: BuildHasher + Default,
2765 {
2766     fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> HashMap<K, V, S> {
2767         let mut map = HashMap::with_hasher(Default::default());
2768         map.extend(iter);
2769         map
2770     }
2771 }
2772
2773 /// Inserts all new key-values from the iterator and replaces values with existing
2774 /// keys with new values returned from the iterator.
2775 #[stable(feature = "rust1", since = "1.0.0")]
2776 impl<K, V, S> Extend<(K, V)> for HashMap<K, V, S>
2777 where
2778     K: Eq + Hash,
2779     S: BuildHasher,
2780 {
2781     #[inline]
2782     fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
2783         self.base.extend(iter)
2784     }
2785
2786     #[inline]
2787     fn extend_one(&mut self, (k, v): (K, V)) {
2788         self.base.insert(k, v);
2789     }
2790
2791     #[inline]
2792     fn extend_reserve(&mut self, additional: usize) {
2793         // self.base.extend_reserve(additional);
2794         // FIXME: hashbrown should implement this method.
2795         // But until then, use the same reservation logic:
2796
2797         // Reserve the entire hint lower bound if the map is empty.
2798         // Otherwise reserve half the hint (rounded up), so the map
2799         // will only resize twice in the worst case.
2800         let reserve = if self.is_empty() { additional } else { (additional + 1) / 2 };
2801         self.base.reserve(reserve);
2802     }
2803 }
2804
2805 #[stable(feature = "hash_extend_copy", since = "1.4.0")]
2806 impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap<K, V, S>
2807 where
2808     K: Eq + Hash + Copy,
2809     V: Copy,
2810     S: BuildHasher,
2811 {
2812     #[inline]
2813     fn extend<T: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: T) {
2814         self.base.extend(iter)
2815     }
2816
2817     #[inline]
2818     fn extend_one(&mut self, (&k, &v): (&'a K, &'a V)) {
2819         self.base.insert(k, v);
2820     }
2821
2822     #[inline]
2823     fn extend_reserve(&mut self, additional: usize) {
2824         Extend::<(K, V)>::extend_reserve(self, additional)
2825     }
2826 }
2827
2828 /// `RandomState` is the default state for [`HashMap`] types.
2829 ///
2830 /// A particular instance `RandomState` will create the same instances of
2831 /// [`Hasher`], but the hashers created by two different `RandomState`
2832 /// instances are unlikely to produce the same result for the same values.
2833 ///
2834 /// # Examples
2835 ///
2836 /// ```
2837 /// use std::collections::HashMap;
2838 /// use std::collections::hash_map::RandomState;
2839 ///
2840 /// let s = RandomState::new();
2841 /// let mut map = HashMap::with_hasher(s);
2842 /// map.insert(1, 2);
2843 /// ```
2844 #[derive(Clone)]
2845 #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
2846 pub struct RandomState {
2847     k0: u64,
2848     k1: u64,
2849 }
2850
2851 impl RandomState {
2852     /// Constructs a new `RandomState` that is initialized with random keys.
2853     ///
2854     /// # Examples
2855     ///
2856     /// ```
2857     /// use std::collections::hash_map::RandomState;
2858     ///
2859     /// let s = RandomState::new();
2860     /// ```
2861     #[inline]
2862     #[allow(deprecated)]
2863     // rand
2864     #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
2865     pub fn new() -> RandomState {
2866         // Historically this function did not cache keys from the OS and instead
2867         // simply always called `rand::thread_rng().gen()` twice. In #31356 it
2868         // was discovered, however, that because we re-seed the thread-local RNG
2869         // from the OS periodically that this can cause excessive slowdown when
2870         // many hash maps are created on a thread. To solve this performance
2871         // trap we cache the first set of randomly generated keys per-thread.
2872         //
2873         // Later in #36481 it was discovered that exposing a deterministic
2874         // iteration order allows a form of DOS attack. To counter that we
2875         // increment one of the seeds on every RandomState creation, giving
2876         // every corresponding HashMap a different iteration order.
2877         thread_local!(static KEYS: Cell<(u64, u64)> = {
2878             Cell::new(sys::hashmap_random_keys())
2879         });
2880
2881         KEYS.with(|keys| {
2882             let (k0, k1) = keys.get();
2883             keys.set((k0.wrapping_add(1), k1));
2884             RandomState { k0, k1 }
2885         })
2886     }
2887 }
2888
2889 #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
2890 impl BuildHasher for RandomState {
2891     type Hasher = DefaultHasher;
2892     #[inline]
2893     #[allow(deprecated)]
2894     fn build_hasher(&self) -> DefaultHasher {
2895         DefaultHasher(SipHasher13::new_with_keys(self.k0, self.k1))
2896     }
2897 }
2898
2899 /// The default [`Hasher`] used by [`RandomState`].
2900 ///
2901 /// The internal algorithm is not specified, and so it and its hashes should
2902 /// not be relied upon over releases.
2903 #[stable(feature = "hashmap_default_hasher", since = "1.13.0")]
2904 #[allow(deprecated)]
2905 #[derive(Clone, Debug)]
2906 pub struct DefaultHasher(SipHasher13);
2907
2908 impl DefaultHasher {
2909     /// Creates a new `DefaultHasher`.
2910     ///
2911     /// This hasher is not guaranteed to be the same as all other
2912     /// `DefaultHasher` instances, but is the same as all other `DefaultHasher`
2913     /// instances created through `new` or `default`.
2914     #[stable(feature = "hashmap_default_hasher", since = "1.13.0")]
2915     #[allow(deprecated)]
2916     pub fn new() -> DefaultHasher {
2917         DefaultHasher(SipHasher13::new_with_keys(0, 0))
2918     }
2919 }
2920
2921 #[stable(feature = "hashmap_default_hasher", since = "1.13.0")]
2922 impl Default for DefaultHasher {
2923     /// Creates a new `DefaultHasher` using [`new`].
2924     /// See its documentation for more.
2925     ///
2926     /// [`new`]: DefaultHasher::new
2927     fn default() -> DefaultHasher {
2928         DefaultHasher::new()
2929     }
2930 }
2931
2932 #[stable(feature = "hashmap_default_hasher", since = "1.13.0")]
2933 impl Hasher for DefaultHasher {
2934     #[inline]
2935     fn write(&mut self, msg: &[u8]) {
2936         self.0.write(msg)
2937     }
2938
2939     #[inline]
2940     fn finish(&self) -> u64 {
2941         self.0.finish()
2942     }
2943 }
2944
2945 #[stable(feature = "hashmap_build_hasher", since = "1.7.0")]
2946 impl Default for RandomState {
2947     /// Constructs a new `RandomState`.
2948     #[inline]
2949     fn default() -> RandomState {
2950         RandomState::new()
2951     }
2952 }
2953
2954 #[stable(feature = "std_debug", since = "1.16.0")]
2955 impl fmt::Debug for RandomState {
2956     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2957         f.pad("RandomState { .. }")
2958     }
2959 }
2960
2961 #[inline]
2962 fn map_entry<'a, K: 'a, V: 'a>(raw: base::RustcEntry<'a, K, V>) -> Entry<'a, K, V> {
2963     match raw {
2964         base::RustcEntry::Occupied(base) => Entry::Occupied(OccupiedEntry { base }),
2965         base::RustcEntry::Vacant(base) => Entry::Vacant(VacantEntry { base }),
2966     }
2967 }
2968
2969 #[inline]
2970 pub(super) fn map_try_reserve_error(err: hashbrown::TryReserveError) -> TryReserveError {
2971     match err {
2972         hashbrown::TryReserveError::CapacityOverflow => TryReserveError::CapacityOverflow,
2973         hashbrown::TryReserveError::AllocError { layout } => {
2974             TryReserveError::AllocError { layout, non_exhaustive: () }
2975         }
2976     }
2977 }
2978
2979 #[inline]
2980 fn map_raw_entry<'a, K: 'a, V: 'a, S: 'a>(
2981     raw: base::RawEntryMut<'a, K, V, S>,
2982 ) -> RawEntryMut<'a, K, V, S> {
2983     match raw {
2984         base::RawEntryMut::Occupied(base) => RawEntryMut::Occupied(RawOccupiedEntryMut { base }),
2985         base::RawEntryMut::Vacant(base) => RawEntryMut::Vacant(RawVacantEntryMut { base }),
2986     }
2987 }
2988
2989 #[allow(dead_code)]
2990 fn assert_covariance() {
2991     fn map_key<'new>(v: HashMap<&'static str, u8>) -> HashMap<&'new str, u8> {
2992         v
2993     }
2994     fn map_val<'new>(v: HashMap<u8, &'static str>) -> HashMap<u8, &'new str> {
2995         v
2996     }
2997     fn iter_key<'a, 'new>(v: Iter<'a, &'static str, u8>) -> Iter<'a, &'new str, u8> {
2998         v
2999     }
3000     fn iter_val<'a, 'new>(v: Iter<'a, u8, &'static str>) -> Iter<'a, u8, &'new str> {
3001         v
3002     }
3003     fn into_iter_key<'new>(v: IntoIter<&'static str, u8>) -> IntoIter<&'new str, u8> {
3004         v
3005     }
3006     fn into_iter_val<'new>(v: IntoIter<u8, &'static str>) -> IntoIter<u8, &'new str> {
3007         v
3008     }
3009     fn keys_key<'a, 'new>(v: Keys<'a, &'static str, u8>) -> Keys<'a, &'new str, u8> {
3010         v
3011     }
3012     fn keys_val<'a, 'new>(v: Keys<'a, u8, &'static str>) -> Keys<'a, u8, &'new str> {
3013         v
3014     }
3015     fn values_key<'a, 'new>(v: Values<'a, &'static str, u8>) -> Values<'a, &'new str, u8> {
3016         v
3017     }
3018     fn values_val<'a, 'new>(v: Values<'a, u8, &'static str>) -> Values<'a, u8, &'new str> {
3019         v
3020     }
3021     fn drain<'new>(
3022         d: Drain<'static, &'static str, &'static str>,
3023     ) -> Drain<'new, &'new str, &'new str> {
3024         d
3025     }
3026 }