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