Coverage Report

Created: 2026-03-12 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/hashbrown-0.15.5/src/map.rs
Line
Count
Source
1
use crate::raw::{
2
    Allocator, Bucket, Global, RawDrain, RawExtractIf, RawIntoIter, RawIter, RawTable,
3
};
4
use crate::{DefaultHashBuilder, Equivalent, TryReserveError};
5
use core::borrow::Borrow;
6
use core::fmt::{self, Debug};
7
use core::hash::{BuildHasher, Hash};
8
use core::iter::FusedIterator;
9
use core::marker::PhantomData;
10
use core::mem;
11
use core::ops::Index;
12
13
#[cfg(feature = "raw-entry")]
14
pub use crate::raw_entry::*;
15
16
/// A hash map implemented with quadratic probing and SIMD lookup.
17
///
18
/// The default hashing algorithm is currently [`foldhash`], though this is
19
/// subject to change at any point in the future. This hash function is very
20
/// fast for all types of keys, but this algorithm will typically *not* protect
21
/// against attacks such as HashDoS.
22
///
23
/// The hashing algorithm can be replaced on a per-`HashMap` basis using the
24
/// [`default`], [`with_hasher`], and [`with_capacity_and_hasher`] methods. Many
25
/// alternative algorithms are available on crates.io, such as the [`fnv`] crate.
26
///
27
/// It is required that the keys implement the [`Eq`] and [`Hash`] traits, although
28
/// this can frequently be achieved by using `#[derive(PartialEq, Eq, Hash)]`.
29
/// If you implement these yourself, it is important that the following
30
/// property holds:
31
///
32
/// ```text
33
/// k1 == k2 -> hash(k1) == hash(k2)
34
/// ```
35
///
36
/// In other words, if two keys are equal, their hashes must be equal.
37
///
38
/// It is a logic error for a key to be modified in such a way that the key's
39
/// hash, as determined by the [`Hash`] trait, or its equality, as determined by
40
/// the [`Eq`] trait, changes while it is in the map. This is normally only
41
/// possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code.
42
///
43
/// It is also a logic error for the [`Hash`] implementation of a key to panic.
44
/// This is generally only possible if the trait is implemented manually. If a
45
/// panic does occur then the contents of the `HashMap` may become corrupted and
46
/// some items may be dropped from the table.
47
///
48
/// # Examples
49
///
50
/// ```
51
/// use hashbrown::HashMap;
52
///
53
/// // Type inference lets us omit an explicit type signature (which
54
/// // would be `HashMap<String, String>` in this example).
55
/// let mut book_reviews = HashMap::new();
56
///
57
/// // Review some books.
58
/// book_reviews.insert(
59
///     "Adventures of Huckleberry Finn".to_string(),
60
///     "My favorite book.".to_string(),
61
/// );
62
/// book_reviews.insert(
63
///     "Grimms' Fairy Tales".to_string(),
64
///     "Masterpiece.".to_string(),
65
/// );
66
/// book_reviews.insert(
67
///     "Pride and Prejudice".to_string(),
68
///     "Very enjoyable.".to_string(),
69
/// );
70
/// book_reviews.insert(
71
///     "The Adventures of Sherlock Holmes".to_string(),
72
///     "Eye lyked it alot.".to_string(),
73
/// );
74
///
75
/// // Check for a specific one.
76
/// // When collections store owned values (String), they can still be
77
/// // queried using references (&str).
78
/// if !book_reviews.contains_key("Les Misérables") {
79
///     println!("We've got {} reviews, but Les Misérables ain't one.",
80
///              book_reviews.len());
81
/// }
82
///
83
/// // oops, this review has a lot of spelling mistakes, let's delete it.
84
/// book_reviews.remove("The Adventures of Sherlock Holmes");
85
///
86
/// // Look up the values associated with some keys.
87
/// let to_find = ["Pride and Prejudice", "Alice's Adventure in Wonderland"];
88
/// for &book in &to_find {
89
///     match book_reviews.get(book) {
90
///         Some(review) => println!("{}: {}", book, review),
91
///         None => println!("{} is unreviewed.", book)
92
///     }
93
/// }
94
///
95
/// // Look up the value for a key (will panic if the key is not found).
96
/// println!("Review for Jane: {}", book_reviews["Pride and Prejudice"]);
97
///
98
/// // Iterate over everything.
99
/// for (book, review) in &book_reviews {
100
///     println!("{}: \"{}\"", book, review);
101
/// }
102
/// ```
103
///
104
/// `HashMap` also implements an [`Entry API`](#method.entry), which allows
105
/// for more complex methods of getting, setting, updating and removing keys and
106
/// their values:
107
///
108
/// ```
109
/// use hashbrown::HashMap;
110
///
111
/// // type inference lets us omit an explicit type signature (which
112
/// // would be `HashMap<&str, u8>` in this example).
113
/// let mut player_stats = HashMap::new();
114
///
115
/// fn random_stat_buff() -> u8 {
116
///     // could actually return some random value here - let's just return
117
///     // some fixed value for now
118
///     42
119
/// }
120
///
121
/// // insert a key only if it doesn't already exist
122
/// player_stats.entry("health").or_insert(100);
123
///
124
/// // insert a key using a function that provides a new value only if it
125
/// // doesn't already exist
126
/// player_stats.entry("defence").or_insert_with(random_stat_buff);
127
///
128
/// // update a key, guarding against the key possibly not being set
129
/// let stat = player_stats.entry("attack").or_insert(100);
130
/// *stat += random_stat_buff();
131
/// ```
132
///
133
/// The easiest way to use `HashMap` with a custom key type is to derive [`Eq`] and [`Hash`].
134
/// We must also derive [`PartialEq`].
135
///
136
/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
137
/// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
138
/// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html
139
/// [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html
140
/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html
141
/// [`default`]: #method.default
142
/// [`with_hasher`]: #method.with_hasher
143
/// [`with_capacity_and_hasher`]: #method.with_capacity_and_hasher
144
/// [`fnv`]: https://crates.io/crates/fnv
145
/// [`foldhash`]: https://crates.io/crates/foldhash
146
///
147
/// ```
148
/// use hashbrown::HashMap;
149
///
150
/// #[derive(Hash, Eq, PartialEq, Debug)]
151
/// struct Viking {
152
///     name: String,
153
///     country: String,
154
/// }
155
///
156
/// impl Viking {
157
///     /// Creates a new Viking.
158
///     fn new(name: &str, country: &str) -> Viking {
159
///         Viking { name: name.to_string(), country: country.to_string() }
160
///     }
161
/// }
162
///
163
/// // Use a HashMap to store the vikings' health points.
164
/// let mut vikings = HashMap::new();
165
///
166
/// vikings.insert(Viking::new("Einar", "Norway"), 25);
167
/// vikings.insert(Viking::new("Olaf", "Denmark"), 24);
168
/// vikings.insert(Viking::new("Harald", "Iceland"), 12);
169
///
170
/// // Use derived implementation to print the status of the vikings.
171
/// for (viking, health) in &vikings {
172
///     println!("{:?} has {} hp", viking, health);
173
/// }
174
/// ```
175
///
176
/// A `HashMap` with fixed list of elements can be initialized from an array:
177
///
178
/// ```
179
/// use hashbrown::HashMap;
180
///
181
/// let timber_resources: HashMap<&str, i32> = [("Norway", 100), ("Denmark", 50), ("Iceland", 10)]
182
///     .into_iter().collect();
183
/// // use the values stored in map
184
/// ```
185
pub struct HashMap<K, V, S = DefaultHashBuilder, A: Allocator = Global> {
186
    pub(crate) hash_builder: S,
187
    pub(crate) table: RawTable<(K, V), A>,
188
}
189
190
impl<K: Clone, V: Clone, S: Clone, A: Allocator + Clone> Clone for HashMap<K, V, S, A> {
191
0
    fn clone(&self) -> Self {
192
0
        HashMap {
193
0
            hash_builder: self.hash_builder.clone(),
194
0
            table: self.table.clone(),
195
0
        }
196
0
    }
197
198
0
    fn clone_from(&mut self, source: &Self) {
199
0
        self.table.clone_from(&source.table);
200
201
        // Update hash_builder only if we successfully cloned all elements.
202
0
        self.hash_builder.clone_from(&source.hash_builder);
203
0
    }
204
}
205
206
/// Ensures that a single closure type across uses of this which, in turn prevents multiple
207
/// instances of any functions like `RawTable::reserve` from being generated
208
#[cfg_attr(feature = "inline-more", inline)]
209
0
pub(crate) fn make_hasher<Q, V, S>(hash_builder: &S) -> impl Fn(&(Q, V)) -> u64 + '_
210
0
where
211
0
    Q: Hash,
212
0
    S: BuildHasher,
213
{
214
0
    move |val| make_hash::<Q, S>(hash_builder, &val.0)
Unexecuted instantiation: hashbrown::map::make_hasher::<u32, (), foldhash::fast::RandomState>::{closure#0}
Unexecuted instantiation: hashbrown::map::make_hasher::<_, _, _>::{closure#0}
215
0
}
Unexecuted instantiation: hashbrown::map::make_hasher::<u32, (), foldhash::fast::RandomState>
Unexecuted instantiation: hashbrown::map::make_hasher::<_, _, _>
216
217
/// Ensures that a single closure type across uses of this which, in turn prevents multiple
218
/// instances of any functions like `RawTable::reserve` from being generated
219
#[cfg_attr(feature = "inline-more", inline)]
220
0
pub(crate) fn equivalent_key<Q, K, V>(k: &Q) -> impl Fn(&(K, V)) -> bool + '_
221
0
where
222
0
    Q: Equivalent<K> + ?Sized,
223
{
224
0
    move |x| k.equivalent(&x.0)
Unexecuted instantiation: hashbrown::map::equivalent_key::<u32, u32, ()>::{closure#0}
Unexecuted instantiation: hashbrown::map::equivalent_key::<_, _, _>::{closure#0}
225
0
}
Unexecuted instantiation: hashbrown::map::equivalent_key::<u32, u32, ()>
Unexecuted instantiation: hashbrown::map::equivalent_key::<_, _, _>
226
227
/// Ensures that a single closure type across uses of this which, in turn prevents multiple
228
/// instances of any functions like `RawTable::reserve` from being generated
229
#[cfg_attr(feature = "inline-more", inline)]
230
#[allow(dead_code)]
231
0
pub(crate) fn equivalent<Q, K>(k: &Q) -> impl Fn(&K) -> bool + '_
232
0
where
233
0
    Q: Equivalent<K> + ?Sized,
234
{
235
0
    move |x| k.equivalent(x)
236
0
}
237
238
#[cfg(not(feature = "nightly"))]
239
#[cfg_attr(feature = "inline-more", inline)]
240
0
pub(crate) fn make_hash<Q, S>(hash_builder: &S, val: &Q) -> u64
241
0
where
242
0
    Q: Hash + ?Sized,
243
0
    S: BuildHasher,
244
{
245
    use core::hash::Hasher;
246
0
    let mut state = hash_builder.build_hasher();
247
0
    val.hash(&mut state);
248
0
    state.finish()
249
0
}
Unexecuted instantiation: hashbrown::map::make_hash::<u32, foldhash::fast::RandomState>
Unexecuted instantiation: hashbrown::map::make_hash::<_, _>
250
251
#[cfg(feature = "nightly")]
252
#[cfg_attr(feature = "inline-more", inline)]
253
pub(crate) fn make_hash<Q, S>(hash_builder: &S, val: &Q) -> u64
254
where
255
    Q: Hash + ?Sized,
256
    S: BuildHasher,
257
{
258
    hash_builder.hash_one(val)
259
}
260
261
#[cfg(feature = "default-hasher")]
262
impl<K, V> HashMap<K, V, DefaultHashBuilder> {
263
    /// Creates an empty `HashMap`.
264
    ///
265
    /// The hash map is initially created with a capacity of 0, so it will not allocate until it
266
    /// is first inserted into.
267
    ///
268
    /// # HashDoS resistance
269
    ///
270
    /// The `hash_builder` normally use a fixed key by default and that does
271
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
272
    /// Users who require HashDoS resistance should explicitly use
273
    /// [`std::collections::hash_map::RandomState`]
274
    /// as the hasher when creating a [`HashMap`], for example with
275
    /// [`with_hasher`](HashMap::with_hasher) method.
276
    ///
277
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
278
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
279
    ///
280
    /// # Examples
281
    ///
282
    /// ```
283
    /// use hashbrown::HashMap;
284
    /// let mut map: HashMap<&str, i32> = HashMap::new();
285
    /// assert_eq!(map.len(), 0);
286
    /// assert_eq!(map.capacity(), 0);
287
    /// ```
288
    #[cfg_attr(feature = "inline-more", inline)]
289
0
    pub fn new() -> Self {
290
0
        Self::default()
291
0
    }
292
293
    /// Creates an empty `HashMap` with the specified capacity.
294
    ///
295
    /// The hash map will be able to hold at least `capacity` elements without
296
    /// reallocating. If `capacity` is 0, the hash map will not allocate.
297
    ///
298
    /// # HashDoS resistance
299
    ///
300
    /// The `hash_builder` normally use a fixed key by default and that does
301
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
302
    /// Users who require HashDoS resistance should explicitly use
303
    /// [`std::collections::hash_map::RandomState`]
304
    /// as the hasher when creating a [`HashMap`], for example with
305
    /// [`with_capacity_and_hasher`](HashMap::with_capacity_and_hasher) method.
306
    ///
307
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
308
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
309
    ///
310
    /// # Examples
311
    ///
312
    /// ```
313
    /// use hashbrown::HashMap;
314
    /// let mut map: HashMap<&str, i32> = HashMap::with_capacity(10);
315
    /// assert_eq!(map.len(), 0);
316
    /// assert!(map.capacity() >= 10);
317
    /// ```
318
    #[cfg_attr(feature = "inline-more", inline)]
319
2
    pub fn with_capacity(capacity: usize) -> Self {
320
2
        Self::with_capacity_and_hasher(capacity, DefaultHashBuilder::default())
321
2
    }
<hashbrown::map::HashMap<u32, ()>>::with_capacity
Line
Count
Source
319
2
    pub fn with_capacity(capacity: usize) -> Self {
320
2
        Self::with_capacity_and_hasher(capacity, DefaultHashBuilder::default())
321
2
    }
Unexecuted instantiation: <hashbrown::map::HashMap<usize, ()>>::with_capacity
Unexecuted instantiation: <hashbrown::map::HashMap<_, _>>::with_capacity
322
}
323
324
#[cfg(feature = "default-hasher")]
325
impl<K, V, A: Allocator> HashMap<K, V, DefaultHashBuilder, A> {
326
    /// Creates an empty `HashMap` using the given allocator.
327
    ///
328
    /// The hash map is initially created with a capacity of 0, so it will not allocate until it
329
    /// is first inserted into.
330
    ///
331
    /// # HashDoS resistance
332
    ///
333
    /// The `hash_builder` normally use a fixed key by default and that does
334
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
335
    /// Users who require HashDoS resistance should explicitly use
336
    /// [`std::collections::hash_map::RandomState`]
337
    /// as the hasher when creating a [`HashMap`], for example with
338
    /// [`with_hasher_in`](HashMap::with_hasher_in) method.
339
    ///
340
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
341
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
342
    ///
343
    /// # Examples
344
    ///
345
    /// ```
346
    /// use hashbrown::HashMap;
347
    /// use bumpalo::Bump;
348
    ///
349
    /// let bump = Bump::new();
350
    /// let mut map = HashMap::new_in(&bump);
351
    ///
352
    /// // The created HashMap holds none elements
353
    /// assert_eq!(map.len(), 0);
354
    ///
355
    /// // The created HashMap also doesn't allocate memory
356
    /// assert_eq!(map.capacity(), 0);
357
    ///
358
    /// // Now we insert element inside created HashMap
359
    /// map.insert("One", 1);
360
    /// // We can see that the HashMap holds 1 element
361
    /// assert_eq!(map.len(), 1);
362
    /// // And it also allocates some capacity
363
    /// assert!(map.capacity() > 1);
364
    /// ```
365
    #[cfg_attr(feature = "inline-more", inline)]
366
0
    pub fn new_in(alloc: A) -> Self {
367
0
        Self::with_hasher_in(DefaultHashBuilder::default(), alloc)
368
0
    }
369
370
    /// Creates an empty `HashMap` with the specified capacity using the given allocator.
371
    ///
372
    /// The hash map will be able to hold at least `capacity` elements without
373
    /// reallocating. If `capacity` is 0, the hash map will not allocate.
374
    ///
375
    /// # HashDoS resistance
376
    ///
377
    /// The `hash_builder` normally use a fixed key by default and that does
378
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
379
    /// Users who require HashDoS resistance should explicitly use
380
    /// [`std::collections::hash_map::RandomState`]
381
    /// as the hasher when creating a [`HashMap`], for example with
382
    /// [`with_capacity_and_hasher_in`](HashMap::with_capacity_and_hasher_in) method.
383
    ///
384
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
385
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
386
    ///
387
    /// # Examples
388
    ///
389
    /// ```
390
    /// use hashbrown::HashMap;
391
    /// use bumpalo::Bump;
392
    ///
393
    /// let bump = Bump::new();
394
    /// let mut map = HashMap::with_capacity_in(5, &bump);
395
    ///
396
    /// // The created HashMap holds none elements
397
    /// assert_eq!(map.len(), 0);
398
    /// // But it can hold at least 5 elements without reallocating
399
    /// let empty_map_capacity = map.capacity();
400
    /// assert!(empty_map_capacity >= 5);
401
    ///
402
    /// // Now we insert some 5 elements inside created HashMap
403
    /// map.insert("One",   1);
404
    /// map.insert("Two",   2);
405
    /// map.insert("Three", 3);
406
    /// map.insert("Four",  4);
407
    /// map.insert("Five",  5);
408
    ///
409
    /// // We can see that the HashMap holds 5 elements
410
    /// assert_eq!(map.len(), 5);
411
    /// // But its capacity isn't changed
412
    /// assert_eq!(map.capacity(), empty_map_capacity)
413
    /// ```
414
    #[cfg_attr(feature = "inline-more", inline)]
415
0
    pub fn with_capacity_in(capacity: usize, alloc: A) -> Self {
416
0
        Self::with_capacity_and_hasher_in(capacity, DefaultHashBuilder::default(), alloc)
417
0
    }
418
}
419
420
impl<K, V, S> HashMap<K, V, S> {
421
    /// Creates an empty `HashMap` which will use the given hash builder to hash
422
    /// keys.
423
    ///
424
    /// The hash map is initially created with a capacity of 0, so it will not
425
    /// allocate until it is first inserted into.
426
    ///
427
    /// # HashDoS resistance
428
    ///
429
    /// The `hash_builder` normally use a fixed key by default and that does
430
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
431
    /// Users who require HashDoS resistance should explicitly use
432
    /// [`std::collections::hash_map::RandomState`]
433
    /// as the hasher when creating a [`HashMap`].
434
    ///
435
    /// The `hash_builder` passed should implement the [`BuildHasher`] trait for
436
    /// the `HashMap` to be useful, see its documentation for details.
437
    ///
438
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
439
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
440
    /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html
441
    ///
442
    /// # Examples
443
    ///
444
    /// ```
445
    /// use hashbrown::HashMap;
446
    /// use hashbrown::DefaultHashBuilder;
447
    ///
448
    /// let s = DefaultHashBuilder::default();
449
    /// let mut map = HashMap::with_hasher(s);
450
    /// assert_eq!(map.len(), 0);
451
    /// assert_eq!(map.capacity(), 0);
452
    ///
453
    /// map.insert(1, 2);
454
    /// ```
455
    #[cfg_attr(feature = "inline-more", inline)]
456
    #[cfg_attr(feature = "rustc-dep-of-std", rustc_const_stable_indirect)]
457
0
    pub const fn with_hasher(hash_builder: S) -> Self {
458
0
        Self {
459
0
            hash_builder,
460
0
            table: RawTable::new(),
461
0
        }
462
0
    }
463
464
    /// Creates an empty `HashMap` with the specified capacity, using `hash_builder`
465
    /// to hash the keys.
466
    ///
467
    /// The hash map will be able to hold at least `capacity` elements without
468
    /// reallocating. If `capacity` is 0, the hash map will not allocate.
469
    ///
470
    /// # HashDoS resistance
471
    ///
472
    /// The `hash_builder` normally use a fixed key by default and that does
473
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
474
    /// Users who require HashDoS resistance should explicitly use
475
    /// [`std::collections::hash_map::RandomState`]
476
    /// as the hasher when creating a [`HashMap`].
477
    ///
478
    /// The `hash_builder` passed should implement the [`BuildHasher`] trait for
479
    /// the `HashMap` to be useful, see its documentation for details.
480
    ///
481
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
482
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
483
    /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html
484
    ///
485
    /// # Examples
486
    ///
487
    /// ```
488
    /// use hashbrown::HashMap;
489
    /// use hashbrown::DefaultHashBuilder;
490
    ///
491
    /// let s = DefaultHashBuilder::default();
492
    /// let mut map = HashMap::with_capacity_and_hasher(10, s);
493
    /// assert_eq!(map.len(), 0);
494
    /// assert!(map.capacity() >= 10);
495
    ///
496
    /// map.insert(1, 2);
497
    /// ```
498
    #[cfg_attr(feature = "inline-more", inline)]
499
2
    pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self {
500
2
        Self {
501
2
            hash_builder,
502
2
            table: RawTable::with_capacity(capacity),
503
2
        }
504
2
    }
<hashbrown::map::HashMap<u32, ()>>::with_capacity_and_hasher
Line
Count
Source
499
2
    pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self {
500
2
        Self {
501
2
            hash_builder,
502
2
            table: RawTable::with_capacity(capacity),
503
2
        }
504
2
    }
Unexecuted instantiation: <hashbrown::map::HashMap<usize, ()>>::with_capacity_and_hasher
Unexecuted instantiation: <hashbrown::map::HashMap<_, _, _>>::with_capacity_and_hasher
505
}
506
507
impl<K, V, S, A: Allocator> HashMap<K, V, S, A> {
508
    /// Returns a reference to the underlying allocator.
509
    #[inline]
510
0
    pub fn allocator(&self) -> &A {
511
0
        self.table.allocator()
512
0
    }
513
514
    /// Creates an empty `HashMap` which will use the given hash builder to hash
515
    /// keys. It will be allocated with the given allocator.
516
    ///
517
    /// The hash map is initially created with a capacity of 0, so it will not allocate until it
518
    /// is first inserted into.
519
    ///
520
    /// # HashDoS resistance
521
    ///
522
    /// The `hash_builder` normally use a fixed key by default and that does
523
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
524
    /// Users who require HashDoS resistance should explicitly use
525
    /// [`std::collections::hash_map::RandomState`]
526
    /// as the hasher when creating a [`HashMap`].
527
    ///
528
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
529
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
530
    ///
531
    /// # Examples
532
    ///
533
    /// ```
534
    /// use hashbrown::HashMap;
535
    /// use hashbrown::DefaultHashBuilder;
536
    ///
537
    /// let s = DefaultHashBuilder::default();
538
    /// let mut map = HashMap::with_hasher(s);
539
    /// map.insert(1, 2);
540
    /// ```
541
    #[cfg_attr(feature = "inline-more", inline)]
542
    #[cfg_attr(feature = "rustc-dep-of-std", rustc_const_stable_indirect)]
543
0
    pub const fn with_hasher_in(hash_builder: S, alloc: A) -> Self {
544
0
        Self {
545
0
            hash_builder,
546
0
            table: RawTable::new_in(alloc),
547
0
        }
548
0
    }
549
550
    /// Creates an empty `HashMap` with the specified capacity, using `hash_builder`
551
    /// to hash the keys. It will be allocated with the given allocator.
552
    ///
553
    /// The hash map will be able to hold at least `capacity` elements without
554
    /// reallocating. If `capacity` is 0, the hash map will not allocate.
555
    ///
556
    /// # HashDoS resistance
557
    ///
558
    /// The `hash_builder` normally use a fixed key by default and that does
559
    /// not allow the `HashMap` to be protected against attacks such as [`HashDoS`].
560
    /// Users who require HashDoS resistance should explicitly use
561
    /// [`std::collections::hash_map::RandomState`]
562
    /// as the hasher when creating a [`HashMap`].
563
    ///
564
    /// [`HashDoS`]: https://en.wikipedia.org/wiki/Collision_attack
565
    /// [`std::collections::hash_map::RandomState`]: https://doc.rust-lang.org/std/collections/hash_map/struct.RandomState.html
566
    ///
567
    /// # Examples
568
    ///
569
    /// ```
570
    /// use hashbrown::HashMap;
571
    /// use hashbrown::DefaultHashBuilder;
572
    ///
573
    /// let s = DefaultHashBuilder::default();
574
    /// let mut map = HashMap::with_capacity_and_hasher(10, s);
575
    /// map.insert(1, 2);
576
    /// ```
577
    #[cfg_attr(feature = "inline-more", inline)]
578
0
    pub fn with_capacity_and_hasher_in(capacity: usize, hash_builder: S, alloc: A) -> Self {
579
0
        Self {
580
0
            hash_builder,
581
0
            table: RawTable::with_capacity_in(capacity, alloc),
582
0
        }
583
0
    }
584
585
    /// Returns a reference to the map's [`BuildHasher`].
586
    ///
587
    /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html
588
    ///
589
    /// # Examples
590
    ///
591
    /// ```
592
    /// use hashbrown::HashMap;
593
    /// use hashbrown::DefaultHashBuilder;
594
    ///
595
    /// let hasher = DefaultHashBuilder::default();
596
    /// let map: HashMap<i32, i32> = HashMap::with_hasher(hasher);
597
    /// let hasher: &DefaultHashBuilder = map.hasher();
598
    /// ```
599
    #[cfg_attr(feature = "inline-more", inline)]
600
0
    pub fn hasher(&self) -> &S {
601
0
        &self.hash_builder
602
0
    }
603
604
    /// Returns the number of elements the map can hold without reallocating.
605
    ///
606
    /// This number is a lower bound; the `HashMap<K, V>` might be able to hold
607
    /// more, but is guaranteed to be able to hold at least this many.
608
    ///
609
    /// # Examples
610
    ///
611
    /// ```
612
    /// use hashbrown::HashMap;
613
    /// let map: HashMap<i32, i32> = HashMap::with_capacity(100);
614
    /// assert_eq!(map.len(), 0);
615
    /// assert!(map.capacity() >= 100);
616
    /// ```
617
    #[cfg_attr(feature = "inline-more", inline)]
618
0
    pub fn capacity(&self) -> usize {
619
0
        self.table.capacity()
620
0
    }
621
622
    /// An iterator visiting all keys in arbitrary order.
623
    /// The iterator element type is `&'a K`.
624
    ///
625
    /// # Examples
626
    ///
627
    /// ```
628
    /// use hashbrown::HashMap;
629
    ///
630
    /// let mut map = HashMap::new();
631
    /// map.insert("a", 1);
632
    /// map.insert("b", 2);
633
    /// map.insert("c", 3);
634
    /// assert_eq!(map.len(), 3);
635
    /// let mut vec: Vec<&str> = Vec::new();
636
    ///
637
    /// for key in map.keys() {
638
    ///     println!("{}", key);
639
    ///     vec.push(*key);
640
    /// }
641
    ///
642
    /// // The `Keys` iterator produces keys in arbitrary order, so the
643
    /// // keys must be sorted to test them against a sorted array.
644
    /// vec.sort_unstable();
645
    /// assert_eq!(vec, ["a", "b", "c"]);
646
    ///
647
    /// assert_eq!(map.len(), 3);
648
    /// ```
649
    #[cfg_attr(feature = "inline-more", inline)]
650
0
    pub fn keys(&self) -> Keys<'_, K, V> {
651
0
        Keys { inner: self.iter() }
652
0
    }
653
654
    /// An iterator visiting all values in arbitrary order.
655
    /// The iterator element type is `&'a V`.
656
    ///
657
    /// # Examples
658
    ///
659
    /// ```
660
    /// use hashbrown::HashMap;
661
    ///
662
    /// let mut map = HashMap::new();
663
    /// map.insert("a", 1);
664
    /// map.insert("b", 2);
665
    /// map.insert("c", 3);
666
    /// assert_eq!(map.len(), 3);
667
    /// let mut vec: Vec<i32> = Vec::new();
668
    ///
669
    /// for val in map.values() {
670
    ///     println!("{}", val);
671
    ///     vec.push(*val);
672
    /// }
673
    ///
674
    /// // The `Values` iterator produces values in arbitrary order, so the
675
    /// // values must be sorted to test them against a sorted array.
676
    /// vec.sort_unstable();
677
    /// assert_eq!(vec, [1, 2, 3]);
678
    ///
679
    /// assert_eq!(map.len(), 3);
680
    /// ```
681
    #[cfg_attr(feature = "inline-more", inline)]
682
0
    pub fn values(&self) -> Values<'_, K, V> {
683
0
        Values { inner: self.iter() }
684
0
    }
685
686
    /// An iterator visiting all values mutably in arbitrary order.
687
    /// The iterator element type is `&'a mut V`.
688
    ///
689
    /// # Examples
690
    ///
691
    /// ```
692
    /// use hashbrown::HashMap;
693
    ///
694
    /// let mut map = HashMap::new();
695
    ///
696
    /// map.insert("a", 1);
697
    /// map.insert("b", 2);
698
    /// map.insert("c", 3);
699
    ///
700
    /// for val in map.values_mut() {
701
    ///     *val = *val + 10;
702
    /// }
703
    ///
704
    /// assert_eq!(map.len(), 3);
705
    /// let mut vec: Vec<i32> = Vec::new();
706
    ///
707
    /// for val in map.values() {
708
    ///     println!("{}", val);
709
    ///     vec.push(*val);
710
    /// }
711
    ///
712
    /// // The `Values` iterator produces values in arbitrary order, so the
713
    /// // values must be sorted to test them against a sorted array.
714
    /// vec.sort_unstable();
715
    /// assert_eq!(vec, [11, 12, 13]);
716
    ///
717
    /// assert_eq!(map.len(), 3);
718
    /// ```
719
    #[cfg_attr(feature = "inline-more", inline)]
720
0
    pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
721
0
        ValuesMut {
722
0
            inner: self.iter_mut(),
723
0
        }
724
0
    }
725
726
    /// An iterator visiting all key-value pairs in arbitrary order.
727
    /// The iterator element type is `(&'a K, &'a V)`.
728
    ///
729
    /// # Examples
730
    ///
731
    /// ```
732
    /// use hashbrown::HashMap;
733
    ///
734
    /// let mut map = HashMap::new();
735
    /// map.insert("a", 1);
736
    /// map.insert("b", 2);
737
    /// map.insert("c", 3);
738
    /// assert_eq!(map.len(), 3);
739
    /// let mut vec: Vec<(&str, i32)> = Vec::new();
740
    ///
741
    /// for (key, val) in map.iter() {
742
    ///     println!("key: {} val: {}", key, val);
743
    ///     vec.push((*key, *val));
744
    /// }
745
    ///
746
    /// // The `Iter` iterator produces items in arbitrary order, so the
747
    /// // items must be sorted to test them against a sorted array.
748
    /// vec.sort_unstable();
749
    /// assert_eq!(vec, [("a", 1), ("b", 2), ("c", 3)]);
750
    ///
751
    /// assert_eq!(map.len(), 3);
752
    /// ```
753
    #[cfg_attr(feature = "inline-more", inline)]
754
0
    pub fn iter(&self) -> Iter<'_, K, V> {
755
        // Here we tie the lifetime of self to the iter.
756
        unsafe {
757
0
            Iter {
758
0
                inner: self.table.iter(),
759
0
                marker: PhantomData,
760
0
            }
761
        }
762
0
    }
763
764
    /// An iterator visiting all key-value pairs in arbitrary order,
765
    /// with mutable references to the values.
766
    /// The iterator element type is `(&'a K, &'a mut V)`.
767
    ///
768
    /// # Examples
769
    ///
770
    /// ```
771
    /// use hashbrown::HashMap;
772
    ///
773
    /// let mut map = HashMap::new();
774
    /// map.insert("a", 1);
775
    /// map.insert("b", 2);
776
    /// map.insert("c", 3);
777
    ///
778
    /// // Update all values
779
    /// for (_, val) in map.iter_mut() {
780
    ///     *val *= 2;
781
    /// }
782
    ///
783
    /// assert_eq!(map.len(), 3);
784
    /// let mut vec: Vec<(&str, i32)> = Vec::new();
785
    ///
786
    /// for (key, val) in &map {
787
    ///     println!("key: {} val: {}", key, val);
788
    ///     vec.push((*key, *val));
789
    /// }
790
    ///
791
    /// // The `Iter` iterator produces items in arbitrary order, so the
792
    /// // items must be sorted to test them against a sorted array.
793
    /// vec.sort_unstable();
794
    /// assert_eq!(vec, [("a", 2), ("b", 4), ("c", 6)]);
795
    ///
796
    /// assert_eq!(map.len(), 3);
797
    /// ```
798
    #[cfg_attr(feature = "inline-more", inline)]
799
0
    pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
800
        // Here we tie the lifetime of self to the iter.
801
        unsafe {
802
0
            IterMut {
803
0
                inner: self.table.iter(),
804
0
                marker: PhantomData,
805
0
            }
806
        }
807
0
    }
