• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use crate::hash_map::{equivalent, make_hash, make_hasher};
2 use crate::raw::{Allocator, Bucket, Global, RawTable};
3 use crate::{Equivalent, HashMap};
4 use core::fmt::{self, Debug};
5 use core::hash::{BuildHasher, Hash};
6 use core::mem;
7 
8 impl<K, V, S, A: Allocator> HashMap<K, V, S, A> {
9     /// Creates a raw entry builder for the `HashMap`.
10     ///
11     /// Raw entries provide the lowest level of control for searching and
12     /// manipulating a map. They must be manually initialized with a hash and
13     /// then manually searched. After this, insertions into a vacant entry
14     /// still require an owned key to be provided.
15     ///
16     /// Raw entries are useful for such exotic situations as:
17     ///
18     /// * Hash memoization
19     /// * Deferring the creation of an owned key until it is known to be required
20     /// * Using a search key that doesn't work with the Borrow trait
21     /// * Using custom comparison logic without newtype wrappers
22     ///
23     /// Because raw entries provide much more low-level control, it's much easier
24     /// to put the `HashMap` into an inconsistent state which, while memory-safe,
25     /// will cause the map to produce seemingly random results. Higher-level and
26     /// more foolproof APIs like `entry` should be preferred when possible.
27     ///
28     /// In particular, the hash used to initialized the raw entry must still be
29     /// consistent with the hash of the key that is ultimately stored in the entry.
30     /// This is because implementations of `HashMap` may need to recompute hashes
31     /// when resizing, at which point only the keys are available.
32     ///
33     /// Raw entries give mutable access to the keys. This must not be used
34     /// to modify how the key would compare or hash, as the map will not re-evaluate
35     /// where the key should go, meaning the keys may become "lost" if their
36     /// location does not reflect their state. For instance, if you change a key
37     /// so that the map now contains keys which compare equal, search may start
38     /// acting erratically, with two keys randomly masking each other. Implementations
39     /// are free to assume this doesn't happen (within the limits of memory-safety).
40     ///
41     /// # Examples
42     ///
43     /// ```
44     /// use core::hash::{BuildHasher, Hash};
45     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
46     ///
47     /// let mut map = HashMap::new();
48     /// map.extend([("a", 100), ("b", 200), ("c", 300)]);
49     ///
50     /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
51     ///     use core::hash::Hasher;
52     ///     let mut state = hash_builder.build_hasher();
53     ///     key.hash(&mut state);
54     ///     state.finish()
55     /// }
56     ///
57     /// // Existing key (insert and update)
58     /// match map.raw_entry_mut().from_key(&"a") {
59     ///     RawEntryMut::Vacant(_) => unreachable!(),
60     ///     RawEntryMut::Occupied(mut view) => {
61     ///         assert_eq!(view.get(), &100);
62     ///         let v = view.get_mut();
63     ///         let new_v = (*v) * 10;
64     ///         *v = new_v;
65     ///         assert_eq!(view.insert(1111), 1000);
66     ///     }
67     /// }
68     ///
69     /// assert_eq!(map[&"a"], 1111);
70     /// assert_eq!(map.len(), 3);
71     ///
72     /// // Existing key (take)
73     /// let hash = compute_hash(map.hasher(), &"c");
74     /// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &"c") {
75     ///     RawEntryMut::Vacant(_) => unreachable!(),
76     ///     RawEntryMut::Occupied(view) => {
77     ///         assert_eq!(view.remove_entry(), ("c", 300));
78     ///     }
79     /// }
80     /// assert_eq!(map.raw_entry().from_key(&"c"), None);
81     /// assert_eq!(map.len(), 2);
82     ///
83     /// // Nonexistent key (insert and update)
84     /// let key = "d";
85     /// let hash = compute_hash(map.hasher(), &key);
86     /// match map.raw_entry_mut().from_hash(hash, |q| *q == key) {
87     ///     RawEntryMut::Occupied(_) => unreachable!(),
88     ///     RawEntryMut::Vacant(view) => {
89     ///         let (k, value) = view.insert("d", 4000);
90     ///         assert_eq!((*k, *value), ("d", 4000));
91     ///         *value = 40000;
92     ///     }
93     /// }
94     /// assert_eq!(map[&"d"], 40000);
95     /// assert_eq!(map.len(), 3);
96     ///
97     /// match map.raw_entry_mut().from_hash(hash, |q| *q == key) {
98     ///     RawEntryMut::Vacant(_) => unreachable!(),
99     ///     RawEntryMut::Occupied(view) => {
100     ///         assert_eq!(view.remove_entry(), ("d", 40000));
101     ///     }
102     /// }
103     /// assert_eq!(map.get(&"d"), None);
104     /// assert_eq!(map.len(), 2);
105     /// ```
106     #[cfg_attr(feature = "inline-more", inline)]
raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S, A>107     pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S, A> {
108         RawEntryBuilderMut { map: self }
109     }
110 
111     /// Creates a raw immutable entry builder for the `HashMap`.
112     ///
113     /// Raw entries provide the lowest level of control for searching and
114     /// manipulating a map. They must be manually initialized with a hash and
115     /// then manually searched.
116     ///
117     /// This is useful for
118     /// * Hash memoization
119     /// * Using a search key that doesn't work with the Borrow trait
120     /// * Using custom comparison logic without newtype wrappers
121     ///
122     /// Unless you are in such a situation, higher-level and more foolproof APIs like
123     /// `get` should be preferred.
124     ///
125     /// Immutable raw entries have very limited use; you might instead want `raw_entry_mut`.
126     ///
127     /// # Examples
128     ///
129     /// ```
130     /// use core::hash::{BuildHasher, Hash};
131     /// use hashbrown::HashMap;
132     ///
133     /// let mut map = HashMap::new();
134     /// map.extend([("a", 100), ("b", 200), ("c", 300)]);
135     ///
136     /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
137     ///     use core::hash::Hasher;
138     ///     let mut state = hash_builder.build_hasher();
139     ///     key.hash(&mut state);
140     ///     state.finish()
141     /// }
142     ///
143     /// for k in ["a", "b", "c", "d", "e", "f"] {
144     ///     let hash = compute_hash(map.hasher(), k);
145     ///     let v = map.get(&k).cloned();
146     ///     let kv = v.as_ref().map(|v| (&k, v));
147     ///
148     ///     println!("Key: {} and value: {:?}", k, v);
149     ///
150     ///     assert_eq!(map.raw_entry().from_key(&k), kv);
151     ///     assert_eq!(map.raw_entry().from_hash(hash, |q| *q == k), kv);
152     ///     assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv);
153     /// }
154     /// ```
155     #[cfg_attr(feature = "inline-more", inline)]
raw_entry(&self) -> RawEntryBuilder<'_, K, V, S, A>156     pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S, A> {
157         RawEntryBuilder { map: self }
158     }
159 }
160 
161 /// A builder for computing where in a [`HashMap`] a key-value pair would be stored.
162 ///
163 /// See the [`HashMap::raw_entry_mut`] docs for usage examples.
164 ///
165 /// [`HashMap::raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut
166 ///
167 /// # Examples
168 ///
169 /// ```
170 /// use hashbrown::hash_map::{RawEntryBuilderMut, RawEntryMut::Vacant, RawEntryMut::Occupied};
171 /// use hashbrown::HashMap;
172 /// use core::hash::{BuildHasher, Hash};
173 ///
174 /// let mut map = HashMap::new();
175 /// map.extend([(1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16)]);
176 /// assert_eq!(map.len(), 6);
177 ///
178 /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
179 ///     use core::hash::Hasher;
180 ///     let mut state = hash_builder.build_hasher();
181 ///     key.hash(&mut state);
182 ///     state.finish()
183 /// }
184 ///
185 /// let builder: RawEntryBuilderMut<_, _, _> = map.raw_entry_mut();
186 ///
187 /// // Existing key
188 /// match builder.from_key(&6) {
189 ///     Vacant(_) => unreachable!(),
190 ///     Occupied(view) => assert_eq!(view.get(), &16),
191 /// }
192 ///
193 /// for key in 0..12 {
194 ///     let hash = compute_hash(map.hasher(), &key);
195 ///     let value = map.get(&key).cloned();
196 ///     let key_value = value.as_ref().map(|v| (&key, v));
197 ///
198 ///     println!("Key: {} and value: {:?}", key, value);
199 ///
200 ///     match map.raw_entry_mut().from_key(&key) {
201 ///         Occupied(mut o) => assert_eq!(Some(o.get_key_value()), key_value),
202 ///         Vacant(_) => assert_eq!(value, None),
203 ///     }
204 ///     match map.raw_entry_mut().from_key_hashed_nocheck(hash, &key) {
205 ///         Occupied(mut o) => assert_eq!(Some(o.get_key_value()), key_value),
206 ///         Vacant(_) => assert_eq!(value, None),
207 ///     }
208 ///     match map.raw_entry_mut().from_hash(hash, |q| *q == key) {
209 ///         Occupied(mut o) => assert_eq!(Some(o.get_key_value()), key_value),
210 ///         Vacant(_) => assert_eq!(value, None),
211 ///     }
212 /// }
213 ///
214 /// assert_eq!(map.len(), 6);
215 /// ```
216 pub struct RawEntryBuilderMut<'a, K, V, S, A: Allocator = Global> {
217     map: &'a mut HashMap<K, V, S, A>,
218 }
219 
220 /// A view into a single entry in a map, which may either be vacant or occupied.
221 ///
222 /// This is a lower-level version of [`Entry`].
223 ///
224 /// This `enum` is constructed through the [`raw_entry_mut`] method on [`HashMap`],
225 /// then calling one of the methods of that [`RawEntryBuilderMut`].
226 ///
227 /// [`HashMap`]: struct.HashMap.html
228 /// [`Entry`]: enum.Entry.html
229 /// [`raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut
230 /// [`RawEntryBuilderMut`]: struct.RawEntryBuilderMut.html
231 ///
232 /// # Examples
233 ///
234 /// ```
235 /// use core::hash::{BuildHasher, Hash};
236 /// use hashbrown::hash_map::{HashMap, RawEntryMut, RawOccupiedEntryMut};
237 ///
238 /// let mut map = HashMap::new();
239 /// map.extend([('a', 1), ('b', 2), ('c', 3)]);
240 /// assert_eq!(map.len(), 3);
241 ///
242 /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
243 ///     use core::hash::Hasher;
244 ///     let mut state = hash_builder.build_hasher();
245 ///     key.hash(&mut state);
246 ///     state.finish()
247 /// }
248 ///
249 /// // Existing key (insert)
250 /// let raw: RawEntryMut<_, _, _> = map.raw_entry_mut().from_key(&'a');
251 /// let _raw_o: RawOccupiedEntryMut<_, _, _> = raw.insert('a', 10);
252 /// assert_eq!(map.len(), 3);
253 ///
254 /// // Nonexistent key (insert)
255 /// map.raw_entry_mut().from_key(&'d').insert('d', 40);
256 /// assert_eq!(map.len(), 4);
257 ///
258 /// // Existing key (or_insert)
259 /// let hash = compute_hash(map.hasher(), &'b');
260 /// let kv = map
261 ///     .raw_entry_mut()
262 ///     .from_key_hashed_nocheck(hash, &'b')
263 ///     .or_insert('b', 20);
264 /// assert_eq!(kv, (&mut 'b', &mut 2));
265 /// *kv.1 = 20;
266 /// assert_eq!(map.len(), 4);
267 ///
268 /// // Nonexistent key (or_insert)
269 /// let hash = compute_hash(map.hasher(), &'e');
270 /// let kv = map
271 ///     .raw_entry_mut()
272 ///     .from_key_hashed_nocheck(hash, &'e')
273 ///     .or_insert('e', 50);
274 /// assert_eq!(kv, (&mut 'e', &mut 50));
275 /// assert_eq!(map.len(), 5);
276 ///
277 /// // Existing key (or_insert_with)
278 /// let hash = compute_hash(map.hasher(), &'c');
279 /// let kv = map
280 ///     .raw_entry_mut()
281 ///     .from_hash(hash, |q| q == &'c')
282 ///     .or_insert_with(|| ('c', 30));
283 /// assert_eq!(kv, (&mut 'c', &mut 3));
284 /// *kv.1 = 30;
285 /// assert_eq!(map.len(), 5);
286 ///
287 /// // Nonexistent key (or_insert_with)
288 /// let hash = compute_hash(map.hasher(), &'f');
289 /// let kv = map
290 ///     .raw_entry_mut()
291 ///     .from_hash(hash, |q| q == &'f')
292 ///     .or_insert_with(|| ('f', 60));
293 /// assert_eq!(kv, (&mut 'f', &mut 60));
294 /// assert_eq!(map.len(), 6);
295 ///
296 /// println!("Our HashMap: {:?}", map);
297 ///
298 /// let mut vec: Vec<_> = map.iter().map(|(&k, &v)| (k, v)).collect();
299 /// // The `Iter` iterator produces items in arbitrary order, so the
300 /// // items must be sorted to test them against a sorted array.
301 /// vec.sort_unstable();
302 /// assert_eq!(vec, [('a', 10), ('b', 20), ('c', 30), ('d', 40), ('e', 50), ('f', 60)]);
303 /// ```
304 pub enum RawEntryMut<'a, K, V, S, A: Allocator = Global> {
305     /// An occupied entry.
306     ///
307     /// # Examples
308     ///
309     /// ```
310     /// use hashbrown::{hash_map::RawEntryMut, HashMap};
311     /// let mut map: HashMap<_, _> = [("a", 100), ("b", 200)].into();
312     ///
313     /// match map.raw_entry_mut().from_key(&"a") {
314     ///     RawEntryMut::Vacant(_) => unreachable!(),
315     ///     RawEntryMut::Occupied(_) => { }
316     /// }
317     /// ```
318     Occupied(RawOccupiedEntryMut<'a, K, V, S, A>),
319     /// A vacant entry.
320     ///
321     /// # Examples
322     ///
323     /// ```
324     /// use hashbrown::{hash_map::RawEntryMut, HashMap};
325     /// let mut map: HashMap<&str, i32> = HashMap::new();
326     ///
327     /// match map.raw_entry_mut().from_key("a") {
328     ///     RawEntryMut::Occupied(_) => unreachable!(),
329     ///     RawEntryMut::Vacant(_) => { }
330     /// }
331     /// ```
332     Vacant(RawVacantEntryMut<'a, K, V, S, A>),
333 }
334 
335 /// A view into an occupied entry in a `HashMap`.
336 /// It is part of the [`RawEntryMut`] enum.
337 ///
338 /// [`RawEntryMut`]: enum.RawEntryMut.html
339 ///
340 /// # Examples
341 ///
342 /// ```
343 /// use core::hash::{BuildHasher, Hash};
344 /// use hashbrown::hash_map::{HashMap, RawEntryMut, RawOccupiedEntryMut};
345 ///
346 /// let mut map = HashMap::new();
347 /// map.extend([("a", 10), ("b", 20), ("c", 30)]);
348 ///
349 /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
350 ///     use core::hash::Hasher;
351 ///     let mut state = hash_builder.build_hasher();
352 ///     key.hash(&mut state);
353 ///     state.finish()
354 /// }
355 ///
356 /// let _raw_o: RawOccupiedEntryMut<_, _, _> = map.raw_entry_mut().from_key(&"a").insert("a", 100);
357 /// assert_eq!(map.len(), 3);
358 ///
359 /// // Existing key (insert and update)
360 /// match map.raw_entry_mut().from_key(&"a") {
361 ///     RawEntryMut::Vacant(_) => unreachable!(),
362 ///     RawEntryMut::Occupied(mut view) => {
363 ///         assert_eq!(view.get(), &100);
364 ///         let v = view.get_mut();
365 ///         let new_v = (*v) * 10;
366 ///         *v = new_v;
367 ///         assert_eq!(view.insert(1111), 1000);
368 ///     }
369 /// }
370 ///
371 /// assert_eq!(map[&"a"], 1111);
372 /// assert_eq!(map.len(), 3);
373 ///
374 /// // Existing key (take)
375 /// let hash = compute_hash(map.hasher(), &"c");
376 /// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &"c") {
377 ///     RawEntryMut::Vacant(_) => unreachable!(),
378 ///     RawEntryMut::Occupied(view) => {
379 ///         assert_eq!(view.remove_entry(), ("c", 30));
380 ///     }
381 /// }
382 /// assert_eq!(map.raw_entry().from_key(&"c"), None);
383 /// assert_eq!(map.len(), 2);
384 ///
385 /// let hash = compute_hash(map.hasher(), &"b");
386 /// match map.raw_entry_mut().from_hash(hash, |q| *q == "b") {
387 ///     RawEntryMut::Vacant(_) => unreachable!(),
388 ///     RawEntryMut::Occupied(view) => {
389 ///         assert_eq!(view.remove_entry(), ("b", 20));
390 ///     }
391 /// }
392 /// assert_eq!(map.get(&"b"), None);
393 /// assert_eq!(map.len(), 1);
394 /// ```
395 pub struct RawOccupiedEntryMut<'a, K, V, S, A: Allocator = Global> {
396     elem: Bucket<(K, V)>,
397     table: &'a mut RawTable<(K, V), A>,
398     hash_builder: &'a S,
399 }
400 
401 unsafe impl<K, V, S, A> Send for RawOccupiedEntryMut<'_, K, V, S, A>
402 where
403     K: Send,
404     V: Send,
405     S: Send,
406     A: Send + Allocator,
407 {
408 }
409 unsafe impl<K, V, S, A> Sync for RawOccupiedEntryMut<'_, K, V, S, A>
410 where
411     K: Sync,
412     V: Sync,
413     S: Sync,
414     A: Sync + Allocator,
415 {
416 }
417 
418 /// A view into a vacant entry in a `HashMap`.
419 /// It is part of the [`RawEntryMut`] enum.
420 ///
421 /// [`RawEntryMut`]: enum.RawEntryMut.html
422 ///
423 /// # Examples
424 ///
425 /// ```
426 /// use core::hash::{BuildHasher, Hash};
427 /// use hashbrown::hash_map::{HashMap, RawEntryMut, RawVacantEntryMut};
428 ///
429 /// let mut map = HashMap::<&str, i32>::new();
430 ///
431 /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
432 ///     use core::hash::Hasher;
433 ///     let mut state = hash_builder.build_hasher();
434 ///     key.hash(&mut state);
435 ///     state.finish()
436 /// }
437 ///
438 /// let raw_v: RawVacantEntryMut<_, _, _> = match map.raw_entry_mut().from_key(&"a") {
439 ///     RawEntryMut::Vacant(view) => view,
440 ///     RawEntryMut::Occupied(_) => unreachable!(),
441 /// };
442 /// raw_v.insert("a", 10);
443 /// assert!(map[&"a"] == 10 && map.len() == 1);
444 ///
445 /// // Nonexistent key (insert and update)
446 /// let hash = compute_hash(map.hasher(), &"b");
447 /// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &"b") {
448 ///     RawEntryMut::Occupied(_) => unreachable!(),
449 ///     RawEntryMut::Vacant(view) => {
450 ///         let (k, value) = view.insert("b", 2);
451 ///         assert_eq!((*k, *value), ("b", 2));
452 ///         *value = 20;
453 ///     }
454 /// }
455 /// assert!(map[&"b"] == 20 && map.len() == 2);
456 ///
457 /// let hash = compute_hash(map.hasher(), &"c");
458 /// match map.raw_entry_mut().from_hash(hash, |q| *q == "c") {
459 ///     RawEntryMut::Occupied(_) => unreachable!(),
460 ///     RawEntryMut::Vacant(view) => {
461 ///         assert_eq!(view.insert("c", 30), (&mut "c", &mut 30));
462 ///     }
463 /// }
464 /// assert!(map[&"c"] == 30 && map.len() == 3);
465 /// ```
466 pub struct RawVacantEntryMut<'a, K, V, S, A: Allocator = Global> {
467     table: &'a mut RawTable<(K, V), A>,
468     hash_builder: &'a S,
469 }
470 
471 /// A builder for computing where in a [`HashMap`] a key-value pair would be stored.
472 ///
473 /// See the [`HashMap::raw_entry`] docs for usage examples.
474 ///
475 /// [`HashMap::raw_entry`]: struct.HashMap.html#method.raw_entry
476 ///
477 /// # Examples
478 ///
479 /// ```
480 /// use hashbrown::hash_map::{HashMap, RawEntryBuilder};
481 /// use core::hash::{BuildHasher, Hash};
482 ///
483 /// let mut map = HashMap::new();
484 /// map.extend([(1, 10), (2, 20), (3, 30)]);
485 ///
486 /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
487 ///     use core::hash::Hasher;
488 ///     let mut state = hash_builder.build_hasher();
489 ///     key.hash(&mut state);
490 ///     state.finish()
491 /// }
492 ///
493 /// for k in 0..6 {
494 ///     let hash = compute_hash(map.hasher(), &k);
495 ///     let v = map.get(&k).cloned();
496 ///     let kv = v.as_ref().map(|v| (&k, v));
497 ///
498 ///     println!("Key: {} and value: {:?}", k, v);
499 ///     let builder: RawEntryBuilder<_, _, _> = map.raw_entry();
500 ///     assert_eq!(builder.from_key(&k), kv);
501 ///     assert_eq!(map.raw_entry().from_hash(hash, |q| *q == k), kv);
502 ///     assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv);
503 /// }
504 /// ```
505 pub struct RawEntryBuilder<'a, K, V, S, A: Allocator = Global> {
506     map: &'a HashMap<K, V, S, A>,
507 }
508 
509 impl<'a, K, V, S, A: Allocator> RawEntryBuilderMut<'a, K, V, S, A> {
510     /// Creates a `RawEntryMut` from the given key.
511     ///
512     /// # Examples
513     ///
514     /// ```
515     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
516     ///
517     /// let mut map: HashMap<&str, u32> = HashMap::new();
518     /// let key = "a";
519     /// let entry: RawEntryMut<&str, u32, _> = map.raw_entry_mut().from_key(&key);
520     /// entry.insert(key, 100);
521     /// assert_eq!(map[&"a"], 100);
522     /// ```
523     #[cfg_attr(feature = "inline-more", inline)]
524     #[allow(clippy::wrong_self_convention)]
from_key<Q>(self, k: &Q) -> RawEntryMut<'a, K, V, S, A> where S: BuildHasher, Q: Hash + Equivalent<K> + ?Sized,525     pub fn from_key<Q>(self, k: &Q) -> RawEntryMut<'a, K, V, S, A>
526     where
527         S: BuildHasher,
528         Q: Hash + Equivalent<K> + ?Sized,
529     {
530         let hash = make_hash::<Q, S>(&self.map.hash_builder, k);
531         self.from_key_hashed_nocheck(hash, k)
532     }
533 
534     /// Creates a `RawEntryMut` from the given key and its hash.
535     ///
536     /// # Examples
537     ///
538     /// ```
539     /// use core::hash::{BuildHasher, Hash};
540     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
541     ///
542     /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
543     ///     use core::hash::Hasher;
544     ///     let mut state = hash_builder.build_hasher();
545     ///     key.hash(&mut state);
546     ///     state.finish()
547     /// }
548     ///
549     /// let mut map: HashMap<&str, u32> = HashMap::new();
550     /// let key = "a";
551     /// let hash = compute_hash(map.hasher(), &key);
552     /// let entry: RawEntryMut<&str, u32, _> = map.raw_entry_mut().from_key_hashed_nocheck(hash, &key);
553     /// entry.insert(key, 100);
554     /// assert_eq!(map[&"a"], 100);
555     /// ```
556     #[inline]
557     #[allow(clippy::wrong_self_convention)]
from_key_hashed_nocheck<Q>(self, hash: u64, k: &Q) -> RawEntryMut<'a, K, V, S, A> where Q: Equivalent<K> + ?Sized,558     pub fn from_key_hashed_nocheck<Q>(self, hash: u64, k: &Q) -> RawEntryMut<'a, K, V, S, A>
559     where
560         Q: Equivalent<K> + ?Sized,
561     {
562         self.from_hash(hash, equivalent(k))
563     }
564 }
565 
566 impl<'a, K, V, S, A: Allocator> RawEntryBuilderMut<'a, K, V, S, A> {
567     /// Creates a `RawEntryMut` from the given hash and matching function.
568     ///
569     /// # Examples
570     ///
571     /// ```
572     /// use core::hash::{BuildHasher, Hash};
573     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
574     ///
575     /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
576     ///     use core::hash::Hasher;
577     ///     let mut state = hash_builder.build_hasher();
578     ///     key.hash(&mut state);
579     ///     state.finish()
580     /// }
581     ///
582     /// let mut map: HashMap<&str, u32> = HashMap::new();
583     /// let key = "a";
584     /// let hash = compute_hash(map.hasher(), &key);
585     /// let entry: RawEntryMut<&str, u32, _> = map.raw_entry_mut().from_hash(hash, |k| k == &key);
586     /// entry.insert(key, 100);
587     /// assert_eq!(map[&"a"], 100);
588     /// ```
589     #[cfg_attr(feature = "inline-more", inline)]
590     #[allow(clippy::wrong_self_convention)]
from_hash<F>(self, hash: u64, is_match: F) -> RawEntryMut<'a, K, V, S, A> where for<'b> F: FnMut(&'b K) -> bool,591     pub fn from_hash<F>(self, hash: u64, is_match: F) -> RawEntryMut<'a, K, V, S, A>
592     where
593         for<'b> F: FnMut(&'b K) -> bool,
594     {
595         self.search(hash, is_match)
596     }
597 
598     #[cfg_attr(feature = "inline-more", inline)]
search<F>(self, hash: u64, mut is_match: F) -> RawEntryMut<'a, K, V, S, A> where for<'b> F: FnMut(&'b K) -> bool,599     fn search<F>(self, hash: u64, mut is_match: F) -> RawEntryMut<'a, K, V, S, A>
600     where
601         for<'b> F: FnMut(&'b K) -> bool,
602     {
603         match self.map.table.find(hash, |(k, _)| is_match(k)) {
604             Some(elem) => RawEntryMut::Occupied(RawOccupiedEntryMut {
605                 elem,
606                 table: &mut self.map.table,
607                 hash_builder: &self.map.hash_builder,
608             }),
609             None => RawEntryMut::Vacant(RawVacantEntryMut {
610                 table: &mut self.map.table,
611                 hash_builder: &self.map.hash_builder,
612             }),
613         }
614     }
615 }
616 
617 impl<'a, K, V, S, A: Allocator> RawEntryBuilder<'a, K, V, S, A> {
618     /// Access an immutable entry by key.
619     ///
620     /// # Examples
621     ///
622     /// ```
623     /// use hashbrown::HashMap;
624     ///
625     /// let map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
626     /// let key = "a";
627     /// assert_eq!(map.raw_entry().from_key(&key), Some((&"a", &100)));
628     /// ```
629     #[cfg_attr(feature = "inline-more", inline)]
630     #[allow(clippy::wrong_self_convention)]
from_key<Q>(self, k: &Q) -> Option<(&'a K, &'a V)> where S: BuildHasher, Q: Hash + Equivalent<K> + ?Sized,631     pub fn from_key<Q>(self, k: &Q) -> Option<(&'a K, &'a V)>
632     where
633         S: BuildHasher,
634         Q: Hash + Equivalent<K> + ?Sized,
635     {
636         let hash = make_hash::<Q, S>(&self.map.hash_builder, k);
637         self.from_key_hashed_nocheck(hash, k)
638     }
639 
640     /// Access an immutable entry by a key and its hash.
641     ///
642     /// # Examples
643     ///
644     /// ```
645     /// use core::hash::{BuildHasher, Hash};
646     /// use hashbrown::HashMap;
647     ///
648     /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
649     ///     use core::hash::Hasher;
650     ///     let mut state = hash_builder.build_hasher();
651     ///     key.hash(&mut state);
652     ///     state.finish()
653     /// }
654     ///
655     /// let map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
656     /// let key = "a";
657     /// let hash = compute_hash(map.hasher(), &key);
658     /// assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &key), Some((&"a", &100)));
659     /// ```
660     #[cfg_attr(feature = "inline-more", inline)]
661     #[allow(clippy::wrong_self_convention)]
from_key_hashed_nocheck<Q>(self, hash: u64, k: &Q) -> Option<(&'a K, &'a V)> where Q: Equivalent<K> + ?Sized,662     pub fn from_key_hashed_nocheck<Q>(self, hash: u64, k: &Q) -> Option<(&'a K, &'a V)>
663     where
664         Q: Equivalent<K> + ?Sized,
665     {
666         self.from_hash(hash, equivalent(k))
667     }
668 
669     #[cfg_attr(feature = "inline-more", inline)]
search<F>(self, hash: u64, mut is_match: F) -> Option<(&'a K, &'a V)> where F: FnMut(&K) -> bool,670     fn search<F>(self, hash: u64, mut is_match: F) -> Option<(&'a K, &'a V)>
671     where
672         F: FnMut(&K) -> bool,
673     {
674         match self.map.table.get(hash, |(k, _)| is_match(k)) {
675             Some((key, value)) => Some((key, value)),
676             None => None,
677         }
678     }
679 
680     /// Access an immutable entry by hash and matching function.
681     ///
682     /// # Examples
683     ///
684     /// ```
685     /// use core::hash::{BuildHasher, Hash};
686     /// use hashbrown::HashMap;
687     ///
688     /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
689     ///     use core::hash::Hasher;
690     ///     let mut state = hash_builder.build_hasher();
691     ///     key.hash(&mut state);
692     ///     state.finish()
693     /// }
694     ///
695     /// let map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
696     /// let key = "a";
697     /// let hash = compute_hash(map.hasher(), &key);
698     /// assert_eq!(map.raw_entry().from_hash(hash, |k| k == &key), Some((&"a", &100)));
699     /// ```
700     #[cfg_attr(feature = "inline-more", inline)]
701     #[allow(clippy::wrong_self_convention)]
from_hash<F>(self, hash: u64, is_match: F) -> Option<(&'a K, &'a V)> where F: FnMut(&K) -> bool,702     pub fn from_hash<F>(self, hash: u64, is_match: F) -> Option<(&'a K, &'a V)>
703     where
704         F: FnMut(&K) -> bool,
705     {
706         self.search(hash, is_match)
707     }
708 }
709 
710 impl<'a, K, V, S, A: Allocator> RawEntryMut<'a, K, V, S, A> {
711     /// Sets the value of the entry, and returns a `RawOccupiedEntryMut`.
712     ///
713     /// # Examples
714     ///
715     /// ```
716     /// use hashbrown::HashMap;
717     ///
718     /// let mut map: HashMap<&str, u32> = HashMap::new();
719     /// let entry = map.raw_entry_mut().from_key("horseyland").insert("horseyland", 37);
720     ///
721     /// assert_eq!(entry.remove_entry(), ("horseyland", 37));
722     /// ```
723     #[cfg_attr(feature = "inline-more", inline)]
insert(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A> where K: Hash, S: BuildHasher,724     pub fn insert(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A>
725     where
726         K: Hash,
727         S: BuildHasher,
728     {
729         match self {
730             RawEntryMut::Occupied(mut entry) => {
731                 entry.insert(value);
732                 entry
733             }
734             RawEntryMut::Vacant(entry) => entry.insert_entry(key, value),
735         }
736     }
737 
738     /// Ensures a value is in the entry by inserting the default if empty, and returns
739     /// mutable references to the key and value in the entry.
740     ///
741     /// # Examples
742     ///
743     /// ```
744     /// use hashbrown::HashMap;
745     ///
746     /// let mut map: HashMap<&str, u32> = HashMap::new();
747     ///
748     /// map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 3);
749     /// assert_eq!(map["poneyland"], 3);
750     ///
751     /// *map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 10).1 *= 2;
752     /// assert_eq!(map["poneyland"], 6);
753     /// ```
754     #[cfg_attr(feature = "inline-more", inline)]
or_insert(self, default_key: K, default_val: V) -> (&'a mut K, &'a mut V) where K: Hash, S: BuildHasher,755     pub fn or_insert(self, default_key: K, default_val: V) -> (&'a mut K, &'a mut V)
756     where
757         K: Hash,
758         S: BuildHasher,
759     {
760         match self {
761             RawEntryMut::Occupied(entry) => entry.into_key_value(),
762             RawEntryMut::Vacant(entry) => entry.insert(default_key, default_val),
763         }
764     }
765 
766     /// Ensures a value is in the entry by inserting the result of the default function if empty,
767     /// and returns mutable references to the key and value in the entry.
768     ///
769     /// # Examples
770     ///
771     /// ```
772     /// use hashbrown::HashMap;
773     ///
774     /// let mut map: HashMap<&str, String> = HashMap::new();
775     ///
776     /// map.raw_entry_mut().from_key("poneyland").or_insert_with(|| {
777     ///     ("poneyland", "hoho".to_string())
778     /// });
779     ///
780     /// assert_eq!(map["poneyland"], "hoho".to_string());
781     /// ```
782     #[cfg_attr(feature = "inline-more", inline)]
or_insert_with<F>(self, default: F) -> (&'a mut K, &'a mut V) where F: FnOnce() -> (K, V), K: Hash, S: BuildHasher,783     pub fn or_insert_with<F>(self, default: F) -> (&'a mut K, &'a mut V)
784     where
785         F: FnOnce() -> (K, V),
786         K: Hash,
787         S: BuildHasher,
788     {
789         match self {
790             RawEntryMut::Occupied(entry) => entry.into_key_value(),
791             RawEntryMut::Vacant(entry) => {
792                 let (k, v) = default();
793                 entry.insert(k, v)
794             }
795         }
796     }
797 
798     /// Provides in-place mutable access to an occupied entry before any
799     /// potential inserts into the map.
800     ///
801     /// # Examples
802     ///
803     /// ```
804     /// use hashbrown::HashMap;
805     ///
806     /// let mut map: HashMap<&str, u32> = HashMap::new();
807     ///
808     /// map.raw_entry_mut()
809     ///    .from_key("poneyland")
810     ///    .and_modify(|_k, v| { *v += 1 })
811     ///    .or_insert("poneyland", 42);
812     /// assert_eq!(map["poneyland"], 42);
813     ///
814     /// map.raw_entry_mut()
815     ///    .from_key("poneyland")
816     ///    .and_modify(|_k, v| { *v += 1 })
817     ///    .or_insert("poneyland", 0);
818     /// assert_eq!(map["poneyland"], 43);
819     /// ```
820     #[cfg_attr(feature = "inline-more", inline)]
and_modify<F>(self, f: F) -> Self where F: FnOnce(&mut K, &mut V),821     pub fn and_modify<F>(self, f: F) -> Self
822     where
823         F: FnOnce(&mut K, &mut V),
824     {
825         match self {
826             RawEntryMut::Occupied(mut entry) => {
827                 {
828                     let (k, v) = entry.get_key_value_mut();
829                     f(k, v);
830                 }
831                 RawEntryMut::Occupied(entry)
832             }
833             RawEntryMut::Vacant(entry) => RawEntryMut::Vacant(entry),
834         }
835     }
836 
837     /// Provides shared access to the key and owned access to the value of
838     /// an occupied entry and allows to replace or remove it based on the
839     /// value of the returned option.
840     ///
841     /// # Examples
842     ///
843     /// ```
844     /// use hashbrown::HashMap;
845     /// use hashbrown::hash_map::RawEntryMut;
846     ///
847     /// let mut map: HashMap<&str, u32> = HashMap::new();
848     ///
849     /// let entry = map
850     ///     .raw_entry_mut()
851     ///     .from_key("poneyland")
852     ///     .and_replace_entry_with(|_k, _v| panic!());
853     ///
854     /// match entry {
855     ///     RawEntryMut::Vacant(_) => {},
856     ///     RawEntryMut::Occupied(_) => panic!(),
857     /// }
858     ///
859     /// map.insert("poneyland", 42);
860     ///
861     /// let entry = map
862     ///     .raw_entry_mut()
863     ///     .from_key("poneyland")
864     ///     .and_replace_entry_with(|k, v| {
865     ///         assert_eq!(k, &"poneyland");
866     ///         assert_eq!(v, 42);
867     ///         Some(v + 1)
868     ///     });
869     ///
870     /// match entry {
871     ///     RawEntryMut::Occupied(e) => {
872     ///         assert_eq!(e.key(), &"poneyland");
873     ///         assert_eq!(e.get(), &43);
874     ///     },
875     ///     RawEntryMut::Vacant(_) => panic!(),
876     /// }
877     ///
878     /// assert_eq!(map["poneyland"], 43);
879     ///
880     /// let entry = map
881     ///     .raw_entry_mut()
882     ///     .from_key("poneyland")
883     ///     .and_replace_entry_with(|_k, _v| None);
884     ///
885     /// match entry {
886     ///     RawEntryMut::Vacant(_) => {},
887     ///     RawEntryMut::Occupied(_) => panic!(),
888     /// }
889     ///
890     /// assert!(!map.contains_key("poneyland"));
891     /// ```
892     #[cfg_attr(feature = "inline-more", inline)]
and_replace_entry_with<F>(self, f: F) -> Self where F: FnOnce(&K, V) -> Option<V>,893     pub fn and_replace_entry_with<F>(self, f: F) -> Self
894     where
895         F: FnOnce(&K, V) -> Option<V>,
896     {
897         match self {
898             RawEntryMut::Occupied(entry) => entry.replace_entry_with(f),
899             RawEntryMut::Vacant(_) => self,
900         }
901     }
902 }
903 
904 impl<'a, K, V, S, A: Allocator> RawOccupiedEntryMut<'a, K, V, S, A> {
905     /// Gets a reference to the key in the entry.
906     ///
907     /// # Examples
908     ///
909     /// ```
910     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
911     ///
912     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
913     ///
914     /// match map.raw_entry_mut().from_key(&"a") {
915     ///     RawEntryMut::Vacant(_) => panic!(),
916     ///     RawEntryMut::Occupied(o) => assert_eq!(o.key(), &"a")
917     /// }
918     /// ```
919     #[cfg_attr(feature = "inline-more", inline)]
key(&self) -> &K920     pub fn key(&self) -> &K {
921         unsafe { &self.elem.as_ref().0 }
922     }
923 
924     /// Gets a mutable reference to the key in the entry.
925     ///
926     /// # Examples
927     ///
928     /// ```
929     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
930     /// use std::rc::Rc;
931     ///
932     /// let key_one = Rc::new("a");
933     /// let key_two = Rc::new("a");
934     ///
935     /// let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
936     /// map.insert(key_one.clone(), 10);
937     ///
938     /// assert_eq!(map[&key_one], 10);
939     /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
940     ///
941     /// match map.raw_entry_mut().from_key(&key_one) {
942     ///     RawEntryMut::Vacant(_) => panic!(),
943     ///     RawEntryMut::Occupied(mut o) => {
944     ///         *o.key_mut() = key_two.clone();
945     ///     }
946     /// }
947     /// assert_eq!(map[&key_two], 10);
948     /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
949     /// ```
950     #[cfg_attr(feature = "inline-more", inline)]
key_mut(&mut self) -> &mut K951     pub fn key_mut(&mut self) -> &mut K {
952         unsafe { &mut self.elem.as_mut().0 }
953     }
954 
955     /// Converts the entry into a mutable reference to the key in the entry
956     /// with a lifetime bound to the map itself.
957     ///
958     /// # Examples
959     ///
960     /// ```
961     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
962     /// use std::rc::Rc;
963     ///
964     /// let key_one = Rc::new("a");
965     /// let key_two = Rc::new("a");
966     ///
967     /// let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
968     /// map.insert(key_one.clone(), 10);
969     ///
970     /// assert_eq!(map[&key_one], 10);
971     /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
972     ///
973     /// let inside_key: &mut Rc<&str>;
974     ///
975     /// match map.raw_entry_mut().from_key(&key_one) {
976     ///     RawEntryMut::Vacant(_) => panic!(),
977     ///     RawEntryMut::Occupied(o) => inside_key = o.into_key(),
978     /// }
979     /// *inside_key = key_two.clone();
980     ///
981     /// assert_eq!(map[&key_two], 10);
982     /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
983     /// ```
984     #[cfg_attr(feature = "inline-more", inline)]
into_key(self) -> &'a mut K985     pub fn into_key(self) -> &'a mut K {
986         unsafe { &mut self.elem.as_mut().0 }
987     }
988 
989     /// Gets a reference to the value in the entry.
990     ///
991     /// # Examples
992     ///
993     /// ```
994     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
995     ///
996     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
997     ///
998     /// match map.raw_entry_mut().from_key(&"a") {
999     ///     RawEntryMut::Vacant(_) => panic!(),
1000     ///     RawEntryMut::Occupied(o) => assert_eq!(o.get(), &100),
1001     /// }
1002     /// ```
1003     #[cfg_attr(feature = "inline-more", inline)]
get(&self) -> &V1004     pub fn get(&self) -> &V {
1005         unsafe { &self.elem.as_ref().1 }
1006     }
1007 
1008     /// Converts the `OccupiedEntry` into a mutable reference to the value in the entry
1009     /// with a lifetime bound to the map itself.
1010     ///
1011     /// # Examples
1012     ///
1013     /// ```
1014     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1015     ///
1016     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1017     ///
1018     /// let value: &mut u32;
1019     ///
1020     /// match map.raw_entry_mut().from_key(&"a") {
1021     ///     RawEntryMut::Vacant(_) => panic!(),
1022     ///     RawEntryMut::Occupied(o) => value = o.into_mut(),
1023     /// }
1024     /// *value += 900;
1025     ///
1026     /// assert_eq!(map[&"a"], 1000);
1027     /// ```
1028     #[cfg_attr(feature = "inline-more", inline)]
into_mut(self) -> &'a mut V1029     pub fn into_mut(self) -> &'a mut V {
1030         unsafe { &mut self.elem.as_mut().1 }
1031     }
1032 
1033     /// Gets a mutable reference to the value in the entry.
1034     ///
1035     /// # Examples
1036     ///
1037     /// ```
1038     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1039     ///
1040     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1041     ///
1042     /// match map.raw_entry_mut().from_key(&"a") {
1043     ///     RawEntryMut::Vacant(_) => panic!(),
1044     ///     RawEntryMut::Occupied(mut o) => *o.get_mut() += 900,
1045     /// }
1046     ///
1047     /// assert_eq!(map[&"a"], 1000);
1048     /// ```
1049     #[cfg_attr(feature = "inline-more", inline)]
get_mut(&mut self) -> &mut V1050     pub fn get_mut(&mut self) -> &mut V {
1051         unsafe { &mut self.elem.as_mut().1 }
1052     }
1053 
1054     /// Gets a reference to the key and value in the entry.
1055     ///
1056     /// # Examples
1057     ///
1058     /// ```
1059     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1060     ///
1061     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1062     ///
1063     /// match map.raw_entry_mut().from_key(&"a") {
1064     ///     RawEntryMut::Vacant(_) => panic!(),
1065     ///     RawEntryMut::Occupied(o) => assert_eq!(o.get_key_value(), (&"a", &100)),
1066     /// }
1067     /// ```
1068     #[cfg_attr(feature = "inline-more", inline)]
get_key_value(&self) -> (&K, &V)1069     pub fn get_key_value(&self) -> (&K, &V) {
1070         unsafe {
1071             let (key, value) = self.elem.as_ref();
1072             (key, value)
1073         }
1074     }
1075 
1076     /// Gets a mutable reference to the key and value in the entry.
1077     ///
1078     /// # Examples
1079     ///
1080     /// ```
1081     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1082     /// use std::rc::Rc;
1083     ///
1084     /// let key_one = Rc::new("a");
1085     /// let key_two = Rc::new("a");
1086     ///
1087     /// let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
1088     /// map.insert(key_one.clone(), 10);
1089     ///
1090     /// assert_eq!(map[&key_one], 10);
1091     /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
1092     ///
1093     /// match map.raw_entry_mut().from_key(&key_one) {
1094     ///     RawEntryMut::Vacant(_) => panic!(),
1095     ///     RawEntryMut::Occupied(mut o) => {
1096     ///         let (inside_key, inside_value) = o.get_key_value_mut();
1097     ///         *inside_key = key_two.clone();
1098     ///         *inside_value = 100;
1099     ///     }
1100     /// }
1101     /// assert_eq!(map[&key_two], 100);
1102     /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
1103     /// ```
1104     #[cfg_attr(feature = "inline-more", inline)]
get_key_value_mut(&mut self) -> (&mut K, &mut V)1105     pub fn get_key_value_mut(&mut self) -> (&mut K, &mut V) {
1106         unsafe {
1107             let &mut (ref mut key, ref mut value) = self.elem.as_mut();
1108             (key, value)
1109         }
1110     }
1111 
1112     /// Converts the `OccupiedEntry` into a mutable reference to the key and value in the entry
1113     /// with a lifetime bound to the map itself.
1114     ///
1115     /// # Examples
1116     ///
1117     /// ```
1118     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1119     /// use std::rc::Rc;
1120     ///
1121     /// let key_one = Rc::new("a");
1122     /// let key_two = Rc::new("a");
1123     ///
1124     /// let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
1125     /// map.insert(key_one.clone(), 10);
1126     ///
1127     /// assert_eq!(map[&key_one], 10);
1128     /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
1129     ///
1130     /// let inside_key: &mut Rc<&str>;
1131     /// let inside_value: &mut u32;
1132     /// match map.raw_entry_mut().from_key(&key_one) {
1133     ///     RawEntryMut::Vacant(_) => panic!(),
1134     ///     RawEntryMut::Occupied(o) => {
1135     ///         let tuple = o.into_key_value();
1136     ///         inside_key = tuple.0;
1137     ///         inside_value = tuple.1;
1138     ///     }
1139     /// }
1140     /// *inside_key = key_two.clone();
1141     /// *inside_value = 100;
1142     /// assert_eq!(map[&key_two], 100);
1143     /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
1144     /// ```
1145     #[cfg_attr(feature = "inline-more", inline)]
into_key_value(self) -> (&'a mut K, &'a mut V)1146     pub fn into_key_value(self) -> (&'a mut K, &'a mut V) {
1147         unsafe {
1148             let &mut (ref mut key, ref mut value) = self.elem.as_mut();
1149             (key, value)
1150         }
1151     }
1152 
1153     /// Sets the value of the entry, and returns the entry's old value.
1154     ///
1155     /// # Examples
1156     ///
1157     /// ```
1158     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1159     ///
1160     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1161     ///
1162     /// match map.raw_entry_mut().from_key(&"a") {
1163     ///     RawEntryMut::Vacant(_) => panic!(),
1164     ///     RawEntryMut::Occupied(mut o) => assert_eq!(o.insert(1000), 100),
1165     /// }
1166     ///
1167     /// assert_eq!(map[&"a"], 1000);
1168     /// ```
1169     #[cfg_attr(feature = "inline-more", inline)]
insert(&mut self, value: V) -> V1170     pub fn insert(&mut self, value: V) -> V {
1171         mem::replace(self.get_mut(), value)
1172     }
1173 
1174     /// Sets the value of the entry, and returns the entry's old value.
1175     ///
1176     /// # Examples
1177     ///
1178     /// ```
1179     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1180     /// use std::rc::Rc;
1181     ///
1182     /// let key_one = Rc::new("a");
1183     /// let key_two = Rc::new("a");
1184     ///
1185     /// let mut map: HashMap<Rc<&str>, u32> = HashMap::new();
1186     /// map.insert(key_one.clone(), 10);
1187     ///
1188     /// assert_eq!(map[&key_one], 10);
1189     /// assert!(Rc::strong_count(&key_one) == 2 && Rc::strong_count(&key_two) == 1);
1190     ///
1191     /// match map.raw_entry_mut().from_key(&key_one) {
1192     ///     RawEntryMut::Vacant(_) => panic!(),
1193     ///     RawEntryMut::Occupied(mut o) => {
1194     ///         let old_key = o.insert_key(key_two.clone());
1195     ///         assert!(Rc::ptr_eq(&old_key, &key_one));
1196     ///     }
1197     /// }
1198     /// assert_eq!(map[&key_two], 10);
1199     /// assert!(Rc::strong_count(&key_one) == 1 && Rc::strong_count(&key_two) == 2);
1200     /// ```
1201     #[cfg_attr(feature = "inline-more", inline)]
insert_key(&mut self, key: K) -> K1202     pub fn insert_key(&mut self, key: K) -> K {
1203         mem::replace(self.key_mut(), key)
1204     }
1205 
1206     /// Takes the value out of the entry, and returns it.
1207     ///
1208     /// # Examples
1209     ///
1210     /// ```
1211     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1212     ///
1213     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1214     ///
1215     /// match map.raw_entry_mut().from_key(&"a") {
1216     ///     RawEntryMut::Vacant(_) => panic!(),
1217     ///     RawEntryMut::Occupied(o) => assert_eq!(o.remove(), 100),
1218     /// }
1219     /// assert_eq!(map.get(&"a"), None);
1220     /// ```
1221     #[cfg_attr(feature = "inline-more", inline)]
remove(self) -> V1222     pub fn remove(self) -> V {
1223         self.remove_entry().1
1224     }
1225 
1226     /// Take the ownership of the key and value from the map.
1227     ///
1228     /// # Examples
1229     ///
1230     /// ```
1231     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1232     ///
1233     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1234     ///
1235     /// match map.raw_entry_mut().from_key(&"a") {
1236     ///     RawEntryMut::Vacant(_) => panic!(),
1237     ///     RawEntryMut::Occupied(o) => assert_eq!(o.remove_entry(), ("a", 100)),
1238     /// }
1239     /// assert_eq!(map.get(&"a"), None);
1240     /// ```
1241     #[cfg_attr(feature = "inline-more", inline)]
remove_entry(self) -> (K, V)1242     pub fn remove_entry(self) -> (K, V) {
1243         unsafe { self.table.remove(self.elem).0 }
1244     }
1245 
1246     /// Provides shared access to the key and owned access to the value of
1247     /// the entry and allows to replace or remove it based on the
1248     /// value of the returned option.
1249     ///
1250     /// # Examples
1251     ///
1252     /// ```
1253     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1254     ///
1255     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1256     ///
1257     /// let raw_entry = match map.raw_entry_mut().from_key(&"a") {
1258     ///     RawEntryMut::Vacant(_) => panic!(),
1259     ///     RawEntryMut::Occupied(o) => o.replace_entry_with(|k, v| {
1260     ///         assert_eq!(k, &"a");
1261     ///         assert_eq!(v, 100);
1262     ///         Some(v + 900)
1263     ///     }),
1264     /// };
1265     /// let raw_entry = match raw_entry {
1266     ///     RawEntryMut::Vacant(_) => panic!(),
1267     ///     RawEntryMut::Occupied(o) => o.replace_entry_with(|k, v| {
1268     ///         assert_eq!(k, &"a");
1269     ///         assert_eq!(v, 1000);
1270     ///         None
1271     ///     }),
1272     /// };
1273     /// match raw_entry {
1274     ///     RawEntryMut::Vacant(_) => { },
1275     ///     RawEntryMut::Occupied(_) => panic!(),
1276     /// };
1277     /// assert_eq!(map.get(&"a"), None);
1278     /// ```
1279     #[cfg_attr(feature = "inline-more", inline)]
replace_entry_with<F>(self, f: F) -> RawEntryMut<'a, K, V, S, A> where F: FnOnce(&K, V) -> Option<V>,1280     pub fn replace_entry_with<F>(self, f: F) -> RawEntryMut<'a, K, V, S, A>
1281     where
1282         F: FnOnce(&K, V) -> Option<V>,
1283     {
1284         unsafe {
1285             let still_occupied = self
1286                 .table
1287                 .replace_bucket_with(self.elem.clone(), |(key, value)| {
1288                     f(&key, value).map(|new_value| (key, new_value))
1289                 });
1290 
1291             if still_occupied {
1292                 RawEntryMut::Occupied(self)
1293             } else {
1294                 RawEntryMut::Vacant(RawVacantEntryMut {
1295                     table: self.table,
1296                     hash_builder: self.hash_builder,
1297                 })
1298             }
1299         }
1300     }
1301 }
1302 
1303 impl<'a, K, V, S, A: Allocator> RawVacantEntryMut<'a, K, V, S, A> {
1304     /// Sets the value of the entry with the `VacantEntry`'s key,
1305     /// and returns a mutable reference to it.
1306     ///
1307     /// # Examples
1308     ///
1309     /// ```
1310     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1311     ///
1312     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1313     ///
1314     /// match map.raw_entry_mut().from_key(&"c") {
1315     ///     RawEntryMut::Occupied(_) => panic!(),
1316     ///     RawEntryMut::Vacant(v) => assert_eq!(v.insert("c", 300), (&mut "c", &mut 300)),
1317     /// }
1318     ///
1319     /// assert_eq!(map[&"c"], 300);
1320     /// ```
1321     #[cfg_attr(feature = "inline-more", inline)]
insert(self, key: K, value: V) -> (&'a mut K, &'a mut V) where K: Hash, S: BuildHasher,1322     pub fn insert(self, key: K, value: V) -> (&'a mut K, &'a mut V)
1323     where
1324         K: Hash,
1325         S: BuildHasher,
1326     {
1327         let hash = make_hash::<K, S>(self.hash_builder, &key);
1328         self.insert_hashed_nocheck(hash, key, value)
1329     }
1330 
1331     /// Sets the value of the entry with the `VacantEntry`'s key,
1332     /// and returns a mutable reference to it.
1333     ///
1334     /// # Examples
1335     ///
1336     /// ```
1337     /// use core::hash::{BuildHasher, Hash};
1338     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1339     ///
1340     /// fn compute_hash<K: Hash + ?Sized, S: BuildHasher>(hash_builder: &S, key: &K) -> u64 {
1341     ///     use core::hash::Hasher;
1342     ///     let mut state = hash_builder.build_hasher();
1343     ///     key.hash(&mut state);
1344     ///     state.finish()
1345     /// }
1346     ///
1347     /// let mut map: HashMap<&str, u32> = [("a", 100), ("b", 200)].into();
1348     /// let key = "c";
1349     /// let hash = compute_hash(map.hasher(), &key);
1350     ///
1351     /// match map.raw_entry_mut().from_key_hashed_nocheck(hash, &key) {
1352     ///     RawEntryMut::Occupied(_) => panic!(),
1353     ///     RawEntryMut::Vacant(v) => assert_eq!(
1354     ///         v.insert_hashed_nocheck(hash, key, 300),
1355     ///         (&mut "c", &mut 300)
1356     ///     ),
1357     /// }
1358     ///
1359     /// assert_eq!(map[&"c"], 300);
1360     /// ```
1361     #[cfg_attr(feature = "inline-more", inline)]
1362     #[allow(clippy::shadow_unrelated)]
insert_hashed_nocheck(self, hash: u64, key: K, value: V) -> (&'a mut K, &'a mut V) where K: Hash, S: BuildHasher,1363     pub fn insert_hashed_nocheck(self, hash: u64, key: K, value: V) -> (&'a mut K, &'a mut V)
1364     where
1365         K: Hash,
1366         S: BuildHasher,
1367     {
1368         let &mut (ref mut k, ref mut v) = self.table.insert_entry(
1369             hash,
1370             (key, value),
1371             make_hasher::<_, V, S>(self.hash_builder),
1372         );
1373         (k, v)
1374     }
1375 
1376     /// Set the value of an entry with a custom hasher function.
1377     ///
1378     /// # Examples
1379     ///
1380     /// ```
1381     /// use core::hash::{BuildHasher, Hash};
1382     /// use hashbrown::hash_map::{HashMap, RawEntryMut};
1383     ///
1384     /// fn make_hasher<K, S>(hash_builder: &S) -> impl Fn(&K) -> u64 + '_
1385     /// where
1386     ///     K: Hash + ?Sized,
1387     ///     S: BuildHasher,
1388     /// {
1389     ///     move |key: &K| {
1390     ///         use core::hash::Hasher;
1391     ///         let mut state = hash_builder.build_hasher();
1392     ///         key.hash(&mut state);
1393     ///         state.finish()
1394     ///     }
1395     /// }
1396     ///
1397     /// let mut map: HashMap<&str, u32> = HashMap::new();
1398     /// let key = "a";
1399     /// let hash_builder = map.hasher().clone();
1400     /// let hash = make_hasher(&hash_builder)(&key);
1401     ///
1402     /// match map.raw_entry_mut().from_hash(hash, |q| q == &key) {
1403     ///     RawEntryMut::Occupied(_) => panic!(),
1404     ///     RawEntryMut::Vacant(v) => assert_eq!(
1405     ///         v.insert_with_hasher(hash, key, 100, make_hasher(&hash_builder)),
1406     ///         (&mut "a", &mut 100)
1407     ///     ),
1408     /// }
1409     /// map.extend([("b", 200), ("c", 300), ("d", 400), ("e", 500), ("f", 600)]);
1410     /// assert_eq!(map[&"a"], 100);
1411     /// ```
1412     #[cfg_attr(feature = "inline-more", inline)]
insert_with_hasher<H>( self, hash: u64, key: K, value: V, hasher: H, ) -> (&'a mut K, &'a mut V) where H: Fn(&K) -> u64,1413     pub fn insert_with_hasher<H>(
1414         self,
1415         hash: u64,
1416         key: K,
1417         value: V,
1418         hasher: H,
1419     ) -> (&'a mut K, &'a mut V)
1420     where
1421         H: Fn(&K) -> u64,
1422     {
1423         let &mut (ref mut k, ref mut v) = self
1424             .table
1425             .insert_entry(hash, (key, value), |x| hasher(&x.0));
1426         (k, v)
1427     }
1428 
1429     #[cfg_attr(feature = "inline-more", inline)]
insert_entry(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A> where K: Hash, S: BuildHasher,1430     fn insert_entry(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A>
1431     where
1432         K: Hash,
1433         S: BuildHasher,
1434     {
1435         let hash = make_hash::<K, S>(self.hash_builder, &key);
1436         let elem = self.table.insert(
1437             hash,
1438             (key, value),
1439             make_hasher::<_, V, S>(self.hash_builder),
1440         );
1441         RawOccupiedEntryMut {
1442             elem,
1443             table: self.table,
1444             hash_builder: self.hash_builder,
1445         }
1446     }
1447 }
1448 
1449 impl<K, V, S, A: Allocator> Debug for RawEntryBuilderMut<'_, K, V, S, A> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1450     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1451         f.debug_struct("RawEntryBuilder").finish()
1452     }
1453 }
1454 
1455 impl<K: Debug, V: Debug, S, A: Allocator> Debug for RawEntryMut<'_, K, V, S, A> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1456     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1457         match *self {
1458             RawEntryMut::Vacant(ref v) => f.debug_tuple("RawEntry").field(v).finish(),
1459             RawEntryMut::Occupied(ref o) => f.debug_tuple("RawEntry").field(o).finish(),
1460         }
1461     }
1462 }
1463 
1464 impl<K: Debug, V: Debug, S, A: Allocator> Debug for RawOccupiedEntryMut<'_, K, V, S, A> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1465     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1466         f.debug_struct("RawOccupiedEntryMut")
1467             .field("key", self.key())
1468             .field("value", self.get())
1469             .finish()
1470     }
1471 }
1472 
1473 impl<K, V, S, A: Allocator> Debug for RawVacantEntryMut<'_, K, V, S, A> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1474     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1475         f.debug_struct("RawVacantEntryMut").finish()
1476     }
1477 }
1478 
1479 impl<K, V, S, A: Allocator> Debug for RawEntryBuilder<'_, K, V, S, A> {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1480     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1481         f.debug_struct("RawEntryBuilder").finish()
1482     }
1483 }
1484 
1485 #[cfg(test)]
1486 mod test_map {
1487     use super::HashMap;
1488     use super::RawEntryMut;
1489 
1490     #[test]
test_raw_occupied_entry_replace_entry_with()1491     fn test_raw_occupied_entry_replace_entry_with() {
1492         let mut a = HashMap::new();
1493 
1494         let key = "a key";
1495         let value = "an initial value";
1496         let new_value = "a new value";
1497 
1498         let entry = a
1499             .raw_entry_mut()
1500             .from_key(&key)
1501             .insert(key, value)
1502             .replace_entry_with(|k, v| {
1503                 assert_eq!(k, &key);
1504                 assert_eq!(v, value);
1505                 Some(new_value)
1506             });
1507 
1508         match entry {
1509             RawEntryMut::Occupied(e) => {
1510                 assert_eq!(e.key(), &key);
1511                 assert_eq!(e.get(), &new_value);
1512             }
1513             RawEntryMut::Vacant(_) => panic!(),
1514         }
1515 
1516         assert_eq!(a[key], new_value);
1517         assert_eq!(a.len(), 1);
1518 
1519         let entry = match a.raw_entry_mut().from_key(&key) {
1520             RawEntryMut::Occupied(e) => e.replace_entry_with(|k, v| {
1521                 assert_eq!(k, &key);
1522                 assert_eq!(v, new_value);
1523                 None
1524             }),
1525             RawEntryMut::Vacant(_) => panic!(),
1526         };
1527 
1528         match entry {
1529             RawEntryMut::Vacant(_) => {}
1530             RawEntryMut::Occupied(_) => panic!(),
1531         }
1532 
1533         assert!(!a.contains_key(key));
1534         assert_eq!(a.len(), 0);
1535     }
1536 
1537     #[test]
test_raw_entry_and_replace_entry_with()1538     fn test_raw_entry_and_replace_entry_with() {
1539         let mut a = HashMap::new();
1540 
1541         let key = "a key";
1542         let value = "an initial value";
1543         let new_value = "a new value";
1544 
1545         let entry = a
1546             .raw_entry_mut()
1547             .from_key(&key)
1548             .and_replace_entry_with(|_, _| panic!());
1549 
1550         match entry {
1551             RawEntryMut::Vacant(_) => {}
1552             RawEntryMut::Occupied(_) => panic!(),
1553         }
1554 
1555         a.insert(key, value);
1556 
1557         let entry = a
1558             .raw_entry_mut()
1559             .from_key(&key)
1560             .and_replace_entry_with(|k, v| {
1561                 assert_eq!(k, &key);
1562                 assert_eq!(v, value);
1563                 Some(new_value)
1564             });
1565 
1566         match entry {
1567             RawEntryMut::Occupied(e) => {
1568                 assert_eq!(e.key(), &key);
1569                 assert_eq!(e.get(), &new_value);
1570             }
1571             RawEntryMut::Vacant(_) => panic!(),
1572         }
1573 
1574         assert_eq!(a[key], new_value);
1575         assert_eq!(a.len(), 1);
1576 
1577         let entry = a
1578             .raw_entry_mut()
1579             .from_key(&key)
1580             .and_replace_entry_with(|k, v| {
1581                 assert_eq!(k, &key);
1582                 assert_eq!(v, new_value);
1583                 None
1584             });
1585 
1586         match entry {
1587             RawEntryMut::Vacant(_) => {}
1588             RawEntryMut::Occupied(_) => panic!(),
1589         }
1590 
1591         assert!(!a.contains_key(key));
1592         assert_eq!(a.len(), 0);
1593     }
1594 
1595     #[test]
test_raw_entry()1596     fn test_raw_entry() {
1597         use super::RawEntryMut::{Occupied, Vacant};
1598 
1599         let xs = [(1_i32, 10_i32), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)];
1600 
1601         let mut map: HashMap<_, _> = xs.iter().copied().collect();
1602 
1603         let compute_hash = |map: &HashMap<i32, i32>, k: i32| -> u64 {
1604             super::make_hash::<i32, _>(map.hasher(), &k)
1605         };
1606 
1607         // Existing key (insert)
1608         match map.raw_entry_mut().from_key(&1) {
1609             Vacant(_) => unreachable!(),
1610             Occupied(mut view) => {
1611                 assert_eq!(view.get(), &10);
1612                 assert_eq!(view.insert(100), 10);
1613             }
1614         }
1615         let hash1 = compute_hash(&map, 1);
1616         assert_eq!(map.raw_entry().from_key(&1).unwrap(), (&1, &100));
1617         assert_eq!(
1618             map.raw_entry().from_hash(hash1, |k| *k == 1).unwrap(),
1619             (&1, &100)
1620         );
1621         assert_eq!(
1622             map.raw_entry().from_key_hashed_nocheck(hash1, &1).unwrap(),
1623             (&1, &100)
1624         );
1625         assert_eq!(map.len(), 6);
1626 
1627         // Existing key (update)
1628         match map.raw_entry_mut().from_key(&2) {
1629             Vacant(_) => unreachable!(),
1630             Occupied(mut view) => {
1631                 let v = view.get_mut();
1632                 let new_v = (*v) * 10;
1633                 *v = new_v;
1634             }
1635         }
1636         let hash2 = compute_hash(&map, 2);
1637         assert_eq!(map.raw_entry().from_key(&2).unwrap(), (&2, &200));
1638         assert_eq!(
1639             map.raw_entry().from_hash(hash2, |k| *k == 2).unwrap(),
1640             (&2, &200)
1641         );
1642         assert_eq!(
1643             map.raw_entry().from_key_hashed_nocheck(hash2, &2).unwrap(),
1644             (&2, &200)
1645         );
1646         assert_eq!(map.len(), 6);
1647 
1648         // Existing key (take)
1649         let hash3 = compute_hash(&map, 3);
1650         match map.raw_entry_mut().from_key_hashed_nocheck(hash3, &3) {
1651             Vacant(_) => unreachable!(),
1652             Occupied(view) => {
1653                 assert_eq!(view.remove_entry(), (3, 30));
1654             }
1655         }
1656         assert_eq!(map.raw_entry().from_key(&3), None);
1657         assert_eq!(map.raw_entry().from_hash(hash3, |k| *k == 3), None);
1658         assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash3, &3), None);
1659         assert_eq!(map.len(), 5);
1660 
1661         // Nonexistent key (insert)
1662         match map.raw_entry_mut().from_key(&10) {
1663             Occupied(_) => unreachable!(),
1664             Vacant(view) => {
1665                 assert_eq!(view.insert(10, 1000), (&mut 10, &mut 1000));
1666             }
1667         }
1668         assert_eq!(map.raw_entry().from_key(&10).unwrap(), (&10, &1000));
1669         assert_eq!(map.len(), 6);
1670 
1671         // Ensure all lookup methods produce equivalent results.
1672         for k in 0..12 {
1673             let hash = compute_hash(&map, k);
1674             let v = map.get(&k).copied();
1675             let kv = v.as_ref().map(|v| (&k, v));
1676 
1677             assert_eq!(map.raw_entry().from_key(&k), kv);
1678             assert_eq!(map.raw_entry().from_hash(hash, |q| *q == k), kv);
1679             assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv);
1680 
1681             match map.raw_entry_mut().from_key(&k) {
1682                 Occupied(o) => assert_eq!(Some(o.get_key_value()), kv),
1683                 Vacant(_) => assert_eq!(v, None),
1684             }
1685             match map.raw_entry_mut().from_key_hashed_nocheck(hash, &k) {
1686                 Occupied(o) => assert_eq!(Some(o.get_key_value()), kv),
1687                 Vacant(_) => assert_eq!(v, None),
1688             }
1689             match map.raw_entry_mut().from_hash(hash, |q| *q == k) {
1690                 Occupied(o) => assert_eq!(Some(o.get_key_value()), kv),
1691                 Vacant(_) => assert_eq!(v, None),
1692             }
1693         }
1694     }
1695 
1696     #[test]
test_key_without_hash_impl()1697     fn test_key_without_hash_impl() {
1698         #[derive(Debug)]
1699         struct IntWrapper(u64);
1700 
1701         let mut m: HashMap<IntWrapper, (), ()> = HashMap::default();
1702         {
1703             assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_none());
1704         }
1705         {
1706             let vacant_entry = match m.raw_entry_mut().from_hash(0, |k| k.0 == 0) {
1707                 RawEntryMut::Occupied(..) => panic!("Found entry for key 0"),
1708                 RawEntryMut::Vacant(e) => e,
1709             };
1710             vacant_entry.insert_with_hasher(0, IntWrapper(0), (), |k| k.0);
1711         }
1712         {
1713             assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_some());
1714             assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_none());
1715             assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none());
1716         }
1717         {
1718             let vacant_entry = match m.raw_entry_mut().from_hash(1, |k| k.0 == 1) {
1719                 RawEntryMut::Occupied(..) => panic!("Found entry for key 1"),
1720                 RawEntryMut::Vacant(e) => e,
1721             };
1722             vacant_entry.insert_with_hasher(1, IntWrapper(1), (), |k| k.0);
1723         }
1724         {
1725             assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_some());
1726             assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_some());
1727             assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none());
1728         }
1729         {
1730             let occupied_entry = match m.raw_entry_mut().from_hash(0, |k| k.0 == 0) {
1731                 RawEntryMut::Occupied(e) => e,
1732                 RawEntryMut::Vacant(..) => panic!("Couldn't find entry for key 0"),
1733             };
1734             occupied_entry.remove();
1735         }
1736         assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_none());
1737         assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_some());
1738         assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none());
1739     }
1740 }
1741