1 //! `IndexMap` is a hash table where the iteration order of the key-value 2 //! pairs is independent of the hash values of the keys. 3 4 mod core; 5 6 pub use crate::mutable_keys::MutableKeys; 7 8 #[cfg(feature = "rayon")] 9 pub use crate::rayon::map as rayon; 10 11 use crate::vec::{self, Vec}; 12 use ::core::cmp::Ordering; 13 use ::core::fmt; 14 use ::core::hash::{BuildHasher, Hash, Hasher}; 15 use ::core::iter::FusedIterator; 16 use ::core::ops::{Index, IndexMut, RangeBounds}; 17 use ::core::slice::{Iter as SliceIter, IterMut as SliceIterMut}; 18 19 #[cfg(has_std)] 20 use std::collections::hash_map::RandomState; 21 22 use self::core::IndexMapCore; 23 use crate::equivalent::Equivalent; 24 use crate::util::third; 25 use crate::{Bucket, Entries, HashValue}; 26 27 pub use self::core::{Entry, OccupiedEntry, VacantEntry}; 28 29 /// A hash table where the iteration order of the key-value pairs is independent 30 /// of the hash values of the keys. 31 /// 32 /// The interface is closely compatible with the standard `HashMap`, but also 33 /// has additional features. 34 /// 35 /// # Order 36 /// 37 /// The key-value pairs have a consistent order that is determined by 38 /// the sequence of insertion and removal calls on the map. The order does 39 /// not depend on the keys or the hash function at all. 40 /// 41 /// All iterators traverse the map in *the order*. 42 /// 43 /// The insertion order is preserved, with **notable exceptions** like the 44 /// `.remove()` or `.swap_remove()` methods. Methods such as `.sort_by()` of 45 /// course result in a new order, depending on the sorting order. 46 /// 47 /// # Indices 48 /// 49 /// The key-value pairs are indexed in a compact range without holes in the 50 /// range `0..self.len()`. For example, the method `.get_full` looks up the 51 /// index for a key, and the method `.get_index` looks up the key-value pair by 52 /// index. 53 /// 54 /// # Examples 55 /// 56 /// ``` 57 /// use indexmap::IndexMap; 58 /// 59 /// // count the frequency of each letter in a sentence. 60 /// let mut letters = IndexMap::new(); 61 /// for ch in "a short treatise on fungi".chars() { 62 /// *letters.entry(ch).or_insert(0) += 1; 63 /// } 64 /// 65 /// assert_eq!(letters[&'s'], 2); 66 /// assert_eq!(letters[&'t'], 3); 67 /// assert_eq!(letters[&'u'], 1); 68 /// assert_eq!(letters.get(&'y'), None); 69 /// ``` 70 #[cfg(has_std)] 71 pub struct IndexMap<K, V, S = RandomState> { 72 pub(crate) core: IndexMapCore<K, V>, 73 hash_builder: S, 74 } 75 #[cfg(not(has_std))] 76 pub struct IndexMap<K, V, S> { 77 pub(crate) core: IndexMapCore<K, V>, 78 hash_builder: S, 79 } 80 81 impl<K, V, S> Clone for IndexMap<K, V, S> 82 where 83 K: Clone, 84 V: Clone, 85 S: Clone, 86 { clone(&self) -> Self87 fn clone(&self) -> Self { 88 IndexMap { 89 core: self.core.clone(), 90 hash_builder: self.hash_builder.clone(), 91 } 92 } 93 clone_from(&mut self, other: &Self)94 fn clone_from(&mut self, other: &Self) { 95 self.core.clone_from(&other.core); 96 self.hash_builder.clone_from(&other.hash_builder); 97 } 98 } 99 100 impl<K, V, S> Entries for IndexMap<K, V, S> { 101 type Entry = Bucket<K, V>; 102 103 #[inline] into_entries(self) -> Vec<Self::Entry>104 fn into_entries(self) -> Vec<Self::Entry> { 105 self.core.into_entries() 106 } 107 108 #[inline] as_entries(&self) -> &[Self::Entry]109 fn as_entries(&self) -> &[Self::Entry] { 110 self.core.as_entries() 111 } 112 113 #[inline] as_entries_mut(&mut self) -> &mut [Self::Entry]114 fn as_entries_mut(&mut self) -> &mut [Self::Entry] { 115 self.core.as_entries_mut() 116 } 117 with_entries<F>(&mut self, f: F) where F: FnOnce(&mut [Self::Entry]),118 fn with_entries<F>(&mut self, f: F) 119 where 120 F: FnOnce(&mut [Self::Entry]), 121 { 122 self.core.with_entries(f); 123 } 124 } 125 126 impl<K, V, S> fmt::Debug for IndexMap<K, V, S> 127 where 128 K: fmt::Debug, 129 V: fmt::Debug, 130 { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result131 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 132 if cfg!(not(feature = "test_debug")) { 133 f.debug_map().entries(self.iter()).finish() 134 } else { 135 // Let the inner `IndexMapCore` print all of its details 136 f.debug_struct("IndexMap") 137 .field("core", &self.core) 138 .finish() 139 } 140 } 141 } 142 143 #[cfg(has_std)] 144 impl<K, V> IndexMap<K, V> { 145 /// Create a new map. (Does not allocate.) 146 #[inline] new() -> Self147 pub fn new() -> Self { 148 Self::with_capacity(0) 149 } 150 151 /// Create a new map with capacity for `n` key-value pairs. (Does not 152 /// allocate if `n` is zero.) 153 /// 154 /// Computes in **O(n)** time. 155 #[inline] with_capacity(n: usize) -> Self156 pub fn with_capacity(n: usize) -> Self { 157 Self::with_capacity_and_hasher(n, <_>::default()) 158 } 159 } 160 161 impl<K, V, S> IndexMap<K, V, S> { 162 /// Create a new map with capacity for `n` key-value pairs. (Does not 163 /// allocate if `n` is zero.) 164 /// 165 /// Computes in **O(n)** time. 166 #[inline] with_capacity_and_hasher(n: usize, hash_builder: S) -> Self167 pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self { 168 if n == 0 { 169 Self::with_hasher(hash_builder) 170 } else { 171 IndexMap { 172 core: IndexMapCore::with_capacity(n), 173 hash_builder, 174 } 175 } 176 } 177 178 /// Create a new map with `hash_builder`. 179 /// 180 /// This function is `const`, so it 181 /// can be called in `static` contexts. with_hasher(hash_builder: S) -> Self182 pub const fn with_hasher(hash_builder: S) -> Self { 183 IndexMap { 184 core: IndexMapCore::new(), 185 hash_builder, 186 } 187 } 188 189 /// Computes in **O(1)** time. capacity(&self) -> usize190 pub fn capacity(&self) -> usize { 191 self.core.capacity() 192 } 193 194 /// Return a reference to the map's `BuildHasher`. hasher(&self) -> &S195 pub fn hasher(&self) -> &S { 196 &self.hash_builder 197 } 198 199 /// Return the number of key-value pairs in the map. 200 /// 201 /// Computes in **O(1)** time. 202 #[inline] len(&self) -> usize203 pub fn len(&self) -> usize { 204 self.core.len() 205 } 206 207 /// Returns true if the map contains no elements. 208 /// 209 /// Computes in **O(1)** time. 210 #[inline] is_empty(&self) -> bool211 pub fn is_empty(&self) -> bool { 212 self.len() == 0 213 } 214 215 /// Return an iterator over the key-value pairs of the map, in their order iter(&self) -> Iter<'_, K, V>216 pub fn iter(&self) -> Iter<'_, K, V> { 217 Iter { 218 iter: self.as_entries().iter(), 219 } 220 } 221 222 /// Return an iterator over the key-value pairs of the map, in their order iter_mut(&mut self) -> IterMut<'_, K, V>223 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { 224 IterMut { 225 iter: self.as_entries_mut().iter_mut(), 226 } 227 } 228 229 /// Return an iterator over the keys of the map, in their order keys(&self) -> Keys<'_, K, V>230 pub fn keys(&self) -> Keys<'_, K, V> { 231 Keys { 232 iter: self.as_entries().iter(), 233 } 234 } 235 236 /// Return an owning iterator over the keys of the map, in their order into_keys(self) -> IntoKeys<K, V>237 pub fn into_keys(self) -> IntoKeys<K, V> { 238 IntoKeys { 239 iter: self.into_entries().into_iter(), 240 } 241 } 242 243 /// Return an iterator over the values of the map, in their order values(&self) -> Values<'_, K, V>244 pub fn values(&self) -> Values<'_, K, V> { 245 Values { 246 iter: self.as_entries().iter(), 247 } 248 } 249 250 /// Return an iterator over mutable references to the values of the map, 251 /// in their order values_mut(&mut self) -> ValuesMut<'_, K, V>252 pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> { 253 ValuesMut { 254 iter: self.as_entries_mut().iter_mut(), 255 } 256 } 257 258 /// Return an owning iterator over the values of the map, in their order into_values(self) -> IntoValues<K, V>259 pub fn into_values(self) -> IntoValues<K, V> { 260 IntoValues { 261 iter: self.into_entries().into_iter(), 262 } 263 } 264 265 /// Remove all key-value pairs in the map, while preserving its capacity. 266 /// 267 /// Computes in **O(n)** time. clear(&mut self)268 pub fn clear(&mut self) { 269 self.core.clear(); 270 } 271 272 /// Shortens the map, keeping the first `len` elements and dropping the rest. 273 /// 274 /// If `len` is greater than the map's current length, this has no effect. truncate(&mut self, len: usize)275 pub fn truncate(&mut self, len: usize) { 276 self.core.truncate(len); 277 } 278 279 /// Clears the `IndexMap` in the given index range, returning those 280 /// key-value pairs as a drain iterator. 281 /// 282 /// The range may be any type that implements `RangeBounds<usize>`, 283 /// including all of the `std::ops::Range*` types, or even a tuple pair of 284 /// `Bound` start and end values. To drain the map entirely, use `RangeFull` 285 /// like `map.drain(..)`. 286 /// 287 /// This shifts down all entries following the drained range to fill the 288 /// gap, and keeps the allocated memory for reuse. 289 /// 290 /// ***Panics*** if the starting point is greater than the end point or if 291 /// the end point is greater than the length of the map. drain<R>(&mut self, range: R) -> Drain<'_, K, V> where R: RangeBounds<usize>,292 pub fn drain<R>(&mut self, range: R) -> Drain<'_, K, V> 293 where 294 R: RangeBounds<usize>, 295 { 296 Drain { 297 iter: self.core.drain(range), 298 } 299 } 300 301 /// Splits the collection into two at the given index. 302 /// 303 /// Returns a newly allocated map containing the elements in the range 304 /// `[at, len)`. After the call, the original map will be left containing 305 /// the elements `[0, at)` with its previous capacity unchanged. 306 /// 307 /// ***Panics*** if `at > len`. split_off(&mut self, at: usize) -> Self where S: Clone,308 pub fn split_off(&mut self, at: usize) -> Self 309 where 310 S: Clone, 311 { 312 Self { 313 core: self.core.split_off(at), 314 hash_builder: self.hash_builder.clone(), 315 } 316 } 317 } 318 319 impl<K, V, S> IndexMap<K, V, S> 320 where 321 K: Hash + Eq, 322 S: BuildHasher, 323 { 324 /// Reserve capacity for `additional` more key-value pairs. 325 /// 326 /// Computes in **O(n)** time. reserve(&mut self, additional: usize)327 pub fn reserve(&mut self, additional: usize) { 328 self.core.reserve(additional); 329 } 330 331 /// Shrink the capacity of the map as much as possible. 332 /// 333 /// Computes in **O(n)** time. shrink_to_fit(&mut self)334 pub fn shrink_to_fit(&mut self) { 335 self.core.shrink_to(0); 336 } 337 338 /// Shrink the capacity of the map with a lower limit. 339 /// 340 /// Computes in **O(n)** time. shrink_to(&mut self, min_capacity: usize)341 pub fn shrink_to(&mut self, min_capacity: usize) { 342 self.core.shrink_to(min_capacity); 343 } 344 hash<Q: ?Sized + Hash>(&self, key: &Q) -> HashValue345 fn hash<Q: ?Sized + Hash>(&self, key: &Q) -> HashValue { 346 let mut h = self.hash_builder.build_hasher(); 347 key.hash(&mut h); 348 HashValue(h.finish() as usize) 349 } 350 351 /// Insert a key-value pair in the map. 352 /// 353 /// If an equivalent key already exists in the map: the key remains and 354 /// retains in its place in the order, its corresponding value is updated 355 /// with `value` and the older value is returned inside `Some(_)`. 356 /// 357 /// If no equivalent key existed in the map: the new key-value pair is 358 /// inserted, last in order, and `None` is returned. 359 /// 360 /// Computes in **O(1)** time (amortized average). 361 /// 362 /// See also [`entry`](#method.entry) if you you want to insert *or* modify 363 /// or if you need to get the index of the corresponding key-value pair. insert(&mut self, key: K, value: V) -> Option<V>364 pub fn insert(&mut self, key: K, value: V) -> Option<V> { 365 self.insert_full(key, value).1 366 } 367 368 /// Insert a key-value pair in the map, and get their index. 369 /// 370 /// If an equivalent key already exists in the map: the key remains and 371 /// retains in its place in the order, its corresponding value is updated 372 /// with `value` and the older value is returned inside `(index, Some(_))`. 373 /// 374 /// If no equivalent key existed in the map: the new key-value pair is 375 /// inserted, last in order, and `(index, None)` is returned. 376 /// 377 /// Computes in **O(1)** time (amortized average). 378 /// 379 /// See also [`entry`](#method.entry) if you you want to insert *or* modify 380 /// or if you need to get the index of the corresponding key-value pair. insert_full(&mut self, key: K, value: V) -> (usize, Option<V>)381 pub fn insert_full(&mut self, key: K, value: V) -> (usize, Option<V>) { 382 let hash = self.hash(&key); 383 self.core.insert_full(hash, key, value) 384 } 385 386 /// Get the given key’s corresponding entry in the map for insertion and/or 387 /// in-place manipulation. 388 /// 389 /// Computes in **O(1)** time (amortized average). entry(&mut self, key: K) -> Entry<'_, K, V>390 pub fn entry(&mut self, key: K) -> Entry<'_, K, V> { 391 let hash = self.hash(&key); 392 self.core.entry(hash, key) 393 } 394 395 /// Return `true` if an equivalent to `key` exists in the map. 396 /// 397 /// Computes in **O(1)** time (average). contains_key<Q: ?Sized>(&self, key: &Q) -> bool where Q: Hash + Equivalent<K>,398 pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool 399 where 400 Q: Hash + Equivalent<K>, 401 { 402 self.get_index_of(key).is_some() 403 } 404 405 /// Return a reference to the value stored for `key`, if it is present, 406 /// else `None`. 407 /// 408 /// Computes in **O(1)** time (average). get<Q: ?Sized>(&self, key: &Q) -> Option<&V> where Q: Hash + Equivalent<K>,409 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V> 410 where 411 Q: Hash + Equivalent<K>, 412 { 413 if let Some(i) = self.get_index_of(key) { 414 let entry = &self.as_entries()[i]; 415 Some(&entry.value) 416 } else { 417 None 418 } 419 } 420 421 /// Return references to the key-value pair stored for `key`, 422 /// if it is present, else `None`. 423 /// 424 /// Computes in **O(1)** time (average). get_key_value<Q: ?Sized>(&self, key: &Q) -> Option<(&K, &V)> where Q: Hash + Equivalent<K>,425 pub fn get_key_value<Q: ?Sized>(&self, key: &Q) -> Option<(&K, &V)> 426 where 427 Q: Hash + Equivalent<K>, 428 { 429 if let Some(i) = self.get_index_of(key) { 430 let entry = &self.as_entries()[i]; 431 Some((&entry.key, &entry.value)) 432 } else { 433 None 434 } 435 } 436 437 /// Return item index, key and value get_full<Q: ?Sized>(&self, key: &Q) -> Option<(usize, &K, &V)> where Q: Hash + Equivalent<K>,438 pub fn get_full<Q: ?Sized>(&self, key: &Q) -> Option<(usize, &K, &V)> 439 where 440 Q: Hash + Equivalent<K>, 441 { 442 if let Some(i) = self.get_index_of(key) { 443 let entry = &self.as_entries()[i]; 444 Some((i, &entry.key, &entry.value)) 445 } else { 446 None 447 } 448 } 449 450 /// Return item index, if it exists in the map 451 /// 452 /// Computes in **O(1)** time (average). get_index_of<Q: ?Sized>(&self, key: &Q) -> Option<usize> where Q: Hash + Equivalent<K>,453 pub fn get_index_of<Q: ?Sized>(&self, key: &Q) -> Option<usize> 454 where 455 Q: Hash + Equivalent<K>, 456 { 457 if self.is_empty() { 458 None 459 } else { 460 let hash = self.hash(key); 461 self.core.get_index_of(hash, key) 462 } 463 } 464 get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V> where Q: Hash + Equivalent<K>,465 pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V> 466 where 467 Q: Hash + Equivalent<K>, 468 { 469 if let Some(i) = self.get_index_of(key) { 470 let entry = &mut self.as_entries_mut()[i]; 471 Some(&mut entry.value) 472 } else { 473 None 474 } 475 } 476 get_full_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, &K, &mut V)> where Q: Hash + Equivalent<K>,477 pub fn get_full_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, &K, &mut V)> 478 where 479 Q: Hash + Equivalent<K>, 480 { 481 if let Some(i) = self.get_index_of(key) { 482 let entry = &mut self.as_entries_mut()[i]; 483 Some((i, &entry.key, &mut entry.value)) 484 } else { 485 None 486 } 487 } 488 get_full_mut2_impl<Q: ?Sized>( &mut self, key: &Q, ) -> Option<(usize, &mut K, &mut V)> where Q: Hash + Equivalent<K>,489 pub(crate) fn get_full_mut2_impl<Q: ?Sized>( 490 &mut self, 491 key: &Q, 492 ) -> Option<(usize, &mut K, &mut V)> 493 where 494 Q: Hash + Equivalent<K>, 495 { 496 if let Some(i) = self.get_index_of(key) { 497 let entry = &mut self.as_entries_mut()[i]; 498 Some((i, &mut entry.key, &mut entry.value)) 499 } else { 500 None 501 } 502 } 503 504 /// Remove the key-value pair equivalent to `key` and return 505 /// its value. 506 /// 507 /// **NOTE:** This is equivalent to `.swap_remove(key)`, if you need to 508 /// preserve the order of the keys in the map, use `.shift_remove(key)` 509 /// instead. 510 /// 511 /// Computes in **O(1)** time (average). remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> where Q: Hash + Equivalent<K>,512 pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> 513 where 514 Q: Hash + Equivalent<K>, 515 { 516 self.swap_remove(key) 517 } 518 519 /// Remove and return the key-value pair equivalent to `key`. 520 /// 521 /// **NOTE:** This is equivalent to `.swap_remove_entry(key)`, if you need to 522 /// preserve the order of the keys in the map, use `.shift_remove_entry(key)` 523 /// instead. 524 /// 525 /// Computes in **O(1)** time (average). remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)> where Q: Hash + Equivalent<K>,526 pub fn remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)> 527 where 528 Q: Hash + Equivalent<K>, 529 { 530 self.swap_remove_entry(key) 531 } 532 533 /// Remove the key-value pair equivalent to `key` and return 534 /// its value. 535 /// 536 /// Like `Vec::swap_remove`, the pair is removed by swapping it with the 537 /// last element of the map and popping it off. **This perturbs 538 /// the position of what used to be the last element!** 539 /// 540 /// Return `None` if `key` is not in map. 541 /// 542 /// Computes in **O(1)** time (average). swap_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> where Q: Hash + Equivalent<K>,543 pub fn swap_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> 544 where 545 Q: Hash + Equivalent<K>, 546 { 547 self.swap_remove_full(key).map(third) 548 } 549 550 /// Remove and return the key-value pair equivalent to `key`. 551 /// 552 /// Like `Vec::swap_remove`, the pair is removed by swapping it with the 553 /// last element of the map and popping it off. **This perturbs 554 /// the position of what used to be the last element!** 555 /// 556 /// Return `None` if `key` is not in map. 557 /// 558 /// Computes in **O(1)** time (average). swap_remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)> where Q: Hash + Equivalent<K>,559 pub fn swap_remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)> 560 where 561 Q: Hash + Equivalent<K>, 562 { 563 match self.swap_remove_full(key) { 564 Some((_, key, value)) => Some((key, value)), 565 None => None, 566 } 567 } 568 569 /// Remove the key-value pair equivalent to `key` and return it and 570 /// the index it had. 571 /// 572 /// Like `Vec::swap_remove`, the pair is removed by swapping it with the 573 /// last element of the map and popping it off. **This perturbs 574 /// the position of what used to be the last element!** 575 /// 576 /// Return `None` if `key` is not in map. 577 /// 578 /// Computes in **O(1)** time (average). swap_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)> where Q: Hash + Equivalent<K>,579 pub fn swap_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)> 580 where 581 Q: Hash + Equivalent<K>, 582 { 583 if self.is_empty() { 584 return None; 585 } 586 let hash = self.hash(key); 587 self.core.swap_remove_full(hash, key) 588 } 589 590 /// Remove the key-value pair equivalent to `key` and return 591 /// its value. 592 /// 593 /// Like `Vec::remove`, the pair is removed by shifting all of the 594 /// elements that follow it, preserving their relative order. 595 /// **This perturbs the index of all of those elements!** 596 /// 597 /// Return `None` if `key` is not in map. 598 /// 599 /// Computes in **O(n)** time (average). shift_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> where Q: Hash + Equivalent<K>,600 pub fn shift_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V> 601 where 602 Q: Hash + Equivalent<K>, 603 { 604 self.shift_remove_full(key).map(third) 605 } 606 607 /// Remove and return the key-value pair equivalent to `key`. 608 /// 609 /// Like `Vec::remove`, the pair is removed by shifting all of the 610 /// elements that follow it, preserving their relative order. 611 /// **This perturbs the index of all of those elements!** 612 /// 613 /// Return `None` if `key` is not in map. 614 /// 615 /// Computes in **O(n)** time (average). shift_remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)> where Q: Hash + Equivalent<K>,616 pub fn shift_remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)> 617 where 618 Q: Hash + Equivalent<K>, 619 { 620 match self.shift_remove_full(key) { 621 Some((_, key, value)) => Some((key, value)), 622 None => None, 623 } 624 } 625 626 /// Remove the key-value pair equivalent to `key` and return it and 627 /// the index it had. 628 /// 629 /// Like `Vec::remove`, the pair is removed by shifting all of the 630 /// elements that follow it, preserving their relative order. 631 /// **This perturbs the index of all of those elements!** 632 /// 633 /// Return `None` if `key` is not in map. 634 /// 635 /// Computes in **O(n)** time (average). shift_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)> where Q: Hash + Equivalent<K>,636 pub fn shift_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)> 637 where 638 Q: Hash + Equivalent<K>, 639 { 640 if self.is_empty() { 641 return None; 642 } 643 let hash = self.hash(key); 644 self.core.shift_remove_full(hash, key) 645 } 646 647 /// Remove the last key-value pair 648 /// 649 /// This preserves the order of the remaining elements. 650 /// 651 /// Computes in **O(1)** time (average). pop(&mut self) -> Option<(K, V)>652 pub fn pop(&mut self) -> Option<(K, V)> { 653 self.core.pop() 654 } 655 656 /// Scan through each key-value pair in the map and keep those where the 657 /// closure `keep` returns `true`. 658 /// 659 /// The elements are visited in order, and remaining elements keep their 660 /// order. 661 /// 662 /// Computes in **O(n)** time (average). retain<F>(&mut self, mut keep: F) where F: FnMut(&K, &mut V) -> bool,663 pub fn retain<F>(&mut self, mut keep: F) 664 where 665 F: FnMut(&K, &mut V) -> bool, 666 { 667 self.core.retain_in_order(move |k, v| keep(k, v)); 668 } 669 retain_mut<F>(&mut self, keep: F) where F: FnMut(&mut K, &mut V) -> bool,670 pub(crate) fn retain_mut<F>(&mut self, keep: F) 671 where 672 F: FnMut(&mut K, &mut V) -> bool, 673 { 674 self.core.retain_in_order(keep); 675 } 676 677 /// Sort the map’s key-value pairs by the default ordering of the keys. 678 /// 679 /// See [`sort_by`](Self::sort_by) for details. sort_keys(&mut self) where K: Ord,680 pub fn sort_keys(&mut self) 681 where 682 K: Ord, 683 { 684 self.with_entries(move |entries| { 685 entries.sort_by(move |a, b| K::cmp(&a.key, &b.key)); 686 }); 687 } 688 689 /// Sort the map’s key-value pairs in place using the comparison 690 /// function `cmp`. 691 /// 692 /// The comparison function receives two key and value pairs to compare (you 693 /// can sort by keys or values or their combination as needed). 694 /// 695 /// Computes in **O(n log n + c)** time and **O(n)** space where *n* is 696 /// the length of the map and *c* the capacity. The sort is stable. sort_by<F>(&mut self, mut cmp: F) where F: FnMut(&K, &V, &K, &V) -> Ordering,697 pub fn sort_by<F>(&mut self, mut cmp: F) 698 where 699 F: FnMut(&K, &V, &K, &V) -> Ordering, 700 { 701 self.with_entries(move |entries| { 702 entries.sort_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value)); 703 }); 704 } 705 706 /// Sort the key-value pairs of the map and return a by-value iterator of 707 /// the key-value pairs with the result. 708 /// 709 /// The sort is stable. sorted_by<F>(self, mut cmp: F) -> IntoIter<K, V> where F: FnMut(&K, &V, &K, &V) -> Ordering,710 pub fn sorted_by<F>(self, mut cmp: F) -> IntoIter<K, V> 711 where 712 F: FnMut(&K, &V, &K, &V) -> Ordering, 713 { 714 let mut entries = self.into_entries(); 715 entries.sort_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value)); 716 IntoIter { 717 iter: entries.into_iter(), 718 } 719 } 720 721 /// Sort the map's key-value pairs by the default ordering of the keys, but 722 /// may not preserve the order of equal elements. 723 /// 724 /// See [`sort_unstable_by`](Self::sort_unstable_by) for details. sort_unstable_keys(&mut self) where K: Ord,725 pub fn sort_unstable_keys(&mut self) 726 where 727 K: Ord, 728 { 729 self.with_entries(move |entries| { 730 entries.sort_unstable_by(move |a, b| K::cmp(&a.key, &b.key)); 731 }); 732 } 733 734 /// Sort the map's key-value pairs in place using the comparison function `cmp`, but 735 /// may not preserve the order of equal elements. 736 /// 737 /// The comparison function receives two key and value pairs to compare (you 738 /// can sort by keys or values or their combination as needed). 739 /// 740 /// Computes in **O(n log n + c)** time where *n* is 741 /// the length of the map and *c* is the capacity. The sort is unstable. sort_unstable_by<F>(&mut self, mut cmp: F) where F: FnMut(&K, &V, &K, &V) -> Ordering,742 pub fn sort_unstable_by<F>(&mut self, mut cmp: F) 743 where 744 F: FnMut(&K, &V, &K, &V) -> Ordering, 745 { 746 self.with_entries(move |entries| { 747 entries.sort_unstable_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value)); 748 }); 749 } 750 751 /// Sort the key-value pairs of the map and return a by-value iterator of 752 /// the key-value pairs with the result. 753 /// 754 /// The sort is unstable. 755 #[inline] sorted_unstable_by<F>(self, mut cmp: F) -> IntoIter<K, V> where F: FnMut(&K, &V, &K, &V) -> Ordering,756 pub fn sorted_unstable_by<F>(self, mut cmp: F) -> IntoIter<K, V> 757 where 758 F: FnMut(&K, &V, &K, &V) -> Ordering, 759 { 760 let mut entries = self.into_entries(); 761 entries.sort_unstable_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value)); 762 IntoIter { 763 iter: entries.into_iter(), 764 } 765 } 766 767 /// Reverses the order of the map’s key-value pairs in place. 768 /// 769 /// Computes in **O(n)** time and **O(1)** space. reverse(&mut self)770 pub fn reverse(&mut self) { 771 self.core.reverse() 772 } 773 } 774 775 impl<K, V, S> IndexMap<K, V, S> { 776 /// Get a key-value pair by index 777 /// 778 /// Valid indices are *0 <= index < self.len()* 779 /// 780 /// Computes in **O(1)** time. get_index(&self, index: usize) -> Option<(&K, &V)>781 pub fn get_index(&self, index: usize) -> Option<(&K, &V)> { 782 self.as_entries().get(index).map(Bucket::refs) 783 } 784 785 /// Get a key-value pair by index 786 /// 787 /// Valid indices are *0 <= index < self.len()* 788 /// 789 /// Computes in **O(1)** time. get_index_mut(&mut self, index: usize) -> Option<(&mut K, &mut V)>790 pub fn get_index_mut(&mut self, index: usize) -> Option<(&mut K, &mut V)> { 791 self.as_entries_mut().get_mut(index).map(Bucket::muts) 792 } 793 794 /// Get the first key-value pair 795 /// 796 /// Computes in **O(1)** time. first(&self) -> Option<(&K, &V)>797 pub fn first(&self) -> Option<(&K, &V)> { 798 self.as_entries().first().map(Bucket::refs) 799 } 800 801 /// Get the first key-value pair, with mutable access to the value 802 /// 803 /// Computes in **O(1)** time. first_mut(&mut self) -> Option<(&K, &mut V)>804 pub fn first_mut(&mut self) -> Option<(&K, &mut V)> { 805 self.as_entries_mut().first_mut().map(Bucket::ref_mut) 806 } 807 808 /// Get the last key-value pair 809 /// 810 /// Computes in **O(1)** time. last(&self) -> Option<(&K, &V)>811 pub fn last(&self) -> Option<(&K, &V)> { 812 self.as_entries().last().map(Bucket::refs) 813 } 814 815 /// Get the last key-value pair, with mutable access to the value 816 /// 817 /// Computes in **O(1)** time. last_mut(&mut self) -> Option<(&K, &mut V)>818 pub fn last_mut(&mut self) -> Option<(&K, &mut V)> { 819 self.as_entries_mut().last_mut().map(Bucket::ref_mut) 820 } 821 822 /// Remove the key-value pair by index 823 /// 824 /// Valid indices are *0 <= index < self.len()* 825 /// 826 /// Like `Vec::swap_remove`, the pair is removed by swapping it with the 827 /// last element of the map and popping it off. **This perturbs 828 /// the position of what used to be the last element!** 829 /// 830 /// Computes in **O(1)** time (average). swap_remove_index(&mut self, index: usize) -> Option<(K, V)>831 pub fn swap_remove_index(&mut self, index: usize) -> Option<(K, V)> { 832 self.core.swap_remove_index(index) 833 } 834 835 /// Remove the key-value pair by index 836 /// 837 /// Valid indices are *0 <= index < self.len()* 838 /// 839 /// Like `Vec::remove`, the pair is removed by shifting all of the 840 /// elements that follow it, preserving their relative order. 841 /// **This perturbs the index of all of those elements!** 842 /// 843 /// Computes in **O(n)** time (average). shift_remove_index(&mut self, index: usize) -> Option<(K, V)>844 pub fn shift_remove_index(&mut self, index: usize) -> Option<(K, V)> { 845 self.core.shift_remove_index(index) 846 } 847 848 /// Moves the position of a key-value pair from one index to another 849 /// by shifting all other pairs in-between. 850 /// 851 /// * If `from < to`, the other pairs will shift down while the targeted pair moves up. 852 /// * If `from > to`, the other pairs will shift up while the targeted pair moves down. 853 /// 854 /// ***Panics*** if `from` or `to` are out of bounds. 855 /// 856 /// Computes in **O(n)** time (average). move_index(&mut self, from: usize, to: usize)857 pub fn move_index(&mut self, from: usize, to: usize) { 858 self.core.move_index(from, to) 859 } 860 861 /// Swaps the position of two key-value pairs in the map. 862 /// 863 /// ***Panics*** if `a` or `b` are out of bounds. swap_indices(&mut self, a: usize, b: usize)864 pub fn swap_indices(&mut self, a: usize, b: usize) { 865 self.core.swap_indices(a, b) 866 } 867 } 868 869 /// An iterator over the keys of a `IndexMap`. 870 /// 871 /// This `struct` is created by the [`keys`] method on [`IndexMap`]. See its 872 /// documentation for more. 873 /// 874 /// [`keys`]: struct.IndexMap.html#method.keys 875 /// [`IndexMap`]: struct.IndexMap.html 876 pub struct Keys<'a, K, V> { 877 iter: SliceIter<'a, Bucket<K, V>>, 878 } 879 880 impl<'a, K, V> Iterator for Keys<'a, K, V> { 881 type Item = &'a K; 882 883 iterator_methods!(Bucket::key_ref); 884 } 885 886 impl<K, V> DoubleEndedIterator for Keys<'_, K, V> { 887 double_ended_iterator_methods!(Bucket::key_ref); 888 } 889 890 impl<K, V> ExactSizeIterator for Keys<'_, K, V> { len(&self) -> usize891 fn len(&self) -> usize { 892 self.iter.len() 893 } 894 } 895 896 impl<K, V> FusedIterator for Keys<'_, K, V> {} 897 898 // FIXME(#26925) Remove in favor of `#[derive(Clone)]` 899 impl<K, V> Clone for Keys<'_, K, V> { clone(&self) -> Self900 fn clone(&self) -> Self { 901 Keys { 902 iter: self.iter.clone(), 903 } 904 } 905 } 906 907 impl<K: fmt::Debug, V> fmt::Debug for Keys<'_, K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result908 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 909 f.debug_list().entries(self.clone()).finish() 910 } 911 } 912 913 /// An owning iterator over the keys of a `IndexMap`. 914 /// 915 /// This `struct` is created by the [`into_keys`] method on [`IndexMap`]. 916 /// See its documentation for more. 917 /// 918 /// [`IndexMap`]: struct.IndexMap.html 919 /// [`into_keys`]: struct.IndexMap.html#method.into_keys 920 pub struct IntoKeys<K, V> { 921 iter: vec::IntoIter<Bucket<K, V>>, 922 } 923 924 impl<K, V> Iterator for IntoKeys<K, V> { 925 type Item = K; 926 927 iterator_methods!(Bucket::key); 928 } 929 930 impl<K, V> DoubleEndedIterator for IntoKeys<K, V> { 931 double_ended_iterator_methods!(Bucket::key); 932 } 933 934 impl<K, V> ExactSizeIterator for IntoKeys<K, V> { len(&self) -> usize935 fn len(&self) -> usize { 936 self.iter.len() 937 } 938 } 939 940 impl<K, V> FusedIterator for IntoKeys<K, V> {} 941 942 impl<K: fmt::Debug, V> fmt::Debug for IntoKeys<K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result943 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 944 let iter = self.iter.as_slice().iter().map(Bucket::key_ref); 945 f.debug_list().entries(iter).finish() 946 } 947 } 948 949 /// An iterator over the values of a `IndexMap`. 950 /// 951 /// This `struct` is created by the [`values`] method on [`IndexMap`]. See its 952 /// documentation for more. 953 /// 954 /// [`values`]: struct.IndexMap.html#method.values 955 /// [`IndexMap`]: struct.IndexMap.html 956 pub struct Values<'a, K, V> { 957 iter: SliceIter<'a, Bucket<K, V>>, 958 } 959 960 impl<'a, K, V> Iterator for Values<'a, K, V> { 961 type Item = &'a V; 962 963 iterator_methods!(Bucket::value_ref); 964 } 965 966 impl<K, V> DoubleEndedIterator for Values<'_, K, V> { 967 double_ended_iterator_methods!(Bucket::value_ref); 968 } 969 970 impl<K, V> ExactSizeIterator for Values<'_, K, V> { len(&self) -> usize971 fn len(&self) -> usize { 972 self.iter.len() 973 } 974 } 975 976 impl<K, V> FusedIterator for Values<'_, K, V> {} 977 978 // FIXME(#26925) Remove in favor of `#[derive(Clone)]` 979 impl<K, V> Clone for Values<'_, K, V> { clone(&self) -> Self980 fn clone(&self) -> Self { 981 Values { 982 iter: self.iter.clone(), 983 } 984 } 985 } 986 987 impl<K, V: fmt::Debug> fmt::Debug for Values<'_, K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result988 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 989 f.debug_list().entries(self.clone()).finish() 990 } 991 } 992 993 /// A mutable iterator over the values of a `IndexMap`. 994 /// 995 /// This `struct` is created by the [`values_mut`] method on [`IndexMap`]. See its 996 /// documentation for more. 997 /// 998 /// [`values_mut`]: struct.IndexMap.html#method.values_mut 999 /// [`IndexMap`]: struct.IndexMap.html 1000 pub struct ValuesMut<'a, K, V> { 1001 iter: SliceIterMut<'a, Bucket<K, V>>, 1002 } 1003 1004 impl<'a, K, V> Iterator for ValuesMut<'a, K, V> { 1005 type Item = &'a mut V; 1006 1007 iterator_methods!(Bucket::value_mut); 1008 } 1009 1010 impl<K, V> DoubleEndedIterator for ValuesMut<'_, K, V> { 1011 double_ended_iterator_methods!(Bucket::value_mut); 1012 } 1013 1014 impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> { len(&self) -> usize1015 fn len(&self) -> usize { 1016 self.iter.len() 1017 } 1018 } 1019 1020 impl<K, V> FusedIterator for ValuesMut<'_, K, V> {} 1021 1022 impl<K, V: fmt::Debug> fmt::Debug for ValuesMut<'_, K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1023 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 1024 let iter = self.iter.as_slice().iter().map(Bucket::value_ref); 1025 f.debug_list().entries(iter).finish() 1026 } 1027 } 1028 1029 /// An owning iterator over the values of a `IndexMap`. 1030 /// 1031 /// This `struct` is created by the [`into_values`] method on [`IndexMap`]. 1032 /// See its documentation for more. 1033 /// 1034 /// [`IndexMap`]: struct.IndexMap.html 1035 /// [`into_values`]: struct.IndexMap.html#method.into_values 1036 pub struct IntoValues<K, V> { 1037 iter: vec::IntoIter<Bucket<K, V>>, 1038 } 1039 1040 impl<K, V> Iterator for IntoValues<K, V> { 1041 type Item = V; 1042 1043 iterator_methods!(Bucket::value); 1044 } 1045 1046 impl<K, V> DoubleEndedIterator for IntoValues<K, V> { 1047 double_ended_iterator_methods!(Bucket::value); 1048 } 1049 1050 impl<K, V> ExactSizeIterator for IntoValues<K, V> { len(&self) -> usize1051 fn len(&self) -> usize { 1052 self.iter.len() 1053 } 1054 } 1055 1056 impl<K, V> FusedIterator for IntoValues<K, V> {} 1057 1058 impl<K, V: fmt::Debug> fmt::Debug for IntoValues<K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1059 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 1060 let iter = self.iter.as_slice().iter().map(Bucket::value_ref); 1061 f.debug_list().entries(iter).finish() 1062 } 1063 } 1064 1065 /// An iterator over the entries of a `IndexMap`. 1066 /// 1067 /// This `struct` is created by the [`iter`] method on [`IndexMap`]. See its 1068 /// documentation for more. 1069 /// 1070 /// [`iter`]: struct.IndexMap.html#method.iter 1071 /// [`IndexMap`]: struct.IndexMap.html 1072 pub struct Iter<'a, K, V> { 1073 iter: SliceIter<'a, Bucket<K, V>>, 1074 } 1075 1076 impl<'a, K, V> Iterator for Iter<'a, K, V> { 1077 type Item = (&'a K, &'a V); 1078 1079 iterator_methods!(Bucket::refs); 1080 } 1081 1082 impl<K, V> DoubleEndedIterator for Iter<'_, K, V> { 1083 double_ended_iterator_methods!(Bucket::refs); 1084 } 1085 1086 impl<K, V> ExactSizeIterator for Iter<'_, K, V> { len(&self) -> usize1087 fn len(&self) -> usize { 1088 self.iter.len() 1089 } 1090 } 1091 1092 impl<K, V> FusedIterator for Iter<'_, K, V> {} 1093 1094 // FIXME(#26925) Remove in favor of `#[derive(Clone)]` 1095 impl<K, V> Clone for Iter<'_, K, V> { clone(&self) -> Self1096 fn clone(&self) -> Self { 1097 Iter { 1098 iter: self.iter.clone(), 1099 } 1100 } 1101 } 1102 1103 impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1104 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 1105 f.debug_list().entries(self.clone()).finish() 1106 } 1107 } 1108 1109 /// A mutable iterator over the entries of a `IndexMap`. 1110 /// 1111 /// This `struct` is created by the [`iter_mut`] method on [`IndexMap`]. See its 1112 /// documentation for more. 1113 /// 1114 /// [`iter_mut`]: struct.IndexMap.html#method.iter_mut 1115 /// [`IndexMap`]: struct.IndexMap.html 1116 pub struct IterMut<'a, K, V> { 1117 iter: SliceIterMut<'a, Bucket<K, V>>, 1118 } 1119 1120 impl<'a, K, V> Iterator for IterMut<'a, K, V> { 1121 type Item = (&'a K, &'a mut V); 1122 1123 iterator_methods!(Bucket::ref_mut); 1124 } 1125 1126 impl<K, V> DoubleEndedIterator for IterMut<'_, K, V> { 1127 double_ended_iterator_methods!(Bucket::ref_mut); 1128 } 1129 1130 impl<K, V> ExactSizeIterator for IterMut<'_, K, V> { len(&self) -> usize1131 fn len(&self) -> usize { 1132 self.iter.len() 1133 } 1134 } 1135 1136 impl<K, V> FusedIterator for IterMut<'_, K, V> {} 1137 1138 impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut<'_, K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1139 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 1140 let iter = self.iter.as_slice().iter().map(Bucket::refs); 1141 f.debug_list().entries(iter).finish() 1142 } 1143 } 1144 1145 /// An owning iterator over the entries of a `IndexMap`. 1146 /// 1147 /// This `struct` is created by the [`into_iter`] method on [`IndexMap`] 1148 /// (provided by the `IntoIterator` trait). See its documentation for more. 1149 /// 1150 /// [`into_iter`]: struct.IndexMap.html#method.into_iter 1151 /// [`IndexMap`]: struct.IndexMap.html 1152 pub struct IntoIter<K, V> { 1153 iter: vec::IntoIter<Bucket<K, V>>, 1154 } 1155 1156 impl<K, V> Iterator for IntoIter<K, V> { 1157 type Item = (K, V); 1158 1159 iterator_methods!(Bucket::key_value); 1160 } 1161 1162 impl<K, V> DoubleEndedIterator for IntoIter<K, V> { 1163 double_ended_iterator_methods!(Bucket::key_value); 1164 } 1165 1166 impl<K, V> ExactSizeIterator for IntoIter<K, V> { len(&self) -> usize1167 fn len(&self) -> usize { 1168 self.iter.len() 1169 } 1170 } 1171 1172 impl<K, V> FusedIterator for IntoIter<K, V> {} 1173 1174 impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IntoIter<K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1175 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 1176 let iter = self.iter.as_slice().iter().map(Bucket::refs); 1177 f.debug_list().entries(iter).finish() 1178 } 1179 } 1180 1181 /// A draining iterator over the entries of a `IndexMap`. 1182 /// 1183 /// This `struct` is created by the [`drain`] method on [`IndexMap`]. See its 1184 /// documentation for more. 1185 /// 1186 /// [`drain`]: struct.IndexMap.html#method.drain 1187 /// [`IndexMap`]: struct.IndexMap.html 1188 pub struct Drain<'a, K, V> { 1189 pub(crate) iter: vec::Drain<'a, Bucket<K, V>>, 1190 } 1191 1192 impl<K, V> Iterator for Drain<'_, K, V> { 1193 type Item = (K, V); 1194 1195 iterator_methods!(Bucket::key_value); 1196 } 1197 1198 impl<K, V> DoubleEndedIterator for Drain<'_, K, V> { 1199 double_ended_iterator_methods!(Bucket::key_value); 1200 } 1201 1202 impl<K, V> ExactSizeIterator for Drain<'_, K, V> { len(&self) -> usize1203 fn len(&self) -> usize { 1204 self.iter.len() 1205 } 1206 } 1207 1208 impl<K, V> FusedIterator for Drain<'_, K, V> {} 1209 1210 impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Drain<'_, K, V> { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result1211 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 1212 let iter = self.iter.as_slice().iter().map(Bucket::refs); 1213 f.debug_list().entries(iter).finish() 1214 } 1215 } 1216 1217 impl<'a, K, V, S> IntoIterator for &'a IndexMap<K, V, S> { 1218 type Item = (&'a K, &'a V); 1219 type IntoIter = Iter<'a, K, V>; into_iter(self) -> Self::IntoIter1220 fn into_iter(self) -> Self::IntoIter { 1221 self.iter() 1222 } 1223 } 1224 1225 impl<'a, K, V, S> IntoIterator for &'a mut IndexMap<K, V, S> { 1226 type Item = (&'a K, &'a mut V); 1227 type IntoIter = IterMut<'a, K, V>; into_iter(self) -> Self::IntoIter1228 fn into_iter(self) -> Self::IntoIter { 1229 self.iter_mut() 1230 } 1231 } 1232 1233 impl<K, V, S> IntoIterator for IndexMap<K, V, S> { 1234 type Item = (K, V); 1235 type IntoIter = IntoIter<K, V>; into_iter(self) -> Self::IntoIter1236 fn into_iter(self) -> Self::IntoIter { 1237 IntoIter { 1238 iter: self.into_entries().into_iter(), 1239 } 1240 } 1241 } 1242 1243 /// Access `IndexMap` values corresponding to a key. 1244 /// 1245 /// # Examples 1246 /// 1247 /// ``` 1248 /// use indexmap::IndexMap; 1249 /// 1250 /// let mut map = IndexMap::new(); 1251 /// for word in "Lorem ipsum dolor sit amet".split_whitespace() { 1252 /// map.insert(word.to_lowercase(), word.to_uppercase()); 1253 /// } 1254 /// assert_eq!(map["lorem"], "LOREM"); 1255 /// assert_eq!(map["ipsum"], "IPSUM"); 1256 /// ``` 1257 /// 1258 /// ```should_panic 1259 /// use indexmap::IndexMap; 1260 /// 1261 /// let mut map = IndexMap::new(); 1262 /// map.insert("foo", 1); 1263 /// println!("{:?}", map["bar"]); // panics! 1264 /// ``` 1265 impl<K, V, Q: ?Sized, S> Index<&Q> for IndexMap<K, V, S> 1266 where 1267 Q: Hash + Equivalent<K>, 1268 K: Hash + Eq, 1269 S: BuildHasher, 1270 { 1271 type Output = V; 1272 1273 /// Returns a reference to the value corresponding to the supplied `key`. 1274 /// 1275 /// ***Panics*** if `key` is not present in the map. index(&self, key: &Q) -> &V1276 fn index(&self, key: &Q) -> &V { 1277 self.get(key).expect("IndexMap: key not found") 1278 } 1279 } 1280 1281 /// Access `IndexMap` values corresponding to a key. 1282 /// 1283 /// Mutable indexing allows changing / updating values of key-value 1284 /// pairs that are already present. 1285 /// 1286 /// You can **not** insert new pairs with index syntax, use `.insert()`. 1287 /// 1288 /// # Examples 1289 /// 1290 /// ``` 1291 /// use indexmap::IndexMap; 1292 /// 1293 /// let mut map = IndexMap::new(); 1294 /// for word in "Lorem ipsum dolor sit amet".split_whitespace() { 1295 /// map.insert(word.to_lowercase(), word.to_string()); 1296 /// } 1297 /// let lorem = &mut map["lorem"]; 1298 /// assert_eq!(lorem, "Lorem"); 1299 /// lorem.retain(char::is_lowercase); 1300 /// assert_eq!(map["lorem"], "orem"); 1301 /// ``` 1302 /// 1303 /// ```should_panic 1304 /// use indexmap::IndexMap; 1305 /// 1306 /// let mut map = IndexMap::new(); 1307 /// map.insert("foo", 1); 1308 /// map["bar"] = 1; // panics! 1309 /// ``` 1310 impl<K, V, Q: ?Sized, S> IndexMut<&Q> for IndexMap<K, V, S> 1311 where 1312 Q: Hash + Equivalent<K>, 1313 K: Hash + Eq, 1314 S: BuildHasher, 1315 { 1316 /// Returns a mutable reference to the value corresponding to the supplied `key`. 1317 /// 1318 /// ***Panics*** if `key` is not present in the map. index_mut(&mut self, key: &Q) -> &mut V1319 fn index_mut(&mut self, key: &Q) -> &mut V { 1320 self.get_mut(key).expect("IndexMap: key not found") 1321 } 1322 } 1323 1324 /// Access `IndexMap` values at indexed positions. 1325 /// 1326 /// # Examples 1327 /// 1328 /// ``` 1329 /// use indexmap::IndexMap; 1330 /// 1331 /// let mut map = IndexMap::new(); 1332 /// for word in "Lorem ipsum dolor sit amet".split_whitespace() { 1333 /// map.insert(word.to_lowercase(), word.to_uppercase()); 1334 /// } 1335 /// assert_eq!(map[0], "LOREM"); 1336 /// assert_eq!(map[1], "IPSUM"); 1337 /// map.reverse(); 1338 /// assert_eq!(map[0], "AMET"); 1339 /// assert_eq!(map[1], "SIT"); 1340 /// map.sort_keys(); 1341 /// assert_eq!(map[0], "AMET"); 1342 /// assert_eq!(map[1], "DOLOR"); 1343 /// ``` 1344 /// 1345 /// ```should_panic 1346 /// use indexmap::IndexMap; 1347 /// 1348 /// let mut map = IndexMap::new(); 1349 /// map.insert("foo", 1); 1350 /// println!("{:?}", map[10]); // panics! 1351 /// ``` 1352 impl<K, V, S> Index<usize> for IndexMap<K, V, S> { 1353 type Output = V; 1354 1355 /// Returns a reference to the value at the supplied `index`. 1356 /// 1357 /// ***Panics*** if `index` is out of bounds. index(&self, index: usize) -> &V1358 fn index(&self, index: usize) -> &V { 1359 self.get_index(index) 1360 .expect("IndexMap: index out of bounds") 1361 .1 1362 } 1363 } 1364 1365 /// Access `IndexMap` values at indexed positions. 1366 /// 1367 /// Mutable indexing allows changing / updating indexed values 1368 /// that are already present. 1369 /// 1370 /// You can **not** insert new values with index syntax, use `.insert()`. 1371 /// 1372 /// # Examples 1373 /// 1374 /// ``` 1375 /// use indexmap::IndexMap; 1376 /// 1377 /// let mut map = IndexMap::new(); 1378 /// for word in "Lorem ipsum dolor sit amet".split_whitespace() { 1379 /// map.insert(word.to_lowercase(), word.to_string()); 1380 /// } 1381 /// let lorem = &mut map[0]; 1382 /// assert_eq!(lorem, "Lorem"); 1383 /// lorem.retain(char::is_lowercase); 1384 /// assert_eq!(map["lorem"], "orem"); 1385 /// ``` 1386 /// 1387 /// ```should_panic 1388 /// use indexmap::IndexMap; 1389 /// 1390 /// let mut map = IndexMap::new(); 1391 /// map.insert("foo", 1); 1392 /// map[10] = 1; // panics! 1393 /// ``` 1394 impl<K, V, S> IndexMut<usize> for IndexMap<K, V, S> { 1395 /// Returns a mutable reference to the value at the supplied `index`. 1396 /// 1397 /// ***Panics*** if `index` is out of bounds. index_mut(&mut self, index: usize) -> &mut V1398 fn index_mut(&mut self, index: usize) -> &mut V { 1399 self.get_index_mut(index) 1400 .expect("IndexMap: index out of bounds") 1401 .1 1402 } 1403 } 1404 1405 impl<K, V, S> FromIterator<(K, V)> for IndexMap<K, V, S> 1406 where 1407 K: Hash + Eq, 1408 S: BuildHasher + Default, 1409 { 1410 /// Create an `IndexMap` from the sequence of key-value pairs in the 1411 /// iterable. 1412 /// 1413 /// `from_iter` uses the same logic as `extend`. See 1414 /// [`extend`](#method.extend) for more details. from_iter<I: IntoIterator<Item = (K, V)>>(iterable: I) -> Self1415 fn from_iter<I: IntoIterator<Item = (K, V)>>(iterable: I) -> Self { 1416 let iter = iterable.into_iter(); 1417 let (low, _) = iter.size_hint(); 1418 let mut map = Self::with_capacity_and_hasher(low, <_>::default()); 1419 map.extend(iter); 1420 map 1421 } 1422 } 1423 1424 #[cfg(has_std)] 1425 impl<K, V, const N: usize> From<[(K, V); N]> for IndexMap<K, V, RandomState> 1426 where 1427 K: Hash + Eq, 1428 { 1429 /// # Examples 1430 /// 1431 /// ``` 1432 /// use indexmap::IndexMap; 1433 /// 1434 /// let map1 = IndexMap::from([(1, 2), (3, 4)]); 1435 /// let map2: IndexMap<_, _> = [(1, 2), (3, 4)].into(); 1436 /// assert_eq!(map1, map2); 1437 /// ``` from(arr: [(K, V); N]) -> Self1438 fn from(arr: [(K, V); N]) -> Self { 1439 Self::from_iter(arr) 1440 } 1441 } 1442 1443 impl<K, V, S> Extend<(K, V)> for IndexMap<K, V, S> 1444 where 1445 K: Hash + Eq, 1446 S: BuildHasher, 1447 { 1448 /// Extend the map with all key-value pairs in the iterable. 1449 /// 1450 /// This is equivalent to calling [`insert`](#method.insert) for each of 1451 /// them in order, which means that for keys that already existed 1452 /// in the map, their value is updated but it keeps the existing order. 1453 /// 1454 /// New keys are inserted in the order they appear in the sequence. If 1455 /// equivalents of a key occur more than once, the last corresponding value 1456 /// prevails. extend<I: IntoIterator<Item = (K, V)>>(&mut self, iterable: I)1457 fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iterable: I) { 1458 // (Note: this is a copy of `std`/`hashbrown`'s reservation logic.) 1459 // Keys may be already present or show multiple times in the iterator. 1460 // Reserve the entire hint lower bound if the map is empty. 1461 // Otherwise reserve half the hint (rounded up), so the map 1462 // will only resize twice in the worst case. 1463 let iter = iterable.into_iter(); 1464 let reserve = if self.is_empty() { 1465 iter.size_hint().0 1466 } else { 1467 (iter.size_hint().0 + 1) / 2 1468 }; 1469 self.reserve(reserve); 1470 iter.for_each(move |(k, v)| { 1471 self.insert(k, v); 1472 }); 1473 } 1474 } 1475 1476 impl<'a, K, V, S> Extend<(&'a K, &'a V)> for IndexMap<K, V, S> 1477 where 1478 K: Hash + Eq + Copy, 1479 V: Copy, 1480 S: BuildHasher, 1481 { 1482 /// Extend the map with all key-value pairs in the iterable. 1483 /// 1484 /// See the first extend method for more details. extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iterable: I)1485 fn extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iterable: I) { 1486 self.extend(iterable.into_iter().map(|(&key, &value)| (key, value))); 1487 } 1488 } 1489 1490 impl<K, V, S> Default for IndexMap<K, V, S> 1491 where 1492 S: Default, 1493 { 1494 /// Return an empty `IndexMap` default() -> Self1495 fn default() -> Self { 1496 Self::with_capacity_and_hasher(0, S::default()) 1497 } 1498 } 1499 1500 impl<K, V1, S1, V2, S2> PartialEq<IndexMap<K, V2, S2>> for IndexMap<K, V1, S1> 1501 where 1502 K: Hash + Eq, 1503 V1: PartialEq<V2>, 1504 S1: BuildHasher, 1505 S2: BuildHasher, 1506 { eq(&self, other: &IndexMap<K, V2, S2>) -> bool1507 fn eq(&self, other: &IndexMap<K, V2, S2>) -> bool { 1508 if self.len() != other.len() { 1509 return false; 1510 } 1511 1512 self.iter() 1513 .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) 1514 } 1515 } 1516 1517 impl<K, V, S> Eq for IndexMap<K, V, S> 1518 where 1519 K: Eq + Hash, 1520 V: Eq, 1521 S: BuildHasher, 1522 { 1523 } 1524 1525 #[cfg(test)] 1526 mod tests { 1527 use super::*; 1528 use std::string::String; 1529 1530 #[test] it_works()1531 fn it_works() { 1532 let mut map = IndexMap::new(); 1533 assert_eq!(map.is_empty(), true); 1534 map.insert(1, ()); 1535 map.insert(1, ()); 1536 assert_eq!(map.len(), 1); 1537 assert!(map.get(&1).is_some()); 1538 assert_eq!(map.is_empty(), false); 1539 } 1540 1541 #[test] new()1542 fn new() { 1543 let map = IndexMap::<String, String>::new(); 1544 println!("{:?}", map); 1545 assert_eq!(map.capacity(), 0); 1546 assert_eq!(map.len(), 0); 1547 assert_eq!(map.is_empty(), true); 1548 } 1549 1550 #[test] insert()1551 fn insert() { 1552 let insert = [0, 4, 2, 12, 8, 7, 11, 5]; 1553 let not_present = [1, 3, 6, 9, 10]; 1554 let mut map = IndexMap::with_capacity(insert.len()); 1555 1556 for (i, &elt) in insert.iter().enumerate() { 1557 assert_eq!(map.len(), i); 1558 map.insert(elt, elt); 1559 assert_eq!(map.len(), i + 1); 1560 assert_eq!(map.get(&elt), Some(&elt)); 1561 assert_eq!(map[&elt], elt); 1562 } 1563 println!("{:?}", map); 1564 1565 for &elt in ¬_present { 1566 assert!(map.get(&elt).is_none()); 1567 } 1568 } 1569 1570 #[test] insert_full()1571 fn insert_full() { 1572 let insert = vec![9, 2, 7, 1, 4, 6, 13]; 1573 let present = vec![1, 6, 2]; 1574 let mut map = IndexMap::with_capacity(insert.len()); 1575 1576 for (i, &elt) in insert.iter().enumerate() { 1577 assert_eq!(map.len(), i); 1578 let (index, existing) = map.insert_full(elt, elt); 1579 assert_eq!(existing, None); 1580 assert_eq!(Some(index), map.get_full(&elt).map(|x| x.0)); 1581 assert_eq!(map.len(), i + 1); 1582 } 1583 1584 let len = map.len(); 1585 for &elt in &present { 1586 let (index, existing) = map.insert_full(elt, elt); 1587 assert_eq!(existing, Some(elt)); 1588 assert_eq!(Some(index), map.get_full(&elt).map(|x| x.0)); 1589 assert_eq!(map.len(), len); 1590 } 1591 } 1592 1593 #[test] insert_2()1594 fn insert_2() { 1595 let mut map = IndexMap::with_capacity(16); 1596 1597 let mut keys = vec![]; 1598 keys.extend(0..16); 1599 keys.extend(if cfg!(miri) { 32..64 } else { 128..267 }); 1600 1601 for &i in &keys { 1602 let old_map = map.clone(); 1603 map.insert(i, ()); 1604 for key in old_map.keys() { 1605 if map.get(key).is_none() { 1606 println!("old_map: {:?}", old_map); 1607 println!("map: {:?}", map); 1608 panic!("did not find {} in map", key); 1609 } 1610 } 1611 } 1612 1613 for &i in &keys { 1614 assert!(map.get(&i).is_some(), "did not find {}", i); 1615 } 1616 } 1617 1618 #[test] insert_order()1619 fn insert_order() { 1620 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; 1621 let mut map = IndexMap::new(); 1622 1623 for &elt in &insert { 1624 map.insert(elt, ()); 1625 } 1626 1627 assert_eq!(map.keys().count(), map.len()); 1628 assert_eq!(map.keys().count(), insert.len()); 1629 for (a, b) in insert.iter().zip(map.keys()) { 1630 assert_eq!(a, b); 1631 } 1632 for (i, k) in (0..insert.len()).zip(map.keys()) { 1633 assert_eq!(map.get_index(i).unwrap().0, k); 1634 } 1635 } 1636 1637 #[test] grow()1638 fn grow() { 1639 let insert = [0, 4, 2, 12, 8, 7, 11]; 1640 let not_present = [1, 3, 6, 9, 10]; 1641 let mut map = IndexMap::with_capacity(insert.len()); 1642 1643 for (i, &elt) in insert.iter().enumerate() { 1644 assert_eq!(map.len(), i); 1645 map.insert(elt, elt); 1646 assert_eq!(map.len(), i + 1); 1647 assert_eq!(map.get(&elt), Some(&elt)); 1648 assert_eq!(map[&elt], elt); 1649 } 1650 1651 println!("{:?}", map); 1652 for &elt in &insert { 1653 map.insert(elt * 10, elt); 1654 } 1655 for &elt in &insert { 1656 map.insert(elt * 100, elt); 1657 } 1658 for (i, &elt) in insert.iter().cycle().enumerate().take(100) { 1659 map.insert(elt * 100 + i as i32, elt); 1660 } 1661 println!("{:?}", map); 1662 for &elt in ¬_present { 1663 assert!(map.get(&elt).is_none()); 1664 } 1665 } 1666 1667 #[test] reserve()1668 fn reserve() { 1669 let mut map = IndexMap::<usize, usize>::new(); 1670 assert_eq!(map.capacity(), 0); 1671 map.reserve(100); 1672 let capacity = map.capacity(); 1673 assert!(capacity >= 100); 1674 for i in 0..capacity { 1675 assert_eq!(map.len(), i); 1676 map.insert(i, i * i); 1677 assert_eq!(map.len(), i + 1); 1678 assert_eq!(map.capacity(), capacity); 1679 assert_eq!(map.get(&i), Some(&(i * i))); 1680 } 1681 map.insert(capacity, std::usize::MAX); 1682 assert_eq!(map.len(), capacity + 1); 1683 assert!(map.capacity() > capacity); 1684 assert_eq!(map.get(&capacity), Some(&std::usize::MAX)); 1685 } 1686 1687 #[test] shrink_to_fit()1688 fn shrink_to_fit() { 1689 let mut map = IndexMap::<usize, usize>::new(); 1690 assert_eq!(map.capacity(), 0); 1691 for i in 0..100 { 1692 assert_eq!(map.len(), i); 1693 map.insert(i, i * i); 1694 assert_eq!(map.len(), i + 1); 1695 assert!(map.capacity() >= i + 1); 1696 assert_eq!(map.get(&i), Some(&(i * i))); 1697 map.shrink_to_fit(); 1698 assert_eq!(map.len(), i + 1); 1699 assert_eq!(map.capacity(), i + 1); 1700 assert_eq!(map.get(&i), Some(&(i * i))); 1701 } 1702 } 1703 1704 #[test] remove()1705 fn remove() { 1706 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; 1707 let mut map = IndexMap::new(); 1708 1709 for &elt in &insert { 1710 map.insert(elt, elt); 1711 } 1712 1713 assert_eq!(map.keys().count(), map.len()); 1714 assert_eq!(map.keys().count(), insert.len()); 1715 for (a, b) in insert.iter().zip(map.keys()) { 1716 assert_eq!(a, b); 1717 } 1718 1719 let remove_fail = [99, 77]; 1720 let remove = [4, 12, 8, 7]; 1721 1722 for &key in &remove_fail { 1723 assert!(map.swap_remove_full(&key).is_none()); 1724 } 1725 println!("{:?}", map); 1726 for &key in &remove { 1727 //println!("{:?}", map); 1728 let index = map.get_full(&key).unwrap().0; 1729 assert_eq!(map.swap_remove_full(&key), Some((index, key, key))); 1730 } 1731 println!("{:?}", map); 1732 1733 for key in &insert { 1734 assert_eq!(map.get(key).is_some(), !remove.contains(key)); 1735 } 1736 assert_eq!(map.len(), insert.len() - remove.len()); 1737 assert_eq!(map.keys().count(), insert.len() - remove.len()); 1738 } 1739 1740 #[test] remove_to_empty()1741 fn remove_to_empty() { 1742 let mut map = indexmap! { 0 => 0, 4 => 4, 5 => 5 }; 1743 map.swap_remove(&5).unwrap(); 1744 map.swap_remove(&4).unwrap(); 1745 map.swap_remove(&0).unwrap(); 1746 assert!(map.is_empty()); 1747 } 1748 1749 #[test] swap_remove_index()1750 fn swap_remove_index() { 1751 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23]; 1752 let mut map = IndexMap::new(); 1753 1754 for &elt in &insert { 1755 map.insert(elt, elt * 2); 1756 } 1757 1758 let mut vector = insert.to_vec(); 1759 let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1]; 1760 1761 // check that the same swap remove sequence on vec and map 1762 // have the same result. 1763 for &rm in remove_sequence { 1764 let out_vec = vector.swap_remove(rm); 1765 let (out_map, _) = map.swap_remove_index(rm).unwrap(); 1766 assert_eq!(out_vec, out_map); 1767 } 1768 assert_eq!(vector.len(), map.len()); 1769 for (a, b) in vector.iter().zip(map.keys()) { 1770 assert_eq!(a, b); 1771 } 1772 } 1773 1774 #[test] partial_eq_and_eq()1775 fn partial_eq_and_eq() { 1776 let mut map_a = IndexMap::new(); 1777 map_a.insert(1, "1"); 1778 map_a.insert(2, "2"); 1779 let mut map_b = map_a.clone(); 1780 assert_eq!(map_a, map_b); 1781 map_b.swap_remove(&1); 1782 assert_ne!(map_a, map_b); 1783 1784 let map_c: IndexMap<_, String> = map_b.into_iter().map(|(k, v)| (k, v.into())).collect(); 1785 assert_ne!(map_a, map_c); 1786 assert_ne!(map_c, map_a); 1787 } 1788 1789 #[test] extend()1790 fn extend() { 1791 let mut map = IndexMap::new(); 1792 map.extend(vec![(&1, &2), (&3, &4)]); 1793 map.extend(vec![(5, 6)]); 1794 assert_eq!( 1795 map.into_iter().collect::<Vec<_>>(), 1796 vec![(1, 2), (3, 4), (5, 6)] 1797 ); 1798 } 1799 1800 #[test] entry()1801 fn entry() { 1802 let mut map = IndexMap::new(); 1803 1804 map.insert(1, "1"); 1805 map.insert(2, "2"); 1806 { 1807 let e = map.entry(3); 1808 assert_eq!(e.index(), 2); 1809 let e = e.or_insert("3"); 1810 assert_eq!(e, &"3"); 1811 } 1812 1813 let e = map.entry(2); 1814 assert_eq!(e.index(), 1); 1815 assert_eq!(e.key(), &2); 1816 match e { 1817 Entry::Occupied(ref e) => assert_eq!(e.get(), &"2"), 1818 Entry::Vacant(_) => panic!(), 1819 } 1820 assert_eq!(e.or_insert("4"), &"2"); 1821 } 1822 1823 #[test] entry_and_modify()1824 fn entry_and_modify() { 1825 let mut map = IndexMap::new(); 1826 1827 map.insert(1, "1"); 1828 map.entry(1).and_modify(|x| *x = "2"); 1829 assert_eq!(Some(&"2"), map.get(&1)); 1830 1831 map.entry(2).and_modify(|x| *x = "doesn't exist"); 1832 assert_eq!(None, map.get(&2)); 1833 } 1834 1835 #[test] entry_or_default()1836 fn entry_or_default() { 1837 let mut map = IndexMap::new(); 1838 1839 #[derive(Debug, PartialEq)] 1840 enum TestEnum { 1841 DefaultValue, 1842 NonDefaultValue, 1843 } 1844 1845 impl Default for TestEnum { 1846 fn default() -> Self { 1847 TestEnum::DefaultValue 1848 } 1849 } 1850 1851 map.insert(1, TestEnum::NonDefaultValue); 1852 assert_eq!(&mut TestEnum::NonDefaultValue, map.entry(1).or_default()); 1853 1854 assert_eq!(&mut TestEnum::DefaultValue, map.entry(2).or_default()); 1855 } 1856 1857 #[test] occupied_entry_key()1858 fn occupied_entry_key() { 1859 // These keys match hash and equality, but their addresses are distinct. 1860 let (k1, k2) = (&mut 1, &mut 1); 1861 let k1_ptr = k1 as *const i32; 1862 let k2_ptr = k2 as *const i32; 1863 assert_ne!(k1_ptr, k2_ptr); 1864 1865 let mut map = IndexMap::new(); 1866 map.insert(k1, "value"); 1867 match map.entry(k2) { 1868 Entry::Occupied(ref e) => { 1869 // `OccupiedEntry::key` should reference the key in the map, 1870 // not the key that was used to find the entry. 1871 let ptr = *e.key() as *const i32; 1872 assert_eq!(ptr, k1_ptr); 1873 assert_ne!(ptr, k2_ptr); 1874 } 1875 Entry::Vacant(_) => panic!(), 1876 } 1877 } 1878 1879 #[test] keys()1880 fn keys() { 1881 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; 1882 let map: IndexMap<_, _> = vec.into_iter().collect(); 1883 let keys: Vec<_> = map.keys().copied().collect(); 1884 assert_eq!(keys.len(), 3); 1885 assert!(keys.contains(&1)); 1886 assert!(keys.contains(&2)); 1887 assert!(keys.contains(&3)); 1888 } 1889 1890 #[test] into_keys()1891 fn into_keys() { 1892 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; 1893 let map: IndexMap<_, _> = vec.into_iter().collect(); 1894 let keys: Vec<i32> = map.into_keys().collect(); 1895 assert_eq!(keys.len(), 3); 1896 assert!(keys.contains(&1)); 1897 assert!(keys.contains(&2)); 1898 assert!(keys.contains(&3)); 1899 } 1900 1901 #[test] values()1902 fn values() { 1903 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; 1904 let map: IndexMap<_, _> = vec.into_iter().collect(); 1905 let values: Vec<_> = map.values().copied().collect(); 1906 assert_eq!(values.len(), 3); 1907 assert!(values.contains(&'a')); 1908 assert!(values.contains(&'b')); 1909 assert!(values.contains(&'c')); 1910 } 1911 1912 #[test] values_mut()1913 fn values_mut() { 1914 let vec = vec![(1, 1), (2, 2), (3, 3)]; 1915 let mut map: IndexMap<_, _> = vec.into_iter().collect(); 1916 for value in map.values_mut() { 1917 *value *= 2 1918 } 1919 let values: Vec<_> = map.values().copied().collect(); 1920 assert_eq!(values.len(), 3); 1921 assert!(values.contains(&2)); 1922 assert!(values.contains(&4)); 1923 assert!(values.contains(&6)); 1924 } 1925 1926 #[test] into_values()1927 fn into_values() { 1928 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; 1929 let map: IndexMap<_, _> = vec.into_iter().collect(); 1930 let values: Vec<char> = map.into_values().collect(); 1931 assert_eq!(values.len(), 3); 1932 assert!(values.contains(&'a')); 1933 assert!(values.contains(&'b')); 1934 assert!(values.contains(&'c')); 1935 } 1936 1937 #[test] 1938 #[cfg(has_std)] from_array()1939 fn from_array() { 1940 let map = IndexMap::from([(1, 2), (3, 4)]); 1941 let mut expected = IndexMap::new(); 1942 expected.insert(1, 2); 1943 expected.insert(3, 4); 1944 1945 assert_eq!(map, expected) 1946 } 1947 } 1948