808
809
    #[cfg(test)]
810
    #[cfg_attr(feature = "inline-more", inline)]
811
    fn raw_capacity(&self) -> usize {
812
        self.table.buckets()
813
    }
814
815
    /// Returns the number of elements in the map.
816
    ///
817
    /// # Examples
818
    ///
819
    /// ```
820
    /// use hashbrown::HashMap;
821
    ///
822
    /// let mut a = HashMap::new();
823
    /// assert_eq!(a.len(), 0);
824
    /// a.insert(1, "a");
825
    /// assert_eq!(a.len(), 1);
826
    /// ```
827
    #[cfg_attr(feature = "inline-more", inline)]
828
0
    pub fn len(&self) -> usize {
829
0
        self.table.len()
830
0
    }
831
832
    /// Returns `true` if the map contains no elements.
833
    ///
834
    /// # Examples
835
    ///
836
    /// ```
837
    /// use hashbrown::HashMap;
838
    ///
839
    /// let mut a = HashMap::new();
840
    /// assert!(a.is_empty());
841
    /// a.insert(1, "a");
842
    /// assert!(!a.is_empty());
843
    /// ```
844
    #[cfg_attr(feature = "inline-more", inline)]
845
0
    pub fn is_empty(&self) -> bool {
846
0
        self.len() == 0
847
0
    }
848
849
    /// Clears the map, returning all key-value pairs as an iterator. Keeps the
850
    /// allocated memory for reuse.
851
    ///
852
    /// If the returned iterator is dropped before being fully consumed, it
853
    /// drops the remaining key-value pairs. The returned iterator keeps a
854
    /// mutable borrow on the vector to optimize its implementation.
855
    ///
856
    /// # Examples
857
    ///
858
    /// ```
859
    /// use hashbrown::HashMap;
860
    ///
861
    /// let mut a = HashMap::new();
862
    /// a.insert(1, "a");
863
    /// a.insert(2, "b");
864
    /// let capacity_before_drain = a.capacity();
865
    ///
866
    /// for (k, v) in a.drain().take(1) {
867
    ///     assert!(k == 1 || k == 2);
868
    ///     assert!(v == "a" || v == "b");
869
    /// }
870
    ///
871
    /// // As we can see, the map is empty and contains no element.
872
    /// assert!(a.is_empty() && a.len() == 0);
873
    /// // But map capacity is equal to old one.
874
    /// assert_eq!(a.capacity(), capacity_before_drain);
875
    ///
876
    /// let mut a = HashMap::new();
877
    /// a.insert(1, "a");
878
    /// a.insert(2, "b");
879
    ///
880
    /// {   // Iterator is dropped without being consumed.
881
    ///     let d = a.drain();
882
    /// }
883
    ///
884
    /// // But the map is empty even if we do not use Drain iterator.
885
    /// assert!(a.is_empty());
886
    /// ```
887
    #[cfg_attr(feature = "inline-more", inline)]
888
0
    pub fn drain(&mut self) -> Drain<'_, K, V, A> {
889
0
        Drain {
890
0
            inner: self.table.drain(),
891
0
        }
892
0
    }
893
894
    /// Retains only the elements specified by the predicate. Keeps the
895
    /// allocated memory for reuse.
896
    ///
897
    /// In other words, remove all pairs `(k, v)` such that `f(&k, &mut v)` returns `false`.
898
    /// The elements are visited in unsorted (and unspecified) order.
899
    ///
900
    /// # Examples
901
    ///
902
    /// ```
903
    /// use hashbrown::HashMap;
904
    ///
905
    /// let mut map: HashMap<i32, i32> = (0..8).map(|x|(x, x*10)).collect();
906
    /// assert_eq!(map.len(), 8);
907
    ///
908
    /// map.retain(|&k, _| k % 2 == 0);
909
    ///
910
    /// // We can see, that the number of elements inside map is changed.
911
    /// assert_eq!(map.len(), 4);
912
    ///
913
    /// let mut vec: Vec<(i32, i32)> = map.iter().map(|(&k, &v)| (k, v)).collect();
914
    /// vec.sort_unstable();
915
    /// assert_eq!(vec, [(0, 0), (2, 20), (4, 40), (6, 60)]);
916
    /// ```
917
0
    pub fn retain<F>(&mut self, mut f: F)
918
0
    where
919
0
        F: FnMut(&K, &mut V) -> bool,
920
    {
921
        // Here we only use `iter` as a temporary, preventing use-after-free
922
        unsafe {
923
0
            for item in self.table.iter() {
924
0
                let &mut (ref key, ref mut value) = item.as_mut();
925
0
                if !f(key, value) {
926
0
                    self.table.erase(item);
927
0
                }
928
            }
929
        }
930
0
    }
931
932
    /// Drains elements which are true under the given predicate,
933
    /// and returns an iterator over the removed items.
934
    ///
935
    /// In other words, move all pairs `(k, v)` such that `f(&k, &mut v)` returns `true` out
936
    /// into another iterator.
937
    ///
938
    /// Note that `extract_if` lets you mutate every value in the filter closure, regardless of
939
    /// whether you choose to keep or remove it.
940
    ///
941
    /// If the returned `ExtractIf` is not exhausted, e.g. because it is dropped without iterating
942
    /// or the iteration short-circuits, then the remaining elements will be retained.
943
    /// Use [`retain()`] with a negated predicate if you do not need the returned iterator.
944
    ///
945
    /// Keeps the allocated memory for reuse.
946
    ///
947
    /// [`retain()`]: HashMap::retain
948
    ///
949
    /// # Examples
950
    ///
951
    /// ```
952
    /// use hashbrown::HashMap;
953
    ///
954
    /// let mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();
955
    ///
956
    /// let drained: HashMap<i32, i32> = map.extract_if(|k, _v| k % 2 == 0).collect();
957
    ///
958
    /// let mut evens = drained.keys().cloned().collect::<Vec<_>>();
959
    /// let mut odds = map.keys().cloned().collect::<Vec<_>>();
960
    /// evens.sort();
961
    /// odds.sort();
962
    ///
963
    /// assert_eq!(evens, vec![0, 2, 4, 6]);
964
    /// assert_eq!(odds, vec![1, 3, 5, 7]);
965
    ///
966
    /// let mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x)).collect();
967
    ///
968
    /// {   // Iterator is dropped without being consumed.
969
    ///     let d = map.extract_if(|k, _v| k % 2 != 0);
970
    /// }
971
    ///
972
    /// // ExtractIf was not exhausted, therefore no elements were drained.
973
    /// assert_eq!(map.len(), 8);
974
    /// ```
975
    #[cfg_attr(feature = "inline-more", inline)]
976
0
    pub fn extract_if<F>(&mut self, f: F) -> ExtractIf<'_, K, V, F, A>
977
0
    where
978
0
        F: FnMut(&K, &mut V) -> bool,
979
    {
980
0
        ExtractIf {
981
0
            f,
982
0
            inner: RawExtractIf {
983
0
                iter: unsafe { self.table.iter() },
984
0
                table: &mut self.table,
985
0
            },
986
0
        }
987
0
    }
988
989
    /// Clears the map, removing all key-value pairs. Keeps the allocated memory
990
    /// for reuse.
991
    ///
992
    /// # Examples
993
    ///
994
    /// ```
995
    /// use hashbrown::HashMap;
996
    ///
997
    /// let mut a = HashMap::new();
998
    /// a.insert(1, "a");
999
    /// let capacity_before_clear = a.capacity();
1000
    ///
1001
    /// a.clear();
1002
    ///
1003
    /// // Map is empty.
1004
    /// assert!(a.is_empty());
1005
    /// // But map capacity is equal to old one.
1006
    /// assert_eq!(a.capacity(), capacity_before_clear);
1007
    /// ```
1008
    #[cfg_attr(feature = "inline-more", inline)]
1009
2
    pub fn clear(&mut self) {
1010
2
        self.table.clear();
1011
2
    }
<hashbrown::map::HashMap<u32, ()>>::clear
Line
Count
Source
1009
2
    pub fn clear(&mut self) {
1010
2
        self.table.clear();
1011
2
    }
Unexecuted instantiation: <hashbrown::map::HashMap<_, _, _, _>>::clear
1012
1013
    /// Creates a consuming iterator visiting all the keys in arbitrary order.
1014
    /// The map cannot be used after calling this.
1015
    /// The iterator element type is `K`.
1016
    ///
1017
    /// # Examples
1018
    ///
1019
    /// ```
1020
    /// use hashbrown::HashMap;
1021
    ///
1022
    /// let mut map = HashMap::new();
1023
    /// map.insert("a", 1);
1024
    /// map.insert("b", 2);
1025
    /// map.insert("c", 3);
1026
    ///
1027
    /// let mut vec: Vec<&str> = map.into_keys().collect();
1028
    ///
1029
    /// // The `IntoKeys` iterator produces keys in arbitrary order, so the
1030
    /// // keys must be sorted to test them against a sorted array.
1031
    /// vec.sort_unstable();
1032
    /// assert_eq!(vec, ["a", "b", "c"]);
1033
    /// ```
1034
    #[inline]
1035
0
    pub fn into_keys(self) -> IntoKeys<K, V, A> {
1036
0
        IntoKeys {
1037
0
            inner: self.into_iter(),
1038
0
        }
1039
0
    }
1040
1041
    /// Creates a consuming iterator visiting all the values in arbitrary order.
1042
    /// The map cannot be used after calling this.
1043
    /// The iterator element type is `V`.
1044
    ///
1045
    /// # Examples
1046
    ///
1047
    /// ```
1048
    /// use hashbrown::HashMap;
1049
    ///
1050
    /// let mut map = HashMap::new();
1051
    /// map.insert("a", 1);
1052
    /// map.insert("b", 2);
1053
    /// map.insert("c", 3);
1054
    ///
1055
    /// let mut vec: Vec<i32> = map.into_values().collect();
1056
    ///
1057
    /// // The `IntoValues` iterator produces values in arbitrary order, so
1058
    /// // the values must be sorted to test them against a sorted array.
1059
    /// vec.sort_unstable();
1060
    /// assert_eq!(vec, [1, 2, 3]);
1061
    /// ```
1062
    #[inline]
1063
0
    pub fn into_values(self) -> IntoValues<K, V, A> {
1064
0
        IntoValues {
1065
0
            inner: self.into_iter(),
1066
0
        }
1067
0
    }
1068
}
1069
1070
impl<K, V, S, A> HashMap<K, V, S, A>
1071
where
1072
    K: Eq + Hash,
1073
    S: BuildHasher,
1074
    A: Allocator,
1075
{
1076
    /// Reserves capacity for at least `additional` more elements to be inserted
1077
    /// in the `HashMap`. The collection may reserve more space to avoid
1078
    /// frequent reallocations.
1079
    ///
1080
    /// # Panics
1081
    ///
1082
    /// Panics if the new capacity exceeds [`isize::MAX`] bytes and [`abort`] the program
1083
    /// in case of allocation error. Use [`try_reserve`](HashMap::try_reserve) instead
1084
    /// if you want to handle memory allocation failure.
1085
    ///
1086
    /// [`isize::MAX`]: https://doc.rust-lang.org/std/primitive.isize.html
1087
    /// [`abort`]: https://doc.rust-lang.org/alloc/alloc/fn.handle_alloc_error.html
1088
    ///
1089
    /// # Examples
1090
    ///
1091
    /// ```
1092
    /// use hashbrown::HashMap;
1093
    /// let mut map: HashMap<&str, i32> = HashMap::new();
1094
    /// // Map is empty and doesn't allocate memory
1095
    /// assert_eq!(map.capacity(), 0);
1096
    ///
1097
    /// map.reserve(10);
1098
    ///
1099
    /// // And now map can hold at least 10 elements
1100
    /// assert!(map.capacity() >= 10);
1101
    /// ```
1102
    #[cfg_attr(feature = "inline-more", inline)]
1103
0
    pub fn reserve(&mut self, additional: usize) {
1104
0
        self.table
1105
0
            .reserve(additional, make_hasher::<_, V, S>(&self.hash_builder));
1106
0
    }
1107
1108
    /// Tries to reserve capacity for at least `additional` more elements to be inserted
1109
    /// in the given `HashMap<K,V>`. The collection may reserve more space to avoid
1110
    /// frequent reallocations.
1111
    ///
1112
    /// # Errors
1113
    ///
1114
    /// If the capacity overflows, or the allocator reports a failure, then an error
1115
    /// is returned.
1116
    ///
1117
    /// # Examples
1118
    ///
1119
    /// ```
1120
    /// use hashbrown::HashMap;
1121
    ///
1122
    /// let mut map: HashMap<&str, isize> = HashMap::new();
1123
    /// // Map is empty and doesn't allocate memory
1124
    /// assert_eq!(map.capacity(), 0);
1125
    ///
1126
    /// map.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?");
1127
    ///
1128
    /// // And now map can hold at least 10 elements
1129
    /// assert!(map.capacity() >= 10);
1130
    /// ```
1131
    /// If the capacity overflows, or the allocator reports a failure, then an error
1132
    /// is returned:
1133
    /// ```
1134
    /// # fn test() {
1135
    /// use hashbrown::HashMap;
1136
    /// use hashbrown::TryReserveError;
1137
    /// let mut map: HashMap<i32, i32> = HashMap::new();
1138
    ///
1139
    /// match map.try_reserve(usize::MAX) {
1140
    ///     Err(error) => match error {
1141
    ///         TryReserveError::CapacityOverflow => {}
1142
    ///         _ => panic!("TryReserveError::AllocError ?"),
1143
    ///     },
1144
    ///     _ => panic!(),
1145
    /// }
1146
    /// # }
1147
    /// # fn main() {
1148
    /// #     #[cfg(not(miri))]
1149
    /// #     test()
1150
    /// # }
1151
    /// ```
1152
    #[cfg_attr(feature = "inline-more", inline)]
1153
0
    pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> {
1154
0
        self.table
1155
0
            .try_reserve(additional, make_hasher::<_, V, S>(&self.hash_builder))
1156
0
    }
1157
1158
    /// Shrinks the capacity of the map as much as possible. It will drop
1159
    /// down as much as possible while maintaining the internal rules
1160
    /// and possibly leaving some space in accordance with the resize policy.
1161
    ///
1162
    /// # Examples
1163
    ///
1164
    /// ```
1165
    /// use hashbrown::HashMap;
1166
    ///
1167
    /// let mut map: HashMap<i32, i32> = HashMap::with_capacity(100);
1168
    /// map.insert(1, 2);
1169
    /// map.insert(3, 4);
1170
    /// assert!(map.capacity() >= 100);
1171
    /// map.shrink_to_fit();
1172
    /// assert!(map.capacity() >= 2);
1173
    /// ```
1174
    #[cfg_attr(feature = "inline-more", inline)]
1175
0
    pub fn shrink_to_fit(&mut self) {
1176
0
        self.table
1177
0
            .shrink_to(0, make_hasher::<_, V, S>(&self.hash_builder));
1178
0
    }
1179
1180
    /// Shrinks the capacity of the map with a lower limit. It will drop
1181
    /// down no lower than the supplied limit while maintaining the internal rules
1182
    /// and possibly leaving some space in accordance with the resize policy.
1183
    ///
1184
    /// This function does nothing if the current capacity is smaller than the
1185
    /// supplied minimum capacity.
1186
    ///
1187
    /// # Examples
1188
    ///
1189
    /// ```
1190
    /// use hashbrown::HashMap;
1191
    ///
1192
    /// let mut map: HashMap<i32, i32> = HashMap::with_capacity(100);
1193
    /// map.insert(1, 2);
1194
    /// map.insert(3, 4);
1195
    /// assert!(map.capacity() >= 100);
1196
    /// map.shrink_to(10);
1197
    /// assert!(map.capacity() >= 10);
1198
    /// map.shrink_to(0);
1199
    /// assert!(map.capacity() >= 2);
1200
    /// map.shrink_to(10);
1201
    /// assert!(map.capacity() >= 2);
1202
    /// ```
1203
    #[cfg_attr(feature = "inline-more", inline)]
1204
0
    pub fn shrink_to(&mut self, min_capacity: usize) {
1205
0
        self.table
1206
0
            .shrink_to(min_capacity, make_hasher::<_, V, S>(&self.hash_builder));
1207
0
    }
1208
1209
    /// Gets the given key's corresponding entry in the map for in-place manipulation.
1210
    ///
1211
    /// # Examples
1212
    ///
1213
    /// ```
1214
    /// use hashbrown::HashMap;
1215
    ///
1216
    /// let mut letters = HashMap::new();
1217
    ///
1218
    /// for ch in "a short treatise on fungi".chars() {
1219
    ///     let counter = letters.entry(ch).or_insert(0);
1220
    ///     *counter += 1;
1221
    /// }
1222
    ///
1223
    /// assert_eq!(letters[&'s'], 2);
1224
    /// assert_eq!(letters[&'t'], 3);
1225
    /// assert_eq!(letters[&'u'], 1);
1226
    /// assert_eq!(letters.get(&'y'), None);
1227
    /// ```
1228
    #[cfg_attr(feature = "inline-more", inline)]
1229
0
    pub fn entry(&mut self, key: K) -> Entry<'_, K, V, S, A> {
1230
0
        let hash = make_hash::<K, S>(&self.hash_builder, &key);
1231
0
        if let Some(elem) = self.table.find(hash, equivalent_key(&key)) {
1232
0
            Entry::Occupied(OccupiedEntry {
1233
0
                hash,
1234
0
                elem,
1235
0
                table: self,
1236
0
            })
1237
        } else {
1238
0
            Entry::Vacant(VacantEntry {
1239
0
                hash,
1240
0
                key,
1241
0
                table: self,
1242
0
            })
1243
        }
1244
0
    }
1245
1246
    /// Gets the given key's corresponding entry by reference in the map for in-place manipulation.
1247
    ///
1248
    /// # Examples
1249
    ///
1250
    /// ```
1251
    /// use hashbrown::HashMap;
1252
    ///
1253
    /// let mut words: HashMap<String, usize> = HashMap::new();
1254
    /// let source = ["poneyland", "horseyland", "poneyland", "poneyland"];
1255
    /// for (i, &s) in source.iter().enumerate() {
1256
    ///     let counter = words.entry_ref(s).or_insert(0);
1257
    ///     *counter += 1;
1258
    /// }
1259
    ///
1260
    /// assert_eq!(words["poneyland"], 3);
1261
    /// assert_eq!(words["horseyland"], 1);
1262
    /// ```
1263
    #[cfg_attr(feature = "inline-more", inline)]
1264
0
    pub fn entry_ref<'a, 'b, Q>(&'a mut self, key: &'b Q) -> EntryRef<'a, 'b, K, Q, V, S, A>
1265
0
    where
1266
0
        Q: Hash + Equivalent<K> + ?Sized,
1267
    {
1268
0
        let hash = make_hash::<Q, S>(&self.hash_builder, key);
1269
0
        if let Some(elem) = self.table.find(hash, equivalent_key(key)) {
1270
0
            EntryRef::Occupied(OccupiedEntry {
1271
0
                hash,
1272
0
                elem,
1273
0
                table: self,
1274
0
            })
1275
        } else {
1276
0
            EntryRef::Vacant(VacantEntryRef {
1277
0
                hash,
1278
0
                key,
1279
0
                table: self,
1280
0
            })
1281
        }
1282
0
    }
1283
1284
    /// Returns a reference to the value corresponding to the key.
1285
    ///
1286
    /// The key may be any borrowed form of the map's key type, but
1287
    /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
1288
    /// the key type.
1289
    ///
1290
    /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
1291
    /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
1292
    ///
1293
    /// # Examples
1294
    ///
1295
    /// ```
1296
    /// use hashbrown::HashMap;
1297
    ///
1298
    /// let mut map = HashMap::new();
1299
    /// map.insert(1, "a");
1300
    /// assert_eq!(map.get(&1), Some(&"a"));
1301
    /// assert_eq!(map.get(&2), None);
1302
    /// ```
1303
    #[inline]
1304
0
    pub fn get<Q>(&self, k: &Q) -> Option<&V>
1305
0
    where
1306
0
        Q: Hash + Equivalent<K> + ?Sized,
1307
    {
1308
        // Avoid `Option::map` because it bloats LLVM IR.
1309
0
        match self.get_inner(k) {
1310
0
            Some((_, v)) => Some(v),
1311
0
            None => None,
1312
        }
1313
0
    }
1314
1315
    /// Returns the key-value pair corresponding to the supplied key.
1316
    ///
1317
    /// The supplied key may be any borrowed form of the map's key type, but
1318
    /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
1319
    /// the key type.
1320
    ///
1321
    /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
1322
    /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
1323
    ///
1324
    /// # Examples
1325
    ///
1326
    /// ```
1327
    /// use hashbrown::HashMap;
1328
    ///
1329
    /// let mut map = HashMap::new();
1330
    /// map.insert(1, "a");
1331
    /// assert_eq!(map.get_key_value(&1), Some((&1, &"a")));
1332
    /// assert_eq!(map.get_key_value(&2), None);
1333
    /// ```
1334
    #[inline]
1335
0
    pub fn get_key_value<Q>(&self, k: &Q) -> Option<(&K, &V)>
1336
0
    where
1337
0
        Q: Hash + Equivalent<K> + ?Sized,
1338
    {
1339
        // Avoid `Option::map` because it bloats LLVM IR.
1340
0
        match self.get_inner(k) {
1341
0
            Some((key, value)) => Some((key, value)),
1342
0
            None => None,
1343
        }
1344
0
    }
1345
1346
    #[inline]
1347
0
    fn get_inner<Q>(&self, k: &Q) -> Option<&(K, V)>
1348
0
    where
1349
0
        Q: Hash + Equivalent<K> + ?Sized,
1350
    {
1351
0
        if self.table.is_empty() {
1352
0
            None
1353
        } else {
1354
0
            let hash = make_hash::<Q, S>(&self.hash_builder, k);
1355
0
            self.table.get(hash, equivalent_key(k))
1356
        }
1357
0
    }
Unexecuted instantiation: <hashbrown::map::HashMap<u32, ()>>::get_inner::<u32>
Unexecuted instantiation: <hashbrown::map::HashMap<_, _, _, _>>::get_inner::<_>
1358
1359
    /// Returns the key-value pair corresponding to the supplied key, with a mutable reference to value.
1360
    ///
1361
    /// The supplied key may be any borrowed form of the map's key type, but
1362
    /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
1363
    /// the key type.
1364
    ///
1365
    /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
1366
    /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
1367
    ///
1368
    /// # Examples
1369
    ///
1370
    /// ```
1371
    /// use hashbrown::HashMap;
1372
    ///
1373
    /// let mut map = HashMap::new();
1374
    /// map.insert(1, "a");
1375
    /// let (k, v) = map.get_key_value_mut(&1).unwrap();
1376
    /// assert_eq!(k, &1);
1377
    /// assert_eq!(v, &mut "a");
1378
    /// *v = "b";
1379
    /// assert_eq!(map.get_key_value_mut(&1), Some((&1, &mut "b")));
1380
    /// assert_eq!(map.get_key_value_mut(&2), None);
1381
    /// ```
1382
    #[inline]
1383
0
    pub fn get_key_value_mut<Q>(&mut self, k: &Q) -> Option<(&K, &mut V)>
1384
0
    where
1385
0
        Q: Hash + Equivalent<K> + ?Sized,
1386
    {
1387
        // Avoid `Option::map` because it bloats LLVM IR.
1388
0
        match self.get_inner_mut(k) {
1389
0
            Some(&mut (ref key, ref mut value)) => Some((key, value)),
1390
0
            None => None,
1391
        }
1392
0
    }
1393
1394
    /// Returns `true` if the map contains a value for the specified key.
1395
    ///
1396
    /// The key may be any borrowed form of the map's key type, but
1397
    /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
1398
    /// the key type.
1399
    ///
1400
    /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
1401
    /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
1402
    ///
1403
    /// # Examples
1404
    ///
1405
    /// ```
1406
    /// use hashbrown::HashMap;
1407
    ///
1408
    /// let mut map = HashMap::new();
1409
    /// map.insert(1, "a");
1410
    /// assert_eq!(map.contains_key(&1), true);
1411
    /// assert_eq!(map.contains_key(&2), false);
1412
    /// ```
1413
    #[cfg_attr(feature = "inline-more", inline)]
1414
0
    pub fn contains_key<Q>(&self, k: &Q) -> bool
1415
0
    where
1416
0
        Q: Hash + Equivalent<K> + ?Sized,
1417
    {
1418
0
        self.get_inner(k).is_some()
1419
0
    }
Unexecuted instantiation: <hashbrown::map::HashMap<u32, ()>>::contains_key::<u32>
Unexecuted instantiation: <hashbrown::map::HashMap<_, _, _, _>>::contains_key::<_>
1420
1421
    /// Returns a mutable reference to the value corresponding to the key.
1422
    ///
1423
    /// The key may be any borrowed form of the map's key type, but
1424
    /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
1425
    /// the key type.
1426
    ///
1427
    /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
1428
    /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
1429
    ///
1430
    /// # Examples
1431
    ///
1432
    /// ```
1433
    /// use hashbrown::HashMap;
1434
    ///
1435
    /// let mut map = HashMap::new();
1436
    /// map.insert(1, "a");
1437
    /// if let Some(x) = map.get_mut(&1) {
1438
    ///     *x = "b";
1439
    /// }
1440
    /// assert_eq!(map[&1], "b");
1441
    ///
1442
    /// assert_eq!(map.get_mut(&2), None);
1443
    /// ```
1444
    #[cfg_attr(feature = "inline-more", inline)]
1445
0
    pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
1446
0
    where
1447
0
        Q: Hash + Equivalent<K> + ?Sized,
1448
    {
1449
        // Avoid `Option::map` because it bloats LLVM IR.
1450
0
        match self.get_inner_mut(k) {
1451
0
            Some(&mut (_, ref mut v)) => Some(v),
1452
0
            None => None,
1453
        }
1454
0
    }
1455
1456
    #[inline]
1457
0
    fn get_inner_mut<Q>(&mut self, k: &Q) -> Option<&mut (K, V)>
1458
0
    where
1459
0
        Q: Hash + Equivalent<K> + ?Sized,
1460
    {
1461
0
        if self.table.is_empty() {
1462
0
            None
1463
        } else {
1464
0
            let hash = make_hash::<Q, S>(&self.hash_builder, k);
1465
0
            self.table.get_mut(hash, equivalent_key(k))
1466
        }
1467
0
    }
1468
1469
    /// Attempts to get mutable references to `N` values in the map at once.
1470
    ///
1471
    /// Returns an array of length `N` with the results of each query. For soundness, at most one
1472
    /// mutable reference will be returned to any value. `None` will be used if the key is missing.
1473
    ///
1474
    /// # Panics
1475
    ///
1476
    /// Panics if any keys are overlapping.
1477
    ///
1478
    /// # Examples
1479
    ///
1480
    /// ```
1481
    /// use hashbrown::HashMap;
1482
    ///
1483
    /// let mut libraries = HashMap::new();
1484
    /// libraries.insert("Bodleian Library".to_string(), 1602);
1485
    /// libraries.insert("Athenæum".to_string(), 1807);
1486
    /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
1487
    /// libraries.insert("Library of Congress".to_string(), 1800);
1488
    ///
1489
    /// // Get Athenæum and Bodleian Library
1490
    /// let [Some(a), Some(b)] = libraries.get_many_mut([
1491
    ///     "Athenæum",
1492
    ///     "Bodleian Library",
1493
    /// ]) else { panic!() };
1494
    ///
1495
    /// // Assert values of Athenæum and Library of Congress
1496
    /// let got = libraries.get_many_mut([
1497
    ///     "Athenæum",
1498
    ///     "Library of Congress",
1499
    /// ]);
1500
    /// assert_eq!(
1501
    ///     got,
1502
    ///     [
1503
    ///         Some(&mut 1807),
1504
    ///         Some(&mut 1800),
1505
    ///     ],
1506
    /// );
1507
    ///
1508
    /// // Missing keys result in None
1509
    /// let got = libraries.get_many_mut([
1510
    ///     "Athenæum",
1511
    ///     "New York Public Library",
1512
    /// ]);
1513
    /// assert_eq!(
1514
    ///     got,
1515
    ///     [
1516
    ///         Some(&mut 1807),
1517
    ///         None
1518
    ///     ]
1519
    /// );
1520
    /// ```
1521
    ///
1522
    /// ```should_panic
1523
    /// use hashbrown::HashMap;
1524
    ///
1525
    /// let mut libraries = HashMap::new();
1526
    /// libraries.insert("Athenæum".to_string(), 1807);
1527
    ///
1528
    /// // Duplicate keys panic!
1529
    /// let got = libraries.get_many_mut([
1530
    ///     "Athenæum",
1531
    ///     "Athenæum",
1532
    /// ]);
1533
    /// ```
