1 // Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! A `HashMap` wrapper that holds key-value pairs in insertion order.
12 //!
13 //! # Examples
14 //!
15 //! ```
16 //! use linked_hash_map::LinkedHashMap;
17 //!
18 //! let mut map = LinkedHashMap::new();
19 //! map.insert(2, 20);
20 //! map.insert(1, 10);
21 //! map.insert(3, 30);
22 //! assert_eq!(map[&1], 10);
23 //! assert_eq!(map[&2], 20);
24 //! assert_eq!(map[&3], 30);
25 //!
26 //! let items: Vec<(i32, i32)> = map.iter().map(|t| (*t.0, *t.1)).collect();
27 //! assert_eq!(items, [(2, 20), (1, 10), (3, 30)]);
28 //! ```
29
30 #![forbid(missing_docs)]
31 #![cfg_attr(all(feature = "nightly", test), feature(test))]
32
33 // Optional Serde support
34 #[cfg(feature = "serde_impl")]
35 pub mod serde;
36 // Optional Heapsize support
37 #[cfg(feature = "heapsize_impl")]
38 mod heapsize;
39 #[cfg(test)]
40 mod tests;
41
42 use std::borrow::Borrow;
43 use std::cmp::Ordering;
44 use std::collections::hash_map::{self, HashMap};
45 use std::fmt;
46 use std::hash::{BuildHasher, Hash, Hasher};
47 use std::iter;
48 use std::marker;
49 use std::mem;
50 use std::ops::{Index, IndexMut};
51 use std::ptr::{self, addr_of_mut};
52
53 struct KeyRef<K> {
54 k: *const K,
55 }
56
57 struct Node<K, V> {
58 next: *mut Node<K, V>,
59 prev: *mut Node<K, V>,
60 key: K,
61 value: V,
62 }
63
64 /// A linked hash map.
65 pub struct LinkedHashMap<K, V, S = hash_map::RandomState> {
66 map: HashMap<KeyRef<K>, *mut Node<K, V>, S>,
67 head: *mut Node<K, V>,
68 free: *mut Node<K, V>,
69 }
70
71 impl<K: Hash> Hash for KeyRef<K> {
hash<H: Hasher>(&self, state: &mut H)72 fn hash<H: Hasher>(&self, state: &mut H) {
73 unsafe { (*self.k).hash(state) }
74 }
75 }
76
77 impl<K: PartialEq> PartialEq for KeyRef<K> {
eq(&self, other: &Self) -> bool78 fn eq(&self, other: &Self) -> bool {
79 unsafe { (*self.k).eq(&*other.k) }
80 }
81 }
82
83 impl<K: Eq> Eq for KeyRef<K> {}
84
85 // This type exists only to support borrowing `KeyRef`s, which cannot be borrowed to `Q` directly
86 // due to conflicting implementations of `Borrow`. The layout of `&Qey<Q>` must be identical to
87 // `&Q` in order to support transmuting in the `Qey::from_ref` method.
88 #[derive(Hash, PartialEq, Eq)]
89 #[repr(transparent)]
90 struct Qey<Q: ?Sized>(Q);
91
92 impl<Q: ?Sized> Qey<Q> {
from_ref(q: &Q) -> &Self93 fn from_ref(q: &Q) -> &Self {
94 unsafe { mem::transmute(q) }
95 }
96 }
97
98 impl<K, Q: ?Sized> Borrow<Qey<Q>> for KeyRef<K>
99 where
100 K: Borrow<Q>,
101 {
borrow(&self) -> &Qey<Q>102 fn borrow(&self) -> &Qey<Q> {
103 Qey::from_ref(unsafe { (*self.k).borrow() })
104 }
105 }
106
107 impl<K, V> Node<K, V> {
new(k: K, v: V) -> Self108 fn new(k: K, v: V) -> Self {
109 Node {
110 key: k,
111 value: v,
112 next: ptr::null_mut(),
113 prev: ptr::null_mut(),
114 }
115 }
116 }
117
118 // drop empty node without dropping its key and value
drop_empty_node<K, V>(the_box: *mut Node<K, V>)119 unsafe fn drop_empty_node<K, V>(the_box: *mut Node<K, V>) {
120 // Safety:
121 // In this crate all `Node` is allocated via `Box` or `alloc`, and `Box` uses the
122 // Global allocator for its allocation,
123 // (https://doc.rust-lang.org/std/boxed/index.html#memory-layout) so we can safely
124 // deallocate the pointer to `Node` by calling `dealloc` method
125 let layout = std::alloc::Layout::new::<Node<K, V>>();
126 std::alloc::dealloc(the_box as *mut u8, layout);
127 }
128
129 impl<K: Hash + Eq, V> LinkedHashMap<K, V> {
130 /// Creates a linked hash map.
new() -> Self131 pub fn new() -> Self {
132 Self::with_map(HashMap::new())
133 }
134
135 /// Creates an empty linked hash map with the given initial capacity.
with_capacity(capacity: usize) -> Self136 pub fn with_capacity(capacity: usize) -> Self {
137 Self::with_map(HashMap::with_capacity(capacity))
138 }
139 }
140
141 impl<K, V, S> LinkedHashMap<K, V, S> {
142 #[inline]
detach(&mut self, node: *mut Node<K, V>)143 fn detach(&mut self, node: *mut Node<K, V>) {
144 unsafe {
145 (*(*node).prev).next = (*node).next;
146 (*(*node).next).prev = (*node).prev;
147 }
148 }
149
150 #[inline]
attach(&mut self, node: *mut Node<K, V>)151 fn attach(&mut self, node: *mut Node<K, V>) {
152 unsafe {
153 (*node).next = (*self.head).next;
154 (*node).prev = self.head;
155 (*self.head).next = node;
156 (*(*node).next).prev = node;
157 }
158 }
159
160 // Caller must check `!self.head.is_null()`
drop_entries(&mut self)161 unsafe fn drop_entries(&mut self) {
162 let mut cur = (*self.head).next;
163 while cur != self.head {
164 let next = (*cur).next;
165 Box::from_raw(cur);
166 cur = next;
167 }
168 }
169
clear_free_list(&mut self)170 fn clear_free_list(&mut self) {
171 unsafe {
172 let mut free = self.free;
173 while !free.is_null() {
174 let next_free = (*free).next;
175 drop_empty_node(free);
176 free = next_free;
177 }
178 self.free = ptr::null_mut();
179 }
180 }
181
ensure_guard_node(&mut self)182 fn ensure_guard_node(&mut self) {
183 if self.head.is_null() {
184 // allocate the guard node if not present
185 unsafe {
186 let node_layout = std::alloc::Layout::new::<Node<K, V>>();
187 self.head = std::alloc::alloc(node_layout) as *mut Node<K, V>;
188 (*self.head).next = self.head;
189 (*self.head).prev = self.head;
190 }
191 }
192 }
193 }
194
195 impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
with_map(map: HashMap<KeyRef<K>, *mut Node<K, V>, S>) -> Self196 fn with_map(map: HashMap<KeyRef<K>, *mut Node<K, V>, S>) -> Self {
197 LinkedHashMap {
198 map,
199 head: ptr::null_mut(),
200 free: ptr::null_mut(),
201 }
202 }
203
204 /// Creates an empty linked hash map with the given initial hash builder.
with_hasher(hash_builder: S) -> Self205 pub fn with_hasher(hash_builder: S) -> Self {
206 Self::with_map(HashMap::with_hasher(hash_builder))
207 }
208
209 /// Creates an empty linked hash map with the given initial capacity and hash builder.
with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self210 pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self {
211 Self::with_map(HashMap::with_capacity_and_hasher(capacity, hash_builder))
212 }
213
214 /// Reserves capacity for at least `additional` more elements to be inserted into the map. The
215 /// map may reserve more space to avoid frequent allocations.
216 ///
217 /// # Panics
218 ///
219 /// Panics if the new allocation size overflows `usize.`
reserve(&mut self, additional: usize)220 pub fn reserve(&mut self, additional: usize) {
221 self.map.reserve(additional);
222 }
223
224 /// Shrinks the capacity of the map as much as possible. It will drop down as much as possible
225 /// while maintaining the internal rules and possibly leaving some space in accordance with the
226 /// resize policy.
shrink_to_fit(&mut self)227 pub fn shrink_to_fit(&mut self) {
228 self.map.shrink_to_fit();
229 self.clear_free_list();
230 }
231
232 /// Gets the given key's corresponding entry in the map for in-place manipulation.
233 ///
234 /// # Examples
235 ///
236 /// ```
237 /// use linked_hash_map::LinkedHashMap;
238 ///
239 /// let mut letters = LinkedHashMap::new();
240 ///
241 /// for ch in "a short treatise on fungi".chars() {
242 /// let counter = letters.entry(ch).or_insert(0);
243 /// *counter += 1;
244 /// }
245 ///
246 /// assert_eq!(letters[&'s'], 2);
247 /// assert_eq!(letters[&'t'], 3);
248 /// assert_eq!(letters[&'u'], 1);
249 /// assert_eq!(letters.get(&'y'), None);
250 /// ```
entry(&mut self, k: K) -> Entry<K, V, S>251 pub fn entry(&mut self, k: K) -> Entry<K, V, S> {
252 let self_ptr: *mut Self = self;
253
254 if let Some(entry) = self.map.get_mut(&KeyRef { k: &k }) {
255 return Entry::Occupied(OccupiedEntry {
256 entry: *entry,
257 map: self_ptr,
258 marker: marker::PhantomData,
259 });
260 }
261
262 Entry::Vacant(VacantEntry { key: k, map: self })
263 }
264
265 /// Returns an iterator visiting all entries in insertion order.
266 /// Iterator element type is `OccupiedEntry<K, V, S>`. Allows for removal
267 /// as well as replacing the entry.
268 ///
269 /// # Examples
270 /// ```
271 /// use linked_hash_map::LinkedHashMap;
272 ///
273 /// let mut map = LinkedHashMap::new();
274 /// map.insert("a", 10);
275 /// map.insert("c", 30);
276 /// map.insert("b", 20);
277 ///
278 /// {
279 /// let mut iter = map.entries();
280 /// let mut entry = iter.next().unwrap();
281 /// assert_eq!(&"a", entry.key());
282 /// *entry.get_mut() = 17;
283 /// }
284 ///
285 /// assert_eq!(&17, map.get(&"a").unwrap());
286 /// ```
entries(&mut self) -> Entries<K, V, S>287 pub fn entries(&mut self) -> Entries<K, V, S> {
288 let head = if !self.head.is_null() {
289 unsafe { (*self.head).prev }
290 } else {
291 ptr::null_mut()
292 };
293 Entries {
294 map: self,
295 head,
296 remaining: self.len(),
297 marker: marker::PhantomData,
298 }
299 }
300
301 /// Inserts a key-value pair into the map. If the key already existed, the old value is
302 /// returned.
303 ///
304 /// # Examples
305 ///
306 /// ```
307 /// use linked_hash_map::LinkedHashMap;
308 /// let mut map = LinkedHashMap::new();
309 ///
310 /// map.insert(1, "a");
311 /// map.insert(2, "b");
312 /// assert_eq!(map[&1], "a");
313 /// assert_eq!(map[&2], "b");
314 /// ```
insert(&mut self, k: K, v: V) -> Option<V>315 pub fn insert(&mut self, k: K, v: V) -> Option<V> {
316 self.ensure_guard_node();
317
318 let (node, old_val) = match self.map.get(&KeyRef { k: &k }) {
319 Some(node) => {
320 let old_val = unsafe { ptr::replace(&mut (**node).value, v) };
321 (*node, Some(old_val))
322 }
323 None => {
324 let node = if self.free.is_null() {
325 Box::into_raw(Box::new(Node::new(k, v)))
326 } else {
327 // use a recycled box
328 unsafe {
329 let free = self.free;
330 self.free = (*free).next;
331 ptr::write(free, Node::new(k, v));
332 free
333 }
334 };
335 (node, None)
336 }
337 };
338 match old_val {
339 Some(_) => {
340 // Existing node, just update LRU position
341 self.detach(node);
342 self.attach(node);
343 }
344 None => {
345 let keyref = unsafe { &(*node).key };
346 self.map.insert(KeyRef { k: keyref }, node);
347 self.attach(node);
348 }
349 }
350 old_val
351 }
352
353 /// Checks if the map contains the given key.
contains_key<Q: ?Sized>(&self, k: &Q) -> bool where K: Borrow<Q>, Q: Eq + Hash,354 pub fn contains_key<Q: ?Sized>(&self, k: &Q) -> bool
355 where
356 K: Borrow<Q>,
357 Q: Eq + Hash,
358 {
359 self.map.contains_key(Qey::from_ref(k))
360 }
361
362 /// Returns the value corresponding to the key in the map.
363 ///
364 /// # Examples
365 ///
366 /// ```
367 /// use linked_hash_map::LinkedHashMap;
368 /// let mut map = LinkedHashMap::new();
369 ///
370 /// map.insert(1, "a");
371 /// map.insert(2, "b");
372 /// map.insert(2, "c");
373 /// map.insert(3, "d");
374 ///
375 /// assert_eq!(map.get(&1), Some(&"a"));
376 /// assert_eq!(map.get(&2), Some(&"c"));
377 /// ```
get<Q: ?Sized>(&self, k: &Q) -> Option<&V> where K: Borrow<Q>, Q: Eq + Hash,378 pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
379 where
380 K: Borrow<Q>,
381 Q: Eq + Hash,
382 {
383 self.map
384 .get(Qey::from_ref(k))
385 .map(|e| unsafe { &(**e).value })
386 }
387
388 /// Returns the mutable reference corresponding to the key in the map.
389 ///
390 /// # Examples
391 ///
392 /// ```
393 /// use linked_hash_map::LinkedHashMap;
394 /// let mut map = LinkedHashMap::new();
395 ///
396 /// map.insert(1, "a");
397 /// map.insert(2, "b");
398 ///
399 /// *map.get_mut(&1).unwrap() = "c";
400 /// assert_eq!(map.get(&1), Some(&"c"));
401 /// ```
get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V> where K: Borrow<Q>, Q: Eq + Hash,402 pub fn get_mut<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>
403 where
404 K: Borrow<Q>,
405 Q: Eq + Hash,
406 {
407 self.map
408 .get(Qey::from_ref(k))
409 .map(|e| unsafe { &mut (**e).value })
410 }
411
412 /// Returns the value corresponding to the key in the map.
413 ///
414 /// If value is found, it is moved to the end of the list.
415 /// This operation can be used in implemenation of LRU cache.
416 ///
417 /// # Examples
418 ///
419 /// ```
420 /// use linked_hash_map::LinkedHashMap;
421 /// let mut map = LinkedHashMap::new();
422 ///
423 /// map.insert(1, "a");
424 /// map.insert(2, "b");
425 /// map.insert(3, "d");
426 ///
427 /// assert_eq!(map.get_refresh(&2), Some(&mut "b"));
428 ///
429 /// assert_eq!((&2, &"b"), map.iter().rev().next().unwrap());
430 /// ```
get_refresh<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V> where K: Borrow<Q>, Q: Eq + Hash,431 pub fn get_refresh<Q: ?Sized>(&mut self, k: &Q) -> Option<&mut V>
432 where
433 K: Borrow<Q>,
434 Q: Eq + Hash,
435 {
436 let (value, node_ptr_opt) = match self.map.get(Qey::from_ref(k)) {
437 None => (None, None),
438 Some(node) => (Some(unsafe { &mut (**node).value }), Some(*node)),
439 };
440 if let Some(node_ptr) = node_ptr_opt {
441 self.detach(node_ptr);
442 self.attach(node_ptr);
443 }
444 value
445 }
446
447 /// Removes and returns the value corresponding to the key from the map.
448 ///
449 /// # Examples
450 ///
451 /// ```
452 /// use linked_hash_map::LinkedHashMap;
453 /// let mut map = LinkedHashMap::new();
454 ///
455 /// map.insert(2, "a");
456 ///
457 /// assert_eq!(map.remove(&1), None);
458 /// assert_eq!(map.remove(&2), Some("a"));
459 /// assert_eq!(map.remove(&2), None);
460 /// assert_eq!(map.len(), 0);
461 /// ```
remove<Q: ?Sized>(&mut self, k: &Q) -> Option<V> where K: Borrow<Q>, Q: Eq + Hash,462 pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<V>
463 where
464 K: Borrow<Q>,
465 Q: Eq + Hash,
466 {
467 let removed = self.map.remove(Qey::from_ref(k));
468 removed.map(|node| {
469 self.detach(node);
470 unsafe {
471 // add to free list
472 (*node).next = self.free;
473 self.free = node;
474 // drop the key and return the value
475 drop(ptr::read(&(*node).key));
476 ptr::read(&(*node).value)
477 }
478 })
479 }
480
481 /// Returns the maximum number of key-value pairs the map can hold without reallocating.
482 ///
483 /// # Examples
484 ///
485 /// ```
486 /// use linked_hash_map::LinkedHashMap;
487 /// let mut map: LinkedHashMap<i32, &str> = LinkedHashMap::new();
488 /// let capacity = map.capacity();
489 /// ```
capacity(&self) -> usize490 pub fn capacity(&self) -> usize {
491 self.map.capacity()
492 }
493
494 /// Removes the first entry.
495 ///
496 /// Can be used in implementation of LRU cache.
497 ///
498 /// # Examples
499 ///
500 /// ```
501 /// use linked_hash_map::LinkedHashMap;
502 /// let mut map = LinkedHashMap::new();
503 /// map.insert(1, 10);
504 /// map.insert(2, 20);
505 /// map.pop_front();
506 /// assert_eq!(map.get(&1), None);
507 /// assert_eq!(map.get(&2), Some(&20));
508 /// ```
509 #[inline]
pop_front(&mut self) -> Option<(K, V)>510 pub fn pop_front(&mut self) -> Option<(K, V)> {
511 if self.is_empty() {
512 return None;
513 }
514 let lru = unsafe { (*self.head).prev };
515 self.detach(lru);
516 self.map
517 .remove(&KeyRef {
518 k: unsafe { &(*lru).key },
519 })
520 .map(|e| {
521 let e = *unsafe { Box::from_raw(e) };
522 (e.key, e.value)
523 })
524 }
525
526 /// Gets the first entry.
527 ///
528 /// # Examples
529 ///
530 /// ```
531 /// use linked_hash_map::LinkedHashMap;
532 /// let mut map = LinkedHashMap::new();
533 /// map.insert(1, 10);
534 /// map.insert(2, 20);
535 /// assert_eq!(map.front(), Some((&1, &10)));
536 /// ```
537 #[inline]
front(&self) -> Option<(&K, &V)>538 pub fn front(&self) -> Option<(&K, &V)> {
539 if self.is_empty() {
540 return None;
541 }
542 let lru = unsafe { (*self.head).prev };
543 self.map
544 .get(&KeyRef {
545 k: unsafe { &(*lru).key },
546 })
547 .map(|e| unsafe { (&(**e).key, &(**e).value) })
548 }
549
550 /// Removes the last entry.
551 ///
552 /// # Examples
553 ///
554 /// ```
555 /// use linked_hash_map::LinkedHashMap;
556 /// let mut map = LinkedHashMap::new();
557 /// map.insert(1, 10);
558 /// map.insert(2, 20);
559 /// map.pop_back();
560 /// assert_eq!(map.get(&1), Some(&10));
561 /// assert_eq!(map.get(&2), None);
562 /// ```
563 #[inline]
pop_back(&mut self) -> Option<(K, V)>564 pub fn pop_back(&mut self) -> Option<(K, V)> {
565 if self.is_empty() {
566 return None;
567 }
568 let mru = unsafe { (*self.head).next };
569 self.detach(mru);
570 self.map
571 .remove(&KeyRef {
572 k: unsafe { &(*mru).key },
573 })
574 .map(|e| {
575 let e = *unsafe { Box::from_raw(e) };
576 (e.key, e.value)
577 })
578 }
579
580 /// Gets the last entry.
581 ///
582 /// # Examples
583 ///
584 /// ```
585 /// use linked_hash_map::LinkedHashMap;
586 /// let mut map = LinkedHashMap::new();
587 /// map.insert(1, 10);
588 /// map.insert(2, 20);
589 /// assert_eq!(map.back(), Some((&2, &20)));
590 /// ```
591 #[inline]
back(&self) -> Option<(&K, &V)>592 pub fn back(&self) -> Option<(&K, &V)> {
593 if self.is_empty() {
594 return None;
595 }
596 let mru = unsafe { (*self.head).next };
597 self.map
598 .get(&KeyRef {
599 k: unsafe { &(*mru).key },
600 })
601 .map(|e| unsafe { (&(**e).key, &(**e).value) })
602 }
603
604 /// Returns the number of key-value pairs in the map.
len(&self) -> usize605 pub fn len(&self) -> usize {
606 self.map.len()
607 }
608
609 /// Returns whether the map is currently empty.
is_empty(&self) -> bool610 pub fn is_empty(&self) -> bool {
611 self.len() == 0
612 }
613
614 /// Returns a reference to the map's hasher.
hasher(&self) -> &S615 pub fn hasher(&self) -> &S {
616 self.map.hasher()
617 }
618
619 /// Clears the map of all key-value pairs.
clear(&mut self)620 pub fn clear(&mut self) {
621 self.map.clear();
622 // update the guard node if present
623 if !self.head.is_null() {
624 unsafe {
625 self.drop_entries();
626 (*self.head).prev = self.head;
627 (*self.head).next = self.head;
628 }
629 }
630 }
631
632 /// Returns a double-ended iterator visiting all key-value pairs in order of insertion.
633 /// Iterator element type is `(&'a K, &'a V)`
634 ///
635 /// # Examples
636 /// ```
637 /// use linked_hash_map::LinkedHashMap;
638 ///
639 /// let mut map = LinkedHashMap::new();
640 /// map.insert("a", 10);
641 /// map.insert("c", 30);
642 /// map.insert("b", 20);
643 ///
644 /// let mut iter = map.iter();
645 /// assert_eq!((&"a", &10), iter.next().unwrap());
646 /// assert_eq!((&"c", &30), iter.next().unwrap());
647 /// assert_eq!((&"b", &20), iter.next().unwrap());
648 /// assert_eq!(None, iter.next());
649 /// ```
iter(&self) -> Iter<K, V>650 pub fn iter(&self) -> Iter<K, V> {
651 let head = if self.head.is_null() {
652 ptr::null_mut()
653 } else {
654 unsafe { (*self.head).prev }
655 };
656 Iter {
657 head,
658 tail: self.head,
659 remaining: self.len(),
660 marker: marker::PhantomData,
661 }
662 }
663
664 /// Returns a double-ended iterator visiting all key-value pairs in order of insertion.
665 /// Iterator element type is `(&'a K, &'a mut V)`
666 /// # Examples
667 /// ```
668 /// use linked_hash_map::LinkedHashMap;
669 ///
670 /// let mut map = LinkedHashMap::new();
671 /// map.insert("a", 10);
672 /// map.insert("c", 30);
673 /// map.insert("b", 20);
674 ///
675 /// {
676 /// let mut iter = map.iter_mut();
677 /// let mut entry = iter.next().unwrap();
678 /// assert_eq!(&"a", entry.0);
679 /// *entry.1 = 17;
680 /// }
681 ///
682 /// assert_eq!(&17, map.get(&"a").unwrap());
683 /// ```
iter_mut(&mut self) -> IterMut<K, V>684 pub fn iter_mut(&mut self) -> IterMut<K, V> {
685 let head = if self.head.is_null() {
686 ptr::null_mut()
687 } else {
688 unsafe { (*self.head).prev }
689 };
690 IterMut {
691 head,
692 tail: self.head,
693 remaining: self.len(),
694 marker: marker::PhantomData,
695 }
696 }
697
698 /// Clears the map, returning all key-value pairs as an iterator. Keeps the
699 /// allocated memory for reuse.
700 ///
701 /// If the returned iterator is dropped before being fully consumed, it
702 /// drops the remaining key-value pairs. The returned iterator keeps a
703 /// mutable borrow on the vector to optimize its implementation.
704 ///
705 /// Current performance implications (why to use this over into_iter()):
706 ///
707 /// * Clears the inner HashMap instead of dropping it
708 /// * Puts all drained nodes in the free-list instead of deallocating them
709 /// * Avoids deallocating the sentinel node
drain(&mut self) -> Drain<K, V>710 pub fn drain(&mut self) -> Drain<K, V> {
711 let len = self.len();
712 // Map should be empty now, regardless of current state
713 self.map.clear();
714 let (head, tail) = if len != 0 {
715 // This is basically the same as IntoIter's impl, but we don't
716 // deallocate/drop anything. Instead we make the sentinel head node
717 // point at itself (same state you get from removing the last element from a map),
718 // and then append the entire list to the free list. At this point all the entries
719 // have essentially been fed into mem::forget. The Drain iterator will then iterate
720 // over those nodes in the freelist (using `len` to know where to stop) and `read`
721 // the values out of the nodes, "unforgetting" them.
722 //
723 // This design results in no observable consequences for mem::forgetting the
724 // drain iterator, because the drain iterator has no responsibility to "fix up"
725 // things during iteration/destruction. That said, you will effectively mem::forget
726 // any elements that weren't yielded yet.
727 unsafe {
728 debug_assert!(!self.head.is_null());
729 debug_assert!(!(*self.head).prev.is_null());
730 debug_assert!((*self.head).prev != self.head);
731 let head = (*self.head).prev;
732 let tail = (*self.head).next;
733 (*self.head).prev = self.head;
734 (*self.head).next = self.head;
735 (*head).next = self.free;
736 (*tail).prev = ptr::null_mut();
737 self.free = tail;
738 (head, tail)
739 }
740 } else {
741 (ptr::null_mut(), ptr::null_mut())
742 };
743
744 Drain {
745 head,
746 tail,
747 remaining: len,
748 marker: marker::PhantomData,
749 }
750 }
751
752 /// Returns a double-ended iterator visiting all key in order of insertion.
753 ///
754 /// # Examples
755 /// ```
756 /// use linked_hash_map::LinkedHashMap;
757 ///
758 /// let mut map = LinkedHashMap::new();
759 /// map.insert('a', 10);
760 /// map.insert('c', 30);
761 /// map.insert('b', 20);
762 ///
763 /// let mut keys = map.keys();
764 /// assert_eq!(&'a', keys.next().unwrap());
765 /// assert_eq!(&'c', keys.next().unwrap());
766 /// assert_eq!(&'b', keys.next().unwrap());
767 /// assert_eq!(None, keys.next());
768 /// ```
keys(&self) -> Keys<K, V>769 pub fn keys(&self) -> Keys<K, V> {
770 Keys { inner: self.iter() }
771 }
772
773 /// Returns a double-ended iterator visiting all values in order of insertion.
774 ///
775 /// # Examples
776 /// ```
777 /// use linked_hash_map::LinkedHashMap;
778 ///
779 /// let mut map = LinkedHashMap::new();
780 /// map.insert('a', 10);
781 /// map.insert('c', 30);
782 /// map.insert('b', 20);
783 ///
784 /// let mut values = map.values();
785 /// assert_eq!(&10, values.next().unwrap());
786 /// assert_eq!(&30, values.next().unwrap());
787 /// assert_eq!(&20, values.next().unwrap());
788 /// assert_eq!(None, values.next());
789 /// ```
values(&self) -> Values<K, V>790 pub fn values(&self) -> Values<K, V> {
791 Values { inner: self.iter() }
792 }
793 }
794
795 impl<'a, K, V, S, Q: ?Sized> Index<&'a Q> for LinkedHashMap<K, V, S>
796 where
797 K: Hash + Eq + Borrow<Q>,
798 S: BuildHasher,
799 Q: Eq + Hash,
800 {
801 type Output = V;
802
index(&self, index: &'a Q) -> &V803 fn index(&self, index: &'a Q) -> &V {
804 self.get(index).expect("no entry found for key")
805 }
806 }
807
808 impl<'a, K, V, S, Q: ?Sized> IndexMut<&'a Q> for LinkedHashMap<K, V, S>
809 where
810 K: Hash + Eq + Borrow<Q>,
811 S: BuildHasher,
812 Q: Eq + Hash,
813 {
index_mut(&mut self, index: &'a Q) -> &mut V814 fn index_mut(&mut self, index: &'a Q) -> &mut V {
815 self.get_mut(index).expect("no entry found for key")
816 }
817 }
818
819 impl<K: Hash + Eq + Clone, V: Clone, S: BuildHasher + Clone> Clone for LinkedHashMap<K, V, S> {
clone(&self) -> Self820 fn clone(&self) -> Self {
821 let mut map = Self::with_hasher(self.map.hasher().clone());
822 map.extend(self.iter().map(|(k, v)| (k.clone(), v.clone())));
823 map
824 }
825 }
826
827 impl<K: Hash + Eq, V, S: BuildHasher + Default> Default for LinkedHashMap<K, V, S> {
default() -> Self828 fn default() -> Self {
829 Self::with_hasher(S::default())
830 }
831 }
832
833 impl<K: Hash + Eq, V, S: BuildHasher> Extend<(K, V)> for LinkedHashMap<K, V, S> {
extend<I: IntoIterator<Item = (K, V)>>(&mut self, iter: I)834 fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iter: I) {
835 for (k, v) in iter {
836 self.insert(k, v);
837 }
838 }
839 }
840
841 impl<'a, K, V, S> Extend<(&'a K, &'a V)> for LinkedHashMap<K, V, S>
842 where
843 K: 'a + Hash + Eq + Copy,
844 V: 'a + Copy,
845 S: BuildHasher,
846 {
extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: I)847 fn extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iter: I) {
848 for (&k, &v) in iter {
849 self.insert(k, v);
850 }
851 }
852 }
853
854 impl<K: Hash + Eq, V, S: BuildHasher + Default> iter::FromIterator<(K, V)>
855 for LinkedHashMap<K, V, S>
856 {
from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self857 fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
858 let iter = iter.into_iter();
859 let mut map = Self::with_capacity_and_hasher(iter.size_hint().0, S::default());
860 map.extend(iter);
861 map
862 }
863 }
864
865 impl<A: fmt::Debug + Hash + Eq, B: fmt::Debug, S: BuildHasher> fmt::Debug
866 for LinkedHashMap<A, B, S>
867 {
868 /// Returns a string that lists the key-value pairs in insertion order.
fmt(&self, f: &mut fmt::Formatter) -> fmt::Result869 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
870 f.debug_map().entries(self).finish()
871 }
872 }
873
874 impl<K: Hash + Eq, V: PartialEq, S: BuildHasher> PartialEq for LinkedHashMap<K, V, S> {
eq(&self, other: &Self) -> bool875 fn eq(&self, other: &Self) -> bool {
876 self.len() == other.len() && self.iter().eq(other)
877 }
878 }
879
880 impl<K: Hash + Eq, V: Eq, S: BuildHasher> Eq for LinkedHashMap<K, V, S> {}
881
882 impl<K: Hash + Eq + PartialOrd, V: PartialOrd, S: BuildHasher> PartialOrd
883 for LinkedHashMap<K, V, S>
884 {
partial_cmp(&self, other: &Self) -> Option<Ordering>885 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
886 self.iter().partial_cmp(other)
887 }
888
lt(&self, other: &Self) -> bool889 fn lt(&self, other: &Self) -> bool {
890 self.iter().lt(other)
891 }
892
le(&self, other: &Self) -> bool893 fn le(&self, other: &Self) -> bool {
894 self.iter().le(other)
895 }
896
ge(&self, other: &Self) -> bool897 fn ge(&self, other: &Self) -> bool {
898 self.iter().ge(other)
899 }
900
gt(&self, other: &Self) -> bool901 fn gt(&self, other: &Self) -> bool {
902 self.iter().gt(other)
903 }
904 }
905
906 impl<K: Hash + Eq + Ord, V: Ord, S: BuildHasher> Ord for LinkedHashMap<K, V, S> {
cmp(&self, other: &Self) -> Ordering907 fn cmp(&self, other: &Self) -> Ordering {
908 self.iter().cmp(other)
909 }
910 }
911
912 impl<K: Hash + Eq, V: Hash, S: BuildHasher> Hash for LinkedHashMap<K, V, S> {
hash<H: Hasher>(&self, h: &mut H)913 fn hash<H: Hasher>(&self, h: &mut H) {
914 for e in self.iter() {
915 e.hash(h);
916 }
917 }
918 }
919
920 unsafe impl<K: Send, V: Send, S: Send> Send for LinkedHashMap<K, V, S> {}
921
922 unsafe impl<K: Sync, V: Sync, S: Sync> Sync for LinkedHashMap<K, V, S> {}
923
924 impl<K, V, S> Drop for LinkedHashMap<K, V, S> {
drop(&mut self)925 fn drop(&mut self) {
926 if !self.head.is_null() {
927 unsafe {
928 self.drop_entries();
929 drop_empty_node(self.head);
930 }
931 }
932 self.clear_free_list();
933 }
934 }
935
936 /// An insertion-order iterator over a `LinkedHashMap`'s entries, with immutable references to the
937 /// values.
938 pub struct Iter<'a, K: 'a, V: 'a> {
939 head: *const Node<K, V>,
940 tail: *const Node<K, V>,
941 remaining: usize,
942 marker: marker::PhantomData<(&'a K, &'a V)>,
943 }
944
945 /// An insertion-order iterator over a `LinkedHashMap`'s entries, with mutable references to the
946 /// values.
947 pub struct IterMut<'a, K: 'a, V: 'a> {
948 head: *mut Node<K, V>,
949 tail: *mut Node<K, V>,
950 remaining: usize,
951 marker: marker::PhantomData<(&'a K, &'a mut V)>,
952 }
953
954 /// A consuming insertion-order iterator over a `LinkedHashMap`'s entries.
955 pub struct IntoIter<K, V> {
956 head: *mut Node<K, V>,
957 tail: *mut Node<K, V>,
958 remaining: usize,
959 marker: marker::PhantomData<(K, V)>,
960 }
961
962 /// A draining insertion-order iterator over a `LinkedHashMap`'s entries.
963 pub struct Drain<'a, K, V> {
964 head: *mut Node<K, V>,
965 tail: *mut Node<K, V>,
966 remaining: usize,
967 marker: marker::PhantomData<&'a mut (K, V)>,
968 }
969
970 /// An insertion-order iterator over a `LinkedHashMap`'s entries represented as
971 /// an `OccupiedEntry`.
972 pub struct Entries<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
973 map: *mut LinkedHashMap<K, V, S>,
974 head: *mut Node<K, V>,
975 remaining: usize,
976 marker: marker::PhantomData<(&'a K, &'a mut V, &'a S)>,
977 }
978
979 unsafe impl<'a, K, V> Send for Iter<'a, K, V>
980 where
981 K: Send,
982 V: Send,
983 {
984 }
985
986 unsafe impl<'a, K, V> Send for IterMut<'a, K, V>
987 where
988 K: Send,
989 V: Send,
990 {
991 }
992
993 unsafe impl<'a, K, V> Send for Drain<'a, K, V>
994 where
995 K: Send,
996 V: Send,
997 {
998 }
999
1000 unsafe impl<K, V> Send for IntoIter<K, V>
1001 where
1002 K: Send,
1003 V: Send,
1004 {
1005 }
1006
1007 unsafe impl<'a, K, V, S> Send for Entries<'a, K, V, S>
1008 where
1009 K: Send,
1010 V: Send,
1011 S: Send,
1012 {
1013 }
1014
1015 unsafe impl<'a, K, V> Sync for Iter<'a, K, V>
1016 where
1017 K: Sync,
1018 V: Sync,
1019 {
1020 }
1021
1022 unsafe impl<'a, K, V> Sync for IterMut<'a, K, V>
1023 where
1024 K: Sync,
1025 V: Sync,
1026 {
1027 }
1028
1029 unsafe impl<'a, K, V> Sync for Drain<'a, K, V>
1030 where
1031 K: Sync,
1032 V: Sync,
1033 {
1034 }
1035 unsafe impl<K, V> Sync for IntoIter<K, V>
1036 where
1037 K: Sync,
1038 V: Sync,
1039 {
1040 }
1041
1042 unsafe impl<'a, K, V, S> Sync for Entries<'a, K, V, S>
1043 where
1044 K: Sync,
1045 V: Sync,
1046 S: Sync,
1047 {
1048 }
1049
1050 impl<'a, K, V> Clone for Iter<'a, K, V> {
clone(&self) -> Self1051 fn clone(&self) -> Self {
1052 Iter { ..*self }
1053 }
1054 }
1055
1056 impl<K, V> Clone for IntoIter<K, V>
1057 where
1058 K: Clone,
1059 V: Clone,
1060 {
clone(&self) -> Self1061 fn clone(&self) -> Self {
1062 if self.remaining == 0 {
1063 return IntoIter { ..*self };
1064 }
1065
1066 fn clone_node<K, V>(e: *mut Node<K, V>) -> *mut Node<K, V>
1067 where
1068 K: Clone,
1069 V: Clone,
1070 {
1071 Box::into_raw(Box::new(Node::new(unsafe { (*e).key.clone() }, unsafe {
1072 (*e).value.clone()
1073 })))
1074 }
1075
1076 let mut cur = self.head;
1077 let head = clone_node(cur);
1078 let mut tail = head;
1079 for _ in 1..self.remaining {
1080 unsafe {
1081 (*tail).prev = clone_node((*cur).prev);
1082 (*(*tail).prev).next = tail;
1083 tail = (*tail).prev;
1084 cur = (*cur).prev;
1085 }
1086 }
1087
1088 IntoIter {
1089 head,
1090 tail,
1091 remaining: self.remaining,
1092 marker: marker::PhantomData,
1093 }
1094 }
1095 }
1096
1097 impl<'a, K, V> Iterator for Iter<'a, K, V> {
1098 type Item = (&'a K, &'a V);
1099
next(&mut self) -> Option<(&'a K, &'a V)>1100 fn next(&mut self) -> Option<(&'a K, &'a V)> {
1101 if self.head == self.tail {
1102 None
1103 } else {
1104 self.remaining -= 1;
1105 unsafe {
1106 let r = Some((&(*self.head).key, &(*self.head).value));
1107 self.head = (*self.head).prev;
1108 r
1109 }
1110 }
1111 }
1112
size_hint(&self) -> (usize, Option<usize>)1113 fn size_hint(&self) -> (usize, Option<usize>) {
1114 (self.remaining, Some(self.remaining))
1115 }
1116 }
1117
1118 impl<'a, K, V> Iterator for IterMut<'a, K, V> {
1119 type Item = (&'a K, &'a mut V);
1120
next(&mut self) -> Option<(&'a K, &'a mut V)>1121 fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
1122 if self.head == self.tail {
1123 None
1124 } else {
1125 self.remaining -= 1;
1126 unsafe {
1127 let r = Some((&(*self.head).key, &mut (*self.head).value));
1128 self.head = (*self.head).prev;
1129 r
1130 }
1131 }
1132 }
1133
size_hint(&self) -> (usize, Option<usize>)1134 fn size_hint(&self) -> (usize, Option<usize>) {
1135 (self.remaining, Some(self.remaining))
1136 }
1137 }
1138
1139 impl<K, V> Iterator for IntoIter<K, V> {
1140 type Item = (K, V);
1141
next(&mut self) -> Option<(K, V)>1142 fn next(&mut self) -> Option<(K, V)> {
1143 if self.remaining == 0 {
1144 return None;
1145 }
1146 self.remaining -= 1;
1147 unsafe {
1148 let prev = (*self.head).prev;
1149 let e = *Box::from_raw(self.head);
1150 self.head = prev;
1151 Some((e.key, e.value))
1152 }
1153 }
1154
size_hint(&self) -> (usize, Option<usize>)1155 fn size_hint(&self) -> (usize, Option<usize>) {
1156 (self.remaining, Some(self.remaining))
1157 }
1158 }
1159
1160 impl<'a, K, V> Iterator for Drain<'a, K, V> {
1161 type Item = (K, V);
1162
next(&mut self) -> Option<(K, V)>1163 fn next(&mut self) -> Option<(K, V)> {
1164 if self.remaining == 0 {
1165 return None;
1166 }
1167 self.remaining -= 1;
1168 unsafe {
1169 let prev = (*self.head).prev;
1170 // Read the values out, the node is in the free-list already so these will
1171 // be treated as uninit memory.
1172 let k = addr_of_mut!((*self.head).key).read();
1173 let v = addr_of_mut!((*self.head).value).read();
1174 self.head = prev;
1175 Some((k, v))
1176 }
1177 }
1178
size_hint(&self) -> (usize, Option<usize>)1179 fn size_hint(&self) -> (usize, Option<usize>) {
1180 (self.remaining, Some(self.remaining))
1181 }
1182 }
1183
1184 impl<'a, K, V> DoubleEndedIterator for Drain<'a, K, V> {
next_back(&mut self) -> Option<(K, V)>1185 fn next_back(&mut self) -> Option<(K, V)> {
1186 if self.remaining == 0 {
1187 return None;
1188 }
1189 self.remaining -= 1;
1190 unsafe {
1191 let next = (*self.tail).next;
1192 // Read the values out, the node is in the free-list already so these will
1193 // be treated as uninit memory.
1194 let k = addr_of_mut!((*self.tail).key).read();
1195 let v = addr_of_mut!((*self.tail).value).read();
1196 self.tail = next;
1197 Some((k, v))
1198 }
1199 }
1200 }
1201
1202 impl<'a, K, V> ExactSizeIterator for Drain<'a, K, V> {
len(&self) -> usize1203 fn len(&self) -> usize {
1204 self.remaining
1205 }
1206 }
1207
1208 impl<'a, K, V, S: BuildHasher> Iterator for Entries<'a, K, V, S> {
1209 type Item = OccupiedEntry<'a, K, V, S>;
1210
next(&mut self) -> Option<OccupiedEntry<'a, K, V, S>>1211 fn next(&mut self) -> Option<OccupiedEntry<'a, K, V, S>> {
1212 if self.remaining == 0 {
1213 None
1214 } else {
1215 self.remaining -= 1;
1216 unsafe {
1217 let r = Some(OccupiedEntry {
1218 map: self.map,
1219 entry: self.head,
1220 marker: marker::PhantomData,
1221 });
1222
1223 self.head = (*self.head).prev;
1224 r
1225 }
1226 }
1227 }
1228
size_hint(&self) -> (usize, Option<usize>)1229 fn size_hint(&self) -> (usize, Option<usize>) {
1230 (self.remaining, Some(self.remaining))
1231 }
1232 }
1233
1234 impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, V> {
next_back(&mut self) -> Option<(&'a K, &'a V)>1235 fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
1236 if self.head == self.tail {
1237 None
1238 } else {
1239 self.remaining -= 1;
1240 unsafe {
1241 self.tail = (*self.tail).next;
1242 Some((&(*self.tail).key, &(*self.tail).value))
1243 }
1244 }
1245 }
1246 }
1247
1248 impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V> {
next_back(&mut self) -> Option<(&'a K, &'a mut V)>1249 fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
1250 if self.head == self.tail {
1251 None
1252 } else {
1253 self.remaining -= 1;
1254 unsafe {
1255 self.tail = (*self.tail).next;
1256 Some((&(*self.tail).key, &mut (*self.tail).value))
1257 }
1258 }
1259 }
1260 }
1261
1262 impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
next_back(&mut self) -> Option<(K, V)>1263 fn next_back(&mut self) -> Option<(K, V)> {
1264 if self.remaining == 0 {
1265 return None;
1266 }
1267 self.remaining -= 1;
1268 unsafe {
1269 let next = (*self.tail).next;
1270 let e = *Box::from_raw(self.tail);
1271 self.tail = next;
1272 Some((e.key, e.value))
1273 }
1274 }
1275 }
1276
1277 impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {
len(&self) -> usize1278 fn len(&self) -> usize {
1279 self.remaining
1280 }
1281 }
1282
1283 impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
len(&self) -> usize1284 fn len(&self) -> usize {
1285 self.remaining
1286 }
1287 }
1288
1289 impl<K, V> ExactSizeIterator for IntoIter<K, V> {
len(&self) -> usize1290 fn len(&self) -> usize {
1291 self.remaining
1292 }
1293 }
1294
1295 impl<K, V> Drop for IntoIter<K, V> {
drop(&mut self)1296 fn drop(&mut self) {
1297 for _ in 0..self.remaining {
1298 unsafe {
1299 let next = (*self.tail).next;
1300 Box::from_raw(self.tail);
1301 self.tail = next;
1302 }
1303 }
1304 }
1305 }
1306
1307 impl<'a, K, V> Drop for Drain<'a, K, V> {
drop(&mut self)1308 fn drop(&mut self) {
1309 for _ in self {}
1310 }
1311 }
1312
1313 /// An insertion-order iterator over a `LinkedHashMap`'s keys.
1314 pub struct Keys<'a, K: 'a, V: 'a> {
1315 inner: Iter<'a, K, V>,
1316 }
1317
1318 impl<'a, K, V> Clone for Keys<'a, K, V> {
clone(&self) -> Self1319 fn clone(&self) -> Self {
1320 Keys {
1321 inner: self.inner.clone(),
1322 }
1323 }
1324 }
1325
1326 impl<'a, K, V> Iterator for Keys<'a, K, V> {
1327 type Item = &'a K;
1328
1329 #[inline]
next(&mut self) -> Option<&'a K>1330 fn next(&mut self) -> Option<&'a K> {
1331 self.inner.next().map(|e| e.0)
1332 }
1333 #[inline]
size_hint(&self) -> (usize, Option<usize>)1334 fn size_hint(&self) -> (usize, Option<usize>) {
1335 self.inner.size_hint()
1336 }
1337 }
1338
1339 impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
1340 #[inline]
next_back(&mut self) -> Option<&'a K>1341 fn next_back(&mut self) -> Option<&'a K> {
1342 self.inner.next_back().map(|e| e.0)
1343 }
1344 }
1345
1346 impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
len(&self) -> usize1347 fn len(&self) -> usize {
1348 self.inner.len()
1349 }
1350 }
1351
1352 /// An insertion-order iterator over a `LinkedHashMap`'s values.
1353 pub struct Values<'a, K: 'a, V: 'a> {
1354 inner: Iter<'a, K, V>,
1355 }
1356
1357 impl<'a, K, V> Clone for Values<'a, K, V> {
clone(&self) -> Self1358 fn clone(&self) -> Self {
1359 Values {
1360 inner: self.inner.clone(),
1361 }
1362 }
1363 }
1364
1365 impl<'a, K, V> Iterator for Values<'a, K, V> {
1366 type Item = &'a V;
1367
1368 #[inline]
next(&mut self) -> Option<&'a V>1369 fn next(&mut self) -> Option<&'a V> {
1370 self.inner.next().map(|e| e.1)
1371 }
1372 #[inline]
size_hint(&self) -> (usize, Option<usize>)1373 fn size_hint(&self) -> (usize, Option<usize>) {
1374 self.inner.size_hint()
1375 }
1376 }
1377
1378 impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
1379 #[inline]
next_back(&mut self) -> Option<&'a V>1380 fn next_back(&mut self) -> Option<&'a V> {
1381 self.inner.next_back().map(|e| e.1)
1382 }
1383 }
1384
1385 impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
len(&self) -> usize1386 fn len(&self) -> usize {
1387 self.inner.len()
1388 }
1389 }
1390
1391 impl<'a, K: Hash + Eq, V, S: BuildHasher> IntoIterator for &'a LinkedHashMap<K, V, S> {
1392 type Item = (&'a K, &'a V);
1393 type IntoIter = Iter<'a, K, V>;
into_iter(self) -> Iter<'a, K, V>1394 fn into_iter(self) -> Iter<'a, K, V> {
1395 self.iter()
1396 }
1397 }
1398
1399 impl<'a, K: Hash + Eq, V, S: BuildHasher> IntoIterator for &'a mut LinkedHashMap<K, V, S> {
1400 type Item = (&'a K, &'a mut V);
1401 type IntoIter = IterMut<'a, K, V>;
into_iter(self) -> IterMut<'a, K, V>1402 fn into_iter(self) -> IterMut<'a, K, V> {
1403 self.iter_mut()
1404 }
1405 }
1406
1407 impl<K: Hash + Eq, V, S: BuildHasher> IntoIterator for LinkedHashMap<K, V, S> {
1408 type Item = (K, V);
1409 type IntoIter = IntoIter<K, V>;
into_iter(mut self) -> IntoIter<K, V>1410 fn into_iter(mut self) -> IntoIter<K, V> {
1411 let (head, tail) = if !self.head.is_null() {
1412 unsafe { ((*self.head).prev, (*self.head).next) }
1413 } else {
1414 (ptr::null_mut(), ptr::null_mut())
1415 };
1416 let len = self.len();
1417
1418 if !self.head.is_null() {
1419 unsafe { drop_empty_node(self.head) }
1420 }
1421 self.clear_free_list();
1422 // drop the HashMap but not the LinkedHashMap
1423 unsafe {
1424 ptr::drop_in_place(&mut self.map);
1425 }
1426 mem::forget(self);
1427
1428 IntoIter {
1429 head,
1430 tail,
1431 remaining: len,
1432 marker: marker::PhantomData,
1433 }
1434 }
1435 }
1436
1437 /// A view into a single location in a map, which may be vacant or occupied.
1438 pub enum Entry<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
1439 /// An occupied Entry.
1440 Occupied(OccupiedEntry<'a, K, V, S>),
1441 /// A vacant Entry.
1442 Vacant(VacantEntry<'a, K, V, S>),
1443 }
1444
1445 /// A view into a single occupied location in a `LinkedHashMap`.
1446 pub struct OccupiedEntry<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
1447 entry: *mut Node<K, V>,
1448 map: *mut LinkedHashMap<K, V, S>,
1449 marker: marker::PhantomData<&'a K>,
1450 }
1451
1452 /// A view into a single empty location in a `LinkedHashMap`.
1453 pub struct VacantEntry<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
1454 key: K,
1455 map: &'a mut LinkedHashMap<K, V, S>,
1456 }
1457
1458 impl<'a, K: Hash + Eq, V, S: BuildHasher> Entry<'a, K, V, S> {
1459 /// Returns the entry key
1460 ///
1461 /// # Examples
1462 ///
1463 /// ```
1464 /// use linked_hash_map::LinkedHashMap;
1465 ///
1466 /// let mut map = LinkedHashMap::<String, u32>::new();
1467 ///
1468 /// assert_eq!("hello", map.entry("hello".to_string()).key());
1469 /// ```
key(&self) -> &K1470 pub fn key(&self) -> &K {
1471 match *self {
1472 Entry::Occupied(ref e) => e.key(),
1473 Entry::Vacant(ref e) => e.key(),
1474 }
1475 }
1476
1477 /// Ensures a value is in the entry by inserting the default if empty, and returns
1478 /// a mutable reference to the value in the entry.
or_insert(self, default: V) -> &'a mut V1479 pub fn or_insert(self, default: V) -> &'a mut V {
1480 match self {
1481 Entry::Occupied(entry) => entry.into_mut(),
1482 Entry::Vacant(entry) => entry.insert(default),
1483 }
1484 }
1485
1486 /// Ensures a value is in the entry by inserting the result of the default function if empty,
1487 /// and returns a mutable reference to the value in the entry.
or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V1488 pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V {
1489 match self {
1490 Entry::Occupied(entry) => entry.into_mut(),
1491 Entry::Vacant(entry) => entry.insert(default()),
1492 }
1493 }
1494
1495 /// Provides in-place mutable access to an occupied entry before any
1496 /// potential inserts into the map.
and_modify<F>(self, f: F) -> Self where F: FnOnce(&mut V),1497 pub fn and_modify<F>(self, f: F) -> Self
1498 where
1499 F: FnOnce(&mut V),
1500 {
1501 match self {
1502 Entry::Occupied(mut entry) => {
1503 f(entry.get_mut());
1504 Entry::Occupied(entry)
1505 }
1506 Entry::Vacant(entry) => Entry::Vacant(entry),
1507 }
1508 }
1509
1510 /// Ensures a value is in the entry by inserting the default value if empty,
1511 /// and returns a mutable reference to the value in the entry.
or_default(self) -> &'a mut V where V: Default,1512 pub fn or_default(self) -> &'a mut V
1513 where
1514 V: Default,
1515 {
1516 match self {
1517 Entry::Occupied(entry) => entry.into_mut(),
1518 Entry::Vacant(entry) => entry.insert(V::default()),
1519 }
1520 }
1521 }
1522
1523 impl<'a, K: Hash + Eq, V, S: BuildHasher> OccupiedEntry<'a, K, V, S> {
1524 /// Gets a reference to the entry key
1525 ///
1526 /// # Examples
1527 ///
1528 /// ```
1529 /// use linked_hash_map::LinkedHashMap;
1530 ///
1531 /// let mut map = LinkedHashMap::new();
1532 ///
1533 /// map.insert("foo".to_string(), 1);
1534 /// assert_eq!("foo", map.entry("foo".to_string()).key());
1535 /// ```
key(&self) -> &K1536 pub fn key(&self) -> &K {
1537 unsafe { &(*self.entry).key }
1538 }
1539
1540 /// Gets a reference to the value in the entry.
get(&self) -> &V1541 pub fn get(&self) -> &V {
1542 unsafe { &(*self.entry).value }
1543 }
1544
1545 /// Gets a mutable reference to the value in the entry.
get_mut(&mut self) -> &mut V1546 pub fn get_mut(&mut self) -> &mut V {
1547 unsafe { &mut (*self.entry).value }
1548 }
1549
1550 /// Converts the OccupiedEntry into a mutable reference to the value in the entry
1551 /// with a lifetime bound to the map itself
into_mut(self) -> &'a mut V1552 pub fn into_mut(self) -> &'a mut V {
1553 unsafe { &mut (*self.entry).value }
1554 }
1555
1556 /// Sets the value of the entry, and returns the entry's old value
insert(&mut self, value: V) -> V1557 pub fn insert(&mut self, value: V) -> V {
1558 unsafe {
1559 (*self.map).ensure_guard_node();
1560
1561 let old_val = mem::replace(&mut (*self.entry).value, value);
1562 let node_ptr: *mut Node<K, V> = self.entry;
1563
1564 // Existing node, just update LRU position
1565 (*self.map).detach(node_ptr);
1566 (*self.map).attach(node_ptr);
1567
1568 old_val
1569 }
1570 }
1571
1572 /// Takes the value out of the entry, and returns it
remove(self) -> V1573 pub fn remove(self) -> V {
1574 unsafe { (*self.map).remove(&(*self.entry).key) }.unwrap()
1575 }
1576 }
1577
1578 impl<'a, K: 'a + Hash + Eq, V: 'a, S: BuildHasher> VacantEntry<'a, K, V, S> {
1579 /// Gets a reference to the entry key
1580 ///
1581 /// # Examples
1582 ///
1583 /// ```
1584 /// use linked_hash_map::LinkedHashMap;
1585 ///
1586 /// let mut map = LinkedHashMap::<String, u32>::new();
1587 ///
1588 /// assert_eq!("foo", map.entry("foo".to_string()).key());
1589 /// ```
key(&self) -> &K1590 pub fn key(&self) -> &K {
1591 &self.key
1592 }
1593
1594 /// Sets the value of the entry with the VacantEntry's key,
1595 /// and returns a mutable reference to it
insert(self, value: V) -> &'a mut V1596 pub fn insert(self, value: V) -> &'a mut V {
1597 self.map.ensure_guard_node();
1598
1599 let node = if self.map.free.is_null() {
1600 Box::into_raw(Box::new(Node::new(self.key, value)))
1601 } else {
1602 // use a recycled box
1603 unsafe {
1604 let free = self.map.free;
1605 self.map.free = (*free).next;
1606 ptr::write(free, Node::new(self.key, value));
1607 free
1608 }
1609 };
1610
1611 let keyref = unsafe { &(*node).key };
1612
1613 self.map.attach(node);
1614
1615 let ret = self.map.map.entry(KeyRef { k: keyref }).or_insert(node);
1616 unsafe { &mut (**ret).value }
1617 }
1618 }
1619