1#![forbid(missing_docs)]
31#![cfg_attr(all(feature = "nightly", test), feature(test))]
32
33#[cfg(feature = "serde_impl")]
35pub mod serde;
36#[cfg(feature = "heapsize_impl")]
38mod heapsize;
39#[cfg(test)]
40mod tests;
41
42use std::borrow::Borrow;
43use std::cmp::Ordering;
44use std::collections::hash_map::{self, HashMap};
45use std::fmt;
46use std::hash::{BuildHasher, Hash, Hasher};
47use std::iter;
48use std::marker;
49use std::mem;
50use std::ops::{Index, IndexMut};
51use std::ptr::{self, addr_of_mut};
52
53struct KeyRef<K> {
54 k: *const K,
55}
56
57struct Node<K, V> {
58 next: *mut Node<K, V>,
59 prev: *mut Node<K, V>,
60 key: K,
61 value: V,
62}
63
64pub 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
71impl<K: Hash> Hash for KeyRef<K> {
72 fn hash<H: Hasher>(&self, state: &mut H) {
73 unsafe { (*self.k).hash(state) }
74 }
75}
76
77impl<K: PartialEq> PartialEq for KeyRef<K> {
78 fn eq(&self, other: &Self) -> bool {
79 unsafe { (*self.k).eq(&*other.k) }
80 }
81}
82
83impl<K: Eq> Eq for KeyRef<K> {}
84
85#[derive(Hash, PartialEq, Eq)]
89#[repr(transparent)]
90struct Qey<Q: ?Sized>(Q);
91
92impl<Q: ?Sized> Qey<Q> {
93 fn from_ref(q: &Q) -> &Self {
94 unsafe { mem::transmute(q) }
95 }
96}
97
98impl<K, Q: ?Sized> Borrow<Qey<Q>> for KeyRef<K>
99where
100 K: Borrow<Q>,
101{
102 fn borrow(&self) -> &Qey<Q> {
103 Qey::from_ref(unsafe { (*self.k).borrow() })
104 }
105}
106
107impl<K, V> Node<K, V> {
108 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
118unsafe fn drop_empty_node<K, V>(the_box: *mut Node<K, V>) {
120 let layout = std::alloc::Layout::new::<Node<K, V>>();
126 std::alloc::dealloc(the_box as *mut u8, layout);
127}
128
129impl<K: Hash + Eq, V> LinkedHashMap<K, V> {
130 pub fn new() -> Self {
132 Self::with_map(HashMap::new())
133 }
134
135 pub fn with_capacity(capacity: usize) -> Self {
137 Self::with_map(HashMap::with_capacity(capacity))
138 }
139}
140
141impl<K, V, S> LinkedHashMap<K, V, S> {
142 #[inline]
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]
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 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
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
182 fn ensure_guard_node(&mut self) {
183 if self.head.is_null() {
184 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
195impl<K: Hash + Eq, V, S: BuildHasher> LinkedHashMap<K, V, S> {
196 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 pub fn with_hasher(hash_builder: S) -> Self {
206 Self::with_map(HashMap::with_hasher(hash_builder))
207 }
208
209 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 pub fn reserve(&mut self, additional: usize) {
221 self.map.reserve(additional);
222 }
223
224 pub fn shrink_to_fit(&mut self) {
228 self.map.shrink_to_fit();
229 self.clear_free_list();
230 }
231
232 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 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 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 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 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 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 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 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 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 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 (*node).next = self.free;
473 self.free = node;
474 drop(ptr::read(&(*node).key));
476 ptr::read(&(*node).value)
477 }
478 })
479 }
480
481 pub fn capacity(&self) -> usize {
491 self.map.capacity()
492 }
493
494 #[inline]
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 #[inline]
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 #[inline]
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 #[inline]
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 pub fn len(&self) -> usize {
606 self.map.len()
607 }
608
609 pub fn is_empty(&self) -> bool {
611 self.len() == 0
612 }
613
614 pub fn hasher(&self) -> &S {
616 self.map.hasher()
617 }
618
619 pub fn clear(&mut self) {
621 self.map.clear();
622 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 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 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 pub fn drain(&mut self) -> Drain<K, V> {
711 let len = self.len();
712 self.map.clear();
714 let (head, tail) = if len != 0 {
715 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 pub fn keys(&self) -> Keys<K, V> {
770 Keys { inner: self.iter() }
771 }
772
773 pub fn values(&self) -> Values<K, V> {
791 Values { inner: self.iter() }
792 }
793}
794
795impl<'a, K, V, S, Q: ?Sized> Index<&'a Q> for LinkedHashMap<K, V, S>
796where
797 K: Hash + Eq + Borrow<Q>,
798 S: BuildHasher,
799 Q: Eq + Hash,
800{
801 type Output = V;
802
803 fn index(&self, index: &'a Q) -> &V {
804 self.get(index).expect("no entry found for key")
805 }
806}
807
808impl<'a, K, V, S, Q: ?Sized> IndexMut<&'a Q> for LinkedHashMap<K, V, S>
809where
810 K: Hash + Eq + Borrow<Q>,
811 S: BuildHasher,
812 Q: Eq + Hash,
813{
814 fn index_mut(&mut self, index: &'a Q) -> &mut V {
815 self.get_mut(index).expect("no entry found for key")
816 }
817}
818
819impl<K: Hash + Eq + Clone, V: Clone, S: BuildHasher + Clone> Clone for LinkedHashMap<K, V, S> {
820 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
827impl<K: Hash + Eq, V, S: BuildHasher + Default> Default for LinkedHashMap<K, V, S> {
828 fn default() -> Self {
829 Self::with_hasher(S::default())
830 }
831}
832
833impl<K: Hash + Eq, V, S: BuildHasher> Extend<(K, V)> for LinkedHashMap<K, V, S> {
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
841impl<'a, K, V, S> Extend<(&'a K, &'a V)> for LinkedHashMap<K, V, S>
842where
843 K: 'a + Hash + Eq + Copy,
844 V: 'a + Copy,
845 S: BuildHasher,
846{
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
854impl<K: Hash + Eq, V, S: BuildHasher + Default> iter::FromIterator<(K, V)>
855 for LinkedHashMap<K, V, S>
856{
857 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
865impl<A: fmt::Debug + Hash + Eq, B: fmt::Debug, S: BuildHasher> fmt::Debug
866 for LinkedHashMap<A, B, S>
867{
868 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
870 f.debug_map().entries(self).finish()
871 }
872}
873
874impl<K: Hash + Eq, V: PartialEq, S: BuildHasher> PartialEq for LinkedHashMap<K, V, S> {
875 fn eq(&self, other: &Self) -> bool {
876 self.len() == other.len() && self.iter().eq(other)
877 }
878}
879
880impl<K: Hash + Eq, V: Eq, S: BuildHasher> Eq for LinkedHashMap<K, V, S> {}
881
882impl<K: Hash + Eq + PartialOrd, V: PartialOrd, S: BuildHasher> PartialOrd
883 for LinkedHashMap<K, V, S>
884{
885 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
886 self.iter().partial_cmp(other)
887 }
888
889 fn lt(&self, other: &Self) -> bool {
890 self.iter().lt(other)
891 }
892
893 fn le(&self, other: &Self) -> bool {
894 self.iter().le(other)
895 }
896
897 fn ge(&self, other: &Self) -> bool {
898 self.iter().ge(other)
899 }
900
901 fn gt(&self, other: &Self) -> bool {
902 self.iter().gt(other)
903 }
904}
905
906impl<K: Hash + Eq + Ord, V: Ord, S: BuildHasher> Ord for LinkedHashMap<K, V, S> {
907 fn cmp(&self, other: &Self) -> Ordering {
908 self.iter().cmp(other)
909 }
910}
911
912impl<K: Hash + Eq, V: Hash, S: BuildHasher> Hash for LinkedHashMap<K, V, S> {
913 fn hash<H: Hasher>(&self, h: &mut H) {
914 for e in self.iter() {
915 e.hash(h);
916 }
917 }
918}
919
920unsafe impl<K: Send, V: Send, S: Send> Send for LinkedHashMap<K, V, S> {}
921
922unsafe impl<K: Sync, V: Sync, S: Sync> Sync for LinkedHashMap<K, V, S> {}
923
924impl<K, V, S> Drop for LinkedHashMap<K, V, S> {
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
936pub 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
945pub 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
954pub 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
962pub 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
970pub 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
979unsafe impl<'a, K, V> Send for Iter<'a, K, V>
980where
981 K: Send,
982 V: Send,
983{
984}
985
986unsafe impl<'a, K, V> Send for IterMut<'a, K, V>
987where
988 K: Send,
989 V: Send,
990{
991}
992
993unsafe impl<'a, K, V> Send for Drain<'a, K, V>
994where
995 K: Send,
996 V: Send,
997{
998}
999
1000unsafe impl<K, V> Send for IntoIter<K, V>
1001where
1002 K: Send,
1003 V: Send,
1004{
1005}
1006
1007unsafe impl<'a, K, V, S> Send for Entries<'a, K, V, S>
1008where
1009 K: Send,
1010 V: Send,
1011 S: Send,
1012{
1013}
1014
1015unsafe impl<'a, K, V> Sync for Iter<'a, K, V>
1016where
1017 K: Sync,
1018 V: Sync,
1019{
1020}
1021
1022unsafe impl<'a, K, V> Sync for IterMut<'a, K, V>
1023where
1024 K: Sync,
1025 V: Sync,
1026{
1027}
1028
1029unsafe impl<'a, K, V> Sync for Drain<'a, K, V>
1030where
1031 K: Sync,
1032 V: Sync,
1033{
1034}
1035unsafe impl<K, V> Sync for IntoIter<K, V>
1036where
1037 K: Sync,
1038 V: Sync,
1039{
1040}
1041
1042unsafe impl<'a, K, V, S> Sync for Entries<'a, K, V, S>
1043where
1044 K: Sync,
1045 V: Sync,
1046 S: Sync,
1047{
1048}
1049
1050impl<'a, K, V> Clone for Iter<'a, K, V> {
1051 fn clone(&self) -> Self {
1052 Iter { ..*self }
1053 }
1054}
1055
1056impl<K, V> Clone for IntoIter<K, V>
1057where
1058 K: Clone,
1059 V: Clone,
1060{
1061 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
1097impl<'a, K, V> Iterator for Iter<'a, K, V> {
1098 type Item = (&'a K, &'a V);
1099
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
1113 fn size_hint(&self) -> (usize, Option<usize>) {
1114 (self.remaining, Some(self.remaining))
1115 }
1116}
1117
1118impl<'a, K, V> Iterator for IterMut<'a, K, V> {
1119 type Item = (&'a K, &'a mut V);
1120
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
1134 fn size_hint(&self) -> (usize, Option<usize>) {
1135 (self.remaining, Some(self.remaining))
1136 }
1137}
1138
1139impl<K, V> Iterator for IntoIter<K, V> {
1140 type Item = (K, V);
1141
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
1155 fn size_hint(&self) -> (usize, Option<usize>) {
1156 (self.remaining, Some(self.remaining))
1157 }
1158}
1159
1160impl<'a, K, V> Iterator for Drain<'a, K, V> {
1161 type Item = (K, V);
1162
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 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
1179 fn size_hint(&self) -> (usize, Option<usize>) {
1180 (self.remaining, Some(self.remaining))
1181 }
1182}
1183
1184impl<'a, K, V> DoubleEndedIterator for Drain<'a, 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 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
1202impl<'a, K, V> ExactSizeIterator for Drain<'a, K, V> {
1203 fn len(&self) -> usize {
1204 self.remaining
1205 }
1206}
1207
1208impl<'a, K, V, S: BuildHasher> Iterator for Entries<'a, K, V, S> {
1209 type Item = OccupiedEntry<'a, K, V, S>;
1210
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
1229 fn size_hint(&self) -> (usize, Option<usize>) {
1230 (self.remaining, Some(self.remaining))
1231 }
1232}
1233
1234impl<'a, K, V> DoubleEndedIterator for Iter<'a, K, 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
1248impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, 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
1262impl<K, V> DoubleEndedIterator for IntoIter<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
1277impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {
1278 fn len(&self) -> usize {
1279 self.remaining
1280 }
1281}
1282
1283impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
1284 fn len(&self) -> usize {
1285 self.remaining
1286 }
1287}
1288
1289impl<K, V> ExactSizeIterator for IntoIter<K, V> {
1290 fn len(&self) -> usize {
1291 self.remaining
1292 }
1293}
1294
1295impl<K, V> Drop for IntoIter<K, V> {
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
1307impl<'a, K, V> Drop for Drain<'a, K, V> {
1308 fn drop(&mut self) {
1309 for _ in self {}
1310 }
1311}
1312
1313pub struct Keys<'a, K: 'a, V: 'a> {
1315 inner: Iter<'a, K, V>,
1316}
1317
1318impl<'a, K, V> Clone for Keys<'a, K, V> {
1319 fn clone(&self) -> Self {
1320 Keys {
1321 inner: self.inner.clone(),
1322 }
1323 }
1324}
1325
1326impl<'a, K, V> Iterator for Keys<'a, K, V> {
1327 type Item = &'a K;
1328
1329 #[inline]
1330 fn next(&mut self) -> Option<&'a K> {
1331 self.inner.next().map(|e| e.0)
1332 }
1333 #[inline]
1334 fn size_hint(&self) -> (usize, Option<usize>) {
1335 self.inner.size_hint()
1336 }
1337}
1338
1339impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V> {
1340 #[inline]
1341 fn next_back(&mut self) -> Option<&'a K> {
1342 self.inner.next_back().map(|e| e.0)
1343 }
1344}
1345
1346impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
1347 fn len(&self) -> usize {
1348 self.inner.len()
1349 }
1350}
1351
1352pub struct Values<'a, K: 'a, V: 'a> {
1354 inner: Iter<'a, K, V>,
1355}
1356
1357impl<'a, K, V> Clone for Values<'a, K, V> {
1358 fn clone(&self) -> Self {
1359 Values {
1360 inner: self.inner.clone(),
1361 }
1362 }
1363}
1364
1365impl<'a, K, V> Iterator for Values<'a, K, V> {
1366 type Item = &'a V;
1367
1368 #[inline]
1369 fn next(&mut self) -> Option<&'a V> {
1370 self.inner.next().map(|e| e.1)
1371 }
1372 #[inline]
1373 fn size_hint(&self) -> (usize, Option<usize>) {
1374 self.inner.size_hint()
1375 }
1376}
1377
1378impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V> {
1379 #[inline]
1380 fn next_back(&mut self) -> Option<&'a V> {
1381 self.inner.next_back().map(|e| e.1)
1382 }
1383}
1384
1385impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
1386 fn len(&self) -> usize {
1387 self.inner.len()
1388 }
1389}
1390
1391impl<'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>;
1394 fn into_iter(self) -> Iter<'a, K, V> {
1395 self.iter()
1396 }
1397}
1398
1399impl<'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>;
1402 fn into_iter(self) -> IterMut<'a, K, V> {
1403 self.iter_mut()
1404 }
1405}
1406
1407impl<K: Hash + Eq, V, S: BuildHasher> IntoIterator for LinkedHashMap<K, V, S> {
1408 type Item = (K, V);
1409 type IntoIter = 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 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
1437pub enum Entry<'a, K: 'a, V: 'a, S: 'a = hash_map::RandomState> {
1439 Occupied(OccupiedEntry<'a, K, V, S>),
1441 Vacant(VacantEntry<'a, K, V, S>),
1443}
1444
1445pub 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
1452pub 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
1458impl<'a, K: Hash + Eq, V, S: BuildHasher> Entry<'a, K, V, S> {
1459 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 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 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 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 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
1523impl<'a, K: Hash + Eq, V, S: BuildHasher> OccupiedEntry<'a, K, V, S> {
1524 pub fn key(&self) -> &K {
1537 unsafe { &(*self.entry).key }
1538 }
1539
1540 pub fn get(&self) -> &V {
1542 unsafe { &(*self.entry).value }
1543 }
1544
1545 pub fn get_mut(&mut self) -> &mut V {
1547 unsafe { &mut (*self.entry).value }
1548 }
1549
1550 pub fn into_mut(self) -> &'a mut V {
1553 unsafe { &mut (*self.entry).value }
1554 }
1555
1556 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 (*self.map).detach(node_ptr);
1566 (*self.map).attach(node_ptr);
1567
1568 old_val
1569 }
1570 }
1571
1572 pub fn remove(self) -> V {
1574 unsafe { (*self.map).remove(&(*self.entry).key) }.unwrap()
1575 }
1576}
1577
1578impl<'a, K: 'a + Hash + Eq, V: 'a, S: BuildHasher> VacantEntry<'a, K, V, S> {
1579 pub fn key(&self) -> &K {
1591 &self.key
1592 }
1593
1594 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 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}