1534
0
    pub fn get_many_mut<Q, const N: usize>(&mut self, ks: [&Q; N]) -> [Option<&'_ mut V>; N]
1535
0
    where
1536
0
        Q: Hash + Equivalent<K> + ?Sized,
1537
    {
1538
0
        self.get_many_mut_inner(ks).map(|res| res.map(|(_, v)| v))
1539
0
    }
1540
1541
    /// Attempts to get mutable references to `N` values in the map at once, without validating that
1542
    /// the values are unique.
1543
    ///
1544
    /// Returns an array of length `N` with the results of each query. `None` will be used if
1545
    /// the key is missing.
1546
    ///
1547
    /// For a safe alternative see [`get_many_mut`](`HashMap::get_many_mut`).
1548
    ///
1549
    /// # Safety
1550
    ///
1551
    /// Calling this method with overlapping keys is *[undefined behavior]* even if the resulting
1552
    /// references are not used.
1553
    ///
1554
    /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1555
    ///
1556
    /// # Examples
1557
    ///
1558
    /// ```
1559
    /// use hashbrown::HashMap;
1560
    ///
1561
    /// let mut libraries = HashMap::new();
1562
    /// libraries.insert("Bodleian Library".to_string(), 1602);
1563
    /// libraries.insert("Athenæum".to_string(), 1807);
1564
    /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
1565
    /// libraries.insert("Library of Congress".to_string(), 1800);
1566
    ///
1567
    /// // SAFETY: The keys do not overlap.
1568
    /// let [Some(a), Some(b)] = (unsafe { libraries.get_many_unchecked_mut([
1569
    ///     "Athenæum",
1570
    ///     "Bodleian Library",
1571
    /// ]) }) else { panic!() };
1572
    ///
1573
    /// // SAFETY: The keys do not overlap.
1574
    /// let got = unsafe { libraries.get_many_unchecked_mut([
1575
    ///     "Athenæum",
1576
    ///     "Library of Congress",
1577
    /// ]) };
1578
    /// assert_eq!(
1579
    ///     got,
1580
    ///     [
1581
    ///         Some(&mut 1807),
1582
    ///         Some(&mut 1800),
1583
    ///     ],
1584
    /// );
1585
    ///
1586
    /// // SAFETY: The keys do not overlap.
1587
    /// let got = unsafe { libraries.get_many_unchecked_mut([
1588
    ///     "Athenæum",
1589
    ///     "New York Public Library",
1590
    /// ]) };
1591
    /// // Missing keys result in None
1592
    /// assert_eq!(got, [Some(&mut 1807), None]);
1593
    /// ```
1594
0
    pub unsafe fn get_many_unchecked_mut<Q, const N: usize>(
1595
0
        &mut self,
1596
0
        ks: [&Q; N],
1597
0
    ) -> [Option<&'_ mut V>; N]
1598
0
    where
1599
0
        Q: Hash + Equivalent<K> + ?Sized,
1600
    {
1601
0
        self.get_many_unchecked_mut_inner(ks)
1602
0
            .map(|res| res.map(|(_, v)| v))
1603
0
    }
1604
1605
    /// Attempts to get mutable references to `N` values in the map at once, with immutable
1606
    /// references to the corresponding keys.
1607
    ///
1608
    /// Returns an array of length `N` with the results of each query. For soundness, at most one
1609
    /// mutable reference will be returned to any value. `None` will be used if the key is missing.
1610
    ///
1611
    /// # Panics
1612
    ///
1613
    /// Panics if any keys are overlapping.
1614
    ///
1615
    /// # Examples
1616
    ///
1617
    /// ```
1618
    /// use hashbrown::HashMap;
1619
    ///
1620
    /// let mut libraries = HashMap::new();
1621
    /// libraries.insert("Bodleian Library".to_string(), 1602);
1622
    /// libraries.insert("Athenæum".to_string(), 1807);
1623
    /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
1624
    /// libraries.insert("Library of Congress".to_string(), 1800);
1625
    ///
1626
    /// let got = libraries.get_many_key_value_mut([
1627
    ///     "Bodleian Library",
1628
    ///     "Herzogin-Anna-Amalia-Bibliothek",
1629
    /// ]);
1630
    /// assert_eq!(
1631
    ///     got,
1632
    ///     [
1633
    ///         Some((&"Bodleian Library".to_string(), &mut 1602)),
1634
    ///         Some((&"Herzogin-Anna-Amalia-Bibliothek".to_string(), &mut 1691)),
1635
    ///     ],
1636
    /// );
1637
    /// // Missing keys result in None
1638
    /// let got = libraries.get_many_key_value_mut([
1639
    ///     "Bodleian Library",
1640
    ///     "Gewandhaus",
1641
    /// ]);
1642
    /// assert_eq!(got, [Some((&"Bodleian Library".to_string(), &mut 1602)), None]);
1643
    /// ```
1644
    ///
1645
    /// ```should_panic
1646
    /// use hashbrown::HashMap;
1647
    ///
1648
    /// let mut libraries = HashMap::new();
1649
    /// libraries.insert("Bodleian Library".to_string(), 1602);
1650
    /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
1651
    ///
1652
    /// // Duplicate keys result in panic!
1653
    /// let got = libraries.get_many_key_value_mut([
1654
    ///     "Bodleian Library",
1655
    ///     "Herzogin-Anna-Amalia-Bibliothek",
1656
    ///     "Herzogin-Anna-Amalia-Bibliothek",
1657
    /// ]);
1658
    /// ```
1659
0
    pub fn get_many_key_value_mut<Q, const N: usize>(
1660
0
        &mut self,
1661
0
        ks: [&Q; N],
1662
0
    ) -> [Option<(&'_ K, &'_ mut V)>; N]
1663
0
    where
1664
0
        Q: Hash + Equivalent<K> + ?Sized,
1665
    {
1666
0
        self.get_many_mut_inner(ks)
1667
0
            .map(|res| res.map(|(k, v)| (&*k, v)))
1668
0
    }
1669
1670
    /// Attempts to get mutable references to `N` values in the map at once, with immutable
1671
    /// references to the corresponding keys, without validating that the values are unique.
1672
    ///
1673
    /// Returns an array of length `N` with the results of each query. `None` will be returned if
1674
    /// any of the keys are missing.
1675
    ///
1676
    /// For a safe alternative see [`get_many_key_value_mut`](`HashMap::get_many_key_value_mut`).
1677
    ///
1678
    /// # Safety
1679
    ///
1680
    /// Calling this method with overlapping keys is *[undefined behavior]* even if the resulting
1681
    /// references are not used.
1682
    ///
1683
    /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html
1684
    ///
1685
    /// # Examples
1686
    ///
1687
    /// ```
1688
    /// use hashbrown::HashMap;
1689
    ///
1690
    /// let mut libraries = HashMap::new();
1691
    /// libraries.insert("Bodleian Library".to_string(), 1602);
1692
    /// libraries.insert("Athenæum".to_string(), 1807);
1693
    /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691);
1694
    /// libraries.insert("Library of Congress".to_string(), 1800);
1695
    ///
1696
    /// let got = libraries.get_many_key_value_mut([
1697
    ///     "Bodleian Library",
1698
    ///     "Herzogin-Anna-Amalia-Bibliothek",
1699
    /// ]);
1700
    /// assert_eq!(
1701
    ///     got,
1702
    ///     [
1703
    ///         Some((&"Bodleian Library".to_string(), &mut 1602)),
1704
    ///         Some((&"Herzogin-Anna-Amalia-Bibliothek".to_string(), &mut 1691)),
1705
    ///     ],
1706
    /// );
1707
    /// // Missing keys result in None
1708
    /// let got = libraries.get_many_key_value_mut([
1709
    ///     "Bodleian Library",
1710
    ///     "Gewandhaus",
1711
    /// ]);
1712
    /// assert_eq!(
1713
    ///     got,
1714
    ///     [
1715
    ///         Some((&"Bodleian Library".to_string(), &mut 1602)),
1716
    ///         None,
1717
    ///     ],
1718
    /// );
1719
    /// ```
1720
0
    pub unsafe fn get_many_key_value_unchecked_mut<Q, const N: usize>(
1721
0
        &mut self,
1722
0
        ks: [&Q; N],
1723
0
    ) -> [Option<(&'_ K, &'_ mut V)>; N]
1724
0
    where
1725
0
        Q: Hash + Equivalent<K> + ?Sized,
1726
    {
1727
0
        self.get_many_unchecked_mut_inner(ks)
1728
0
            .map(|res| res.map(|(k, v)| (&*k, v)))
1729
0
    }
1730
1731
0
    fn get_many_mut_inner<Q, const N: usize>(&mut self, ks: [&Q; N]) -> [Option<&'_ mut (K, V)>; N]
1732
0
    where
1733
0
        Q: Hash + Equivalent<K> + ?Sized,
1734
    {
1735
0
        let hashes = self.build_hashes_inner(ks);
1736
0
        self.table
1737
0
            .get_many_mut(hashes, |i, (k, _)| ks[i].equivalent(k))
1738
0
    }
1739
1740
0
    unsafe fn get_many_unchecked_mut_inner<Q, const N: usize>(
1741
0
        &mut self,
1742
0
        ks: [&Q; N],
1743
0
    ) -> [Option<&'_ mut (K, V)>; N]
1744
0
    where
1745
0
        Q: Hash + Equivalent<K> + ?Sized,
1746
    {
1747
0
        let hashes = self.build_hashes_inner(ks);
1748
0
        self.table
1749
0
            .get_many_unchecked_mut(hashes, |i, (k, _)| ks[i].equivalent(k))
1750
0
    }
1751
1752
0
    fn build_hashes_inner<Q, const N: usize>(&self, ks: [&Q; N]) -> [u64; N]
1753
0
    where
1754
0
        Q: Hash + Equivalent<K> + ?Sized,
1755
    {
1756
0
        let mut hashes = [0_u64; N];
1757
0
        for i in 0..N {
1758
0
            hashes[i] = make_hash::<Q, S>(&self.hash_builder, ks[i]);
1759
0
        }
1760
0
        hashes
1761
0
    }
1762
1763
    /// Inserts a key-value pair into the map.
1764
    ///
1765
    /// If the map did not have this key present, [`None`] is returned.
1766
    ///
1767
    /// If the map did have this key present, the value is updated, and the old
1768
    /// value is returned. The key is not updated, though; this matters for
1769
    /// types that can be `==` without being identical. See the [`std::collections`]
1770
    /// [module-level documentation] for more.
1771
    ///
1772
    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
1773
    /// [`std::collections`]: https://doc.rust-lang.org/std/collections/index.html
1774
    /// [module-level documentation]: https://doc.rust-lang.org/std/collections/index.html#insert-and-complex-keys
1775
    ///
1776
    /// # Examples
1777
    ///
1778
    /// ```
1779
    /// use hashbrown::HashMap;
1780
    ///
1781
    /// let mut map = HashMap::new();
1782
    /// assert_eq!(map.insert(37, "a"), None);
1783
    /// assert_eq!(map.is_empty(), false);
1784
    ///
1785
    /// map.insert(37, "b");
1786
    /// assert_eq!(map.insert(37, "c"), Some("b"));
1787
    /// assert_eq!(map[&37], "c");
1788
    /// ```
1789
    #[cfg_attr(feature = "inline-more", inline)]
1790
0
    pub fn insert(&mut self, k: K, v: V) -> Option<V> {
1791
0
        let hash = make_hash::<K, S>(&self.hash_builder, &k);
1792
0
        match self.find_or_find_insert_slot(hash, &k) {
1793
0
            Ok(bucket) => Some(mem::replace(unsafe { &mut bucket.as_mut().1 }, v)),
1794
0
            Err(slot) => {
1795
0
                unsafe {
1796
0
                    self.table.insert_in_slot(hash, slot, (k, v));
1797
0
                }
1798
0
                None
1799
            }
1800
        }
1801
0
    }
Unexecuted instantiation: <hashbrown::map::HashMap<u32, ()>>::insert
Unexecuted instantiation: <hashbrown::map::HashMap<_, _, _, _>>::insert
1802
1803
    #[cfg_attr(feature = "inline-more", inline)]
1804
0
    pub(crate) fn find_or_find_insert_slot<Q>(
1805
0
        &mut self,
1806
0
        hash: u64,
1807
0
        key: &Q,
1808
0
    ) -> Result<Bucket<(K, V)>, crate::raw::InsertSlot>
1809
0
    where
1810
0
        Q: Equivalent<K> + ?Sized,
1811
    {
1812
0
        self.table.find_or_find_insert_slot(
1813
0
            hash,
1814
0
            equivalent_key(key),
1815
0
            make_hasher(&self.hash_builder),
1816
        )
1817
0
    }
Unexecuted instantiation: <hashbrown::map::HashMap<u32, ()>>::find_or_find_insert_slot::<u32>
Unexecuted instantiation: <hashbrown::map::HashMap<_, _, _, _>>::find_or_find_insert_slot::<_>
1818
1819
    /// Insert a key-value pair into the map without checking
1820
    /// if the key already exists in the map.
1821
    ///
1822
    /// This operation is faster than regular insert, because it does not perform
1823
    /// lookup before insertion.
1824
    ///
1825
    /// This operation is useful during initial population of the map.
1826
    /// For example, when constructing a map from another map, we know
1827
    /// that keys are unique.
1828
    ///
1829
    /// Returns a reference to the key and value just inserted.
1830
    ///
1831
    /// # Safety
1832
    ///
1833
    /// This operation is safe if a key does not exist in the map.
1834
    ///
1835
    /// However, if a key exists in the map already, the behavior is unspecified:
1836
    /// this operation may panic, loop forever, or any following operation with the map
1837
    /// may panic, loop forever or return arbitrary result.
1838
    ///
1839
    /// That said, this operation (and following operations) are guaranteed to
1840
    /// not violate memory safety.
1841
    ///
1842
    /// However this operation is still unsafe because the resulting `HashMap`
1843
    /// may be passed to unsafe code which does expect the map to behave
1844
    /// correctly, and would cause unsoundness as a result.
1845
    ///
1846
    /// # Examples
1847
    ///
1848
    /// ```
1849
    /// use hashbrown::HashMap;
1850
    ///
1851
    /// let mut map1 = HashMap::new();
1852
    /// assert_eq!(map1.insert(1, "a"), None);
1853
    /// assert_eq!(map1.insert(2, "b"), None);
1854
    /// assert_eq!(map1.insert(3, "c"), None);
1855
    /// assert_eq!(map1.len(), 3);
1856
    ///
1857
    /// let mut map2 = HashMap::new();
1858
    ///
1859
    /// for (key, value) in map1.into_iter() {
1860
    ///     unsafe {
1861
    ///         map2.insert_unique_unchecked(key, value);
1862
    ///     }
1863
    /// }
1864
    ///
1865
    /// let (key, value) = unsafe { map2.insert_unique_unchecked(4, "d") };
1866
    /// assert_eq!(key, &4);
1867
    /// assert_eq!(value, &mut "d");
1868
    /// *value = "e";
1869
    ///
1870
    /// assert_eq!(map2[&1], "a");
1871
    /// assert_eq!(map2[&2], "b");
1872
    /// assert_eq!(map2[&3], "c");
1873
    /// assert_eq!(map2[&4], "e");
1874
    /// assert_eq!(map2.len(), 4);
1875
    /// ```
1876
    #[cfg_attr(feature = "inline-more", inline)]
1877
0
    pub unsafe fn insert_unique_unchecked(&mut self, k: K, v: V) -> (&K, &mut V) {
1878
0
        let hash = make_hash::<K, S>(&self.hash_builder, &k);
1879
0
        let bucket = self
1880
0
            .table
1881
0
            .insert(hash, (k, v), make_hasher::<_, V, S>(&self.hash_builder));
1882
0
        let (k_ref, v_ref) = unsafe { bucket.as_mut() };
1883
0
        (k_ref, v_ref)
1884
0
    }
1885
1886
    /// Tries to insert a key-value pair into the map, and returns
1887
    /// a mutable reference to the value in the entry.
1888
    ///
1889
    /// # Errors
1890
    ///
1891
    /// If the map already had this key present, nothing is updated, and
1892
    /// an error containing the occupied entry and the value is returned.
1893
    ///
1894
    /// # Examples
1895
    ///
1896
    /// Basic usage:
1897
    ///
1898
    /// ```
1899
    /// use hashbrown::HashMap;
1900
    /// use hashbrown::hash_map::OccupiedError;
1901
    ///
1902
    /// let mut map = HashMap::new();
1903
    /// assert_eq!(map.try_insert(37, "a").unwrap(), &"a");
1904
    ///
1905
    /// match map.try_insert(37, "b") {
1906
    ///     Err(OccupiedError { entry, value }) => {
1907
    ///         assert_eq!(entry.key(), &37);
1908
    ///         assert_eq!(entry.get(), &"a");
1909
    ///         assert_eq!(value, "b");
1910
    ///     }
1911
    ///     _ => panic!()
1912
    /// }
1913
    /// ```
1914
    #[cfg_attr(feature = "inline-more", inline)]
1915
0
    pub fn try_insert(
1916
0
        &mut self,
1917
0
        key: K,
1918
0
        value: V,
1919
0
    ) -> Result<&mut V, OccupiedError<'_, K, V, S, A>> {
1920
0
        match self.entry(key) {
1921
0
            Entry::Occupied(entry) => Err(OccupiedError { entry, value }),
1922
0
            Entry::Vacant(entry) => Ok(entry.insert(value)),
1923
        }
1924
0
    }
1925
1926
    /// Removes a key from the map, returning the value at the key if the key
1927
    /// was previously in the map. Keeps the allocated memory for reuse.
1928
    ///
1929
    /// The key may be any borrowed form of the map's key type, but
1930
    /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
1931
    /// the key type.
1932
    ///
1933
    /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
1934
    /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
1935
    ///
1936
    /// # Examples
1937
    ///
1938
    /// ```
1939
    /// use hashbrown::HashMap;
1940
    ///
1941
    /// let mut map = HashMap::new();
1942
    /// // The map is empty
1943
    /// assert!(map.is_empty() && map.capacity() == 0);
1944
    ///
1945
    /// map.insert(1, "a");
1946
    ///
1947
    /// assert_eq!(map.remove(&1), Some("a"));
1948
    /// assert_eq!(map.remove(&1), None);
1949
    ///
1950
    /// // Now map holds none elements
1951
    /// assert!(map.is_empty());
1952
    /// ```
1953
    #[cfg_attr(feature = "inline-more", inline)]
1954
0
    pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
1955
0
    where
1956
0
        Q: Hash + Equivalent<K> + ?Sized,
1957
    {
1958
        // Avoid `Option::map` because it bloats LLVM IR.
1959
0
        match self.remove_entry(k) {
1960
0
            Some((_, v)) => Some(v),
1961
0
            None => None,
1962
        }
1963
0
    }
1964
1965
    /// Removes a key from the map, returning the stored key and value if the
1966
    /// key was previously in the map. Keeps the allocated memory for reuse.
1967
    ///
1968
    /// The key may be any borrowed form of the map's key type, but
1969
    /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for
1970
    /// the key type.
1971
    ///
1972
    /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
1973
    /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
1974
    ///
1975
    /// # Examples
1976
    ///
1977
    /// ```
1978
    /// use hashbrown::HashMap;
1979
    ///
1980
    /// let mut map = HashMap::new();
1981
    /// // The map is empty
1982
    /// assert!(map.is_empty() && map.capacity() == 0);
1983
    ///
1984
    /// map.insert(1, "a");
1985
    ///
1986
    /// assert_eq!(map.remove_entry(&1), Some((1, "a")));
1987
    /// assert_eq!(map.remove(&1), None);
1988
    ///
1989
    /// // Now map hold none elements
1990
    /// assert!(map.is_empty());
1991
    /// ```
1992
    #[cfg_attr(feature = "inline-more", inline)]
1993
0
    pub fn remove_entry<Q>(&mut self, k: &Q) -> Option<(K, V)>
1994
0
    where
1995
0
        Q: Hash + Equivalent<K> + ?Sized,
1996
    {
1997
0
        let hash = make_hash::<Q, S>(&self.hash_builder, k);
1998
0
        self.table.remove_entry(hash, equivalent_key(k))
1999
0
    }
2000
2001
    /// Returns the total amount of memory allocated internally by the hash
2002
    /// set, in bytes.
2003
    ///
2004
    /// The returned number is informational only. It is intended to be
2005
    /// primarily used for memory profiling.
2006
    #[inline]
2007
0
    pub fn allocation_size(&self) -> usize {
2008
0
        self.table.allocation_size()
2009
0
    }
2010
}
2011
2012
impl<K, V, S, A> PartialEq for HashMap<K, V, S, A>
2013
where
2014
    K: Eq + Hash,
2015
    V: PartialEq,
2016
    S: BuildHasher,
2017
    A: Allocator,
2018
{
2019
0
    fn eq(&self, other: &Self) -> bool {
2020
0
        if self.len() != other.len() {
2021
0
            return false;
2022
0
        }
2023
2024
0
        self.iter()
2025
0
            .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
2026
0
    }
2027
}
2028
2029
impl<K, V, S, A> Eq for HashMap<K, V, S, A>
2030
where
2031
    K: Eq + Hash,
2032
    V: Eq,
2033
    S: BuildHasher,
2034
    A: Allocator,
2035
{
2036
}
2037
2038
impl<K, V, S, A> Debug for HashMap<K, V, S, A>
2039
where
2040
    K: Debug,
2041
    V: Debug,
2042
    A: Allocator,
2043
{
2044
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2045
0
        f.debug_map().entries(self.iter()).finish()
2046
0
    }
2047
}
2048
2049
impl<K, V, S, A> Default for HashMap<K, V, S, A>
2050
where
2051
    S: Default,
2052
    A: Default + Allocator,
2053
{
2054
    /// Creates an empty `HashMap<K, V, S, A>`, with the `Default` value for the hasher and allocator.
2055
    ///
2056
    /// # Examples
2057
    ///
2058
    /// ```
2059
    /// use hashbrown::HashMap;
2060
    /// use std::collections::hash_map::RandomState;
2061
    ///
2062
    /// // You can specify all types of HashMap, including hasher and allocator.
2063
    /// // Created map is empty and don't allocate memory
2064
    /// let map: HashMap<u32, String> = Default::default();
2065
    /// assert_eq!(map.capacity(), 0);
2066
    /// let map: HashMap<u32, String, RandomState> = HashMap::default();
2067
    /// assert_eq!(map.capacity(), 0);
2068
    /// ```
2069
    #[cfg_attr(feature = "inline-more", inline)]
2070
0
    fn default() -> Self {
2071
0
        Self::with_hasher_in(Default::default(), Default::default())
2072
0
    }
2073
}
2074
2075
impl<K, Q, V, S, A> Index<&Q> for HashMap<K, V, S, A>
2076
where
2077
    K: Eq + Hash,
2078
    Q: Hash + Equivalent<K> + ?Sized,
2079
    S: BuildHasher,
2080
    A: Allocator,
2081
{
2082
    type Output = V;
2083
2084
    /// Returns a reference to the value corresponding to the supplied key.
2085
    ///
2086
    /// # Panics
2087
    ///
2088
    /// Panics if the key is not present in the `HashMap`.
2089
    ///
2090
    /// # Examples
2091
    ///
2092
    /// ```
2093
    /// use hashbrown::HashMap;
2094
    ///
2095
    /// let map: HashMap<_, _> = [("a", "One"), ("b", "Two")].into();
2096
    ///
2097
    /// assert_eq!(map[&"a"], "One");
2098
    /// assert_eq!(map[&"b"], "Two");
2099
    /// ```
2100
    #[cfg_attr(feature = "inline-more", inline)]
2101
0
    fn index(&self, key: &Q) -> &V {
2102
0
        self.get(key).expect("no entry found for key")
2103
0
    }
2104
}
2105
2106
// The default hasher is used to match the std implementation signature
2107
#[cfg(feature = "default-hasher")]
2108
impl<K, V, A, const N: usize> From<[(K, V); N]> for HashMap<K, V, DefaultHashBuilder, A>
2109
where
2110
    K: Eq + Hash,
2111
    A: Default + Allocator,
2112
{
2113
    /// # Examples
2114
    ///
2115
    /// ```
2116
    /// use hashbrown::HashMap;
2117
    ///
2118
    /// let map1 = HashMap::from([(1, 2), (3, 4)]);
2119
    /// let map2: HashMap<_, _> = [(1, 2), (3, 4)].into();
2120
    /// assert_eq!(map1, map2);
2121
    /// ```
2122
0
    fn from(arr: [(K, V); N]) -> Self {
2123
0
        arr.into_iter().collect()
2124
0
    }
2125
}
2126
2127
/// An iterator over the entries of a `HashMap` in arbitrary order.
2128
/// The iterator element type is `(&'a K, &'a V)`.
2129
///
2130
/// This `struct` is created by the [`iter`] method on [`HashMap`]. See its
2131
/// documentation for more.
2132
///
2133
/// [`iter`]: struct.HashMap.html#method.iter
2134
/// [`HashMap`]: struct.HashMap.html
2135
///
2136
/// # Examples
2137
///
2138
/// ```
2139
/// use hashbrown::HashMap;
2140
///
2141
/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
2142
///
2143
/// let mut iter = map.iter();
2144
/// let mut vec = vec![iter.next(), iter.next(), iter.next()];
2145
///
2146
/// // The `Iter` iterator produces items in arbitrary order, so the
2147
/// // items must be sorted to test them against a sorted array.
2148
/// vec.sort_unstable();
2149
/// assert_eq!(vec, [Some((&1, &"a")), Some((&2, &"b")), Some((&3, &"c"))]);
2150
///
2151
/// // It is fused iterator
2152
/// assert_eq!(iter.next(), None);
2153
/// assert_eq!(iter.next(), None);
2154
/// ```
2155
pub struct Iter<'a, K, V> {
2156
    inner: RawIter<(K, V)>,
2157
    marker: PhantomData<(&'a K, &'a V)>,
2158
}
2159
2160
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
2161
impl<K, V> Clone for Iter<'_, K, V> {
2162
    #[cfg_attr(feature = "inline-more", inline)]
2163
0
    fn clone(&self) -> Self {
2164
0
        Iter {
2165
0
            inner: self.inner.clone(),
2166
0
            marker: PhantomData,
2167
0
        }
2168
0
    }
2169
}
2170
2171
impl<K: Debug, V: Debug> fmt::Debug for Iter<'_, K, V> {
2172
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2173
0
        f.debug_list().entries(self.clone()).finish()
2174
0
    }
2175
}
2176
2177
/// A mutable iterator over the entries of a `HashMap` in arbitrary order.
2178
/// The iterator element type is `(&'a K, &'a mut V)`.
2179
///
2180
/// This `struct` is created by the [`iter_mut`] method on [`HashMap`]. See its
2181
/// documentation for more.
2182
///
2183
/// [`iter_mut`]: struct.HashMap.html#method.iter_mut
2184
/// [`HashMap`]: struct.HashMap.html
2185
///
2186
/// # Examples
2187
///
2188
/// ```
2189
/// use hashbrown::HashMap;
2190
///
2191
/// let mut map: HashMap<_, _> = [(1, "One".to_owned()), (2, "Two".into())].into();
2192
///
2193
/// let mut iter = map.iter_mut();
2194
/// iter.next().map(|(_, v)| v.push_str(" Mississippi"));
2195
/// iter.next().map(|(_, v)| v.push_str(" Mississippi"));
2196
///
2197
/// // It is fused iterator
2198
/// assert_eq!(iter.next(), None);
2199
/// assert_eq!(iter.next(), None);
2200
///
2201
/// assert_eq!(map.get(&1).unwrap(), &"One Mississippi".to_owned());
2202
/// assert_eq!(map.get(&2).unwrap(), &"Two Mississippi".to_owned());
2203
/// ```
2204
pub struct IterMut<'a, K, V> {
2205
    inner: RawIter<(K, V)>,
2206
    // To ensure invariance with respect to V
2207
    marker: PhantomData<(&'a K, &'a mut V)>,
2208
}
2209
2210
// We override the default Send impl which has K: Sync instead of K: Send. Both
2211
// are correct, but this one is more general since it allows keys which
2212
// implement Send but not Sync.
2213
unsafe impl<K: Send, V: Send> Send for IterMut<'_, K, V> {}
2214
2215
impl<K, V> IterMut<'_, K, V> {
2216
    /// Returns a iterator of references over the remaining items.
2217
    #[cfg_attr(feature = "inline-more", inline)]
2218
0
    pub(super) fn iter(&self) -> Iter<'_, K, V> {
2219
0
        Iter {
2220
0
            inner: self.inner.clone(),
2221
0
            marker: PhantomData,
2222
0
        }
2223
0
    }
2224
}
2225
2226
/// An owning iterator over the entries of a `HashMap` in arbitrary order.
2227
/// The iterator element type is `(K, V)`.
2228
///
2229
/// This `struct` is created by the [`into_iter`] method on [`HashMap`]
2230
/// (provided by the [`IntoIterator`] trait). See its documentation for more.
2231
/// The map cannot be used after calling that method.
2232
///
2233
/// [`into_iter`]: struct.HashMap.html#method.into_iter
2234
/// [`HashMap`]: struct.HashMap.html
2235
/// [`IntoIterator`]: https://doc.rust-lang.org/core/iter/trait.IntoIterator.html
2236
///
2237
/// # Examples
2238
///
2239
/// ```
2240
/// use hashbrown::HashMap;
2241
///
2242
/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
2243
///
2244
/// let mut iter = map.into_iter();
2245
/// let mut vec = vec![iter.next(), iter.next(), iter.next()];
2246
///
2247
/// // The `IntoIter` iterator produces items in arbitrary order, so the
2248
/// // items must be sorted to test them against a sorted array.
2249
/// vec.sort_unstable();
2250
/// assert_eq!(vec, [Some((1, "a")), Some((2, "b")), Some((3, "c"))]);
2251
///
2252
/// // It is fused iterator
2253
/// assert_eq!(iter.next(), None);
2254
/// assert_eq!(iter.next(), None);
2255
/// ```
2256
pub struct IntoIter<K, V, A: Allocator = Global> {
2257
    inner: RawIntoIter<(K, V), A>,
2258
}
2259
2260
impl<K, V, A: Allocator> IntoIter<K, V, A> {
2261
    /// Returns a iterator of references over the remaining items.
2262
    #[cfg_attr(feature = "inline-more", inline)]
2263
0
    pub(super) fn iter(&self) -> Iter<'_, K, V> {
2264
0
        Iter {
2265
0
            inner: self.inner.iter(),
2266
0
            marker: PhantomData,
2267
0
        }
2268
0
    }
2269
}
2270
2271
/// An owning iterator over the keys of a `HashMap` in arbitrary order.
2272
/// The iterator element type is `K`.
2273
///
2274
/// This `struct` is created by the [`into_keys`] method on [`HashMap`].
2275
/// See its documentation for more.
2276
/// The map cannot be used after calling that method.
2277
///
2278
/// [`into_keys`]: struct.HashMap.html#method.into_keys
2279
/// [`HashMap`]: struct.HashMap.html
2280
///
2281
/// # Examples
2282
///
2283
/// ```
2284
/// use hashbrown::HashMap;
2285
///
2286
/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
2287
///
2288
/// let mut keys = map.into_keys();
2289
/// let mut vec = vec![keys.next(), keys.next(), keys.next()];
2290
///
2291
/// // The `IntoKeys` iterator produces keys in arbitrary order, so the
2292
/// // keys must be sorted to test them against a sorted array.
2293
/// vec.sort_unstable();
2294
/// assert_eq!(vec, [Some(1), Some(2), Some(3)]);
2295
///
2296
/// // It is fused iterator
2297
/// assert_eq!(keys.next(), None);
2298
/// assert_eq!(keys.next(), None);
2299
/// ```
2300
pub struct IntoKeys<K, V, A: Allocator = Global> {
2301
    inner: IntoIter<K, V, A>,
2302
}
2303
2304
impl<K, V, A: Allocator> Default for IntoKeys<K, V, A> {
2305
    #[cfg_attr(feature = "inline-more", inline)]
2306
0
    fn default() -> Self {
2307
0
        Self {
2308
0
            inner: Default::default(),
2309
0
        }
2310
0
    }
2311
}
2312
impl<K, V, A: Allocator> Iterator for IntoKeys<K, V, A> {
2313
    type Item = K;
2314
2315
    #[inline]
2316
0
    fn next(&mut self) -> Option<K> {
2317
0
        self.inner.next().map(|(k, _)| k)
2318
0
    }
2319
    #[inline]
2320
0
    fn size_hint(&self) -> (usize, Option<usize>) {
2321
0
        self.inner.size_hint()
2322
0
    }
2323
    #[inline]
2324
0
    fn fold<B, F>(self, init: B, mut f: F) -> B
2325
0
    where
2326
0
        Self: Sized,
2327
0
        F: FnMut(B, Self::Item) -> B,
2328
    {
2329
0
        self.inner.fold(init, |acc, (k, _)| f(acc, k))
2330
0
    }
2331
}
2332
2333
impl<K, V, A: Allocator> ExactSizeIterator for IntoKeys<K, V, A> {
2334
    #[inline]
2335
0
    fn len(&self) -> usize {
2336
0
        self.inner.len()
2337
0
    }
2338
}
2339
2340
impl<K, V, A: Allocator> FusedIterator for IntoKeys<K, V, A> {}
2341
2342
impl<K: Debug, V: Debug, A: Allocator> fmt::Debug for IntoKeys<K, V, A> {
2343
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2344
0
        f.debug_list()
2345
0
            .entries(self.inner.iter().map(|(k, _)| k))
2346
0
            .finish()
2347
0
    }
2348
}
2349
2350
/// An owning iterator over the values of a `HashMap` in arbitrary order.
2351
/// The iterator element type is `V`.
2352
///
2353
/// This `struct` is created by the [`into_values`] method on [`HashMap`].
2354
/// See its documentation for more. The map cannot be used after calling that method.
2355
///
2356
/// [`into_values`]: struct.HashMap.html#method.into_values
2357
/// [`HashMap`]: struct.HashMap.html
2358
///
2359
/// # Examples
2360
///
2361
/// ```
2362
/// use hashbrown::HashMap;
2363
///
2364
/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
2365
///
2366
/// let mut values = map.into_values();
2367
/// let mut vec = vec![values.next(), values.next(), values.next()];
2368
///
2369
/// // The `IntoValues` iterator produces values in arbitrary order, so
2370
/// // the values must be sorted to test them against a sorted array.
2371
/// vec.sort_unstable();
2372
/// assert_eq!(vec, [Some("a"), Some("b"), Some("c")]);
2373
///
2374
/// // It is fused iterator
2375
/// assert_eq!(values.next(), None);
2376
/// assert_eq!(values.next(), None);
2377
/// ```
2378
pub struct IntoValues<K, V, A: Allocator = Global> {
2379
    inner: IntoIter<K, V, A>,
2380
}
2381
2382
impl<K, V, A: Allocator> Default for IntoValues<K, V, A> {
2383
    #[cfg_attr(feature = "inline-more", inline)]
2384
0
    fn default() -> Self {
2385
0
        Self {
2386
0
            inner: Default::default(),
2387
0
        }
2388
0
    }
2389
}
2390
impl<K, V, A: Allocator> Iterator for IntoValues<K, V, A> {
2391
    type Item = V;
2392
2393
    #[inline]
2394
0
    fn next(&mut self) -> Option<V> {
2395
0
        self.inner.next().map(|(_, v)| v)
2396
0
    }
2397
    #[inline]
2398
0
    fn size_hint(&self) -> (usize, Option<usize>) {
2399
0
        self.inner.size_hint()
2400
0
    }
2401
    #[inline]
2402
0
    fn fold<B, F>(self, init: B, mut f: F) -> B
2403
0
    where
2404
0
        Self: Sized,
2405
0
        F: FnMut(B, Self::Item) -> B,
2406
    {
2407
0
        self.inner.fold(init, |acc, (_, v)| f(acc, v))
2408
0
    }
2409
}
2410
2411
impl<K, V, A: Allocator> ExactSizeIterator for IntoValues<K, V, A> {
2412
    #[inline]
2413
0
    fn len(&self) -> usize {
2414
0
        self.inner.len()
2415
0
    }
2416
}
2417
2418
impl<K, V, A: Allocator> FusedIterator for IntoValues<K, V, A> {}
2419
2420
impl<K, V: Debug, A: Allocator> fmt::Debug for IntoValues<K, V, A> {
2421
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2422
0
        f.debug_list()
2423
0
            .entries(self.inner.iter().map(|(_, v)| v))
2424
0
            .finish()
2425
0
    }
2426
}
2427
2428
/// An iterator over the keys of a `HashMap` in arbitrary order.
2429
/// The iterator element type is `&'a K`.
2430
///
2431
/// This `struct` is created by the [`keys`] method on [`HashMap`]. See its
2432
/// documentation for more.
2433
///
2434
/// [`keys`]: struct.HashMap.html#method.keys
2435
/// [`HashMap`]: struct.HashMap.html
2436
///
2437
/// # Examples
2438
///
2439
/// ```
2440
/// use hashbrown::HashMap;
2441
///
2442
/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
2443
///
2444
/// let mut keys = map.keys();
2445
/// let mut vec = vec![keys.next(), keys.next(), keys.next()];
2446
///
2447
/// // The `Keys` iterator produces keys in arbitrary order, so the
2448
/// // keys must be sorted to test them against a sorted array.
2449
/// vec.sort_unstable();
2450
/// assert_eq!(vec, [Some(&1), Some(&2), Some(&3)]);
2451
///
2452
/// // It is fused iterator
2453
/// assert_eq!(keys.next(), None);
2454
/// assert_eq!(keys.next(), None);
2455
/// ```
2456
pub struct Keys<'a, K, V> {
2457
    inner: Iter<'a, K, V>,
2458
}
2459
2460
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
2461
impl<K, V> Clone for Keys<'_, K, V> {
2462
    #[cfg_attr(feature = "inline-more", inline)]
2463
0
    fn clone(&self) -> Self {
2464
0
        Keys {
2465
0
            inner: self.inner.clone(),
2466
0
        }
2467
0
    }
2468
}
2469
2470
impl<K: Debug, V> fmt::Debug for Keys<'_, K, V> {
2471
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2472
0
        f.debug_list().entries(self.clone()).finish()
2473
0
    }
2474
}
2475
2476
/// An iterator over the values of a `HashMap` in arbitrary order.
2477
/// The iterator element type is `&'a V`.
2478
///
2479
/// This `struct` is created by the [`values`] method on [`HashMap`]. See its
2480
/// documentation for more.
2481
///
2482
/// [`values`]: struct.HashMap.html#method.values
2483
/// [`HashMap`]: struct.HashMap.html
2484
///
2485
/// # Examples
2486
///
2487
/// ```
2488
/// use hashbrown::HashMap;
2489
///
2490
/// let map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
2491
///
2492
/// let mut values = map.values();
2493
/// let mut vec = vec![values.next(), values.next(), values.next()];
2494
///
2495
/// // The `Values` iterator produces values in arbitrary order, so the
2496
/// // values must be sorted to test them against a sorted array.
2497
/// vec.sort_unstable();
2498
/// assert_eq!(vec, [Some(&"a"), Some(&"b"), Some(&"c")]);
2499
///
2500
/// // It is fused iterator
2501
/// assert_eq!(values.next(), None);
2502
/// assert_eq!(values.next(), None);
2503
/// ```
2504
pub struct Values<'a, K, V> {
2505
    inner: Iter<'a, K, V>,
2506
}
2507
2508
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
2509
impl<K, V> Clone for Values<'_, K, V> {
2510
    #[cfg_attr(feature = "inline-more", inline)]
2511
0
    fn clone(&self) -> Self {
2512
0
        Values {
2513
0
            inner: self.inner.clone(),
2514
0
        }
2515
0
    }
2516
}
2517
2518
impl<K, V: Debug> fmt::Debug for Values<'_, K, V> {
2519
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2520
0
        f.debug_list().entries(self.clone()).finish()
2521
0
    }
2522
}
2523
2524
/// A draining iterator over the entries of a `HashMap` in arbitrary
2525
/// order. The iterator element type is `(K, V)`.
2526
///
2527
/// This `struct` is created by the [`drain`] method on [`HashMap`]. See its
2528
/// documentation for more.
2529
///
2530
/// [`drain`]: struct.HashMap.html#method.drain
2531
/// [`HashMap`]: struct.HashMap.html
2532
///
2533
/// # Examples
2534
///
2535
/// ```
2536
/// use hashbrown::HashMap;
2537
///
2538
/// let mut map: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
2539
///
2540
/// let mut drain_iter = map.drain();
2541
/// let mut vec = vec![drain_iter.next(), drain_iter.next(), drain_iter.next()];
2542
///
2543
/// // The `Drain` iterator produces items in arbitrary order, so the
2544
/// // items must be sorted to test them against a sorted array.
2545
/// vec.sort_unstable();
2546
/// assert_eq!(vec, [Some((1, "a")), Some((2, "b")), Some((3, "c"))]);
2547
///
2548
/// // It is fused iterator
2549
/// assert_eq!(drain_iter.next(), None);
2550
/// assert_eq!(drain_iter.next(), None);
2551
/// ```
2552
pub struct Drain<'a, K, V, A: Allocator = Global> {
2553
    inner: RawDrain<'a, (K, V), A>,
2554
}
2555
2556
impl<K, V, A: Allocator> Drain<'_, K, V, A> {
2557
    /// Returns a iterator of references over the remaining items.
2558
    #[cfg_attr(feature = "inline-more", inline)]
2559
0
    pub(super) fn iter(&self) -> Iter<'_, K, V> {
2560
0
        Iter {
2561
0
            inner: self.inner.iter(),
2562
0
            marker: PhantomData,
2563
0
        }
2564
0
    }
2565
}
2566
2567
/// A draining iterator over entries of a `HashMap` which don't satisfy the predicate
2568
/// `f(&k, &mut v)` in arbitrary order. The iterator element type is `(K, V)`.
2569
///
2570
/// This `struct` is created by the [`extract_if`] method on [`HashMap`]. See its
2571
/// documentation for more.
2572
///
2573
/// [`extract_if`]: struct.HashMap.html#method.extract_if
2574
/// [`HashMap`]: struct.HashMap.html
2575
///
2576
/// # Examples
2577
///
2578
/// ```
2579
/// use hashbrown::HashMap;
2580
///
2581
/// let mut map: HashMap<i32, &str> = [(1, "a"), (2, "b"), (3, "c")].into();
2582
///
2583
/// let mut extract_if = map.extract_if(|k, _v| k % 2 != 0);
2584
/// let mut vec = vec![extract_if.next(), extract_if.next()];
2585
///
2586
/// // The `ExtractIf` iterator produces items in arbitrary order, so the
2587
/// // items must be sorted to test them against a sorted array.
2588
/// vec.sort_unstable();
2589
/// assert_eq!(vec, [Some((1, "a")),Some((3, "c"))]);
2590
///
2591
/// // It is fused iterator
2592
/// assert_eq!(extract_if.next(), None);
2593
/// assert_eq!(extract_if.next(), None);
2594
/// drop(extract_if);
2595
///
2596
/// assert_eq!(map.len(), 1);
2597
/// ```
2598
#[must_use = "Iterators are lazy unless consumed"]
2599
pub struct ExtractIf<'a, K, V, F, A: Allocator = Global> {
2600
    f: F,
2601
    inner: RawExtractIf<'a, (K, V), A>,
2602
}
2603
2604
impl<K, V, F, A> Iterator for ExtractIf<'_, K, V, F, A>
2605
where
2606
    F: FnMut(&K, &mut V) -> bool,
2607
    A: Allocator,
2608
{
2609
    type Item = (K, V);
2610
2611
    #[cfg_attr(feature = "inline-more", inline)]
2612
0
    fn next(&mut self) -> Option<Self::Item> {
2613
0
        self.inner.next(|&mut (ref k, ref mut v)| (self.f)(k, v))
2614
0
    }
2615
2616
    #[inline]
2617
0
    fn size_hint(&self) -> (usize, Option<usize>) {
2618
0
        (0, self.inner.iter.size_hint().1)
2619
0
    }
2620
}
2621
2622
impl<K, V, F> FusedIterator for ExtractIf<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {}
2623
2624
/// A mutable iterator over the values of a `HashMap` in arbitrary order.
2625
/// The iterator element type is `&'a mut V`.
2626
///
2627
/// This `struct` is created by the [`values_mut`] method on [`HashMap`]. See its
2628
/// documentation for more.
2629
///
2630
/// [`values_mut`]: struct.HashMap.html#method.values_mut
2631
/// [`HashMap`]: struct.HashMap.html
2632
///
2633
/// # Examples
2634
///
2635
/// ```
2636
/// use hashbrown::HashMap;
2637
///
2638
/// let mut map: HashMap<_, _> = [(1, "One".to_owned()), (2, "Two".into())].into();
2639
///
2640
/// let mut values = map.values_mut();
2641
/// values.next().map(|v| v.push_str(" Mississippi"));
2642
/// values.next().map(|v| v.push_str(" Mississippi"));
2643
///
2644
/// // It is fused iterator
2645
/// assert_eq!(values.next(), None);
2646
/// assert_eq!(values.next(), None);
2647
///
2648
/// assert_eq!(map.get(&1).unwrap(), &"One Mississippi".to_owned());
2649
/// assert_eq!(map.get(&2).unwrap(), &"Two Mississippi".to_owned());
2650
/// ```
2651
pub struct ValuesMut<'a, K, V> {
2652
    inner: IterMut<'a, K, V>,
2653
}
2654
2655
/// A view into a single entry in a map, which may either be vacant or occupied.
2656
///
2657
/// This `enum` is constructed from the [`entry`] method on [`HashMap`].
2658
///
2659
/// [`HashMap`]: struct.HashMap.html
2660
/// [`entry`]: struct.HashMap.html#method.entry
2661
///
2662
/// # Examples
2663
///
2664
/// ```
2665
/// use hashbrown::hash_map::{Entry, HashMap, OccupiedEntry};
2666
///
2667
/// let mut map = HashMap::new();
2668
/// map.extend([("a", 10), ("b", 20), ("c", 30)]);
2669
/// assert_eq!(map.len(), 3);
2670
///
2671
/// // Existing key (insert)
2672
/// let entry: Entry<_, _, _> = map.entry("a");
2673
/// let _raw_o: OccupiedEntry<_, _, _> = entry.insert(1);
2674
/// assert_eq!(map.len(), 3);
2675
/// // Nonexistent key (insert)
2676
/// map.entry("d").insert(4);
2677
///
2678
/// // Existing key (or_insert)
2679
/// let v = map.entry("b").or_insert(2);
2680
/// assert_eq!(std::mem::replace(v, 2), 20);
2681
/// // Nonexistent key (or_insert)
2682
/// map.entry("e").or_insert(5);
2683
///
2684
/// // Existing key (or_insert_with)
2685
/// let v = map.entry("c").or_insert_with(|| 3);
2686
/// assert_eq!(std::mem::replace(v, 3), 30);
2687
/// // Nonexistent key (or_insert_with)
2688
/// map.entry("f").or_insert_with(|| 6);
2689
///
2690
/// println!("Our HashMap: {:?}", map);
2691
///
2692
/// let mut vec: Vec<_> = map.iter().map(|(&k, &v)| (k, v)).collect();
2693
/// // The `Iter` iterator produces items in arbitrary order, so the
2694
/// // items must be sorted to test them against a sorted array.
2695
/// vec.sort_unstable();
2696
/// assert_eq!(vec, [("a", 1), ("b", 2), ("c", 3), ("d", 4), ("e", 5), ("f", 6)]);
2697
/// ```
2698
pub enum Entry<'a, K, V, S, A = Global>
2699
where
2700
    A: Allocator,
2701
{
2702
    /// An occupied entry.
2703
    ///
2704
    /// # Examples
2705
    ///
2706
    /// ```
2707
    /// use hashbrown::hash_map::{Entry, HashMap};
2708
    /// let mut map: HashMap<_, _> = [("a", 100), ("b", 200)].into();
2709
    ///
2710
    /// match map.entry("a") {
2711
    ///     Entry::Vacant(_) => unreachable!(),
2712
    ///     Entry::Occupied(_) => { }
2713
    /// }
2714
    /// ```
2715
    Occupied(OccupiedEntry<'a, K, V, S, A>),
2716
2717
    /// A vacant entry.
2718
    ///
2719
    /// # Examples
2720
    ///
2721
    /// ```
2722
    /// use hashbrown::hash_map::{Entry, HashMap};
2723
    /// let mut map: HashMap<&str, i32> = HashMap::new();
2724
    ///
2725
    /// match map.entry("a") {
2726
    ///     Entry::Occupied(_) => unreachable!(),
2727
    ///     Entry::Vacant(_) => { }
2728
    /// }
2729
    /// ```
2730
    Vacant(VacantEntry<'a, K, V, S, A>),
2731
}
2732
2733
impl<K: Debug, V: Debug, S, A: Allocator> Debug for Entry<'_, K, V, S, A> {
2734
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2735
0
        match *self {
2736
0
            Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(),
2737
0
            Entry::Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(),
2738
        }
2739
0
    }
2740
}
2741
2742
/// A view into an occupied entry in a [`HashMap`].
2743
/// It is part of the [`Entry`] and [`EntryRef`] enums.
2744
///
2745
/// # Examples
2746
///
2747
/// ```
2748
/// use hashbrown::hash_map::{Entry, HashMap, OccupiedEntry};
2749
///
2750
/// let mut map = HashMap::new();
2751
/// map.extend([("a", 10), ("b", 20), ("c", 30)]);
2752
///
2753
/// let _entry_o: OccupiedEntry<_, _, _> = map.entry("a").insert(100);
2754
/// assert_eq!(map.len(), 3);
2755
///
2756
/// // Existing key (insert and update)
2757
/// match map.entry("a") {
2758
///     Entry::Vacant(_) => unreachable!(),
2759
///     Entry::Occupied(mut view) => {
2760
///         assert_eq!(view.get(), &100);
2761
///         let v = view.get_mut();
2762
///         *v *= 10;
2763
///         assert_eq!(view.insert(1111), 1000);
2764
///     }
2765
/// }
2766
///
2767
/// assert_eq!(map[&"a"], 1111);
2768
/// assert_eq!(map.len(), 3);
2769
///
2770
/// // Existing key (take)
2771
/// match map.entry("c") {
2772
///     Entry::Vacant(_) => unreachable!(),
2773
///     Entry::Occupied(view) => {
2774
///         assert_eq!(view.remove_entry(), ("c", 30));
2775
///     }
2776
/// }
2777
/// assert_eq!(map.get(&"c"), None);
2778
/// assert_eq!(map.len(), 2);
2779
/// ```
2780
pub struct OccupiedEntry<'a, K, V, S = DefaultHashBuilder, A: Allocator = Global> {
2781
    hash: u64,
2782
    elem: Bucket<(K, V)>,
2783
    table: &'a mut HashMap<K, V, S, A>,
2784
}
2785
2786
unsafe impl<K, V, S, A> Send for OccupiedEntry<'_, K, V, S, A>
2787
where
2788
    K: Send,
2789
    V: Send,
2790
    S: Send,
2791
    A: Send + Allocator,
2792
{
2793
}
2794
unsafe impl<K, V, S, A> Sync for OccupiedEntry<'_, K, V, S, A>
2795
where
2796
    K: Sync,
2797
    V: Sync,
2798
    S: Sync,
2799
    A: Sync + Allocator,
2800
{
2801
}
2802
2803
impl<K: Debug, V: Debug, S, A: Allocator> Debug for OccupiedEntry<'_, K, V, S, A> {
2804
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2805
0
        f.debug_struct("OccupiedEntry")
2806
0
            .field("key", self.key())
2807
0
            .field("value", self.get())
2808
0
            .finish()
2809
0
    }
2810
}
2811
2812
/// A view into a vacant entry in a `HashMap`.
2813
/// It is part of the [`Entry`] enum.
2814
///
2815
/// [`Entry`]: enum.Entry.html
2816
///
2817
/// # Examples
2818
///
2819
/// ```
2820
/// use hashbrown::hash_map::{Entry, HashMap, VacantEntry};
2821
///
2822
/// let mut map = HashMap::<&str, i32>::new();
2823
///
2824
/// let entry_v: VacantEntry<_, _, _> = match map.entry("a") {
2825
///     Entry::Vacant(view) => view,
2826
///     Entry::Occupied(_) => unreachable!(),
2827
/// };
2828
/// entry_v.insert(10);
2829
/// assert!(map[&"a"] == 10 && map.len() == 1);
2830
///
2831
/// // Nonexistent key (insert and update)
2832
/// match map.entry("b") {
2833
///     Entry::Occupied(_) => unreachable!(),
2834
///     Entry::Vacant(view) => {
2835
///         let value = view.insert(2);
2836
///         assert_eq!(*value, 2);
2837
///         *value = 20;
2838
///     }
2839
/// }
2840
/// assert!(map[&"b"] == 20 && map.len() == 2);
2841
/// ```
2842
pub struct VacantEntry<'a, K, V, S = DefaultHashBuilder, A: Allocator = Global> {
2843
    hash: u64,
2844
    key: K,
2845
    table: &'a mut HashMap<K, V, S, A>,
2846
}
2847
2848
impl<K: Debug, V, S, A: Allocator> Debug for VacantEntry<'_, K, V, S, A> {
2849
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2850
0
        f.debug_tuple("VacantEntry").field(self.key()).finish()
2851
0
    }
2852
}
2853
2854
/// A view into a single entry in a map, which may either be vacant or occupied,
2855
/// with any borrowed form of the map's key type.
2856
///
2857
///
2858
/// This `enum` is constructed from the [`entry_ref`] method on [`HashMap`].
2859
///
2860
/// [`Hash`] and [`Eq`] on the borrowed form of the map's key type *must* match those
2861
/// for the key type. It also require that key may be constructed from the borrowed
2862
/// form through the [`From`] trait.
2863
///
2864
/// [`HashMap`]: struct.HashMap.html
2865
/// [`entry_ref`]: struct.HashMap.html#method.entry_ref
2866
/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html
2867
/// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html
2868
/// [`From`]: https://doc.rust-lang.org/std/convert/trait.From.html
2869
///
2870
/// # Examples
2871
///
2872
/// ```
2873
/// use hashbrown::hash_map::{EntryRef, HashMap, OccupiedEntry};
2874
///
2875
/// let mut map = HashMap::new();
2876
/// map.extend([("a".to_owned(), 10), ("b".into(), 20), ("c".into(), 30)]);
2877
/// assert_eq!(map.len(), 3);
2878
///
2879
/// // Existing key (insert)
2880
/// let key = String::from("a");
2881
/// let entry: EntryRef<_, _, _, _> = map.entry_ref(&key);
2882
/// let _raw_o: OccupiedEntry<_, _, _, _> = entry.insert(1);
2883
/// assert_eq!(map.len(), 3);
2884
/// // Nonexistent key (insert)
2885
/// map.entry_ref("d").insert(4);
2886
///
2887
/// // Existing key (or_insert)
2888
/// let v = map.entry_ref("b").or_insert(2);
2889
/// assert_eq!(std::mem::replace(v, 2), 20);
2890
/// // Nonexistent key (or_insert)
2891
/// map.entry_ref("e").or_insert(5);
2892
///
2893
/// // Existing key (or_insert_with)
2894
/// let v = map.entry_ref("c").or_insert_with(|| 3);
2895
/// assert_eq!(std::mem::replace(v, 3), 30);
2896
/// // Nonexistent key (or_insert_with)
2897
/// map.entry_ref("f").or_insert_with(|| 6);
2898
///
2899
/// println!("Our HashMap: {:?}", map);
2900
///
2901
/// for (key, value) in ["a", "b", "c", "d", "e", "f"].into_iter().zip(1..=6) {
2902
///     assert_eq!(map[key], value)
2903
/// }
2904
/// assert_eq!(map.len(), 6);
2905
/// ```
2906
pub enum EntryRef<'a, 'b, K, Q: ?Sized, V, S, A = Global>
2907
where
2908
    A: Allocator,
2909
{
2910
    /// An occupied entry.
2911
    ///
2912
    /// # Examples
2913
    ///
2914
    /// ```
2915
    /// use hashbrown::hash_map::{EntryRef, HashMap};
2916
    /// let mut map: HashMap<_, _> = [("a".to_owned(), 100), ("b".into(), 200)].into();
2917
    ///
2918
    /// match map.entry_ref("a") {
2919
    ///     EntryRef::Vacant(_) => unreachable!(),
2920
    ///     EntryRef::Occupied(_) => { }
2921
    /// }
2922
    /// ```
2923
    Occupied(OccupiedEntry<'a, K, V, S, A>),
2924
2925
    /// A vacant entry.
2926
    ///
2927
    /// # Examples
2928
    ///
2929
    /// ```
2930
    /// use hashbrown::hash_map::{EntryRef, HashMap};
2931
    /// let mut map: HashMap<String, i32> = HashMap::new();
2932
    ///
2933
    /// match map.entry_ref("a") {
2934
    ///     EntryRef::Occupied(_) => unreachable!(),
2935
    ///     EntryRef::Vacant(_) => { }
2936
    /// }
2937
    /// ```
2938
    Vacant(VacantEntryRef<'a, 'b, K, Q, V, S, A>),
2939
}
2940
2941
impl<K, Q, V, S, A> Debug for EntryRef<'_, '_, K, Q, V, S, A>
2942
where
2943
    K: Debug + Borrow<Q>,
2944
    Q: Debug + ?Sized,
2945
    V: Debug,
2946
    A: Allocator,
2947
{
2948
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2949
0
        match *self {
2950
0
            EntryRef::Vacant(ref v) => f.debug_tuple("EntryRef").field(v).finish(),
2951
0
            EntryRef::Occupied(ref o) => f.debug_tuple("EntryRef").field(o).finish(),
2952
        }
2953
0
    }
2954
}
2955
2956
/// A view into a vacant entry in a `HashMap`.
2957
/// It is part of the [`EntryRef`] enum.
2958
///
2959
/// [`EntryRef`]: enum.EntryRef.html
2960
///
2961
/// # Examples
2962
///
2963
/// ```
2964
/// use hashbrown::hash_map::{EntryRef, HashMap, VacantEntryRef};
2965
///
2966
/// let mut map = HashMap::<String, i32>::new();
2967
///
2968
/// let entry_v: VacantEntryRef<_, _, _, _> = match map.entry_ref("a") {
2969
///     EntryRef::Vacant(view) => view,
2970
///     EntryRef::Occupied(_) => unreachable!(),
2971
/// };
2972
/// entry_v.insert(10);
2973
/// assert!(map["a"] == 10 && map.len() == 1);
2974
///
2975
/// // Nonexistent key (insert and update)
2976
/// match map.entry_ref("b") {
2977
///     EntryRef::Occupied(_) => unreachable!(),
2978
///     EntryRef::Vacant(view) => {
2979
///         let value = view.insert(2);
2980
///         assert_eq!(*value, 2);
2981
///         *value = 20;
2982
///     }
2983
/// }
2984
/// assert!(map["b"] == 20 && map.len() == 2);
2985
/// ```
2986
pub struct VacantEntryRef<'a, 'b, K, Q: ?Sized, V, S, A: Allocator = Global> {
2987
    hash: u64,
2988
    key: &'b Q,
2989
    table: &'a mut HashMap<K, V, S, A>,
2990
}
2991
2992
impl<K, Q, V, S, A> Debug for VacantEntryRef<'_, '_, K, Q, V, S, A>
2993
where
2994
    K: Borrow<Q>,
2995
    Q: Debug + ?Sized,
2996
    A: Allocator,
2997
{
2998
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2999
0
        f.debug_tuple("VacantEntryRef").field(&self.key()).finish()
3000
0
    }
3001
}
3002
3003
/// The error returned by [`try_insert`](HashMap::try_insert) when the key already exists.
3004
///
3005
/// Contains the occupied entry, and the value that was not inserted.
3006
///
3007
/// # Examples
3008
///
3009
/// ```
3010
/// use hashbrown::hash_map::{HashMap, OccupiedError};
3011
///
3012
/// let mut map: HashMap<_, _> = [("a", 10), ("b", 20)].into();
3013
///
3014
/// // try_insert method returns mutable reference to the value if keys are vacant,
3015
/// // but if the map did have key present, nothing is updated, and the provided
3016
/// // value is returned inside `Err(_)` variant
3017
/// match map.try_insert("a", 100) {
3018
///     Err(OccupiedError { mut entry, value }) => {
3019
///         assert_eq!(entry.key(), &"a");
3020
///         assert_eq!(value, 100);
3021
///         assert_eq!(entry.insert(100), 10)
3022
///     }
3023
///     _ => unreachable!(),
3024
/// }
3025
/// assert_eq!(map[&"a"], 100);
3026
/// ```
3027
pub struct OccupiedError<'a, K, V, S, A: Allocator = Global> {
3028
    /// The entry in the map that was already occupied.
3029
    pub entry: OccupiedEntry<'a, K, V, S, A>,
3030
    /// The value which was not inserted, because the entry was already occupied.
3031
    pub value: V,
3032
}
3033
3034
impl<K: Debug, V: Debug, S, A: Allocator> Debug for OccupiedError<'_, K, V, S, A> {
3035
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3036
0
        f.debug_struct("OccupiedError")
3037
0
            .field("key", self.entry.key())
3038
0
            .field("old_value", self.entry.get())
3039
0
            .field("new_value", &self.value)
3040
0
            .finish()
3041
0
    }
3042
}
3043
3044
impl<K: Debug, V: Debug, S, A: Allocator> fmt::Display for OccupiedError<'_, K, V, S, A> {
3045
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3046
0
        write!(
3047
0
            f,
3048
0
            "failed to insert {:?}, key {:?} already exists with value {:?}",
3049
            self.value,
3050
0
            self.entry.key(),
3051
0
            self.entry.get(),
3052
        )
3053
0
    }
3054
}
3055
3056
impl<'a, K, V, S, A: Allocator> IntoIterator for &'a HashMap<K, V, S, A> {
3057
    type Item = (&'a K, &'a V);
3058
    type IntoIter = Iter<'a, K, V>;
3059
3060
    /// Creates an iterator over the entries of a `HashMap` in arbitrary order.
3061
    /// The iterator element type is `(&'a K, &'a V)`.
3062
    ///
3063
    /// Return the same `Iter` struct as by the [`iter`] method on [`HashMap`].
3064
    ///
3065
    /// [`iter`]: struct.HashMap.html#method.iter
3066
    /// [`HashMap`]: struct.HashMap.html
3067
    ///
3068
    /// # Examples
3069
    ///
3070
    /// ```
3071
    /// use hashbrown::HashMap;
3072
    /// let map_one: HashMap<_, _> = [(1, "a"), (2, "b"), (3, "c")].into();
3073
    /// let mut map_two = HashMap::new();
3074
    ///
3075
    /// for (key, value) in &map_one {
3076
    ///     println!("Key: {}, Value: {}", key, value);
3077
    ///     map_two.insert(*key, *value);
3078
    /// }
3079
    ///
3080
    /// assert_eq!(map_one, map_two);
3081
    /// ```
3082
    #[cfg_attr(feature = "inline-more", inline)]
3083
0
    fn into_iter(self) -> Iter<'a, K, V> {
3084
0
        self.iter()
3085
0
    }
3086
}
3087
3088
impl<'a, K, V, S, A: Allocator> IntoIterator for &'a mut HashMap<K, V, S, A> {
3089
    type Item = (&'a K, &'a mut V);
3090
    type IntoIter = IterMut<'a, K, V>;
3091
3092
    /// Creates an iterator over the entries of a `HashMap` in arbitrary order
3093
    /// with mutable references to the values. The iterator element type is
3094
    /// `(&'a K, &'a mut V)`.
3095
    ///
3096
    /// Return the same `IterMut` struct as by the [`iter_mut`] method on
3097
    /// [`HashMap`].
3098
    ///
3099
    /// [`iter_mut`]: struct.HashMap.html#method.iter_mut
3100
    /// [`HashMap`]: struct.HashMap.html
3101
    ///
3102
    /// # Examples
3103
    ///
3104
    /// ```
3105
    /// use hashbrown::HashMap;
3106
    /// let mut map: HashMap<_, _> = [("a", 1), ("b", 2), ("c", 3)].into();
3107
    ///
3108
    /// for (key, value) in &mut map {
3109
    ///     println!("Key: {}, Value: {}", key, value);
3110
    ///     *value *= 2;
3111
    /// }
3112
    ///
3113
    /// let mut vec = map.iter().collect::<Vec<_>>();
3114
    /// // The `Iter` iterator produces items in arbitrary order, so the
3115
    /// // items must be sorted to test them against a sorted array.
3116
    /// vec.sort_unstable();
3117
    /// assert_eq!(vec, [(&"a", &2), (&"b", &4), (&"c", &6)]);
3118
    /// ```
3119
    #[cfg_attr(feature = "inline-more", inline)]
3120
0
    fn into_iter(self) -> IterMut<'a, K, V> {
3121
0
        self.iter_mut()
3122
0
    }
3123
}
3124
3125
impl<K, V, S, A: Allocator> IntoIterator for HashMap<K, V, S, A> {
3126
    type Item = (K, V);
3127
    type IntoIter = IntoIter<K, V, A>;
3128
3129
    /// Creates a consuming iterator, that is, one that moves each key-value
3130
    /// pair out of the map in arbitrary order. The map cannot be used after
3131
    /// calling this.
3132
    ///
3133
    /// # Examples
3134
    ///
3135
    /// ```
3136
    /// use hashbrown::HashMap;
3137
    ///
3138
    /// let map: HashMap<_, _> = [("a", 1), ("b", 2), ("c", 3)].into();
3139
    ///
3140
    /// // Not possible with .iter()
3141
    /// let mut vec: Vec<(&str, i32)> = map.into_iter().collect();
3142
    /// // The `IntoIter` iterator produces items in arbitrary order, so
3143
    /// // the items must be sorted to test them against a sorted array.
3144
    /// vec.sort_unstable();
3145
    /// assert_eq!(vec, [("a", 1), ("b", 2), ("c", 3)]);
3146
    /// ```
3147
    #[cfg_attr(feature = "inline-more", inline)]
3148
0
    fn into_iter(self) -> IntoIter<K, V, A> {
3149
0
        IntoIter {
3150
0
            inner: self.table.into_iter(),
3151
0
        }
3152
0
    }
3153
}
3154
3155
impl<K, V> Default for Iter<'_, K, V> {
3156
    #[cfg_attr(feature = "inline-more", inline)]
3157
0
    fn default() -> Self {
3158
0
        Self {
3159
0
            inner: Default::default(),
3160
0
            marker: PhantomData,
3161
0
        }
3162
0
    }
3163
}
3164
impl<'a, K, V> Iterator for Iter<'a, K, V> {
3165
    type Item = (&'a K, &'a V);
3166
3167
    #[cfg_attr(feature = "inline-more", inline)]
3168
0
    fn next(&mut self) -> Option<(&'a K, &'a V)> {
3169
        // Avoid `Option::map` because it bloats LLVM IR.
3170
0
        match self.inner.next() {
3171
0
            Some(x) => unsafe {
3172
0
                let r = x.as_ref();
3173
0
                Some((&r.0, &r.1))
3174
            },
3175
0
            None => None,
3176
        }
3177
0
    }
3178
    #[cfg_attr(feature = "inline-more", inline)]
3179
0
    fn size_hint(&self) -> (usize, Option<usize>) {
3180
0
        self.inner.size_hint()
3181
0
    }
3182
    #[cfg_attr(feature = "inline-more", inline)]
3183
0
    fn fold<B, F>(self, init: B, mut f: F) -> B
3184
0
    where
3185
0
        Self: Sized,
3186
0
        F: FnMut(B, Self::Item) -> B,
3187
    {
3188
0
        self.inner.fold(init, |acc, x| unsafe {
3189
0
            let (k, v) = x.as_ref();
3190
0
            f(acc, (k, v))
3191
0
        })
3192
0
    }
3193
}
3194
impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
3195
    #[cfg_attr(feature = "inline-more", inline)]
3196
0
    fn len(&self) -> usize {
3197
0
        self.inner.len()
3198
0
    }
3199
}
3200
3201
impl<K, V> FusedIterator for Iter<'_, K, V> {}
3202
3203
impl<K, V> Default for IterMut<'_, K, V> {
3204
    #[cfg_attr(feature = "inline-more", inline)]
3205
0
    fn default() -> Self {
3206
0
        Self {
3207
0
            inner: Default::default(),
3208
0
            marker: PhantomData,
3209
0
        }
3210
0
    }
3211
}
3212
impl<'a, K, V> Iterator for IterMut<'a, K, V> {
3213
    type Item = (&'a K, &'a mut V);
3214
3215
    #[cfg_attr(feature = "inline-more", inline)]
3216
0
    fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
3217
        // Avoid `Option::map` because it bloats LLVM IR.
3218
0
        match self.inner.next() {
3219
0
            Some(x) => unsafe {
3220
0
                let r = x.as_mut();
3221
0
                Some((&r.0, &mut r.1))
3222
            },
3223
0
            None => None,
3224
        }
3225
0
    }
3226
    #[cfg_attr(feature = "inline-more", inline)]
3227
0
    fn size_hint(&self) -> (usize, Option<usize>) {
3228
0
        self.inner.size_hint()
3229
0
    }
3230
    #[cfg_attr(feature = "inline-more", inline)]
3231
0
    fn fold<B, F>(self, init: B, mut f: F) -> B
3232
0
    where
3233
0
        Self: Sized,
3234
0
        F: FnMut(B, Self::Item) -> B,
3235
    {
3236
0
        self.inner.fold(init, |acc, x| unsafe {
3237
0
            let (k, v) = x.as_mut();
3238
0
            f(acc, (k, v))
3239
0
        })
3240
0
    }
3241
}
3242
impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
3243
    #[cfg_attr(feature = "inline-more", inline)]
3244
0
    fn len(&self) -> usize {
3245
0
        self.inner.len()
3246
0
    }
3247
}
3248
impl<K, V> FusedIterator for IterMut<'_, K, V> {}
3249
3250
impl<K, V> fmt::Debug for IterMut<'_, K, V>
3251
where
3252
    K: fmt::Debug,
3253
    V: fmt::Debug,
3254
{
3255
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3256
0
        f.debug_list().entries(self.iter()).finish()
3257
0
    }
3258
}
3259
3260
impl<K, V, A: Allocator> Default for IntoIter<K, V, A> {
3261
    #[cfg_attr(feature = "inline-more", inline)]
3262
0
    fn default() -> Self {
3263
0
        Self {
3264
0
            inner: Default::default(),
3265
0
        }
3266
0
    }
3267
}
3268
impl<K, V, A: Allocator> Iterator for IntoIter<K, V, A> {
3269
    type Item = (K, V);
3270
3271
    #[cfg_attr(feature = "inline-more", inline)]
3272
0
    fn next(&mut self) -> Option<(K, V)> {
3273
0
        self.inner.next()
3274
0
    }
3275
    #[cfg_attr(feature = "inline-more", inline)]
3276
0
    fn size_hint(&self) -> (usize, Option<usize>) {
3277
0
        self.inner.size_hint()
3278
0
    }
3279
    #[cfg_attr(feature = "inline-more", inline)]
3280
0
    fn fold<B, F>(self, init: B, f: F) -> B
3281
0
    where
3282
0
        Self: Sized,
3283
0
        F: FnMut(B, Self::Item) -> B,
3284
    {
3285
0
        self.inner.fold(init, f)
3286
0
    }
3287
}
3288
impl<K, V, A: Allocator> ExactSizeIterator for IntoIter<K, V, A> {
3289
    #[cfg_attr(feature = "inline-more", inline)]
3290
0
    fn len(&self) -> usize {
3291
0
        self.inner.len()
3292
0
    }
3293
}
3294
impl<K, V, A: Allocator> FusedIterator for IntoIter<K, V, A> {}
3295
3296
impl<K: Debug, V: Debug, A: Allocator> fmt::Debug for IntoIter<K, V, A> {
3297
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3298
0
        f.debug_list().entries(self.iter()).finish()
3299
0
    }
3300
}
3301
3302
impl<K, V> Default for Keys<'_, K, V> {
3303
    #[cfg_attr(feature = "inline-more", inline)]
3304
0
    fn default() -> Self {
3305
0
        Self {
3306
0
            inner: Default::default(),
3307
0
        }
3308
0
    }
3309
}
3310
impl<'a, K, V> Iterator for Keys<'a, K, V> {
3311
    type Item = &'a K;
3312
3313
    #[cfg_attr(feature = "inline-more", inline)]
3314
0
    fn next(&mut self) -> Option<&'a K> {
3315
        // Avoid `Option::map` because it bloats LLVM IR.
3316
0
        match self.inner.next() {
3317
0
            Some((k, _)) => Some(k),
3318
0
            None => None,
3319
        }
3320
0
    }
3321
    #[cfg_attr(feature = "inline-more", inline)]
3322
0
    fn size_hint(&self) -> (usize, Option<usize>) {
3323
0
        self.inner.size_hint()
3324
0
    }
3325
    #[cfg_attr(feature = "inline-more", inline)]
3326
0
    fn fold<B, F>(self, init: B, mut f: F) -> B
3327
0
    where
3328
0
        Self: Sized,
3329
0
        F: FnMut(B, Self::Item) -> B,
3330
    {
3331
0
        self.inner.fold(init, |acc, (k, _)| f(acc, k))
3332
0
    }
3333
}
3334
impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
3335
    #[cfg_attr(feature = "inline-more", inline)]
3336
0
    fn len(&self) -> usize {
3337
0
        self.inner.len()
3338
0
    }
3339
}
3340
impl<K, V> FusedIterator for Keys<'_, K, V> {}
3341
3342
impl<K, V> Default for Values<'_, K, V> {
3343
    #[cfg_attr(feature = "inline-more", inline)]
3344
0
    fn default() -> Self {
3345
0
        Self {
3346
0
            inner: Default::default(),
3347
0
        }
3348
0
    }
3349
}
3350
impl<'a, K, V> Iterator for Values<'a, K, V> {
3351
    type Item = &'a V;
3352
3353
    #[cfg_attr(feature = "inline-more", inline)]
3354
0
    fn next(&mut self) -> Option<&'a V> {
3355
        // Avoid `Option::map` because it bloats LLVM IR.
3356
0
        match self.inner.next() {
3357
0
            Some((_, v)) => Some(v),
3358
0
            None => None,
3359
        }
3360
0
    }
3361
    #[cfg_attr(feature = "inline-more", inline)]
3362
0
    fn size_hint(&self) -> (usize, Option<usize>) {
3363
0
        self.inner.size_hint()
3364
0
    }
3365
    #[cfg_attr(feature = "inline-more", inline)]
3366
0
    fn fold<B, F>(self, init: B, mut f: F) -> B
3367
0
    where
3368
0
        Self: Sized,
3369
0
        F: FnMut(B, Self::Item) -> B,
3370
    {
3371
0
        self.inner.fold(init, |acc, (_, v)| f(acc, v))
3372
0
    }
3373
}
3374
impl<K, V> ExactSizeIterator for Values<'_, K, V> {
3375
    #[cfg_attr(feature = "inline-more", inline)]
3376
0
    fn len(&self) -> usize {
3377
0
        self.inner.len()
3378
0
    }
3379
}
3380
impl<K, V> FusedIterator for Values<'_, K, V> {}
3381
3382
impl<K, V> Default for ValuesMut<'_, K, V> {
3383
    #[cfg_attr(feature = "inline-more", inline)]
3384
0
    fn default() -> Self {
3385
0
        Self {
3386
0
            inner: Default::default(),
3387
0
        }
3388
0
    }
3389
}
3390
impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
3391
    type Item = &'a mut V;
3392
3393
    #[cfg_attr(feature = "inline-more", inline)]
3394
0
    fn next(&mut self) -> Option<&'a mut V> {
3395
        // Avoid `Option::map` because it bloats LLVM IR.
3396
0
        match self.inner.next() {
3397
0
            Some((_, v)) => Some(v),
3398
0
            None => None,
3399
        }
3400
0
    }
3401
    #[cfg_attr(feature = "inline-more", inline)]
3402
0
    fn size_hint(&self) -> (usize, Option<usize>) {
3403
0
        self.inner.size_hint()
3404
0
    }
3405
    #[cfg_attr(feature = "inline-more", inline)]
3406
0
    fn fold<B, F>(self, init: B, mut f: F) -> B
3407
0
    where
3408
0
        Self: Sized,
3409
0
        F: FnMut(B, Self::Item) -> B,
3410
    {
3411
0
        self.inner.fold(init, |acc, (_, v)| f(acc, v))
3412
0
    }
3413
}
3414
impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
3415
    #[cfg_attr(feature = "inline-more", inline)]
3416
0
    fn len(&self) -> usize {
3417
0
        self.inner.len()
3418
0
    }
3419
}
3420
impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
3421
3422
impl<K, V: Debug> fmt::Debug for ValuesMut<'_, K, V> {
3423
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3424
0
        f.debug_list()
3425
0
            .entries(self.inner.iter().map(|(_, val)| val))
3426
0
            .finish()
3427
0
    }
3428
}
3429
3430
impl<K, V, A: Allocator> Iterator for Drain<'_, K, V, A> {
3431
    type Item = (K, V);
3432
3433
    #[cfg_attr(feature = "inline-more", inline)]
3434
0
    fn next(&mut self) -> Option<(K, V)> {
3435
0
        self.inner.next()
3436
0
    }
3437
    #[cfg_attr(feature = "inline-more", inline)]
3438
0
    fn size_hint(&self) -> (usize, Option<usize>) {
3439
0
        self.inner.size_hint()
3440
0
    }
3441
    #[cfg_attr(feature = "inline-more", inline)]
3442
0
    fn fold<B, F>(self, init: B, f: F) -> B
3443
0
    where
3444
0
        Self: Sized,
3445
0
        F: FnMut(B, Self::Item) -> B,
3446
    {
3447
0
        self.inner.fold(init, f)
3448
0
    }
3449
}
3450
impl<K, V, A: Allocator> ExactSizeIterator for Drain<'_, K, V, A> {
3451
    #[cfg_attr(feature = "inline-more", inline)]
3452
0
    fn len(&self) -> usize {
3453
0
        self.inner.len()
3454
0
    }
3455
}
3456
impl<K, V, A: Allocator> FusedIterator for Drain<'_, K, V, A> {}
3457
3458
impl<K, V, A> fmt::Debug for Drain<'_, K, V, A>
3459
where
3460
    K: fmt::Debug,
3461
    V: fmt::Debug,
3462
    A: Allocator,
3463
{
3464
0
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3465
0
        f.debug_list().entries(self.iter()).finish()
3466
0
    }
3467
}
3468
3469
impl<'a, K, V, S, A: Allocator> Entry<'a, K, V, S, A> {
3470
    /// Sets the value of the entry, and returns an `OccupiedEntry`.
3471
    ///
3472
    /// # Examples
3473
    ///
3474
    /// ```
3475
    /// use hashbrown::HashMap;
3476
    ///
3477
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3478
    /// let entry = map.entry("horseyland").insert(37);
3479
    ///
3480
    /// assert_eq!(entry.key(), &"horseyland");
3481
    /// ```
3482
    #[cfg_attr(feature = "inline-more", inline)]
3483
0
    pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>
3484
0
    where
3485
0
        K: Hash,
3486
0
        S: BuildHasher,
3487
    {
3488
0
        match self {
3489
0
            Entry::Occupied(mut entry) => {
3490
0
                entry.insert(value);
3491
0
                entry
3492
            }
3493
0
            Entry::Vacant(entry) => entry.insert_entry(value),
3494
        }
3495
0
    }
3496
3497
    /// Ensures a value is in the entry by inserting the default if empty, and returns
3498
    /// a mutable reference to the value in the entry.
3499
    ///
3500
    /// # Examples
3501
    ///
3502
    /// ```
3503
    /// use hashbrown::HashMap;
3504
    ///
3505
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3506
    ///
3507
    /// // nonexistent key
3508
    /// map.entry("poneyland").or_insert(3);
3509
    /// assert_eq!(map["poneyland"], 3);
3510
    ///
3511
    /// // existing key
3512
    /// *map.entry("poneyland").or_insert(10) *= 2;
3513
    /// assert_eq!(map["poneyland"], 6);
3514
    /// ```
3515
    #[cfg_attr(feature = "inline-more", inline)]
3516
0
    pub fn or_insert(self, default: V) -> &'a mut V
3517
0
    where
3518
0
        K: Hash,
3519
0
        S: BuildHasher,
3520
    {
3521
0
        match self {
3522
0
            Entry::Occupied(entry) => entry.into_mut(),
3523
0
            Entry::Vacant(entry) => entry.insert(default),
3524
        }
3525
0
    }
3526
3527
    /// Ensures a value is in the entry by inserting the default if empty,
3528
    /// and returns an [`OccupiedEntry`].
3529
    ///
3530
    /// # Examples
3531
    ///
3532
    /// ```
3533
    /// use hashbrown::HashMap;
3534
    ///
3535
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3536
    ///
3537
    /// // nonexistent key
3538
    /// let entry = map.entry("poneyland").or_insert_entry(3);
3539
    /// assert_eq!(entry.key(), &"poneyland");
3540
    /// assert_eq!(entry.get(), &3);
3541
    ///
3542
    /// // existing key
3543
    /// let mut entry = map.entry("poneyland").or_insert_entry(10);
3544
    /// assert_eq!(entry.key(), &"poneyland");
3545
    /// assert_eq!(entry.get(), &3);
3546
    /// ```
3547
    #[cfg_attr(feature = "inline-more", inline)]
3548
0
    pub fn or_insert_entry(self, default: V) -> OccupiedEntry<'a, K, V, S, A>
3549
0
    where
3550
0
        K: Hash,
3551
0
        S: BuildHasher,
3552
    {
3553
0
        match self {
3554
0
            Entry::Occupied(entry) => entry,
3555
0
            Entry::Vacant(entry) => entry.insert_entry(default),
3556
        }
3557
0
    }
3558
3559
    /// Ensures a value is in the entry by inserting the result of the default function if empty,
3560
    /// and returns a mutable reference to the value in the entry.
3561
    ///
3562
    /// # Examples
3563
    ///
3564
    /// ```
3565
    /// use hashbrown::HashMap;
3566
    ///
3567
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3568
    ///
3569
    /// // nonexistent key
3570
    /// map.entry("poneyland").or_insert_with(|| 3);
3571
    /// assert_eq!(map["poneyland"], 3);
3572
    ///
3573
    /// // existing key
3574
    /// *map.entry("poneyland").or_insert_with(|| 10) *= 2;
3575
    /// assert_eq!(map["poneyland"], 6);
3576
    /// ```
3577
    #[cfg_attr(feature = "inline-more", inline)]
3578
0
    pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V
3579
0
    where
3580
0
        K: Hash,
3581
0
        S: BuildHasher,
3582
    {
3583
0
        match self {
3584
0
            Entry::Occupied(entry) => entry.into_mut(),
3585
0
            Entry::Vacant(entry) => entry.insert(default()),
3586
        }
3587
0
    }
3588
3589
    /// Ensures a value is in the entry by inserting, if empty, the result of the default function.
3590
    /// This method allows for generating key-derived values for insertion by providing the default
3591
    /// function a reference to the key that was moved during the `.entry(key)` method call.
3592
    ///
3593
    /// The reference to the moved key is provided so that cloning or copying the key is
3594
    /// unnecessary, unlike with `.or_insert_with(|| ... )`.
3595
    ///
3596
    /// # Examples
3597
    ///
3598
    /// ```
3599
    /// use hashbrown::HashMap;
3600
    ///
3601
    /// let mut map: HashMap<&str, usize> = HashMap::new();
3602
    ///
3603
    /// // nonexistent key
3604
    /// map.entry("poneyland").or_insert_with_key(|key| key.chars().count());
3605
    /// assert_eq!(map["poneyland"], 9);
3606
    ///
3607
    /// // existing key
3608
    /// *map.entry("poneyland").or_insert_with_key(|key| key.chars().count() * 10) *= 2;
3609
    /// assert_eq!(map["poneyland"], 18);
3610
    /// ```
3611
    #[cfg_attr(feature = "inline-more", inline)]
3612
0
    pub fn or_insert_with_key<F: FnOnce(&K) -> V>(self, default: F) -> &'a mut V
3613
0
    where
3614
0
        K: Hash,
3615
0
        S: BuildHasher,
3616
    {
3617
0
        match self {
3618
0
            Entry::Occupied(entry) => entry.into_mut(),
3619
0
            Entry::Vacant(entry) => {
3620
0
                let value = default(entry.key());
3621
0
                entry.insert(value)
3622
            }
3623
        }
3624
0
    }
3625
3626
    /// Returns a reference to this entry's key.
3627
    ///
3628
    /// # Examples
3629
    ///
3630
    /// ```
3631
    /// use hashbrown::HashMap;
3632
    ///
3633
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3634
    /// map.entry("poneyland").or_insert(3);
3635
    /// // existing key
3636
    /// assert_eq!(map.entry("poneyland").key(), &"poneyland");
3637
    /// // nonexistent key
3638
    /// assert_eq!(map.entry("horseland").key(), &"horseland");
3639
    /// ```
3640
    #[cfg_attr(feature = "inline-more", inline)]
3641
0
    pub fn key(&self) -> &K {
3642
0
        match *self {
3643
0
            Entry::Occupied(ref entry) => entry.key(),
3644
0
            Entry::Vacant(ref entry) => entry.key(),
3645
        }
3646
0
    }
3647
3648
    /// Provides in-place mutable access to an occupied entry before any
3649
    /// potential inserts into the map.
3650
    ///
3651
    /// # Examples
3652
    ///
3653
    /// ```
3654
    /// use hashbrown::HashMap;
3655
    ///
3656
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3657
    ///
3658
    /// map.entry("poneyland")
3659
    ///    .and_modify(|e| { *e += 1 })
3660
    ///    .or_insert(42);
3661
    /// assert_eq!(map["poneyland"], 42);
3662
    ///
3663
    /// map.entry("poneyland")
3664
    ///    .and_modify(|e| { *e += 1 })
3665
    ///    .or_insert(42);
3666
    /// assert_eq!(map["poneyland"], 43);
3667
    /// ```
3668
    #[cfg_attr(feature = "inline-more", inline)]
3669
0
    pub fn and_modify<F>(self, f: F) -> Self
3670
0
    where
3671
0
        F: FnOnce(&mut V),
3672
    {
3673
0
        match self {
3674
0
            Entry::Occupied(mut entry) => {
3675
0
                f(entry.get_mut());
3676
0
                Entry::Occupied(entry)
3677
            }
3678
0
            Entry::Vacant(entry) => Entry::Vacant(entry),
3679
        }
3680
0
    }
3681
3682
    /// Provides shared access to the key and owned access to the value of
3683
    /// an occupied entry and allows to replace or remove it based on the
3684
    /// value of the returned option.
3685
    ///
3686
    /// # Examples
3687
    ///
3688
    /// ```
3689
    /// use hashbrown::HashMap;
3690
    /// use hashbrown::hash_map::Entry;
3691
    ///
3692
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3693
    ///
3694
    /// let entry = map
3695
    ///     .entry("poneyland")
3696
    ///     .and_replace_entry_with(|_k, _v| panic!());
3697
    ///
3698
    /// match entry {
3699
    ///     Entry::Vacant(e) => {
3700
    ///         assert_eq!(e.key(), &"poneyland");
3701
    ///     }
3702
    ///     Entry::Occupied(_) => panic!(),
3703
    /// }
3704
    ///
3705
    /// map.insert("poneyland", 42);
3706
    ///
3707
    /// let entry = map
3708
    ///     .entry("poneyland")
3709
    ///     .and_replace_entry_with(|k, v| {
3710
    ///         assert_eq!(k, &"poneyland");
3711
    ///         assert_eq!(v, 42);
3712
    ///         Some(v + 1)
3713
    ///     });
3714
    ///
3715
    /// match entry {
3716
    ///     Entry::Occupied(e) => {
3717
    ///         assert_eq!(e.key(), &"poneyland");
3718
    ///         assert_eq!(e.get(), &43);
3719
    ///     }
3720
    ///     Entry::Vacant(_) => panic!(),
3721
    /// }
3722
    ///
3723
    /// assert_eq!(map["poneyland"], 43);
3724
    ///
3725
    /// let entry = map
3726
    ///     .entry("poneyland")
3727
    ///     .and_replace_entry_with(|_k, _v| None);
3728
    ///
3729
    /// match entry {
3730
    ///     Entry::Vacant(e) => assert_eq!(e.key(), &"poneyland"),
3731
    ///     Entry::Occupied(_) => panic!(),
3732
    /// }
3733
    ///
3734
    /// assert!(!map.contains_key("poneyland"));
3735
    /// ```
3736
    #[cfg_attr(feature = "inline-more", inline)]
3737
0
    pub fn and_replace_entry_with<F>(self, f: F) -> Self
3738
0
    where
3739
0
        F: FnOnce(&K, V) -> Option<V>,
3740
    {
3741
0
        match self {
3742
0
            Entry::Occupied(entry) => entry.replace_entry_with(f),
3743
0
            Entry::Vacant(_) => self,
3744
        }
3745
0
    }
3746
}
3747
3748
impl<'a, K, V: Default, S, A: Allocator> Entry<'a, K, V, S, A> {
3749
    /// Ensures a value is in the entry by inserting the default value if empty,
3750
    /// and returns a mutable reference to the value in the entry.
3751
    ///
3752
    /// # Examples
3753
    ///
3754
    /// ```
3755
    /// use hashbrown::HashMap;
3756
    ///
3757
    /// let mut map: HashMap<&str, Option<u32>> = HashMap::new();
3758
    ///
3759
    /// // nonexistent key
3760
    /// map.entry("poneyland").or_default();
3761
    /// assert_eq!(map["poneyland"], None);
3762
    ///
3763
    /// map.insert("horseland", Some(3));
3764
    ///
3765
    /// // existing key
3766
    /// assert_eq!(map.entry("horseland").or_default(), &mut Some(3));
3767
    /// ```
3768
    #[cfg_attr(feature = "inline-more", inline)]
3769
0
    pub fn or_default(self) -> &'a mut V
3770
0
    where
3771
0
        K: Hash,
3772
0
        S: BuildHasher,
3773
    {
3774
0
        match self {
3775
0
            Entry::Occupied(entry) => entry.into_mut(),
3776
0
            Entry::Vacant(entry) => entry.insert(Default::default()),
3777
        }
3778
0
    }
3779
}
3780
3781
impl<'a, K, V, S, A: Allocator> OccupiedEntry<'a, K, V, S, A> {
3782
    /// Gets a reference to the key in the entry.
3783
    ///
3784
    /// # Examples
3785
    ///
3786
    /// ```
3787
    /// use hashbrown::hash_map::{Entry, HashMap};
3788
    ///
3789
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3790
    /// map.entry("poneyland").or_insert(12);
3791
    ///
3792
    /// match map.entry("poneyland") {
3793
    ///     Entry::Vacant(_) => panic!(),
3794
    ///     Entry::Occupied(entry) => assert_eq!(entry.key(), &"poneyland"),
3795
    /// }
3796
    /// ```
3797
    #[cfg_attr(feature = "inline-more", inline)]
3798
0
    pub fn key(&self) -> &K {
3799
0
        unsafe { &self.elem.as_ref().0 }
3800
0
    }
3801
3802
    /// Take the ownership of the key and value from the map.
3803
    /// Keeps the allocated memory for reuse.
3804
    ///
3805
    /// # Examples
3806
    ///
3807
    /// ```
3808
    /// use hashbrown::HashMap;
3809
    /// use hashbrown::hash_map::Entry;
3810
    ///
3811
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3812
    /// // The map is empty
3813
    /// assert!(map.is_empty() && map.capacity() == 0);
3814
    ///
3815
    /// map.entry("poneyland").or_insert(12);
3816
    ///
3817
    /// if let Entry::Occupied(o) = map.entry("poneyland") {
3818
    ///     // We delete the entry from the map.
3819
    ///     assert_eq!(o.remove_entry(), ("poneyland", 12));
3820
    /// }
3821
    ///
3822
    /// assert_eq!(map.contains_key("poneyland"), false);
3823
    /// // Now map hold none elements
3824
    /// assert!(map.is_empty());
3825
    /// ```
3826
    #[cfg_attr(feature = "inline-more", inline)]
3827
0
    pub fn remove_entry(self) -> (K, V) {
3828
0
        unsafe { self.table.table.remove(self.elem).0 }
3829
0
    }
3830
3831
    /// Gets a reference to the value in the entry.
3832
    ///
3833
    /// # Examples
3834
    ///
3835
    /// ```
3836
    /// use hashbrown::HashMap;
3837
    /// use hashbrown::hash_map::Entry;
3838
    ///
3839
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3840
    /// map.entry("poneyland").or_insert(12);
3841
    ///
3842
    /// match map.entry("poneyland") {
3843
    ///     Entry::Vacant(_) => panic!(),
3844
    ///     Entry::Occupied(entry) => assert_eq!(entry.get(), &12),
3845
    /// }
3846
    /// ```
3847
    #[cfg_attr(feature = "inline-more", inline)]
3848
0
    pub fn get(&self) -> &V {
3849
0
        unsafe { &self.elem.as_ref().1 }
3850
0
    }
3851
3852
    /// Gets a mutable reference to the value in the entry.
3853
    ///
3854
    /// If you need a reference to the `OccupiedEntry` which may outlive the
3855
    /// destruction of the `Entry` value, see [`into_mut`].
3856
    ///
3857
    /// [`into_mut`]: #method.into_mut
3858
    ///
3859
    /// # Examples
3860
    ///
3861
    /// ```
3862
    /// use hashbrown::HashMap;
3863
    /// use hashbrown::hash_map::Entry;
3864
    ///
3865
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3866
    /// map.entry("poneyland").or_insert(12);
3867
    ///
3868
    /// assert_eq!(map["poneyland"], 12);
3869
    /// if let Entry::Occupied(mut o) = map.entry("poneyland") {
3870
    ///     *o.get_mut() += 10;
3871
    ///     assert_eq!(*o.get(), 22);
3872
    ///
3873
    ///     // We can use the same Entry multiple times.
3874
    ///     *o.get_mut() += 2;
3875
    /// }
3876
    ///
3877
    /// assert_eq!(map["poneyland"], 24);
3878
    /// ```
3879
    #[cfg_attr(feature = "inline-more", inline)]
3880
0
    pub fn get_mut(&mut self) -> &mut V {
3881
0
        unsafe { &mut self.elem.as_mut().1 }
3882
0
    }
3883
3884
    /// Converts the `OccupiedEntry` into a mutable reference to the value in the entry
3885
    /// with a lifetime bound to the map itself.
3886
    ///
3887
    /// If you need multiple references to the `OccupiedEntry`, see [`get_mut`].
3888
    ///
3889
    /// [`get_mut`]: #method.get_mut
3890
    ///
3891
    /// # Examples
3892
    ///
3893
    /// ```
3894
    /// use hashbrown::hash_map::{Entry, HashMap};
3895
    ///
3896
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3897
    /// map.entry("poneyland").or_insert(12);
3898
    ///
3899
    /// assert_eq!(map["poneyland"], 12);
3900
    ///
3901
    /// let value: &mut u32;
3902
    /// match map.entry("poneyland") {
3903
    ///     Entry::Occupied(entry) => value = entry.into_mut(),
3904
    ///     Entry::Vacant(_) => panic!(),
3905
    /// }
3906
    /// *value += 10;
3907
    ///
3908
    /// assert_eq!(map["poneyland"], 22);
3909
    /// ```
3910
    #[cfg_attr(feature = "inline-more", inline)]
3911
0
    pub fn into_mut(self) -> &'a mut V {
3912
0
        unsafe { &mut self.elem.as_mut().1 }
3913
0
    }
3914
3915
    /// Sets the value of the entry, and returns the entry's old value.
3916
    ///
3917
    /// # Examples
3918
    ///
3919
    /// ```
3920
    /// use hashbrown::HashMap;
3921
    /// use hashbrown::hash_map::Entry;
3922
    ///
3923
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3924
    /// map.entry("poneyland").or_insert(12);
3925
    ///
3926
    /// if let Entry::Occupied(mut o) = map.entry("poneyland") {
3927
    ///     assert_eq!(o.insert(15), 12);
3928
    /// }
3929
    ///
3930
    /// assert_eq!(map["poneyland"], 15);
3931
    /// ```
3932
    #[cfg_attr(feature = "inline-more", inline)]
3933
0
    pub fn insert(&mut self, value: V) -> V {
3934
0
        mem::replace(self.get_mut(), value)
3935
0
    }
3936
3937
    /// Takes the value out of the entry, and returns it.
3938
    /// Keeps the allocated memory for reuse.
3939
    ///
3940
    /// # Examples
3941
    ///
3942
    /// ```
3943
    /// use hashbrown::HashMap;
3944
    /// use hashbrown::hash_map::Entry;
3945
    ///
3946
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3947
    /// // The map is empty
3948
    /// assert!(map.is_empty() && map.capacity() == 0);
3949
    ///
3950
    /// map.entry("poneyland").or_insert(12);
3951
    ///
3952
    /// if let Entry::Occupied(o) = map.entry("poneyland") {
3953
    ///     assert_eq!(o.remove(), 12);
3954
    /// }
3955
    ///
3956
    /// assert_eq!(map.contains_key("poneyland"), false);
3957
    /// // Now map hold none elements
3958
    /// assert!(map.is_empty());
3959
    /// ```
3960
    #[cfg_attr(feature = "inline-more", inline)]
3961
0
    pub fn remove(self) -> V {
3962
0
        self.remove_entry().1
3963
0
    }
3964
3965
    /// Provides shared access to the key and owned access to the value of
3966
    /// the entry and allows to replace or remove it based on the
3967
    /// value of the returned option.
3968
    ///
3969
    /// # Examples
3970
    ///
3971
    /// ```
3972
    /// use hashbrown::HashMap;
3973
    /// use hashbrown::hash_map::Entry;
3974
    ///
3975
    /// let mut map: HashMap<&str, u32> = HashMap::new();
3976
    /// map.insert("poneyland", 42);
3977
    ///
3978
    /// let entry = match map.entry("poneyland") {
3979
    ///     Entry::Occupied(e) => {
3980
    ///         e.replace_entry_with(|k, v| {
3981
    ///             assert_eq!(k, &"poneyland");
3982
    ///             assert_eq!(v, 42);
3983
    ///             Some(v + 1)
3984
    ///         })
3985
    ///     }
3986
    ///     Entry::Vacant(_) => panic!(),
3987
    /// };
3988
    ///
3989
    /// match entry {
3990
    ///     Entry::Occupied(e) => {
3991
    ///         assert_eq!(e.key(), &"poneyland");
3992
    ///         assert_eq!(e.get(), &43);
3993
    ///     }
3994
    ///     Entry::Vacant(_) => panic!(),
3995
    /// }
3996
    ///
3997
    /// assert_eq!(map["poneyland"], 43);
3998
    ///
3999
    /// let entry = match map.entry("poneyland") {
4000
    ///     Entry::Occupied(e) => e.replace_entry_with(|_k, _v| None),
4001
    ///     Entry::Vacant(_) => panic!(),
4002
    /// };
4003
    ///
4004
    /// match entry {
4005
    ///     Entry::Vacant(e) => {
4006
    ///         assert_eq!(e.key(), &"poneyland");
4007
    ///     }
4008
    ///     Entry::Occupied(_) => panic!(),
4009
    /// }
4010
    ///
4011
    /// assert!(!map.contains_key("poneyland"));
4012
    /// ```
4013
    #[cfg_attr(feature = "inline-more", inline)]
4014
0
    pub fn replace_entry_with<F>(self, f: F) -> Entry<'a, K, V, S, A>
4015
0
    where
4016
0
        F: FnOnce(&K, V) -> Option<V>,
4017
    {
4018
        unsafe {
4019
0
            let mut spare_key = None;
4020
4021
0
            self.table
4022
0
                .table
4023
0
                .replace_bucket_with(self.elem.clone(), |(key, value)| {
4024
0
                    if let Some(new_value) = f(&key, value) {
4025
0
                        Some((key, new_value))
4026
                    } else {
4027
0
                        spare_key = Some(key);
4028
0
                        None
4029
                    }
4030
0
                });
4031
4032
0
            if let Some(key) = spare_key {
4033
0
                Entry::Vacant(VacantEntry {
4034
0
                    hash: self.hash,
4035
0
                    key,
4036
0
                    table: self.table,
4037
0
                })
4038
            } else {
4039
0
                Entry::Occupied(self)
4040
            }
4041
        }
4042
0
    }
4043
}
4044
4045
impl<'a, K, V, S, A: Allocator> VacantEntry<'a, K, V, S, A> {
4046
    /// Gets a reference to the key that would be used when inserting a value
4047
    /// through the `VacantEntry`.
4048
    ///
4049
    /// # Examples
4050
    ///
4051
    /// ```
4052
    /// use hashbrown::HashMap;
4053
    ///
4054
    /// let mut map: HashMap<&str, u32> = HashMap::new();
4055
    /// assert_eq!(map.entry("poneyland").key(), &"poneyland");
4056
    /// ```
4057
    #[cfg_attr(feature = "inline-more", inline)]
4058
0
    pub fn key(&self) -> &K {
4059
0
        &self.key
4060
0
    }
4061
4062
    /// Take ownership of the key.
4063
    ///
4064
    /// # Examples
4065
    ///
4066
    /// ```
4067
    /// use hashbrown::hash_map::{Entry, HashMap};
4068
    ///
4069
    /// let mut map: HashMap<&str, u32> = HashMap::new();
4070
    ///
4071
    /// match map.entry("poneyland") {
4072
    ///     Entry::Occupied(_) => panic!(),
4073
    ///     Entry::Vacant(v) => assert_eq!(v.into_key(), "poneyland"),
4074
    /// }
4075
    /// ```
4076
    #[cfg_attr(feature = "inline-more", inline)]
4077
0
    pub fn into_key(self) -> K {
4078
0
        self.key
4079
0
    }
4080
4081
    /// Sets the value of the entry with the [`VacantEntry`]'s key,
4082
    /// and returns a mutable reference to it.
4083
    ///
4084
    /// # Examples
4085
    ///
4086
    /// ```
4087
    /// use hashbrown::HashMap;
4088
    /// use hashbrown::hash_map::Entry;
4089
    ///
4090
    /// let mut map: HashMap<&str, u32> = HashMap::new();
4091
    ///
4092
    /// if let Entry::Vacant(o) = map.entry("poneyland") {
4093
    ///     o.insert(37);
4094
    /// }
4095
    /// assert_eq!(map["poneyland"], 37);
4096
    /// ```
4097
    #[cfg_attr(feature = "inline-more", inline)]
4098
0
    pub fn insert(self, value: V) -> &'a mut V
4099
0
    where
4100
0
        K: Hash,
4101
0
        S: BuildHasher,
4102
    {
4103
0
        let table = &mut self.table.table;
4104
0
        let entry = table.insert_entry(
4105
0
            self.hash,
4106
0
            (self.key, value),
4107
0
            make_hasher::<_, V, S>(&self.table.hash_builder),
4108
        );
4109
0
        &mut entry.1
4110
0
    }
4111
4112
    /// Sets the value of the entry with the [`VacantEntry`]'s key,
4113
    /// and returns an [`OccupiedEntry`].
4114
    ///
4115
    /// # Examples
4116
    ///
4117
    /// ```
4118
    /// use hashbrown::HashMap;
4119
    /// use hashbrown::hash_map::Entry;
4120
    ///
4121
    /// let mut map: HashMap<&str, u32> = HashMap::new();
4122
    ///
4123
    /// if let Entry::Vacant(v) = map.entry("poneyland") {
4124
    ///     let o = v.insert_entry(37);
4125
    ///     assert_eq!(o.get(), &37);
4126
    /// }
4127
    /// ```
4128
    #[cfg_attr(feature = "inline-more", inline)]
4129
0
    pub fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S, A>
4130
0
    where
4131
0
        K: Hash,
4132
0
        S: BuildHasher,
4133
    {
4134
0
        let elem = self.table.table.insert(
4135
0
            self.hash,
4136
0
            (self.key, value),
4137
0
            make_hasher::<_, V, S>(&self.table.hash_builder),
4138
        );
4139
0
        OccupiedEntry {
4140
0
            hash: self.hash,
4141
0
            elem,
4142
0
            table: self.table,
4143
0
        }
4144
0
    }
4145
}
4146
4147
impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator> EntryRef<'a, 'b, K, Q, V, S, A> {
4148
    /// Sets the value of the entry, and returns an `OccupiedEntry`.
4149
    ///
4150
    /// # Examples
4151
    ///
4152
    /// ```
4153
    /// use hashbrown::HashMap;
4154
    ///
4155
    /// let mut map: HashMap<String, u32> = HashMap::new();
4156
    /// let entry = map.entry_ref("horseyland").insert(37);
4157
    ///
4158
    /// assert_eq!(entry.key(), "horseyland");
4159
    /// ```
4160
    #[cfg_attr(feature = "inline-more", inline)]
4161
0
    pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A>
4162
0
    where
4163
0
        K: Hash,
4164
0
        &'b Q: Into<K>,
4165
0
        S: BuildHasher,
4166
    {
4167
0
        match self {
4168
0
            EntryRef::Occupied(mut entry) => {
4169
0
                entry.insert(value);
4170
0
                entry
4171
            }
4172
0
            EntryRef::Vacant(entry) => entry.insert_entry(value),
4173
        }
4174
0
    }
4175
4176
    /// Ensures a value is in the entry by inserting the default if empty, and returns
4177
    /// a mutable reference to the value in the entry.
4178
    ///
4179
    /// # Examples
4180
    ///
4181
    /// ```
4182
    /// use hashbrown::HashMap;
4183
    ///
4184
    /// let mut map: HashMap<String, u32> = HashMap::new();
4185
    ///
4186
    /// // nonexistent key
4187
    /// map.entry_ref("poneyland").or_insert(3);
4188
    /// assert_eq!(map["poneyland"], 3);
4189
    ///
4190
    /// // existing key
4191
    /// *map.entry_ref("poneyland").or_insert(10) *= 2;
4192
    /// assert_eq!(map["poneyland"], 6);
4193
    /// ```
4194
    #[cfg_attr(feature = "inline-more", inline)]
4195
0
    pub fn or_insert(self, default: V) -> &'a mut V
4196
0
    where
4197
0
        K: Hash,
4198
0
        &'b Q: Into<K>,
4199
0
        S: BuildHasher,
4200
    {
4201
0
        match self {
4202
0
            EntryRef::Occupied(entry) => entry.into_mut(),
4203
0
            EntryRef::Vacant(entry) => entry.insert(default),
4204
        }
4205
0
    }
4206
4207
    /// Ensures a value is in the entry by inserting the result of the default function if empty,
4208
    /// and returns a mutable reference to the value in the entry.
4209
    ///
4210
    /// # Examples
4211
    ///
4212
    /// ```
4213
    /// use hashbrown::HashMap;
4214
    ///
4215
    /// let mut map: HashMap<String, u32> = HashMap::new();
4216
    ///
4217
    /// // nonexistent key
4218
    /// map.entry_ref("poneyland").or_insert_with(|| 3);
4219
    /// assert_eq!(map["poneyland"], 3);
4220
    ///
4221
    /// // existing key
4222
    /// *map.entry_ref("poneyland").or_insert_with(|| 10) *= 2;
4223
    /// assert_eq!(map["poneyland"], 6);
4224
    /// ```
4225
    #[cfg_attr(feature = "inline-more", inline)]
4226
0
    pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V
4227
0
    where
4228
0
        K: Hash,
4229
0
        &'b Q: Into<K>,
4230
0
        S: BuildHasher,
4231
    {
4232
0
        match self {
4233
0
            EntryRef::Occupied(entry) => entry.into_mut(),
4234
0
            EntryRef::Vacant(entry) => entry.insert(default()),
4235
        }
4236
0
    }
4237
4238
    /// Ensures a value is in the entry by inserting, if empty, the result of the default function.
4239
    /// This method allows for generating key-derived values for insertion by providing the default
4240
    /// function an access to the borrower form of the key.
4241
    ///
4242
    /// # Examples
4243
    ///
4244
    /// ```
4245
    /// use hashbrown::HashMap;
4246
    ///
4247
    /// let mut map: HashMap<String, usize> = HashMap::new();
4248
    ///
4249
    /// // nonexistent key
4250
    /// map.entry_ref("poneyland").or_insert_with_key(|key| key.chars().count());
4251
    /// assert_eq!(map["poneyland"], 9);
4252
    ///
4253
    /// // existing key
4254
    /// *map.entry_ref("poneyland").or_insert_with_key(|key| key.chars().count() * 10) *= 2;
4255
    /// assert_eq!(map["poneyland"], 18);
4256
    /// ```
4257
    #[cfg_attr(feature = "inline-more", inline)]
4258
0
    pub fn or_insert_with_key<F: FnOnce(&Q) -> V>(self, default: F) -> &'a mut V
4259
0
    where
4260
0
        K: Hash + Borrow<Q>,
4261
0
        &'b Q: Into<K>,
4262
0
        S: BuildHasher,
4263
    {
4264
0
        match self {
4265
0
            EntryRef::Occupied(entry) => entry.into_mut(),
4266
0
            EntryRef::Vacant(entry) => {
4267
0
                let value = default(entry.key);
4268
0
                entry.insert(value)
4269
            }
4270
        }
4271
0
    }
4272
4273
    /// Returns a reference to this entry's key.
4274
    ///
4275
    /// # Examples
4276
    ///
4277
    /// ```
4278
    /// use hashbrown::HashMap;
4279
    ///
4280
    /// let mut map: HashMap<String, u32> = HashMap::new();
4281
    /// map.entry_ref("poneyland").or_insert(3);
4282
    /// // existing key
4283
    /// assert_eq!(map.entry_ref("poneyland").key(), "poneyland");
4284
    /// // nonexistent key
4285
    /// assert_eq!(map.entry_ref("horseland").key(), "horseland");
4286
    /// ```
4287
    #[cfg_attr(feature = "inline-more", inline)]
4288
0
    pub fn key(&self) -> &Q
4289
0
    where
4290
0
        K: Borrow<Q>,
4291
    {
4292
0
        match *self {
4293
0
            EntryRef::Occupied(ref entry) => entry.key().borrow(),
4294
0
            EntryRef::Vacant(ref entry) => entry.key(),
4295
        }
4296
0
    }
4297
4298
    /// Provides in-place mutable access to an occupied entry before any
4299
    /// potential inserts into the map.
4300
    ///
4301
    /// # Examples
4302
    ///
4303
    /// ```
4304
    /// use hashbrown::HashMap;
4305
    ///
4306
    /// let mut map: HashMap<String, u32> = HashMap::new();
4307
    ///
4308
    /// map.entry_ref("poneyland")
4309
    ///    .and_modify(|e| { *e += 1 })
4310
    ///    .or_insert(42);
4311
    /// assert_eq!(map["poneyland"], 42);
4312
    ///
4313
    /// map.entry_ref("poneyland")
4314
    ///    .and_modify(|e| { *e += 1 })
4315
    ///    .or_insert(42);
4316
    /// assert_eq!(map["poneyland"], 43);
4317
    /// ```
4318
    #[cfg_attr(feature = "inline-more", inline)]
4319
0
    pub fn and_modify<F>(self, f: F) -> Self
4320
0
    where
4321
0
        F: FnOnce(&mut V),
4322
    {
4323
0
        match self {
4324
0
            EntryRef::Occupied(mut entry) => {
4325
0
                f(entry.get_mut());
4326
0
                EntryRef::Occupied(entry)
4327
            }
4328
0
            EntryRef::Vacant(entry) => EntryRef::Vacant(entry),
4329
        }
4330
0
    }
4331
}
4332
4333
impl<'a, 'b, K, Q: ?Sized, V: Default, S, A: Allocator> EntryRef<'a, 'b, K, Q, V, S, A> {
4334
    /// Ensures a value is in the entry by inserting the default value if empty,
4335
    /// and returns a mutable reference to the value in the entry.
4336
    ///
4337
    /// # Examples
4338
    ///
4339
    /// ```
4340
    /// use hashbrown::HashMap;
4341
    ///
4342
    /// let mut map: HashMap<String, Option<u32>> = HashMap::new();
4343
    ///
4344
    /// // nonexistent key
4345
    /// map.entry_ref("poneyland").or_default();
4346
    /// assert_eq!(map["poneyland"], None);
4347
    ///
4348
    /// map.insert("horseland".to_string(), Some(3));
4349
    ///
4350
    /// // existing key
4351
    /// assert_eq!(map.entry_ref("horseland").or_default(), &mut Some(3));
4352
    /// ```
4353
    #[cfg_attr(feature = "inline-more", inline)]
4354
0
    pub fn or_default(self) -> &'a mut V
4355
0
    where
4356
0
        K: Hash,
4357
0
        &'b Q: Into<K>,
4358
0
        S: BuildHasher,
4359
    {
4360
0
        match self {
4361
0
            EntryRef::Occupied(entry) => entry.into_mut(),
4362
0
            EntryRef::Vacant(entry) => entry.insert(Default::default()),
4363
        }
4364
0
    }
4365
4366
    /// Ensures a value is in the entry by inserting the default value if empty,
4367
    /// and returns an [`OccupiedEntry`].
4368
    ///
4369
    /// # Examples
4370
    ///
4371
    /// ```
4372
    /// use hashbrown::HashMap;
4373
    ///
4374
    /// let mut map: HashMap<String, Option<u32>> = HashMap::new();
4375
    ///
4376
    /// // nonexistent key
4377
    /// let entry = map.entry_ref("poneyland").or_default_entry();
4378
    /// assert_eq!(entry.key(), &"poneyland");
4379
    /// assert_eq!(entry.get(), &None);
4380
    ///
4381
    /// // existing key
4382
    /// map.insert("horseland".to_string(), Some(3));
4383
    /// let entry = map.entry_ref("horseland").or_default_entry();
4384
    /// assert_eq!(entry.key(), &"horseland");
4385
    /// assert_eq!(entry.get(), &Some(3));
4386
    /// ```
4387
    #[cfg_attr(feature = "inline-more", inline)]
4388
0
    pub fn or_default_entry(self) -> OccupiedEntry<'a, K, V, S, A>
4389
0
    where
4390
0
        K: Hash + From<&'b Q>,
4391
0
        S: BuildHasher,
4392
    {
4393
0
        match self {
4394
0
            EntryRef::Occupied(entry) => entry,
4395
0
            EntryRef::Vacant(entry) => entry.insert_entry(Default::default()),
4396
        }
4397
0
    }
4398
}
4399
4400
impl<'a, 'b, K, Q: ?Sized, V, S, A: Allocator> VacantEntryRef<'a, 'b, K, Q, V, S, A> {
4401
    /// Gets a reference to the key that would be used when inserting a value
4402
    /// through the `VacantEntryRef`.
4403
    ///
4404
    /// # Examples
4405
    ///
4406
    /// ```
4407
    /// use hashbrown::HashMap;
4408
    ///
4409
    /// let mut map: HashMap<String, u32> = HashMap::new();
4410
    /// let key: &str = "poneyland";
4411
    /// assert_eq!(map.entry_ref(key).key(), "poneyland");
4412
    /// ```
4413
    #[cfg_attr(feature = "inline-more", inline)]
4414
0
    pub fn key(&self) -> &'b Q {
4415
0
        self.key
4416
0
    }
4417
4418
    /// Sets the value of the entry with the `VacantEntryRef`'s key,
4419
    /// and returns a mutable reference to it.
4420
    ///
4421
    /// # Examples
4422
    ///
4423
    /// ```
4424
    /// use hashbrown::HashMap;
4425
    /// use hashbrown::hash_map::EntryRef;
4426
    ///
4427
    /// let mut map: HashMap<String, u32> = HashMap::new();
4428
    /// let key: &str = "poneyland";
4429
    ///
4430
    /// if let EntryRef::Vacant(o) = map.entry_ref(key) {
4431
    ///     o.insert(37);
4432
    /// }
4433
    /// assert_eq!(map["poneyland"], 37);
4434
    /// ```
4435
    #[cfg_attr(feature = "inline-more", inline)]
4436
0
    pub fn insert(self, value: V) -> &'a mut V
4437
0
    where
4438
0
        K: Hash,
4439
0
        &'b Q: Into<K>,
4440
0
        S: BuildHasher,
4441
    {
4442
0
        let table = &mut self.table.table;
4443
0
        let entry = table.insert_entry(
4444
0
            self.hash,
4445
0
            (self.key.into(), value),
4446
0
            make_hasher::<_, V, S>(&self.table.hash_builder),
4447
        );
4448
0
        &mut entry.1
4449
0
    }
4450
4451
    /// Sets the value of the entry with the [`VacantEntryRef`]'s key,
4452
    /// and returns an [`OccupiedEntry`].
4453
    ///
4454
    /// # Examples
4455
    ///
4456
    /// ```
4457
    /// use hashbrown::HashMap;
4458
    /// use hashbrown::hash_map::EntryRef;
4459
    ///
4460
    /// let mut map: HashMap<&str, u32> = HashMap::new();
4461
    ///
4462
    /// if let EntryRef::Vacant(v) = map.entry_ref("poneyland") {
4463
    ///     let o = v.insert_entry(37);
4464
    ///     assert_eq!(o.get(), &37);
4465
    /// }
4466
    /// ```
4467
    #[cfg_attr(feature = "inline-more", inline)]
4468
0
    pub fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S, A>
4469
0
    where
4470
0
        K: Hash,
4471
0
        &'b Q: Into<K>,
4472
0
        S: BuildHasher,
4473
    {
4474
0
        let elem = self.table.table.insert(
4475
0
            self.hash,
4476
0
            (self.key.into(), value),
4477
0
            make_hasher::<_, V, S>(&self.table.hash_builder),
4478
        );
4479
0
        OccupiedEntry {
4480
0
            hash: self.hash,
4481
0
            elem,
4482
0
            table: self.table,
4483
0
        }
4484
0
    }
4485
}
4486
4487
impl<K, V, S, A> FromIterator<(K, V)> for HashMap<K, V, S, A>
4488
where
4489
    K: Eq + Hash,
4490
    S: BuildHasher + Default,
4491
    A: Default + Allocator,
4492
{
4493
    #[cfg_attr(feature = "inline-more", inline)]
4494
0
    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
4495
0
        let iter = iter.into_iter();
4496
0
        let mut map =
4497
0
            Self::with_capacity_and_hasher_in(iter.size_hint().0, S::default(), A::default());
4498
0
        iter.for_each(|(k, v)| {
4499
0
            map.insert(k, v);
4500
0
        });
4501
0
        map
4502
0
    }
4503
}
4504
4505
/// Inserts all new key-values from the iterator and replaces values with existing
4506
/// keys with new values returned from the iterator.
4507
impl<K, V, S, A> Extend<(K, V)> for HashMap<K, V, S, A>
4508
where
4509
    K: Eq + Hash,
4510
    S: BuildHasher,
4511
    A: Allocator,
4512
{
4513
    /// Inserts all new key-values from the iterator to existing `HashMap<K, V, S, A>`.
4514
    /// Replace values with existing keys with new values returned from the iterator.
4515
    ///
4516
    /// # Examples
4517
    ///
4518
    /// ```
4519
    /// use hashbrown::hash_map::HashMap;
4520
    ///
4521
    /// let mut map = HashMap::new();
4522
    /// map.insert(1, 100);
4523
    ///
4524
    /// let some_iter = [(1, 1), (2, 2)].into_iter();
4525
    /// map.extend(some_iter);
4526
    /// // Replace values with existing keys with new values returned from the iterator.
4527
    /// // So that the map.get(&1) doesn't return Some(&100).
4528
    /// assert_eq!(map.get(&1), Some(&1));
4529
    ///
4530
    /// let some_vec: Vec<_> = vec![(3, 3), (4, 4)];
4531
    /// map.extend(some_vec);
4532
    ///
4533
    /// let some_arr = [(5, 5), (6, 6)];
4534
    /// map.extend(some_arr);
4535
    /// let old_map_len = map.len();
4536
    ///
4537
    /// // You can also extend from another HashMap
4538
    /// let mut new_map = HashMap::new();
4539
    /// new_map.extend(map);
4540
    /// assert_eq!(new_map.len(), old_map_len);
4541
    ///
4542
    /// let mut vec: Vec<_> = new_map.into_iter().collect();
4543
    /// // The `IntoIter` iterator produces items in arbitrary order, so the
4544
    /// // items must be sorted to test them against a sorted array.
4545
    /// vec.sort_unstable();
4546
    /// assert_eq!(vec, [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]);
4547
    /// ```
4548
    #[cfg_attr(feature = "inline-more", inline)]
4549
0
    fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
4550
        // Keys may be already present or show multiple times in the iterator.
4551
        // Reserve the entire hint lower bound if the map is empty.
4552
        // Otherwise reserve half the hint (rounded up), so the map
4553
        // will only resize twice in the worst case.
4554
0
        let iter = iter.into_iter();
4555
0
        let reserve = if self.is_empty() {
4556
0
            iter.size_hint().0
4557
        } else {
4558
0
            (iter.size_hint().0 + 1) / 2
4559
        };
4560
0
        self.reserve(reserve);
4561
0
        iter.for_each(move |(k, v)| {
4562
0
            self.insert(k, v);
4563
0
        });
4564
0
    }
4565
4566
    #[inline]
4567
    #[cfg(feature = "nightly")]
4568
    fn extend_one(&mut self, (k, v): (K, V)) {
4569
        self.insert(k, v);
4570
    }
4571
4572
    #[inline]
4573
    #[cfg(feature = "nightly")]
4574
    fn extend_reserve(&mut self, additional: usize) {
4575
        // Keys may be already present or show multiple times in the iterator.
4576
        // Reserve the entire hint lower bound if the map is empty.
4577
        // Otherwise reserve half the hint (rounded up), so the map
4578
        // will only resize twice in the worst case.
4579
        let reserve = if self.is_empty() {
4580
            additional
4581
        } else {
4582
            (additional + 1) / 2
4583
        };
4584
        self.reserve(reserve);
4585
    }
4586
}
4587
4588
/// Inserts all new key-values from the iterator and replaces values with existing
4589
/// keys with new values returned from the iterator.
4590
impl<'a, K, V, S, A> Extend<(&'a K, &'a V)> for HashMap<K, V, S, A>
4591
where
4592
    K: Eq + Hash + Copy,
4593
    V: Copy,
4594
    S: BuildHasher,
4595
    A: Allocator,
4596
{
4597
    /// Inserts all new key-values from the iterator to existing `HashMap<K, V, S, A>`.
4598
    /// Replace values with existing keys with new values returned from the iterator.
4599
    /// The keys and values must implement [`Copy`] trait.
4600
    ///
4601
    /// [`Copy`]: https://doc.rust-lang.org/core/marker/trait.Copy.html
4602
    ///
4603
    /// # Examples
4604
    ///
4605
    /// ```
4606
    /// use hashbrown::hash_map::HashMap;
4607
    ///
4608
    /// let mut map = HashMap::new();
4609
    /// map.insert(1, 100);
4610
    ///
4611
    /// let arr = [(1, 1), (2, 2)];
4612
    /// let some_iter = arr.iter().map(|(k, v)| (k, v));
4613
    /// map.extend(some_iter);
4614
    /// // Replace values with existing keys with new values returned from the iterator.
4615
    /// // So that the map.get(&1) doesn't return Some(&100).
4616
    /// assert_eq!(map.get(&1), Some(&1));
4617
    ///
4618
    /// let some_vec: Vec<_> = vec![(3, 3), (4, 4)];
4619
    /// map.extend(some_vec.iter().map(|(k, v)| (k, v)));
4620
    ///
4621
    /// let some_arr = [(5, 5), (6, 6)];
4622
    /// map.extend(some_arr.iter().map(|(k, v)| (k, v)));
4623
    ///
4624
    /// // You can also extend from another HashMap
4625
    /// let mut new_map = HashMap::new();
4626
    /// new_map.extend(&map);
4627
    /// assert_eq!(new_map, map);
4628
    ///
4629
    /// let mut vec: Vec<_> = new_map.into_iter().collect();
4630
    /// // The `IntoIter` iterator produces items in arbitrary order, so the
4631
    /// // items must be sorted to test them against a sorted array.
4632
    /// vec.sort_unstable();
4633
    /// assert_eq!(vec, [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]);
4634
    /// ```
4635
    #[cfg_attr(feature = "inline-more", inline)]
4636
0
    fn extend<T: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: T) {
4637
0
        self.extend(iter.into_iter().map(|(&key, &value)| (key, value)));
4638
0
    }
4639
4640
    #[inline]
4641
    #[cfg(feature = "nightly")]
4642
    fn extend_one(&mut self, (k, v): (&'a K, &'a V)) {
4643
        self.insert(*k, *v);
4644
    }
4645
4646
    #[inline]
4647
    #[cfg(feature = "nightly")]
4648
    fn extend_reserve(&mut self, additional: usize) {
4649
        Extend::<(K, V)>::extend_reserve(self, additional);
4650
    }
4651
}
4652
4653
/// Inserts all new key-values from the iterator and replaces values with existing
4654
/// keys with new values returned from the iterator.
4655
impl<'a, K, V, S, A> Extend<&'a (K, V)> for HashMap<K, V, S, A>
4656
where
4657
    K: Eq + Hash + Copy,
4658
    V: Copy,
4659
    S: BuildHasher,
4660
    A: Allocator,
4661
{
4662
    /// Inserts all new key-values from the iterator to existing `HashMap<K, V, S, A>`.
4663
    /// Replace values with existing keys with new values returned from the iterator.
4664
    /// The keys and values must implement [`Copy`] trait.
4665
    ///
4666
    /// [`Copy`]: https://doc.rust-lang.org/core/marker/trait.Copy.html
4667
    ///
4668
    /// # Examples
4669
    ///
4670
    /// ```
4671
    /// use hashbrown::hash_map::HashMap;
4672
    ///
4673
    /// let mut map = HashMap::new();
4674
    /// map.insert(1, 100);
4675
    ///
4676
    /// let arr = [(1, 1), (2, 2)];
4677
    /// let some_iter = arr.iter();
4678
    /// map.extend(some_iter);
4679
    /// // Replace values with existing keys with new values returned from the iterator.
4680
    /// // So that the map.get(&1) doesn't return Some(&100).
4681
    /// assert_eq!(map.get(&1), Some(&1));
4682
    ///
4683
    /// let some_vec: Vec<_> = vec![(3, 3), (4, 4)];
4684
    /// map.extend(&some_vec);
4685
    ///
4686
    /// let some_arr = [(5, 5), (6, 6)];
4687
    /// map.extend(&some_arr);
4688
    ///
4689
    /// let mut vec: Vec<_> = map.into_iter().collect();
4690
    /// // The `IntoIter` iterator produces items in arbitrary order, so the
4691
    /// // items must be sorted to test them against a sorted array.
4692
    /// vec.sort_unstable();
4693
    /// assert_eq!(vec, [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]);
4694
    /// ```
4695
    #[cfg_attr(feature = "inline-more", inline)]
4696
0
    fn extend<T: IntoIterator<Item = &'a (K, V)>>(&mut self, iter: T) {
4697
0
        self.extend(iter.into_iter().map(|&(key, value)| (key, value)));
4698
0
    }
4699
4700
    #[inline]
4701
    #[cfg(feature = "nightly")]
4702
    fn extend_one(&mut self, &(k, v): &'a (K, V)) {
4703
        self.insert(k, v);
4704
    }
4705
4706
    #[inline]
4707
    #[cfg(feature = "nightly")]
4708
    fn extend_reserve(&mut self, additional: usize) {
4709
        Extend::<(K, V)>::extend_reserve(self, additional);
4710
    }
4711
}
4712
4713
#[allow(dead_code)]
4714
0
fn assert_covariance() {
4715
0
    fn map_key<'new>(v: HashMap<&'static str, u8>) -> HashMap<&'new str, u8> {
4716
0
        v
4717
0
    }
4718
0
    fn map_val<'new>(v: HashMap<u8, &'static str>) -> HashMap<u8, &'new str> {
4719
0
        v
4720
0
    }
4721
0
    fn iter_key<'a, 'new>(v: Iter<'a, &'static str, u8>) -> Iter<'a, &'new str, u8> {
4722
0
        v
4723
0
    }
4724
0
    fn iter_val<'a, 'new>(v: Iter<'a, u8, &'static str>) -> Iter<'a, u8, &'new str> {
4725
0
        v
4726
0
    }
4727
0
    fn into_iter_key<'new, A: Allocator>(
4728
0
        v: IntoIter<&'static str, u8, A>,
4729
0
    ) -> IntoIter<&'new str, u8, A> {
4730
0
        v
4731
0
    }
4732
0
    fn into_iter_val<'new, A: Allocator>(
4733
0
        v: IntoIter<u8, &'static str, A>,
4734
0
    ) -> IntoIter<u8, &'new str, A> {
4735
0
        v
4736
0
    }
4737
0
    fn keys_key<'a, 'new>(v: Keys<'a, &'static str, u8>) -> Keys<'a, &'new str, u8> {
4738
0
        v
4739
0
    }
4740
0
    fn keys_val<'a, 'new>(v: Keys<'a, u8, &'static str>) -> Keys<'a, u8, &'new str> {
4741
0
        v
4742
0
    }
4743
0
    fn values_key<'a, 'new>(v: Values<'a, &'static str, u8>) -> Values<'a, &'new str, u8> {
4744
0
        v
4745
0
    }
4746
0
    fn values_val<'a, 'new>(v: Values<'a, u8, &'static str>) -> Values<'a, u8, &'new str> {
4747
0
        v
4748
0
    }
4749
0
    fn drain<'new>(
4750
0
        d: Drain<'static, &'static str, &'static str>,
4751
0
    ) -> Drain<'new, &'new str, &'new str> {
4752
0
        d
4753
0
    }
4754
0
}
4755
4756
#[cfg(test)]
4757
mod test_map {
4758
    use super::DefaultHashBuilder;
4759
    use super::Entry::{Occupied, Vacant};
4760
    use super::EntryRef;
4761
    use super::HashMap;
4762
    use crate::raw::{AllocError, Allocator, Global};
4763
    use alloc::string::{String, ToString};
4764
    use alloc::sync::Arc;
4765
    use core::alloc::Layout;
4766
    use core::ptr::NonNull;
4767
    use core::sync::atomic::{AtomicI8, Ordering};
4768
    use rand::{rngs::SmallRng, Rng, SeedableRng};
4769
    use std::borrow::ToOwned;
4770
    use std::cell::RefCell;
4771
    use std::vec::Vec;
4772
4773
    #[test]
4774
    fn test_zero_capacities() {
4775
        type HM = HashMap<i32, i32>;
4776
4777
        let m = HM::new();
4778
        assert_eq!(m.capacity(), 0);
4779
4780
        let m = HM::default();
4781
        assert_eq!(m.capacity(), 0);
4782
4783
        let m = HM::with_hasher(DefaultHashBuilder::default());
4784
        assert_eq!(m.capacity(), 0);
4785
4786
        let m = HM::with_capacity(0);
4787
        assert_eq!(m.capacity(), 0);
4788
4789
        let m = HM::with_capacity_and_hasher(0, DefaultHashBuilder::default());
4790
        assert_eq!(m.capacity(), 0);
4791
4792
        let mut m = HM::new();
4793
        m.insert(1, 1);
4794
        m.insert(2, 2);
4795
        m.remove(&1);
4796
        m.remove(&2);
4797
        m.shrink_to_fit();
4798
        assert_eq!(m.capacity(), 0);
4799
4800
        let mut m = HM::new();
4801
        m.reserve(0);
4802
        assert_eq!(m.capacity(), 0);
4803
    }
4804
4805
    #[test]
4806
    fn test_create_capacity_zero() {
4807
        let mut m = HashMap::with_capacity(0);
4808
4809
        assert!(m.insert(1, 1).is_none());
4810
4811
        assert!(m.contains_key(&1));
4812
        assert!(!m.contains_key(&0));
4813
    }
4814
4815
    #[test]
4816
    fn test_insert() {
4817
        let mut m = HashMap::new();
4818
        assert_eq!(m.len(), 0);
4819
        assert!(m.insert(1, 2).is_none());
4820
        assert_eq!(m.len(), 1);
4821
        assert!(m.insert(2, 4).is_none());
4822
        assert_eq!(m.len(), 2);
4823
        assert_eq!(*m.get(&1).unwrap(), 2);
4824
        assert_eq!(*m.get(&2).unwrap(), 4);
4825
    }
4826
4827
    #[test]
4828
    fn test_clone() {
4829
        let mut m = HashMap::new();
4830
        assert_eq!(m.len(), 0);
4831
        assert!(m.insert(1, 2).is_none());
4832
        assert_eq!(m.len(), 1);
4833
        assert!(m.insert(2, 4).is_none());
4834
        assert_eq!(m.len(), 2);
4835
        #[allow(clippy::redundant_clone)]
4836
        let m2 = m.clone();
4837
        assert_eq!(*m2.get(&1).unwrap(), 2);
4838
        assert_eq!(*m2.get(&2).unwrap(), 4);
4839
        assert_eq!(m2.len(), 2);
4840
    }
4841
4842
    #[test]
4843
    fn test_clone_from() {
4844
        let mut m = HashMap::new();
4845
        let mut m2 = HashMap::new();
4846
        assert_eq!(m.len(), 0);
4847
        assert!(m.insert(1, 2).is_none());
4848
        assert_eq!(m.len(), 1);
4849
        assert!(m.insert(2, 4).is_none());
4850
        assert_eq!(m.len(), 2);
4851
        m2.clone_from(&m);
4852
        assert_eq!(*m2.get(&1).unwrap(), 2);
4853
        assert_eq!(*m2.get(&2).unwrap(), 4);
4854
        assert_eq!(m2.len(), 2);
4855
    }
4856
4857
    thread_local! { static DROP_VECTOR: RefCell<Vec<i32>> = const { RefCell::new(Vec::new()) } }
4858
4859
    #[derive(Hash, PartialEq, Eq)]
4860
    struct Droppable {
4861
        k: usize,
4862
    }
4863
4864
    impl Droppable {
4865
        fn new(k: usize) -> Droppable {
4866
            DROP_VECTOR.with(|slot| {
4867
                slot.borrow_mut()[k] += 1;
4868
            });
4869
4870
            Droppable { k }
4871
        }
4872
    }
4873
4874
    impl Drop for Droppable {
4875
        fn drop(&mut self) {
4876
            DROP_VECTOR.with(|slot| {
4877
                slot.borrow_mut()[self.k] -= 1;
4878
            });
4879
        }
4880
    }
4881
4882
    impl Clone for Droppable {
4883
        fn clone(&self) -> Self {
4884
            Droppable::new(self.k)
4885
        }
4886
    }
4887
4888
    #[test]
4889
    fn test_drops() {
4890
        DROP_VECTOR.with(|slot| {
4891
            *slot.borrow_mut() = vec![0; 200];
4892
        });
4893
4894
        {
4895
            let mut m = HashMap::new();
4896
4897
            DROP_VECTOR.with(|v| {
4898
                for i in 0..200 {
4899
                    assert_eq!(v.borrow()[i], 0);
4900
                }
4901
            });
4902
4903
            for i in 0..100 {
4904
                let d1 = Droppable::new(i);
4905
                let d2 = Droppable::new(i + 100);
4906
                m.insert(d1, d2);
4907
            }
4908
4909
            DROP_VECTOR.with(|v| {
4910
                for i in 0..200 {
4911
                    assert_eq!(v.borrow()[i], 1);
4912
                }
4913
            });
4914
4915
            for i in 0..50 {
4916
                let k = Droppable::new(i);
4917
                let v = m.remove(&k);
4918
4919
                assert!(v.is_some());
4920
4921
                DROP_VECTOR.with(|v| {
4922
                    assert_eq!(v.borrow()[i], 1);
4923
                    assert_eq!(v.borrow()[i + 100], 1);
4924
                });
4925
            }
4926
4927
            DROP_VECTOR.with(|v| {
4928
                for i in 0..50 {
4929
                    assert_eq!(v.borrow()[i], 0);
4930
                    assert_eq!(v.borrow()[i + 100], 0);
4931
                }
4932
4933
                for i in 50..100 {
4934
                    assert_eq!(v.borrow()[i], 1);
4935
                    assert_eq!(v.borrow()[i + 100], 1);
4936
                }
4937
            });
4938
        }
4939
4940
        DROP_VECTOR.with(|v| {
4941
            for i in 0..200 {
4942
                assert_eq!(v.borrow()[i], 0);
4943
            }
4944
        });
4945
    }
4946
4947
    #[test]
4948
    fn test_into_iter_drops() {
4949
        DROP_VECTOR.with(|v| {
4950
            *v.borrow_mut() = vec![0; 200];
4951
        });
4952
4953
        let hm = {
4954
            let mut hm = HashMap::new();
4955
4956
            DROP_VECTOR.with(|v| {
4957
                for i in 0..200 {
4958
                    assert_eq!(v.borrow()[i], 0);
4959
                }
4960
            });
4961
4962
            for i in 0..100 {
4963
                let d1 = Droppable::new(i);
4964
                let d2 = Droppable::new(i + 100);
4965
                hm.insert(d1, d2);
4966
            }
4967
4968
            DROP_VECTOR.with(|v| {
4969
                for i in 0..200 {
4970
                    assert_eq!(v.borrow()[i], 1);
4971
                }
4972
            });
4973
4974
            hm
4975
        };
4976
4977
        // By the way, ensure that cloning doesn't screw up the dropping.
4978
        drop(hm.clone());
4979
4980
        {
4981
            let mut half = hm.into_iter().take(50);
4982
4983
            DROP_VECTOR.with(|v| {
4984
                for i in 0..200 {
4985
                    assert_eq!(v.borrow()[i], 1);
4986
                }
4987
            });
4988
4989
            for _ in half.by_ref() {}
4990
4991
            DROP_VECTOR.with(|v| {
4992
                let nk = (0..100).filter(|&i| v.borrow()[i] == 1).count();
4993
4994
                let nv = (0..100).filter(|&i| v.borrow()[i + 100] == 1).count();
4995
4996
                assert_eq!(nk, 50);
4997
                assert_eq!(nv, 50);
4998
            });
4999
        };
5000
5001
        DROP_VECTOR.with(|v| {
5002
            for i in 0..200 {
5003
                assert_eq!(v.borrow()[i], 0);
5004
            }
5005
        });
5006
    }
5007
5008
    #[test]
5009
    fn test_empty_remove() {
5010
        let mut m: HashMap<i32, bool> = HashMap::new();
5011
        assert_eq!(m.remove(&0), None);
5012
    }
5013
5014
    #[test]
5015
    fn test_empty_entry() {
5016
        let mut m: HashMap<i32, bool> = HashMap::new();
5017
        match m.entry(0) {
5018
            Occupied(_) => panic!(),
5019
            Vacant(_) => {}
5020
        }
5021
        assert!(*m.entry(0).or_insert(true));
5022
        assert_eq!(m.len(), 1);
5023
    }
5024
5025
    #[test]
5026
    fn test_empty_entry_ref() {
5027
        let mut m: HashMap<std::string::String, bool> = HashMap::new();
5028
        match m.entry_ref("poneyland") {
5029
            EntryRef::Occupied(_) => panic!(),
5030
            EntryRef::Vacant(_) => {}
5031
        }
5032
        assert!(*m.entry_ref("poneyland").or_insert(true));
5033
        assert_eq!(m.len(), 1);
5034
    }
5035
5036
    #[test]
5037
    fn test_empty_iter() {
5038
        let mut m: HashMap<i32, bool> = HashMap::new();
5039
        assert_eq!(m.drain().next(), None);
5040
        assert_eq!(m.keys().next(), None);
5041
        assert_eq!(m.values().next(), None);
5042
        assert_eq!(m.values_mut().next(), None);
5043
        assert_eq!(m.iter().next(), None);
5044
        assert_eq!(m.iter_mut().next(), None);
5045
        assert_eq!(m.len(), 0);
5046
        assert!(m.is_empty());
5047
        assert_eq!(m.into_iter().next(), None);
5048
    }
5049
5050
    #[test]
5051
    #[cfg_attr(miri, ignore)] // FIXME: takes too long
5052
    fn test_lots_of_insertions() {
5053
        let mut m = HashMap::new();
5054
5055
        // Try this a few times to make sure we never screw up the hashmap's
5056
        // internal state.
5057
        for _ in 0..10 {
5058
            assert!(m.is_empty());
5059
5060
            for i in 1..1001 {
5061
                assert!(m.insert(i, i).is_none());
5062
5063
                for j in 1..=i {
5064
                    let r = m.get(&j);
5065
                    assert_eq!(r, Some(&j));
5066
                }
5067
5068
                for j in i + 1..1001 {
5069
                    let r = m.get(&j);
5070
                    assert_eq!(r, None);
5071
                }
5072
            }
5073
5074
            for i in 1001..2001 {
5075
                assert!(!m.contains_key(&i));
5076
            }
5077
5078
            // remove forwards
5079
            for i in 1..1001 {
5080
                assert!(m.remove(&i).is_some());
5081
5082
                for j in 1..=i {
5083
                    assert!(!m.contains_key(&j));
5084
                }
5085
5086
                for j in i + 1..1001 {
5087
                    assert!(m.contains_key(&j));
5088
                }
5089
            }
5090
5091
            for i in 1..1001 {
5092
                assert!(!m.contains_key(&i));
5093
            }
5094
5095
            for i in 1..1001 {
5096
                assert!(m.insert(i, i).is_none());
5097
            }
5098
5099
            // remove backwards
5100
            for i in (1..1001).rev() {
5101
                assert!(m.remove(&i).is_some());
5102
5103
                for j in i..1001 {
5104
                    assert!(!m.contains_key(&j));
5105
                }
5106
5107
                for j in 1..i {
5108
                    assert!(m.contains_key(&j));
5109
                }
5110
            }
5111
        }
5112
    }
5113
5114
    #[test]
5115
    fn test_find_mut() {
5116
        let mut m = HashMap::new();
5117
        assert!(m.insert(1, 12).is_none());
5118
        assert!(m.insert(2, 8).is_none());
5119
        assert!(m.insert(5, 14).is_none());
5120
        let new = 100;
5121
        match m.get_mut(&5) {
5122
            None => panic!(),
5123
            Some(x) => *x = new,
5124
        }
5125
        assert_eq!(m.get(&5), Some(&new));
5126
        let mut hashmap: HashMap<i32, String> = HashMap::default();
5127
        let key = &1;
5128
        let result = hashmap.get_mut(key);
5129
        assert!(result.is_none());
5130
    }
5131
5132
    #[test]
5133
    fn test_insert_overwrite() {
5134
        let mut m = HashMap::new();
5135
        assert!(m.insert(1, 2).is_none());
5136
        assert_eq!(*m.get(&1).unwrap(), 2);
5137
        assert!(m.insert(1, 3).is_some());
5138
        assert_eq!(*m.get(&1).unwrap(), 3);
5139
    }
5140
5141
    #[test]
5142
    fn test_insert_conflicts() {
5143
        let mut m = HashMap::with_capacity(4);
5144
        assert!(m.insert(1, 2).is_none());
5145
        assert!(m.insert(5, 3).is_none());
5146
        assert!(m.insert(9, 4).is_none());
5147
        assert_eq!(*m.get(&9).unwrap(), 4);
5148
        assert_eq!(*m.get(&5).unwrap(), 3);
5149
        assert_eq!(*m.get(&1).unwrap(), 2);
5150
    }
5151
5152
    #[test]
5153
    fn test_conflict_remove() {
5154
        let mut m = HashMap::with_capacity(4);
5155
        assert!(m.insert(1, 2).is_none());
5156
        assert_eq!(*m.get(&1).unwrap(), 2);
5157
        assert!(m.insert(5, 3).is_none());
5158
        assert_eq!(*m.get(&1).unwrap(), 2);
5159
        assert_eq!(*m.get(&5).unwrap(), 3);
5160
        assert!(m.insert(9, 4).is_none());
5161
        assert_eq!(*m.get(&1).unwrap(), 2);
5162
        assert_eq!(*m.get(&5).unwrap(), 3);
5163
        assert_eq!(*m.get(&9).unwrap(), 4);
5164
        assert!(m.remove(&1).is_some());
5165
        assert_eq!(*m.get(&9).unwrap(), 4);
5166
        assert_eq!(*m.get(&5).unwrap(), 3);
5167
    }
5168
5169
    #[test]
5170
    fn test_insert_unique_unchecked() {
5171
        let mut map = HashMap::new();
5172
        let (k1, v1) = unsafe { map.insert_unique_unchecked(10, 11) };
5173
        assert_eq!((&10, &mut 11), (k1, v1));
5174
        let (k2, v2) = unsafe { map.insert_unique_unchecked(20, 21) };
5175
        assert_eq!((&20, &mut 21), (k2, v2));
5176
        assert_eq!(Some(&11), map.get(&10));
5177
        assert_eq!(Some(&21), map.get(&20));
5178
        assert_eq!(None, map.get(&30));
5179
    }
5180
5181
    #[test]
5182
    fn test_is_empty() {
5183
        let mut m = HashMap::with_capacity(4);
5184
        assert!(m.insert(1, 2).is_none());
5185
        assert!(!m.is_empty());
5186
        assert!(m.remove(&1).is_some());
5187
        assert!(m.is_empty());
5188
    }
5189
5190
    #[test]
5191
    fn test_remove() {
5192
        let mut m = HashMap::new();
5193
        m.insert(1, 2);
5194
        assert_eq!(m.remove(&1), Some(2));
5195
        assert_eq!(m.remove(&1), None);
5196
    }
5197
5198
    #[test]
5199
    fn test_remove_entry() {
5200
        let mut m = HashMap::new();
5201
        m.insert(1, 2);
5202
        assert_eq!(m.remove_entry(&1), Some((1, 2)));
5203
        assert_eq!(m.remove(&1), None);
5204
    }
5205
5206
    #[test]
5207
    fn test_iterate() {
5208
        let mut m = HashMap::with_capacity(4);
5209
        for i in 0..32 {
5210
            assert!(m.insert(i, i * 2).is_none());
5211
        }
5212
        assert_eq!(m.len(), 32);
5213
5214
        let mut observed: u32 = 0;
5215
5216
        for (k, v) in &m {
5217
            assert_eq!(*v, *k * 2);
5218
            observed |= 1 << *k;
5219
        }
5220
        assert_eq!(observed, 0xFFFF_FFFF);
5221
    }
5222
5223
    #[test]
5224
    fn test_keys() {
5225
        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
5226
        let map: HashMap<_, _> = vec.into_iter().collect();
5227
        let keys: Vec<_> = map.keys().copied().collect();
5228
        assert_eq!(keys.len(), 3);
5229
        assert!(keys.contains(&1));
5230
        assert!(keys.contains(&2));
5231
        assert!(keys.contains(&3));
5232
    }
5233
5234
    #[test]
5235
    fn test_values() {
5236
        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
5237
        let map: HashMap<_, _> = vec.into_iter().collect();
5238
        let values: Vec<_> = map.values().copied().collect();
5239
        assert_eq!(values.len(), 3);
5240
        assert!(values.contains(&'a'));
5241
        assert!(values.contains(&'b'));
5242
        assert!(values.contains(&'c'));
5243
    }
5244
5245
    #[test]
5246
    fn test_values_mut() {
5247
        let vec = vec![(1, 1), (2, 2), (3, 3)];
5248
        let mut map: HashMap<_, _> = vec.into_iter().collect();
5249
        for value in map.values_mut() {
5250
            *value *= 2;
5251
        }
5252
        let values: Vec<_> = map.values().copied().collect();
5253
        assert_eq!(values.len(), 3);
5254
        assert!(values.contains(&2));
5255
        assert!(values.contains(&4));
5256
        assert!(values.contains(&6));
5257
    }
5258
5259
    #[test]
5260
    fn test_into_keys() {
5261
        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
5262
        let map: HashMap<_, _> = vec.into_iter().collect();
5263
        let keys: Vec<_> = map.into_keys().collect();
5264
5265
        assert_eq!(keys.len(), 3);
5266
        assert!(keys.contains(&1));
5267
        assert!(keys.contains(&2));
5268
        assert!(keys.contains(&3));
5269
    }
5270
5271
    #[test]
5272
    fn test_into_values() {
5273
        let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
5274
        let map: HashMap<_, _> = vec.into_iter().collect();
5275
        let values: Vec<_> = map.into_values().collect();
5276
5277
        assert_eq!(values.len(), 3);
5278
        assert!(values.contains(&'a'));
5279
        assert!(values.contains(&'b'));
5280
        assert!(values.contains(&'c'));
5281
    }
5282
5283
    #[test]
5284
    fn test_find() {
5285
        let mut m = HashMap::new();
5286
        assert!(m.get(&1).is_none());
5287
        m.insert(1, 2);
5288
        match m.get(&1) {
5289
            None => panic!(),
5290
            Some(v) => assert_eq!(*v, 2),
5291
        }
5292
    }
5293
5294
    #[test]
5295
    fn test_eq() {
5296
        let mut m1 = HashMap::new();
5297
        m1.insert(1, 2);
5298
        m1.insert(2, 3);
5299
        m1.insert(3, 4);
5300
5301
        let mut m2 = HashMap::new();
5302
        m2.insert(1, 2);
5303
        m2.insert(2, 3);
5304
5305
        assert!(m1 != m2);
5306
5307
        m2.insert(3, 4);
5308
5309
        assert_eq!(m1, m2);
5310
    }
5311
5312
    #[test]
5313
    fn test_show() {
5314
        let mut map = HashMap::new();
5315
        let empty: HashMap<i32, i32> = HashMap::new();
5316
5317
        map.insert(1, 2);
5318
        map.insert(3, 4);
5319
5320
        let map_str = format!("{map:?}");
5321
5322
        assert!(map_str == "{1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}");
5323
        assert_eq!(format!("{empty:?}"), "{}");
5324
    }
5325
5326
    #[test]
5327
    fn test_expand() {
5328
        let mut m = HashMap::new();
5329
5330
        assert_eq!(m.len(), 0);
5331
        assert!(m.is_empty());
5332
5333
        let mut i = 0;
5334
        let old_raw_cap = m.raw_capacity();
5335
        while old_raw_cap == m.raw_capacity() {
5336
            m.insert(i, i);
5337
            i += 1;
5338
        }
5339
5340
        assert_eq!(m.len(), i);
5341
        assert!(!m.is_empty());
5342
    }
5343
5344
    #[test]
5345
    fn test_behavior_resize_policy() {
5346
        let mut m = HashMap::new();
5347
5348
        assert_eq!(m.len(), 0);
5349
        assert_eq!(m.raw_capacity(), 1);
5350
        assert!(m.is_empty());
5351
5352
        m.insert(0, 0);
5353
        m.remove(&0);
5354
        assert!(m.is_empty());
5355
        let initial_raw_cap = m.raw_capacity();
5356
        m.reserve(initial_raw_cap);
5357
        let raw_cap = m.raw_capacity();
5358
5359
        assert_eq!(raw_cap, initial_raw_cap * 2);
5360
5361
        let mut i = 0;
5362
        for _ in 0..raw_cap * 3 / 4 {
5363
            m.insert(i, i);
5364
            i += 1;
5365
        }
5366
        // three quarters full
5367
5368
        assert_eq!(m.len(), i);
5369
        assert_eq!(m.raw_capacity(), raw_cap);
5370
5371
        for _ in 0..raw_cap / 4 {
5372
            m.insert(i, i);
5373
            i += 1;
5374
        }
5375
        // half full
5376
5377
        let new_raw_cap = m.raw_capacity();
5378
        assert_eq!(new_raw_cap, raw_cap * 2);
5379
5380
        for _ in 0..raw_cap / 2 - 1 {
5381
            i -= 1;
5382
            m.remove(&i);
5383
            assert_eq!(m.raw_capacity(), new_raw_cap);
5384
        }
5385
        // A little more than one quarter full.
5386
        m.shrink_to_fit();
5387
        assert_eq!(m.raw_capacity(), raw_cap);
5388
        // again, a little more than half full
5389
        for _ in 0..raw_cap / 2 {
5390
            i -= 1;
5391
            m.remove(&i);
5392
        }
5393
        m.shrink_to_fit();
5394
5395
        assert_eq!(m.len(), i);
5396
        assert!(!m.is_empty());
5397
        assert_eq!(m.raw_capacity(), initial_raw_cap);
5398
    }
5399
5400
    #[test]
5401
    fn test_reserve_shrink_to_fit() {
5402
        let mut m = HashMap::new();
5403
        m.insert(0, 0);
5404
        m.remove(&0);
5405
        assert!(m.capacity() >= m.len());
5406
        for i in 0..128 {
5407
            m.insert(i, i);
5408
        }
5409
        m.reserve(256);
5410
5411
        let usable_cap = m.capacity();
5412
        for i in 128..(128 + 256) {
5413
            m.insert(i, i);
5414
            assert_eq!(m.capacity(), usable_cap);
5415
        }
5416
5417
        for i in 100..(128 + 256) {
5418
            assert_eq!(m.remove(&i), Some(i));
5419
        }
5420
        m.shrink_to_fit();
5421
5422
        assert_eq!(m.len(), 100);
5423
        assert!(!m.is_empty());
5424
        assert!(m.capacity() >= m.len());
5425
5426
        for i in 0..100 {
5427
            assert_eq!(m.remove(&i), Some(i));
5428
        }
5429
        m.shrink_to_fit();
5430
        m.insert(0, 0);
5431
5432
        assert_eq!(m.len(), 1);
5433
        assert!(m.capacity() >= m.len());
5434
        assert_eq!(m.remove(&0), Some(0));
5435
    }
5436
5437
    #[test]
5438
    fn test_from_iter() {
5439
        let xs = [(1, 1), (2, 2), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
5440
5441
        let map: HashMap<_, _> = xs.iter().copied().collect();
5442
5443
        for &(k, v) in &xs {
5444
            assert_eq!(map.get(&k), Some(&v));
5445
        }
5446
5447
        assert_eq!(map.iter().len(), xs.len() - 1);
5448
    }
5449
5450
    #[test]
5451
    fn test_size_hint() {
5452
        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
5453
5454
        let map: HashMap<_, _> = xs.iter().copied().collect();
5455
5456
        let mut iter = map.iter();
5457
5458
        for _ in iter.by_ref().take(3) {}
5459
5460
        assert_eq!(iter.size_hint(), (3, Some(3)));
5461
    }
5462
5463
    #[test]
5464
    fn test_iter_len() {
5465
        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
5466
5467
        let map: HashMap<_, _> = xs.iter().copied().collect();
5468
5469
        let mut iter = map.iter();
5470
5471
        for _ in iter.by_ref().take(3) {}
5472
5473
        assert_eq!(iter.len(), 3);
5474
    }
5475
5476
    #[test]
5477
    fn test_mut_size_hint() {
5478
        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
5479
5480
        let mut map: HashMap<_, _> = xs.iter().copied().collect();
5481
5482
        let mut iter = map.iter_mut();
5483
5484
        for _ in iter.by_ref().take(3) {}
5485
5486
        assert_eq!(iter.size_hint(), (3, Some(3)));
5487
    }
5488
5489
    #[test]
5490
    fn test_iter_mut_len() {
5491
        let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
5492
5493
        let mut map: HashMap<_, _> = xs.iter().copied().collect();
5494
5495
        let mut iter = map.iter_mut();
5496
5497
        for _ in iter.by_ref().take(3) {}
5498
5499
        assert_eq!(iter.len(), 3);
5500
    }
5501
5502
    #[test]
5503
    fn test_index() {
5504
        let mut map = HashMap::new();
5505
5506
        map.insert(1, 2);
5507
        map.insert(2, 1);
5508
        map.insert(3, 4);
5509
5510
        assert_eq!(map[&2], 1);
5511
    }
5512
5513
    #[test]
5514
    #[should_panic]
5515
    fn test_index_nonexistent() {
5516
        let mut map = HashMap::new();
5517
5518
        map.insert(1, 2);
5519
        map.insert(2, 1);
5520
        map.insert(3, 4);
5521
5522
        #[allow(clippy::no_effect)] // false positive lint
5523
        map[&4];
5524
    }
5525
5526
    #[test]
5527
    fn test_entry() {
5528
        let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
5529
5530
        let mut map: HashMap<_, _> = xs.iter().copied().collect();
5531
5532
        // Existing key (insert)
5533
        match map.entry(1) {
5534
            Vacant(_) => unreachable!(),
5535
            Occupied(mut view) => {
5536
                assert_eq!(view.get(), &10);
5537
                assert_eq!(view.insert(100), 10);
5538
            }
5539
        }
5540
        assert_eq!(map.get(&1).unwrap(), &100);
5541
        assert_eq!(map.len(), 6);
5542
5543
        // Existing key (update)
5544
        match map.entry(2) {
5545
            Vacant(_) => unreachable!(),
5546
            Occupied(mut view) => {
5547
                let v = view.get_mut();
5548
                let new_v = (*v) * 10;
5549
                *v = new_v;
5550
            }
5551
        }
5552
        assert_eq!(map.get(&2).unwrap(), &200);
5553
        assert_eq!(map.len(), 6);
5554
5555
        // Existing key (take)
5556
        match map.entry(3) {
5557
            Vacant(_) => unreachable!(),
5558
            Occupied(view) => {
5559
                assert_eq!(view.remove(), 30);
5560
            }
5561
        }
5562
        assert_eq!(map.get(&3), None);
5563
        assert_eq!(map.len(), 5);
5564
5565
        // Inexistent key (insert)
5566
        match map.entry(10) {
5567
            Occupied(_) => unreachable!(),
5568
            Vacant(view) => {
5569
                assert_eq!(*view.insert(1000), 1000);
5570
            }
5571
        }
5572
        assert_eq!(map.get(&10).unwrap(), &1000);
5573
        assert_eq!(map.len(), 6);
5574
    }
5575
5576
    #[test]
5577
    fn test_entry_ref() {
5578
        let xs = [
5579
            ("One".to_owned(), 10),
5580
            ("Two".to_owned(), 20),
5581
            ("Three".to_owned(), 30),
5582
            ("Four".to_owned(), 40),
5583
            ("Five".to_owned(), 50),
5584
            ("Six".to_owned(), 60),
5585
        ];
5586
5587
        let mut map: HashMap<_, _> = xs.iter().cloned().collect();
5588
5589
        // Existing key (insert)
5590
        match map.entry_ref("One") {
5591
            EntryRef::Vacant(_) => unreachable!(),
5592
            EntryRef::Occupied(mut view) => {
5593
                assert_eq!(view.get(), &10);
5594
                assert_eq!(view.insert(100), 10);
5595
            }
5596
        }
5597
        assert_eq!(map.get("One").unwrap(), &100);
5598
        assert_eq!(map.len(), 6);
5599
5600
        // Existing key (update)
5601
        match map.entry_ref("Two") {
5602
            EntryRef::Vacant(_) => unreachable!(),
5603
            EntryRef::Occupied(mut view) => {
5604
                let v = view.get_mut();
5605
                let new_v = (*v) * 10;
5606
                *v = new_v;
5607
            }
5608
        }
5609
        assert_eq!(map.get("Two").unwrap(), &200);
5610
        assert_eq!(map.len(), 6);
5611
5612
        // Existing key (take)
5613
        match map.entry_ref("Three") {
5614
            EntryRef::Vacant(_) => unreachable!(),
5615
            EntryRef::Occupied(view) => {
5616
                assert_eq!(view.remove(), 30);
5617
            }
5618
        }
5619
        assert_eq!(map.get("Three"), None);
5620
        assert_eq!(map.len(), 5);
5621
5622
        // Inexistent key (insert)
5623
        match map.entry_ref("Ten") {
5624
            EntryRef::Occupied(_) => unreachable!(),
5625
            EntryRef::Vacant(view) => {
5626
                assert_eq!(*view.insert(1000), 1000);
5627
            }
5628
        }
5629
        assert_eq!(map.get("Ten").unwrap(), &1000);
5630
        assert_eq!(map.len(), 6);
5631
    }
5632
5633
    #[test]
5634
    fn test_entry_take_doesnt_corrupt() {
5635
        #![allow(deprecated)] //rand
5636
                              // Test for #19292
5637
        fn check(m: &HashMap<i32, ()>) {
5638
            for k in m.keys() {
5639
                assert!(m.contains_key(k), "{k} is in keys() but not in the map?");
5640
            }
5641
        }
5642
5643
        let mut m = HashMap::new();
5644
5645
        let mut rng = {
5646
            let seed = u64::from_le_bytes(*b"testseed");
5647
            SmallRng::seed_from_u64(seed)
5648
        };
5649
5650
        // Populate the map with some items.
5651
        for _ in 0..50 {
5652
            let x = rng.gen_range(-10..10);
5653
            m.insert(x, ());
5654
        }
5655
5656
        for _ in 0..1000 {
5657
            let x = rng.gen_range(-10..10);
5658
            match m.entry(x) {
5659
                Vacant(_) => {}
5660
                Occupied(e) => {
5661
                    e.remove();
5662
                }
5663
            }
5664
5665
            check(&m);
5666
        }
5667
    }
5668
5669
    #[test]
5670
    fn test_entry_ref_take_doesnt_corrupt() {
5671
        #![allow(deprecated)] //rand
5672
                              // Test for #19292
5673
        fn check(m: &HashMap<std::string::String, ()>) {
5674
            for k in m.keys() {
5675
                assert!(m.contains_key(k), "{k} is in keys() but not in the map?");
5676
            }
5677
        }
5678
5679
        let mut m = HashMap::new();
5680
5681
        let mut rng = {
5682
            let seed = u64::from_le_bytes(*b"testseed");
5683
            SmallRng::seed_from_u64(seed)
5684
        };
5685
5686
        // Populate the map with some items.
5687
        for _ in 0..50 {
5688
            let mut x = std::string::String::with_capacity(1);
5689
            x.push(rng.gen_range('a'..='z'));
5690
            m.insert(x, ());
5691
        }
5692
5693
        for _ in 0..1000 {
5694
            let mut x = std::string::String::with_capacity(1);
5695
            x.push(rng.gen_range('a'..='z'));
5696
            match m.entry_ref(x.as_str()) {
5697
                EntryRef::Vacant(_) => {}
5698
                EntryRef::Occupied(e) => {
5699
                    e.remove();
5700
                }
5701
            }
5702
5703
            check(&m);
5704
        }
5705
    }
5706
5707
    #[test]
5708
    fn test_extend_ref_k_ref_v() {
5709
        let mut a = HashMap::new();
5710
        a.insert(1, "one");
5711
        let mut b = HashMap::new();
5712
        b.insert(2, "two");
5713
        b.insert(3, "three");
5714
5715
        a.extend(&b);
5716
5717
        assert_eq!(a.len(), 3);
5718
        assert_eq!(a[&1], "one");
5719
        assert_eq!(a[&2], "two");
5720
        assert_eq!(a[&3], "three");
5721
    }
5722
5723
    #[test]
5724
    #[allow(clippy::needless_borrow)]
5725
    fn test_extend_ref_kv_tuple() {
5726
        use std::ops::AddAssign;
5727
        let mut a = HashMap::new();
5728
        a.insert(0, 0);
5729
5730
        fn create_arr<T: AddAssign<T> + Copy, const N: usize>(start: T, step: T) -> [(T, T); N] {
5731
            let mut outs: [(T, T); N] = [(start, start); N];
5732
            let mut element = step;
5733
            outs.iter_mut().skip(1).for_each(|(k, v)| {
5734
                *k += element;
5735
                *v += element;
5736
                element += step;
5737
            });
5738
            outs
5739
        }
5740
5741
        let for_iter: Vec<_> = (0..100).map(|i| (i, i)).collect();
5742
        let iter = for_iter.iter();
5743
        let vec: Vec<_> = (100..200).map(|i| (i, i)).collect();
5744
        a.extend(iter);
5745
        a.extend(&vec);
5746
        a.extend(create_arr::<i32, 100>(200, 1));
5747
5748
        assert_eq!(a.len(), 300);
5749
5750
        for item in 0..300 {
5751
            assert_eq!(a[&item], item);
5752
        }
5753
    }
5754
5755
    #[test]
5756
    fn test_capacity_not_less_than_len() {
5757
        let mut a = HashMap::new();
5758
        let mut item = 0;
5759
5760
        for _ in 0..116 {
5761
            a.insert(item, 0);
5762
            item += 1;
5763
        }
5764
5765
        assert!(a.capacity() > a.len());
5766
5767
        let free = a.capacity() - a.len();
5768
        for _ in 0..free {
5769
            a.insert(item, 0);
5770
            item += 1;
5771
        }
5772
5773
        assert_eq!(a.len(), a.capacity());
5774
5775
        // Insert at capacity should cause allocation.
5776
        a.insert(item, 0);
5777
        assert!(a.capacity() > a.len());
5778
    }
5779
5780
    #[test]
5781
    fn test_occupied_entry_key() {
5782
        let mut a = HashMap::new();
5783
        let key = "hello there";
5784
        let value = "value goes here";
5785
        assert!(a.is_empty());
5786
        a.insert(key, value);
5787
        assert_eq!(a.len(), 1);
5788
        assert_eq!(a[key], value);
5789
5790
        match a.entry(key) {
5791
            Vacant(_) => panic!(),
5792
            Occupied(e) => assert_eq!(key, *e.key()),
5793
        }
5794
        assert_eq!(a.len(), 1);
5795
        assert_eq!(a[key], value);
5796
    }
5797
5798
    #[test]
5799
    fn test_occupied_entry_ref_key() {
5800
        let mut a = HashMap::new();
5801
        let key = "hello there";
5802
        let value = "value goes here";
5803
        assert!(a.is_empty());
5804
        a.insert(key.to_owned(), value);
5805
        assert_eq!(a.len(), 1);
5806
        assert_eq!(a[key], value);
5807
5808
        match a.entry_ref(key) {
5809
            EntryRef::Vacant(_) => panic!(),
5810
            EntryRef::Occupied(e) => assert_eq!(key, e.key()),
5811
        }
5812
        assert_eq!(a.len(), 1);
5813
        assert_eq!(a[key], value);
5814
    }
5815
5816
    #[test]
5817
    fn test_vacant_entry_key() {
5818
        let mut a = HashMap::new();
5819
        let key = "hello there";
5820
        let value = "value goes here";
5821
5822
        assert!(a.is_empty());
5823
        match a.entry(key) {
5824
            Occupied(_) => panic!(),
5825
            Vacant(e) => {
5826
                assert_eq!(key, *e.key());
5827
                e.insert(value);
5828
            }
5829
        }
5830
        assert_eq!(a.len(), 1);
5831
        assert_eq!(a[key], value);
5832
    }
5833
5834
    #[test]
5835
    fn test_vacant_entry_ref_key() {
5836
        let mut a: HashMap<std::string::String, &str> = HashMap::new();
5837
        let key = "hello there";
5838
        let value = "value goes here";
5839
5840
        assert!(a.is_empty());
5841
        match a.entry_ref(key) {
5842
            EntryRef::Occupied(_) => panic!(),
5843
            EntryRef::Vacant(e) => {
5844
                assert_eq!(key, e.key());
5845
                e.insert(value);
5846
            }
5847
        }
5848
        assert_eq!(a.len(), 1);
5849
        assert_eq!(a[key], value);
5850
    }
5851
5852
    #[test]
5853
    fn test_occupied_entry_replace_entry_with() {
5854
        let mut a = HashMap::new();
5855
5856
        let key = "a key";
5857
        let value = "an initial value";
5858
        let new_value = "a new value";
5859
5860
        let entry = a.entry(key).insert(value).replace_entry_with(|k, v| {
5861
            assert_eq!(k, &key);
5862
            assert_eq!(v, value);
5863
            Some(new_value)
5864
        });
5865
5866
        match entry {
5867
            Occupied(e) => {
5868
                assert_eq!(e.key(), &key);
5869
                assert_eq!(e.get(), &new_value);
5870
            }
5871
            Vacant(_) => panic!(),
5872
        }
5873
5874
        assert_eq!(a[key], new_value);
5875
        assert_eq!(a.len(), 1);
5876
5877
        let entry = match a.entry(key) {
5878
            Occupied(e) => e.replace_entry_with(|k, v| {
5879
                assert_eq!(k, &key);
5880
                assert_eq!(v, new_value);
5881
                None
5882
            }),
5883
            Vacant(_) => panic!(),
5884
        };
5885
5886
        match entry {
5887
            Vacant(e) => assert_eq!(e.key(), &key),
5888
            Occupied(_) => panic!(),
5889
        }
5890
5891
        assert!(!a.contains_key(key));
5892
        assert_eq!(a.len(), 0);
5893
    }
5894
5895
    #[test]
5896
    fn test_entry_and_replace_entry_with() {
5897
        let mut a = HashMap::new();
5898
5899
        let key = "a key";
5900
        let value = "an initial value";
5901
        let new_value = "a new value";
5902
5903
        let entry = a.entry(key).and_replace_entry_with(|_, _| panic!());
5904
5905
        match entry {
5906
            Vacant(e) => assert_eq!(e.key(), &key),
5907
            Occupied(_) => panic!(),
5908
        }
5909
5910
        a.insert(key, value);
5911
5912
        let entry = a.entry(key).and_replace_entry_with(|k, v| {
5913
            assert_eq!(k, &key);
5914
            assert_eq!(v, value);
5915
            Some(new_value)
5916
        });
5917
5918
        match entry {
5919
            Occupied(e) => {
5920
                assert_eq!(e.key(), &key);
5921
                assert_eq!(e.get(), &new_value);
5922
            }
5923
            Vacant(_) => panic!(),
5924
        }
5925
5926
        assert_eq!(a[key], new_value);
5927
        assert_eq!(a.len(), 1);
5928
5929
        let entry = a.entry(key).and_replace_entry_with(|k, v| {
5930
            assert_eq!(k, &key);
5931
            assert_eq!(v, new_value);
5932
            None
5933
        });
5934
5935
        match entry {
5936
            Vacant(e) => assert_eq!(e.key(), &key),
5937
            Occupied(_) => panic!(),
5938
        }
5939
5940
        assert!(!a.contains_key(key));
5941
        assert_eq!(a.len(), 0);
5942
    }
5943
5944
    #[test]
5945
    fn test_replace_entry_with_doesnt_corrupt() {
5946
        #![allow(deprecated)] //rand
5947
                              // Test for #19292
5948
        fn check(m: &HashMap<i32, ()>) {
5949
            for k in m.keys() {
5950
                assert!(m.contains_key(k), "{k} is in keys() but not in the map?");
5951
            }
5952
        }
5953
5954
        let mut m = HashMap::new();
5955
5956
        let mut rng = {
5957
            let seed = u64::from_le_bytes(*b"testseed");
5958
            SmallRng::seed_from_u64(seed)
5959
        };
5960
5961
        // Populate the map with some items.
5962
        for _ in 0..50 {
5963
            let x = rng.gen_range(-10..10);
5964
            m.insert(x, ());
5965
        }
5966
5967
        for _ in 0..1000 {
5968
            let x = rng.gen_range(-10..10);
5969
            m.entry(x).and_replace_entry_with(|_, _| None);
5970
            check(&m);
5971
        }
5972
    }
5973
5974
    #[test]
5975
    fn test_retain() {
5976
        let mut map: HashMap<i32, i32> = (0..100).map(|x| (x, x * 10)).collect();
5977
5978
        map.retain(|&k, _| k % 2 == 0);
5979
        assert_eq!(map.len(), 50);
5980
        assert_eq!(map[&2], 20);
5981
        assert_eq!(map[&4], 40);
5982
        assert_eq!(map[&6], 60);
5983
    }
5984
5985
    #[test]
5986
    fn test_extract_if() {
5987
        {
5988
            let mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x * 10)).collect();
5989
            let drained = map.extract_if(|&k, _| k % 2 == 0);
5990
            let mut out = drained.collect::<Vec<_>>();
5991
            out.sort_unstable();
5992
            assert_eq!(vec![(0, 0), (2, 20), (4, 40), (6, 60)], out);
5993
            assert_eq!(map.len(), 4);
5994
        }
5995
        {
5996
            let mut map: HashMap<i32, i32> = (0..8).map(|x| (x, x * 10)).collect();
5997
            map.extract_if(|&k, _| k % 2 == 0).for_each(drop);
5998
            assert_eq!(map.len(), 4);
5999
        }
6000
    }
6001
6002
    #[test]
6003
    #[cfg_attr(miri, ignore)] // FIXME: no OOM signalling (https://github.com/rust-lang/miri/issues/613)
6004
    fn test_try_reserve() {
6005
        use crate::TryReserveError::{AllocError, CapacityOverflow};
6006
6007
        const MAX_ISIZE: usize = isize::MAX as usize;
6008
6009
        let mut empty_bytes: HashMap<u8, u8> = HashMap::new();
6010
6011
        if let Err(CapacityOverflow) = empty_bytes.try_reserve(usize::MAX) {
6012
        } else {
6013
            panic!("usize::MAX should trigger an overflow!");
6014
        }
6015
6016
        if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_ISIZE) {
6017
        } else {
6018
            panic!("isize::MAX should trigger an overflow!");
6019
        }
6020
6021
        if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_ISIZE / 5) {
6022
        } else {
6023
            // This may succeed if there is enough free memory. Attempt to
6024
            // allocate a few more hashmaps to ensure the allocation will fail.
6025
            let mut empty_bytes2: HashMap<u8, u8> = HashMap::new();
6026
            let _ = empty_bytes2.try_reserve(MAX_ISIZE / 5);
6027
            let mut empty_bytes3: HashMap<u8, u8> = HashMap::new();
6028
            let _ = empty_bytes3.try_reserve(MAX_ISIZE / 5);
6029
            let mut empty_bytes4: HashMap<u8, u8> = HashMap::new();
6030
            if let Err(AllocError { .. }) = empty_bytes4.try_reserve(MAX_ISIZE / 5) {
6031
            } else {
6032
                panic!("isize::MAX / 5 should trigger an OOM!");
6033
            }
6034
        }
6035
    }
6036
6037
    #[test]
6038
    fn test_const_with_hasher() {
6039
        use core::hash::BuildHasher;
6040
        use std::collections::hash_map::DefaultHasher;
6041
6042
        #[derive(Clone)]
6043
        struct MyHasher;
6044
        impl BuildHasher for MyHasher {
6045
            type Hasher = DefaultHasher;
6046
6047
            fn build_hasher(&self) -> DefaultHasher {
6048
                DefaultHasher::new()
6049
            }
6050
        }
6051
6052
        const EMPTY_MAP: HashMap<u32, std::string::String, MyHasher> =
6053
            HashMap::with_hasher(MyHasher);
6054
6055
        let mut map = EMPTY_MAP;
6056
        map.insert(17, "seventeen".to_owned());
6057
        assert_eq!("seventeen", map[&17]);
6058
    }
6059
6060
    #[test]
6061
    fn test_get_many_mut() {
6062
        let mut map = HashMap::new();
6063
        map.insert("foo".to_owned(), 0);
6064
        map.insert("bar".to_owned(), 10);
6065
        map.insert("baz".to_owned(), 20);
6066
        map.insert("qux".to_owned(), 30);
6067
6068
        let xs = map.get_many_mut(["foo", "qux"]);
6069
        assert_eq!(xs, [Some(&mut 0), Some(&mut 30)]);
6070
6071
        let xs = map.get_many_mut(["foo", "dud"]);
6072
        assert_eq!(xs, [Some(&mut 0), None]);
6073
6074
        let ys = map.get_many_key_value_mut(["bar", "baz"]);
6075
        assert_eq!(
6076
            ys,
6077
            [
6078
                Some((&"bar".to_owned(), &mut 10)),
6079
                Some((&"baz".to_owned(), &mut 20))
6080
            ],
6081
        );
6082
6083
        let ys = map.get_many_key_value_mut(["bar", "dip"]);
6084
        assert_eq!(ys, [Some((&"bar".to_string(), &mut 10)), None]);
6085
    }
6086
6087
    #[test]
6088
    #[should_panic = "duplicate keys found"]
6089
    fn test_get_many_mut_duplicate() {
6090
        let mut map = HashMap::new();
6091
        map.insert("foo".to_owned(), 0);
6092
6093
        let _xs = map.get_many_mut(["foo", "foo"]);
6094
    }
6095
6096
    #[test]
6097
    #[should_panic = "panic in drop"]
6098
    fn test_clone_from_double_drop() {
6099
        #[derive(Clone)]
6100
        struct CheckedDrop {
6101
            panic_in_drop: bool,
6102
            dropped: bool,
6103
        }
6104
        impl Drop for CheckedDrop {
6105
            fn drop(&mut self) {
6106
                if self.panic_in_drop {
6107
                    self.dropped = true;
6108
                    panic!("panic in drop");
6109
                }
6110
                if self.dropped {
6111
                    panic!("double drop");
6112
                }
6113
                self.dropped = true;
6114
            }
6115
        }
6116
        const DISARMED: CheckedDrop = CheckedDrop {
6117
            panic_in_drop: false,
6118
            dropped: false,
6119
        };
6120
        const ARMED: CheckedDrop = CheckedDrop {
6121
            panic_in_drop: true,
6122
            dropped: false,
6123
        };
6124
6125
        let mut map1 = HashMap::new();
6126
        map1.insert(1, DISARMED);
6127
        map1.insert(2, DISARMED);
6128
        map1.insert(3, DISARMED);
6129
        map1.insert(4, DISARMED);
6130
6131
        let mut map2 = HashMap::new();
6132
        map2.insert(1, DISARMED);
6133
        map2.insert(2, ARMED);
6134
        map2.insert(3, DISARMED);
6135
        map2.insert(4, DISARMED);
6136
6137
        map2.clone_from(&map1);
6138
    }
6139
6140
    #[test]
6141
    #[should_panic = "panic in clone"]
6142
    fn test_clone_from_memory_leaks() {
6143
        use alloc::vec::Vec;
6144
6145
        struct CheckedClone {
6146
            panic_in_clone: bool,
6147
            need_drop: Vec<i32>,
6148
        }
6149
        impl Clone for CheckedClone {
6150
            fn clone(&self) -> Self {
6151
                if self.panic_in_clone {
6152
                    panic!("panic in clone")
6153
                }
6154
                Self {
6155
                    panic_in_clone: self.panic_in_clone,
6156
                    need_drop: self.need_drop.clone(),
6157
                }
6158
            }
6159
        }
6160
        let mut map1 = HashMap::new();
6161
        map1.insert(
6162
            1,
6163
            CheckedClone {
6164
                panic_in_clone: false,
6165
                need_drop: vec![0, 1, 2],
6166
            },
6167
        );
6168
        map1.insert(
6169
            2,
6170
            CheckedClone {
6171
                panic_in_clone: false,
6172
                need_drop: vec![3, 4, 5],
6173
            },
6174
        );
6175
        map1.insert(
6176
            3,
6177
            CheckedClone {
6178
                panic_in_clone: true,
6179
                need_drop: vec![6, 7, 8],
6180
            },
6181
        );
6182
        let _map2 = map1.clone();
6183
    }
6184
6185
    struct MyAllocInner {
6186
        drop_count: Arc<AtomicI8>,
6187
    }
6188
6189
    #[derive(Clone)]
6190
    struct MyAlloc {
6191
        _inner: Arc<MyAllocInner>,
6192
    }
6193
6194
    impl MyAlloc {
6195
        fn new(drop_count: Arc<AtomicI8>) -> Self {
6196
            MyAlloc {
6197
                _inner: Arc::new(MyAllocInner { drop_count }),
6198
            }
6199
        }
6200
    }
6201
6202
    impl Drop for MyAllocInner {
6203
        fn drop(&mut self) {
6204
            println!("MyAlloc freed.");
6205
            self.drop_count.fetch_sub(1, Ordering::SeqCst);
6206
        }
6207
    }
6208
6209
    unsafe impl Allocator for MyAlloc {
6210
        fn allocate(&self, layout: Layout) -> std::result::Result<NonNull<[u8]>, AllocError> {
6211
            let g = Global;
6212
            g.allocate(layout)
6213
        }
6214
6215
        unsafe fn deallocate(&self, ptr: NonNull<u8>, layout: Layout) {
6216
            let g = Global;
6217
            g.deallocate(ptr, layout)
6218
        }
6219
    }
6220
6221
    #[test]
6222
    fn test_hashmap_into_iter_bug() {
6223
        let dropped: Arc<AtomicI8> = Arc::new(AtomicI8::new(1));
6224
6225
        {
6226
            let mut map = HashMap::with_capacity_in(10, MyAlloc::new(dropped.clone()));
6227
            for i in 0..10 {
6228
                map.entry(i).or_insert_with(|| "i".to_string());
6229
            }
6230
6231
            for (k, v) in map {
6232
                println!("{k}, {v}");
6233
            }
6234
        }
6235
6236
        // All allocator clones should already be dropped.
6237
        assert_eq!(dropped.load(Ordering::SeqCst), 0);
6238
    }
6239
6240
    #[derive(Debug)]
6241
    struct CheckedCloneDrop<T> {
6242
        panic_in_clone: bool,
6243
        panic_in_drop: bool,
6244
        dropped: bool,
6245
        data: T,
6246
    }
6247
6248
    impl<T> CheckedCloneDrop<T> {
6249
        fn new(panic_in_clone: bool, panic_in_drop: bool, data: T) -> Self {
6250
            CheckedCloneDrop {
6251
                panic_in_clone,
6252
                panic_in_drop,
6253
                dropped: false,
6254
                data,
6255
            }
6256
        }
6257
    }
6258
6259
    impl<T: Clone> Clone for CheckedCloneDrop<T> {
6260
        fn clone(&self) -> Self {
6261
            if self.panic_in_clone {
6262
                panic!("panic in clone")
6263
            }
6264
            Self {
6265
                panic_in_clone: self.panic_in_clone,
6266
                panic_in_drop: self.panic_in_drop,
6267
                dropped: self.dropped,
6268
                data: self.data.clone(),
6269
            }
6270
        }
6271
    }
6272
6273
    impl<T> Drop for CheckedCloneDrop<T> {
6274
        fn drop(&mut self) {
6275
            if self.panic_in_drop {
6276
                self.dropped = true;
6277
                panic!("panic in drop");
6278
            }
6279
            if self.dropped {
6280
                panic!("double drop");
6281
            }
6282
            self.dropped = true;
6283
        }
6284
    }
6285
6286
    /// Return hashmap with predefined distribution of elements.
6287
    /// All elements will be located in the same order as elements
6288
    /// returned by iterator.
6289
    ///
6290
    /// This function does not panic, but returns an error as a `String`
6291
    /// to distinguish between a test panic and an error in the input data.
6292
    fn get_test_map<I, T, A>(
6293
        iter: I,
6294
        mut fun: impl FnMut(u64) -> T,
6295
        alloc: A,
6296
    ) -> Result<HashMap<u64, CheckedCloneDrop<T>, DefaultHashBuilder, A>, String>
6297
    where
6298
        I: Iterator<Item = (bool, bool)> + Clone + ExactSizeIterator,
6299
        A: Allocator,
6300
        T: PartialEq + core::fmt::Debug,
6301
    {
6302
        use crate::scopeguard::guard;
6303
6304
        let mut map: HashMap<u64, CheckedCloneDrop<T>, _, A> =
6305
            HashMap::with_capacity_in(iter.size_hint().0, alloc);
6306
        {
6307
            let mut guard = guard(&mut map, |map| {
6308
                for (_, value) in map.iter_mut() {
6309
                    value.panic_in_drop = false
6310
                }
6311
            });
6312
6313
            let mut count = 0;
6314
            // Hash and Key must be equal to each other for controlling the elements placement.
6315
            for (panic_in_clone, panic_in_drop) in iter.clone() {
6316
                if core::mem::needs_drop::<T>() && panic_in_drop {
6317
                    return Err(String::from(
6318
                        "panic_in_drop can be set with a type that doesn't need to be dropped",
6319
                    ));
6320
                }
6321
                guard.table.insert(
6322
                    count,
6323
                    (
6324
                        count,
6325
                        CheckedCloneDrop::new(panic_in_clone, panic_in_drop, fun(count)),
6326
                    ),
6327
                    |(k, _)| *k,
6328
                );
6329
                count += 1;
6330
            }
6331
6332
            // Let's check that all elements are located as we wanted
6333
            let mut check_count = 0;
6334
            for ((key, value), (panic_in_clone, panic_in_drop)) in guard.iter().zip(iter) {
6335
                if *key != check_count {
6336
                    return Err(format!(
6337
                        "key != check_count,\nkey: `{key}`,\ncheck_count: `{check_count}`"
6338
                    ));
6339
                }
6340
                if value.dropped
6341
                    || value.panic_in_clone != panic_in_clone
6342
                    || value.panic_in_drop != panic_in_drop
6343
                    || value.data != fun(check_count)
6344
                {
6345
                    return Err(format!(
6346
                        "Value is not equal to expected,\nvalue: `{:?}`,\nexpected: \
6347
                        `CheckedCloneDrop {{ panic_in_clone: {}, panic_in_drop: {}, dropped: {}, data: {:?} }}`",
6348
                        value, panic_in_clone, panic_in_drop, false, fun(check_count)
6349
                    ));
6350
                }
6351
                check_count += 1;
6352
            }
6353
6354
            if guard.len() != check_count as usize {
6355
                return Err(format!(
6356
                    "map.len() != check_count,\nmap.len(): `{}`,\ncheck_count: `{}`",
6357
                    guard.len(),
6358
                    check_count
6359
                ));
6360
            }
6361
6362
            if count != check_count {
6363
                return Err(format!(
6364
                    "count != check_count,\ncount: `{count}`,\ncheck_count: `{check_count}`"
6365
                ));
6366
            }
6367
            core::mem::forget(guard);
6368
        }
6369
        Ok(map)
6370
    }
6371
6372
    const DISARMED: bool = false;
6373
    const ARMED: bool = true;
6374
6375
    const ARMED_FLAGS: [bool; 8] = [
6376
        DISARMED, DISARMED, DISARMED, ARMED, DISARMED, DISARMED, DISARMED, DISARMED,
6377
    ];
6378
6379
    const DISARMED_FLAGS: [bool; 8] = [
6380
        DISARMED, DISARMED, DISARMED, DISARMED, DISARMED, DISARMED, DISARMED, DISARMED,
6381
    ];
6382
6383
    #[test]
6384
    #[should_panic = "panic in clone"]
6385
    fn test_clone_memory_leaks_and_double_drop_one() {
6386
        let dropped: Arc<AtomicI8> = Arc::new(AtomicI8::new(2));
6387
6388
        {
6389
            assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len());
6390
6391
            let map: HashMap<u64, CheckedCloneDrop<Vec<u64>>, DefaultHashBuilder, MyAlloc> =
6392
                match get_test_map(
6393
                    ARMED_FLAGS.into_iter().zip(DISARMED_FLAGS),
6394
                    |n| vec![n],
6395
                    MyAlloc::new(dropped.clone()),
6396
                ) {
6397
                    Ok(map) => map,
6398
                    Err(msg) => panic!("{msg}"),
6399
                };
6400
6401
            // Clone should normally clone a few elements, and then (when the
6402
            // clone function panics), deallocate both its own memory, memory
6403
            // of `dropped: Arc<AtomicI8>` and the memory of already cloned
6404
            // elements (Vec<i32> memory inside CheckedCloneDrop).
6405
            let _map2 = map.clone();
6406
        }
6407
    }
6408
6409
    #[test]
6410
    #[should_panic = "panic in drop"]
6411
    fn test_clone_memory_leaks_and_double_drop_two() {
6412
        let dropped: Arc<AtomicI8> = Arc::new(AtomicI8::new(2));
6413
6414
        {
6415
            assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len());
6416
6417
            let map: HashMap<u64, CheckedCloneDrop<u64>, DefaultHashBuilder, _> = match get_test_map(
6418
                DISARMED_FLAGS.into_iter().zip(DISARMED_FLAGS),
6419
                |n| n,
6420
                MyAlloc::new(dropped.clone()),
6421
            ) {
6422
                Ok(map) => map,
6423
                Err(msg) => panic!("{msg}"),
6424
            };
6425
6426
            let mut map2 = match get_test_map(
6427
                DISARMED_FLAGS.into_iter().zip(ARMED_FLAGS),
6428
                |n| n,
6429
                MyAlloc::new(dropped.clone()),
6430
            ) {
6431
                Ok(map) => map,
6432
                Err(msg) => panic!("{msg}"),
6433
            };
6434
6435
            // The `clone_from` should try to drop the elements of `map2` without
6436
            // double drop and leaking the allocator. Elements that have not been
6437
            // dropped leak their memory.
6438
            map2.clone_from(&map);
6439
        }
6440
    }
6441
6442
    /// We check that we have a working table if the clone operation from another
6443
    /// thread ended in a panic (when buckets of maps are equal to each other).
6444
    #[test]
6445
    fn test_catch_panic_clone_from_when_len_is_equal() {
6446
        use std::thread;
6447
6448
        let dropped: Arc<AtomicI8> = Arc::new(AtomicI8::new(2));
6449
6450
        {
6451
            assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len());
6452
6453
            let mut map = match get_test_map(
6454
                DISARMED_FLAGS.into_iter().zip(DISARMED_FLAGS),
6455
                |n| vec![n],
6456
                MyAlloc::new(dropped.clone()),
6457
            ) {
6458
                Ok(map) => map,
6459
                Err(msg) => panic!("{msg}"),
6460
            };
6461
6462
            thread::scope(|s| {
6463
                let result: thread::ScopedJoinHandle<'_, String> = s.spawn(|| {
6464
                    let scope_map =
6465
                        match get_test_map(ARMED_FLAGS.into_iter().zip(DISARMED_FLAGS), |n| vec![n * 2], MyAlloc::new(dropped.clone())) {
6466
                            Ok(map) => map,
6467
                            Err(msg) => return msg,
6468
                        };
6469
                    if map.table.buckets() != scope_map.table.buckets() {
6470
                        return format!(
6471
                            "map.table.buckets() != scope_map.table.buckets(),\nleft: `{}`,\nright: `{}`",
6472
                            map.table.buckets(), scope_map.table.buckets()
6473
                        );
6474
                    }
6475
                    map.clone_from(&scope_map);
6476
                    "We must fail the cloning!!!".to_owned()
6477
                });
6478
                if let Ok(msg) = result.join() {
6479
                    panic!("{msg}")
6480
                }
6481
            });
6482
6483
            // Let's check that all iterators work fine and do not return elements
6484
            // (especially `RawIterRange`, which does not depend on the number of
6485
            // elements in the table, but looks directly at the control bytes)
6486
            //
6487
            // SAFETY: We know for sure that `RawTable` will outlive
6488
            // the returned `RawIter / RawIterRange` iterator.
6489
            assert_eq!(map.len(), 0);
6490
            assert_eq!(map.iter().count(), 0);
6491
            assert_eq!(unsafe { map.table.iter().count() }, 0);
6492
            assert_eq!(unsafe { map.table.iter().iter.count() }, 0);
6493
6494
            for idx in 0..map.table.buckets() {
6495
                let idx = idx as u64;
6496
                assert!(
6497
                    map.table.find(idx, |(k, _)| *k == idx).is_none(),
6498
                    "Index: {idx}"
6499
                );
6500
            }
6501
        }
6502
6503
        // All allocator clones should already be dropped.
6504
        assert_eq!(dropped.load(Ordering::SeqCst), 0);
6505
    }
6506
6507
    /// We check that we have a working table if the clone operation from another
6508
    /// thread ended in a panic (when buckets of maps are not equal to each other).
6509
    #[test]
6510
    fn test_catch_panic_clone_from_when_len_is_not_equal() {
6511
        use std::thread;
6512
6513
        let dropped: Arc<AtomicI8> = Arc::new(AtomicI8::new(2));
6514
6515
        {
6516
            assert_eq!(ARMED_FLAGS.len(), DISARMED_FLAGS.len());
6517
6518
            let mut map = match get_test_map(
6519
                [DISARMED].into_iter().zip([DISARMED]),
6520
                |n| vec![n],
6521
                MyAlloc::new(dropped.clone()),
6522
            ) {
6523
                Ok(map) => map,
6524
                Err(msg) => panic!("{msg}"),
6525
            };
6526
6527
            thread::scope(|s| {
6528
                let result: thread::ScopedJoinHandle<'_, String> = s.spawn(|| {
6529
                    let scope_map = match get_test_map(
6530
                        ARMED_FLAGS.into_iter().zip(DISARMED_FLAGS),
6531
                        |n| vec![n * 2],
6532
                        MyAlloc::new(dropped.clone()),
6533
                    ) {
6534
                        Ok(map) => map,
6535
                        Err(msg) => return msg,
6536
                    };
6537
                    if map.table.buckets() == scope_map.table.buckets() {
6538
                        return format!(
6539
                            "map.table.buckets() == scope_map.table.buckets(): `{}`",
6540
                            map.table.buckets()
6541
                        );
6542
                    }
6543
                    map.clone_from(&scope_map);
6544
                    "We must fail the cloning!!!".to_owned()
6545
                });
6546
                if let Ok(msg) = result.join() {
6547
                    panic!("{msg}")
6548
                }
6549
            });
6550
6551
            // Let's check that all iterators work fine and do not return elements
6552
            // (especially `RawIterRange`, which does not depend on the number of
6553
            // elements in the table, but looks directly at the control bytes)
6554
            //
6555
            // SAFETY: We know for sure that `RawTable` will outlive
6556
            // the returned `RawIter / RawIterRange` iterator.
6557
            assert_eq!(map.len(), 0);
6558
            assert_eq!(map.iter().count(), 0);
6559
            assert_eq!(unsafe { map.table.iter().count() }, 0);
6560
            assert_eq!(unsafe { map.table.iter().iter.count() }, 0);
6561
6562
            for idx in 0..map.table.buckets() {
6563
                let idx = idx as u64;
6564
                assert!(
6565
                    map.table.find(idx, |(k, _)| *k == idx).is_none(),
6566
                    "Index: {idx}"
6567
                );
6568
            }
6569
        }
6570
6571
        // All allocator clones should already be dropped.
6572
        assert_eq!(dropped.load(Ordering::SeqCst), 0);
6573
    }
6574
6575
    #[test]
6576
    fn test_allocation_info() {
6577
        assert_eq!(HashMap::<(), ()>::new().allocation_size(), 0);
6578
        assert_eq!(HashMap::<u32, u32>::new().allocation_size(), 0);
6579
        assert!(
6580
            HashMap::<u32, u32>::with_capacity(1).allocation_size() > core::mem::size_of::<u32>()
6581
        );
6582
    }
6583
}