1#![allow(unsafe_code)]
4
5use alloc::vec;
6use core::{
7 borrow::Borrow,
8 fmt::{self, Debug, Formatter},
9 hash::{BuildHasher, Hash, Hasher},
10 iter::{FromIterator, FusedIterator},
11 marker::PhantomData,
12};
13
14use dlv_list::{
15 Index, IntoIter as VecListIntoIter, Iter as VecListIter, IterMut as VecListIterMut, VecList,
16};
17use hashbrown::{
18 hash_map::{RawEntryMut, RawOccupiedEntryMut},
19 HashMap,
20};
21
22#[cfg(feature = "std")]
24pub type RandomState = std::collections::hash_map::RandomState;
25
26#[cfg(not(feature = "std"))]
28#[derive(Debug)]
29pub struct RandomState(core::convert::Infallible);
30
31#[cfg(not(feature = "std"))]
32impl RandomState {
33 #[cfg_attr(mutants, mutants::skip)]
35 #[must_use]
36 pub fn new() -> RandomState {
37 panic!("RandomState is not available without std")
38 }
39}
40
41#[cfg(not(feature = "std"))]
42impl Default for RandomState {
43 #[cfg_attr(mutants, mutants::skip)]
44 fn default() -> RandomState {
45 RandomState::new()
46 }
47}
48
49#[cfg(not(feature = "std"))]
50impl BuildHasher for RandomState {
51 type Hasher = DummyHasher;
52
53 #[cfg_attr(mutants, mutants::skip)]
54 fn build_hasher(&self) -> Self::Hasher {
55 match self.0 {}
56 }
57}
58
59#[derive(Clone)]
60pub struct ListOrderedMultimap<Key, Value, State = RandomState> {
72 pub(crate) build_hasher: State,
76
77 pub(crate) keys: VecList<Key>,
79
80 pub(crate) map: HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
84
85 pub(crate) values: VecList<ValueEntry<Key, Value>>,
87}
88
89#[cfg(feature = "std")]
90impl<Key, Value> ListOrderedMultimap<Key, Value, RandomState> {
91 #[must_use]
103 pub fn new() -> ListOrderedMultimap<Key, Value, RandomState> {
104 ListOrderedMultimap {
105 build_hasher: RandomState::new(),
106 keys: VecList::new(),
107 map: HashMap::with_hasher(DummyState),
108 values: VecList::new(),
109 }
110 }
111
112 #[must_use]
131 pub fn with_capacity(
132 key_capacity: usize,
133 value_capacity: usize,
134 ) -> ListOrderedMultimap<Key, Value, RandomState> {
135 ListOrderedMultimap {
136 build_hasher: RandomState::new(),
137 keys: VecList::with_capacity(key_capacity),
138 map: HashMap::with_capacity_and_hasher(key_capacity, DummyState),
139 values: VecList::with_capacity(value_capacity),
140 }
141 }
142}
143
144impl<Key, Value, State> ListOrderedMultimap<Key, Value, State>
145where
146 State: BuildHasher,
147{
148 #[must_use]
170 pub fn with_capacity_and_hasher(
171 key_capacity: usize,
172 value_capacity: usize,
173 state: State,
174 ) -> ListOrderedMultimap<Key, Value, State> {
175 ListOrderedMultimap {
176 build_hasher: state,
177 keys: VecList::with_capacity(key_capacity),
178 map: HashMap::with_capacity_and_hasher(key_capacity, DummyState),
179 values: VecList::with_capacity(value_capacity),
180 }
181 }
182
183 #[must_use]
200 pub fn with_hasher(state: State) -> ListOrderedMultimap<Key, Value, State> {
201 ListOrderedMultimap {
202 build_hasher: state,
203 keys: VecList::new(),
204 map: HashMap::with_hasher(DummyState),
205 values: VecList::new(),
206 }
207 }
208}
209
210impl<Key, Value, State> ListOrderedMultimap<Key, Value, State> {
211 #[must_use]
227 pub fn back(&self) -> Option<(&Key, &Value)> {
228 self.iter().next_back()
229 }
230
231 #[must_use]
247 pub fn back_mut(&mut self) -> Option<(&Key, &mut Value)> {
248 self.iter_mut().next_back()
249 }
250
251 pub fn clear(&mut self) {
270 self.keys.clear();
271 self.map.clear();
272 self.values.clear();
273 }
274
275 #[must_use]
291 pub fn front(&self) -> Option<(&Key, &Value)> {
292 self.iter().next()
293 }
294
295 #[must_use]
311 pub fn front_mut(&mut self) -> Option<(&Key, &mut Value)> {
312 self.iter_mut().next()
313 }
314
315 #[must_use]
326 pub fn hasher(&self) -> &State {
327 &self.build_hasher
328 }
329
330 #[must_use]
347 pub fn is_empty(&self) -> bool {
348 self.keys.is_empty()
349 }
350
351 #[must_use]
373 pub fn iter(&self) -> Iter<'_, Key, Value> {
374 Iter {
375 keys: &self.keys,
376 iter: self.values.iter(),
377 }
378 }
379
380 #[must_use]
410 pub fn iter_mut(&mut self) -> IterMut<'_, Key, Value> {
411 IterMut {
412 keys: &self.keys,
413 iter: self.values.iter_mut(),
414 }
415 }
416
417 #[must_use]
439 pub fn keys(&self) -> Keys<'_, Key> {
440 Keys(self.keys.iter())
441 }
442
443 #[must_use]
459 pub fn keys_capacity(&self) -> usize {
460 self.keys.capacity()
461 }
462
463 #[must_use]
479 pub fn keys_len(&self) -> usize {
480 self.keys.len()
481 }
482
483 #[must_use]
505 pub fn pairs(&self) -> KeyValues<'_, Key, Value, State> {
506 KeyValues {
507 build_hasher: &self.build_hasher,
508 keys: &self.keys,
509 iter: self.keys.iter(),
510 map: &self.map,
511 values: &self.values,
512 }
513 }
514
515 #[must_use]
538 pub fn pairs_mut(&mut self) -> KeyValuesMut<'_, Key, Value, State> {
539 KeyValuesMut {
540 build_hasher: &self.build_hasher,
541 keys: &self.keys,
542 iter: self.keys.iter(),
543 map: &self.map,
544 values: &mut self.values,
545 }
546 }
547
548 pub fn reserve_values(&mut self, additional_capacity: usize) {
569 self.values.reserve(additional_capacity);
570 }
571
572 #[must_use]
594 pub fn values(&self) -> Values<'_, Key, Value> {
595 Values(self.values.iter())
596 }
597
598 #[must_use]
626 pub fn values_mut(&mut self) -> ValuesMut<'_, Key, Value> {
627 ValuesMut(self.values.iter_mut())
628 }
629
630 #[must_use]
646 pub fn values_capacity(&self) -> usize {
647 self.values.capacity()
648 }
649
650 #[must_use]
667 pub fn values_len(&self) -> usize {
668 self.values.len()
669 }
670}
671
672impl<Key, Value, State> ListOrderedMultimap<Key, Value, State>
673where
674 Key: Eq + Hash,
675 State: BuildHasher,
676{
677 pub fn append(&mut self, key: Key, value: Value) -> bool {
700 let hash = hash_key(&self.build_hasher, &key);
701 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, &key);
702 let build_hasher = &self.build_hasher;
703
704 match entry {
705 RawEntryMut::Occupied(mut entry) => {
706 let key_index = entry.key();
707 let mut value_entry = ValueEntry::new(*key_index, value);
708 let map_entry = entry.get_mut();
709 value_entry.previous_index = Some(map_entry.tail_index);
710 let index = self.values.push_back(value_entry);
711 self
712 .values
713 .get_mut(map_entry.tail_index)
714 .unwrap()
715 .next_index = Some(index);
716 map_entry.append(index);
717 true
718 }
719 RawEntryMut::Vacant(entry) => {
720 let key_index = self.keys.push_back(key);
721 let value_entry = ValueEntry::new(key_index, value);
722 let index = self.values.push_back(value_entry);
723 let keys = &self.keys;
724 let _ = entry.insert_with_hasher(hash, key_index, MapEntry::new(index), |&key_index| {
725 let key = keys.get(key_index).unwrap();
726 hash_key(build_hasher, key)
727 });
728 false
729 }
730 }
731 }
732
733 #[must_use]
748 pub fn contains_key<KeyQuery>(&self, key: &KeyQuery) -> bool
749 where
750 Key: Borrow<KeyQuery>,
751 KeyQuery: ?Sized + Eq + Hash,
752 {
753 let hash = hash_key(&self.build_hasher, &key);
754 raw_entry(&self.keys, &self.map, hash, key).is_some()
755 }
756
757 #[must_use]
772 pub fn entry(&mut self, key: Key) -> Entry<'_, Key, Value, State> {
773 let hash = hash_key(&self.build_hasher, &key);
774
775 if !self.contains_key(&key) {
779 Entry::Vacant(VacantEntry {
780 build_hasher: &self.build_hasher,
781 hash,
782 key,
783 keys: &mut self.keys,
784 map: &mut self.map,
785 values: &mut self.values,
786 })
787 } else {
788 match raw_entry_mut(&self.keys, &mut self.map, hash, &key) {
789 RawEntryMut::Occupied(entry) => Entry::Occupied(OccupiedEntry {
790 entry,
791 keys: &mut self.keys,
792 values: &mut self.values,
793 }),
794 _ => panic!("expected occupied entry"),
795 }
796 }
797 }
798
799 #[must_use]
818 pub fn entry_len<KeyQuery>(&self, key: &KeyQuery) -> usize
819 where
820 Key: Borrow<KeyQuery>,
821 KeyQuery: ?Sized + Eq + Hash,
822 {
823 let hash = hash_key(&self.build_hasher, &key);
824
825 match raw_entry(&self.keys, &self.map, hash, key) {
826 Some((_, map_entry)) => map_entry.length,
827 None => 0,
828 }
829 }
830
831 #[must_use]
846 pub fn get<KeyQuery>(&self, key: &KeyQuery) -> Option<&Value>
847 where
848 Key: Borrow<KeyQuery>,
849 KeyQuery: ?Sized + Eq + Hash,
850 {
851 let hash = hash_key(&self.build_hasher, &key);
852 let (_, map_entry) = raw_entry(&self.keys, &self.map, hash, key)?;
853 self
854 .values
855 .get(map_entry.head_index)
856 .map(|entry| &entry.value)
857 }
858
859 #[must_use]
879 pub fn get_all<KeyQuery>(&self, key: &KeyQuery) -> EntryValues<'_, Key, Value>
880 where
881 Key: Borrow<KeyQuery>,
882 KeyQuery: ?Sized + Eq + Hash,
883 {
884 let hash = hash_key(&self.build_hasher, &key);
885
886 match raw_entry(&self.keys, &self.map, hash, key) {
887 Some((_, map_entry)) => EntryValues::from_map_entry(&self.values, map_entry),
888 None => EntryValues::empty(&self.values),
889 }
890 }
891
892 #[must_use]
917 pub fn get_all_mut<KeyQuery>(&mut self, key: &KeyQuery) -> EntryValuesMut<'_, Key, Value>
918 where
919 Key: Borrow<KeyQuery>,
920 KeyQuery: ?Sized + Eq + Hash,
921 {
922 let hash = hash_key(&self.build_hasher, &key);
923
924 match raw_entry(&self.keys, &self.map, hash, key) {
925 Some((_, map_entry)) => EntryValuesMut::from_map_entry(&mut self.values, map_entry),
926 None => EntryValuesMut::empty(&mut self.values),
927 }
928 }
929
930 #[must_use]
952 pub fn get_mut<KeyQuery>(&mut self, key: &KeyQuery) -> Option<&mut Value>
953 where
954 Key: Borrow<KeyQuery>,
955 KeyQuery: ?Sized + Eq + Hash,
956 {
957 let hash = hash_key(&self.build_hasher, &key);
958 let (_, map_entry) = raw_entry(&self.keys, &self.map, hash, key)?;
959 self
960 .values
961 .get_mut(map_entry.head_index)
962 .map(|entry| &mut entry.value)
963 }
964
965 pub fn insert(&mut self, key: Key, value: Value) -> Option<Value> {
992 self.insert_all(key, value).next()
993 }
994
995 pub fn insert_all(&mut self, key: Key, value: Value) -> EntryValuesDrain<'_, Key, Value> {
1032 let hash = hash_key(&self.build_hasher, &key);
1033 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, &key);
1034 let build_hasher = &self.build_hasher;
1035
1036 match entry {
1037 RawEntryMut::Occupied(mut entry) => {
1038 let key_index = entry.key();
1039 let value_entry = ValueEntry::new(*key_index, value);
1040 let index = self.values.push_back(value_entry);
1041 let map_entry = entry.get_mut();
1042 let iter = EntryValuesDrain::from_map_entry(&mut self.values, map_entry);
1043 map_entry.reset(index);
1044 iter
1045 }
1046 RawEntryMut::Vacant(entry) => {
1047 let key_index = self.keys.push_back(key);
1048 let value_entry = ValueEntry::new(key_index, value);
1049 let index = self.values.push_back(value_entry);
1050 let keys = &self.keys;
1051 let _ = entry.insert_with_hasher(hash, key_index, MapEntry::new(index), |&key_index| {
1052 let key = keys.get(key_index).unwrap();
1053 hash_key(build_hasher, key)
1054 });
1055 EntryValuesDrain::empty(&mut self.values)
1056 }
1057 }
1058 }
1059
1060 #[cfg(feature = "std")]
1090 pub fn pack_to(&mut self, keys_minimum_capacity: usize, values_minimum_capacity: usize)
1091 where
1092 State: Default,
1093 {
1094 assert!(
1095 keys_minimum_capacity >= self.keys_len(),
1096 "cannot pack multimap keys lower than current length"
1097 );
1098 assert!(
1099 values_minimum_capacity >= self.values_len(),
1100 "cannot pack multimap values lower than current length"
1101 );
1102
1103 let key_map = self.keys.pack_to(keys_minimum_capacity);
1104 let value_map = self.values.pack_to(values_minimum_capacity);
1105 let mut map = HashMap::with_capacity_and_hasher(keys_minimum_capacity, DummyState);
1106 let build_hasher = &self.build_hasher;
1107
1108 for value_entry in self.values.iter_mut() {
1109 value_entry.key_index = key_map[&value_entry.key_index];
1110 value_entry.next_index = value_entry.next_index.map(|index| value_map[&index]);
1111 value_entry.previous_index = value_entry.previous_index.map(|index| value_map[&index]);
1112 }
1113
1114 for (key_index, mut map_entry) in self.map.drain() {
1115 map_entry.head_index = value_map[&map_entry.head_index];
1116 map_entry.tail_index = value_map[&map_entry.tail_index];
1117 let key_index = key_map[&key_index];
1118 let key = self.keys.get(key_index).unwrap();
1119 let hash = hash_key(&self.build_hasher, key);
1120
1121 match map.raw_entry_mut().from_hash(hash, |_| false) {
1122 RawEntryMut::Vacant(entry) => {
1123 let keys = &self.keys;
1124 let _ = entry.insert_with_hasher(hash, key_index, map_entry, |&key_index| {
1125 let key = keys.get(key_index).unwrap();
1126 hash_key(build_hasher, key)
1127 });
1128 }
1129 _ => panic!("expected vacant entry"),
1130 }
1131 }
1132
1133 self.map = map;
1134 }
1135
1136 #[cfg(feature = "std")]
1159 pub fn pack_to_fit(&mut self)
1160 where
1161 State: Default,
1162 {
1163 self.pack_to(self.keys_len(), self.values_len());
1164 }
1165
1166 pub fn pop_back(&mut self) -> Option<(KeyWrapper<'_, Key>, Value)> {
1197 let value_entry = self.values.pop_back()?;
1198
1199 let key_wrapper = match value_entry.previous_index {
1200 Some(previous_index) => {
1201 let key = self.keys.get(value_entry.key_index).unwrap();
1202 let hash = hash_key(&self.build_hasher, &key);
1203
1204 let mut entry = match raw_entry_mut(&self.keys, &mut self.map, hash, key) {
1205 RawEntryMut::Occupied(entry) => entry,
1206 _ => panic!("expected occupied entry in internal map"),
1207 };
1208 let map_entry = entry.get_mut();
1209 map_entry.length -= 1;
1210 map_entry.tail_index = previous_index;
1211
1212 let previous_value_entry = self.values.get_mut(previous_index).unwrap();
1213 previous_value_entry.next_index = None;
1214
1215 KeyWrapper::Borrowed(key)
1216 }
1217 None => {
1218 let key = self.keys.remove(value_entry.key_index).unwrap();
1219 let hash = hash_key(&self.build_hasher, &key);
1220
1221 match raw_entry_mut_empty(&self.keys, &mut self.map, hash) {
1222 RawEntryMut::Occupied(entry) => {
1223 let _ = entry.remove();
1224 }
1225 _ => panic!("expectd occupied entry in internal map"),
1226 }
1227
1228 KeyWrapper::Owned(key)
1229 }
1230 };
1231
1232 Some((key_wrapper, value_entry.value))
1233 }
1234
1235 pub fn pop_front(&mut self) -> Option<(KeyWrapper<'_, Key>, Value)> {
1266 let value_entry = self.values.pop_front()?;
1267
1268 let key_wrapper = match value_entry.next_index {
1269 Some(next_index) => {
1270 let key = self.keys.get(value_entry.key_index).unwrap();
1271 let hash = hash_key(&self.build_hasher, &key);
1272
1273 let mut entry = match raw_entry_mut(&self.keys, &mut self.map, hash, key) {
1274 RawEntryMut::Occupied(entry) => entry,
1275 _ => panic!("expected occupied entry in internal map"),
1276 };
1277 let map_entry = entry.get_mut();
1278 map_entry.length -= 1;
1279 map_entry.head_index = next_index;
1280
1281 let next_value_entry = self.values.get_mut(next_index).unwrap();
1282 next_value_entry.previous_index = None;
1283
1284 KeyWrapper::Borrowed(key)
1285 }
1286 None => {
1287 let key = self.keys.remove(value_entry.key_index).unwrap();
1288 let hash = hash_key(&self.build_hasher, &key);
1289
1290 match raw_entry_mut_empty(&self.keys, &mut self.map, hash) {
1291 RawEntryMut::Occupied(entry) => {
1292 let _ = entry.remove();
1293 }
1294 _ => panic!("expectd occupied entry in internal map"),
1295 }
1296
1297 KeyWrapper::Owned(key)
1298 }
1299 };
1300
1301 Some((key_wrapper, value_entry.value))
1302 }
1303
1304 pub fn remove<KeyQuery>(&mut self, key: &KeyQuery) -> Option<Value>
1326 where
1327 Key: Borrow<KeyQuery>,
1328 KeyQuery: ?Sized + Eq + Hash,
1329 {
1330 self.remove_entry(key).map(|(_, value)| value)
1331 }
1332
1333 pub fn remove_all<KeyQuery>(&mut self, key: &KeyQuery) -> EntryValuesDrain<'_, Key, Value>
1365 where
1366 Key: Borrow<KeyQuery>,
1367 KeyQuery: ?Sized + Eq + Hash,
1368 {
1369 let hash = hash_key(&self.build_hasher, &key);
1370 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, key);
1371
1372 match entry {
1373 RawEntryMut::Occupied(entry) => {
1374 let (key_index, map_entry) = entry.remove_entry();
1375 let _ = self.keys.remove(key_index).unwrap();
1376 EntryValuesDrain::from_map_entry(&mut self.values, &map_entry)
1377 }
1378 RawEntryMut::Vacant(_) => EntryValuesDrain::empty(&mut self.values),
1379 }
1380 }
1381
1382 pub fn remove_entry<KeyQuery>(&mut self, key: &KeyQuery) -> Option<(Key, Value)>
1406 where
1407 Key: Borrow<KeyQuery>,
1408 KeyQuery: ?Sized + Eq + Hash,
1409 {
1410 let (key, mut iter) = self.remove_entry_all(key)?;
1411 Some((key, iter.next().unwrap()))
1412 }
1413
1414 pub fn remove_entry_all<KeyQuery>(
1448 &mut self,
1449 key: &KeyQuery,
1450 ) -> Option<(Key, EntryValuesDrain<'_, Key, Value>)>
1451 where
1452 Key: Borrow<KeyQuery>,
1453 KeyQuery: ?Sized + Eq + Hash,
1454 {
1455 let hash = hash_key(&self.build_hasher, &key);
1456 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, key);
1457
1458 match entry {
1459 RawEntryMut::Occupied(entry) => {
1460 let (key_index, map_entry) = entry.remove_entry();
1461 let key = self.keys.remove(key_index).unwrap();
1462 let iter = EntryValuesDrain::from_map_entry(&mut self.values, &map_entry);
1463 Some((key, iter))
1464 }
1465 _ => None,
1466 }
1467 }
1468
1469 pub fn reserve_keys(&mut self, additional_capacity: usize) {
1491 if self.keys.capacity() - self.keys.len() >= additional_capacity {
1492 return;
1493 }
1494
1495 let capacity = self.map.capacity() + additional_capacity;
1496 let mut map = HashMap::with_capacity_and_hasher(capacity, DummyState);
1497
1498 for (key_index, map_entry) in self.map.drain() {
1499 let key = self.keys.get(key_index).unwrap();
1500 let hash = hash_key(&self.build_hasher, key);
1501 let entry = match raw_entry_mut(&self.keys, &mut map, hash, key) {
1502 RawEntryMut::Vacant(entry) => entry,
1503 _ => panic!("expected vacant entry"),
1504 };
1505 let _ = entry.insert_hashed_nocheck(hash, key_index, map_entry);
1506 }
1507
1508 self.keys.reserve(additional_capacity);
1509 self.map = map;
1510 }
1511
1512 pub fn retain<Function>(&mut self, function: Function)
1536 where
1537 Function: FnMut(&Key, &mut Value) -> bool,
1538 {
1539 ListOrderedMultimap::retain_helper(
1540 &self.build_hasher,
1541 &mut self.keys,
1542 &mut self.map,
1543 &mut self.values,
1544 function,
1545 );
1546 }
1547
1548 fn retain_helper<'map, Function>(
1550 build_hasher: &'map State,
1551 keys: &'map mut VecList<Key>,
1552 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
1553 values: &'map mut VecList<ValueEntry<Key, Value>>,
1554 mut function: Function,
1555 ) where
1556 Function: FnMut(&Key, &mut Value) -> bool,
1557 {
1558 let mut post_updates = vec![];
1559
1560 values.retain(|value_entry| {
1561 let key = keys.get(value_entry.key_index).unwrap();
1562
1563 if function(key, &mut value_entry.value) {
1564 true
1565 } else {
1566 let hash = hash_key(build_hasher, key);
1567 let mut entry = match raw_entry_mut(keys, map, hash, key) {
1568 RawEntryMut::Occupied(entry) => entry,
1569 _ => panic!("expected occupied entry in internal map"),
1570 };
1571
1572 if value_entry.previous_index.is_none() && value_entry.next_index.is_none() {
1573 let _ = entry.remove();
1574 let _ = keys.remove(value_entry.key_index);
1575 } else {
1576 let map_entry = entry.get_mut();
1577 map_entry.length -= 1;
1578
1579 if let Some(previous_index) = value_entry.previous_index {
1580 post_updates.push((previous_index, None, Some(value_entry.next_index)));
1581 } else {
1582 map_entry.head_index = value_entry.next_index.unwrap();
1583 }
1584
1585 if let Some(next_index) = value_entry.next_index {
1586 post_updates.push((next_index, Some(value_entry.previous_index), None));
1587 } else {
1588 map_entry.tail_index = value_entry.previous_index.unwrap();
1589 }
1590 }
1591
1592 false
1593 }
1594 });
1595
1596 for (index, new_previous_index, new_next_index) in post_updates {
1597 let value_entry = values.get_mut(index).unwrap();
1598
1599 if let Some(new_previous_index) = new_previous_index {
1600 value_entry.previous_index = new_previous_index;
1601 }
1602
1603 if let Some(new_next_index) = new_next_index {
1604 value_entry.next_index = new_next_index;
1605 }
1606 }
1607 }
1608}
1609
1610impl<Key, Value, State> Debug for ListOrderedMultimap<Key, Value, State>
1611where
1612 Key: Debug,
1613 Value: Debug,
1614{
1615 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
1616 formatter.debug_map().entries(self.iter()).finish()
1617 }
1618}
1619
1620#[cfg(feature = "std")]
1621impl<Key, Value> Default for ListOrderedMultimap<Key, Value, RandomState> {
1622 fn default() -> Self {
1623 Self::new()
1624 }
1625}
1626
1627impl<Key, Value, State> Eq for ListOrderedMultimap<Key, Value, State>
1628where
1629 Key: Eq,
1630 Value: PartialEq,
1631{
1632}
1633
1634impl<Key, Value, State> Extend<(Key, Value)> for ListOrderedMultimap<Key, Value, State>
1635where
1636 Key: Eq + Hash,
1637 State: BuildHasher,
1638{
1639 fn extend<Iter>(&mut self, iter: Iter)
1640 where
1641 Iter: IntoIterator<Item = (Key, Value)>,
1642 {
1643 let iter = iter.into_iter();
1644 self.reserve_values(iter.size_hint().0);
1645
1646 for (key, value) in iter {
1647 let _ = self.append(key, value);
1648 }
1649 }
1650}
1651
1652impl<'a, Key, Value, State> Extend<(&'a Key, &'a Value)> for ListOrderedMultimap<Key, Value, State>
1653where
1654 Key: Copy + Eq + Hash,
1655 Value: Copy,
1656 State: BuildHasher,
1657{
1658 fn extend<Iter>(&mut self, iter: Iter)
1659 where
1660 Iter: IntoIterator<Item = (&'a Key, &'a Value)>,
1661 {
1662 self.extend(iter.into_iter().map(|(&key, &value)| (key, value)));
1663 }
1664}
1665
1666impl<Key, Value, State> FromIterator<(Key, Value)> for ListOrderedMultimap<Key, Value, State>
1667where
1668 Key: Eq + Hash,
1669 State: BuildHasher + Default,
1670{
1671 fn from_iter<Iter>(iter: Iter) -> Self
1672 where
1673 Iter: IntoIterator<Item = (Key, Value)>,
1674 {
1675 let mut map = ListOrderedMultimap::with_hasher(State::default());
1676 map.extend(iter);
1677 map
1678 }
1679}
1680
1681impl<Key, Value, State> IntoIterator for ListOrderedMultimap<Key, Value, State>
1682where
1683 Key: Clone,
1684{
1685 type IntoIter = IntoIter<Key, Value>;
1686 type Item = (Key, Value);
1687
1688 fn into_iter(self) -> Self::IntoIter {
1689 IntoIter {
1690 keys: self.keys,
1691 iter: self.values.into_iter(),
1692 }
1693 }
1694}
1695
1696impl<'map, Key, Value, State> IntoIterator for &'map ListOrderedMultimap<Key, Value, State> {
1697 type IntoIter = Iter<'map, Key, Value>;
1698 type Item = (&'map Key, &'map Value);
1699
1700 fn into_iter(self) -> Self::IntoIter {
1701 self.iter()
1702 }
1703}
1704
1705impl<'map, Key, Value, State> IntoIterator for &'map mut ListOrderedMultimap<Key, Value, State> {
1706 type IntoIter = IterMut<'map, Key, Value>;
1707 type Item = (&'map Key, &'map mut Value);
1708
1709 fn into_iter(self) -> Self::IntoIter {
1710 self.iter_mut()
1711 }
1712}
1713
1714impl<Key, Value, State> PartialEq for ListOrderedMultimap<Key, Value, State>
1715where
1716 Key: PartialEq,
1717 Value: PartialEq,
1718{
1719 fn eq(&self, other: &ListOrderedMultimap<Key, Value, State>) -> bool {
1720 if self.keys_len() != other.keys_len() || self.values_len() != other.values_len() {
1721 return false;
1722 }
1723
1724 self.iter().eq(other.iter())
1725 }
1726}
1727
1728#[allow(single_use_lifetimes)]
1732#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
1733pub enum KeyWrapper<'map, Key> {
1734 Borrowed(&'map Key),
1737
1738 Owned(Key),
1740}
1741
1742impl<Key> KeyWrapper<'_, Key> {
1743 #[must_use]
1757 pub fn into_owned(self) -> Key
1758 where
1759 Key: Clone,
1760 {
1761 match self {
1762 KeyWrapper::Borrowed(key) => key.clone(),
1763 KeyWrapper::Owned(key) => key,
1764 }
1765 }
1766
1767 #[must_use]
1781 pub fn is_borrowed(&self) -> bool {
1782 matches!(self, KeyWrapper::Borrowed(_))
1783 }
1784
1785 #[must_use]
1799 pub fn is_owned(&self) -> bool {
1800 matches!(self, KeyWrapper::Owned(_))
1801 }
1802}
1803
1804#[derive(Clone)]
1806pub(crate) struct MapEntry<Key, Value> {
1807 head_index: Index<ValueEntry<Key, Value>>,
1809
1810 length: usize,
1812
1813 tail_index: Index<ValueEntry<Key, Value>>,
1815}
1816
1817impl<Key, Value> MapEntry<Key, Value> {
1818 pub fn append(&mut self, index: Index<ValueEntry<Key, Value>>) {
1820 self.length += 1;
1821 self.tail_index = index;
1822 }
1823
1824 #[must_use]
1826 pub fn new(index: Index<ValueEntry<Key, Value>>) -> Self {
1827 MapEntry {
1828 head_index: index,
1829 length: 1,
1830 tail_index: index,
1831 }
1832 }
1833
1834 pub fn reset(&mut self, index: Index<ValueEntry<Key, Value>>) {
1836 self.head_index = index;
1837 self.length = 1;
1838 self.tail_index = index;
1839 }
1840}
1841
1842#[derive(Clone)]
1844pub(crate) struct ValueEntry<Key, Value> {
1845 key_index: Index<Key>,
1847
1848 next_index: Option<Index<ValueEntry<Key, Value>>>,
1850
1851 previous_index: Option<Index<ValueEntry<Key, Value>>>,
1853
1854 value: Value,
1856}
1857
1858impl<Key, Value> ValueEntry<Key, Value> {
1859 #[must_use]
1861 pub fn new(key_index: Index<Key>, value: Value) -> Self {
1862 ValueEntry {
1863 key_index,
1864 next_index: None,
1865 previous_index: None,
1866 value,
1867 }
1868 }
1869}
1870
1871pub enum Entry<'map, Key, Value, State = RandomState> {
1873 Occupied(OccupiedEntry<'map, Key, Value>),
1875
1876 Vacant(VacantEntry<'map, Key, Value, State>),
1878}
1879
1880impl<'map, Key, Value, State> Entry<'map, Key, Value, State>
1881where
1882 Key: Eq + Hash,
1883 State: BuildHasher,
1884{
1885 pub fn and_modify<Function>(self, function: Function) -> Self
1906 where
1907 Function: FnOnce(&mut Value),
1908 {
1909 match self {
1910 Entry::Occupied(mut entry) => {
1911 function(entry.get_mut());
1912 Entry::Occupied(entry)
1913 }
1914 Entry::Vacant(entry) => Entry::Vacant(entry),
1915 }
1916 }
1917
1918 pub fn or_insert(self, value: Value) -> &'map mut Value {
1936 match self {
1937 Entry::Occupied(entry) => entry.into_mut(),
1938 Entry::Vacant(entry) => entry.insert(value),
1939 }
1940 }
1941
1942 pub fn or_insert_entry(self, value: Value) -> OccupiedEntry<'map, Key, Value> {
1960 match self {
1961 Entry::Occupied(entry) => entry,
1962 Entry::Vacant(entry) => entry.insert_entry(value),
1963 }
1964 }
1965
1966 pub fn or_insert_with<Function>(self, function: Function) -> &'map mut Value
1985 where
1986 Function: FnOnce() -> Value,
1987 {
1988 match self {
1989 Entry::Occupied(entry) => entry.into_mut(),
1990 Entry::Vacant(entry) => entry.insert(function()),
1991 }
1992 }
1993
1994 pub fn or_insert_with_entry<Function>(self, function: Function) -> OccupiedEntry<'map, Key, Value>
2012 where
2013 Function: FnOnce() -> Value,
2014 {
2015 match self {
2016 Entry::Occupied(entry) => entry,
2017 Entry::Vacant(entry) => entry.insert_entry(function()),
2018 }
2019 }
2020}
2021
2022impl<Key, Value, State> Debug for Entry<'_, Key, Value, State>
2023where
2024 Key: Debug,
2025 State: BuildHasher,
2026 Value: Debug,
2027{
2028 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
2029 match self {
2030 Entry::Occupied(entry) => entry.fmt(formatter),
2031 Entry::Vacant(entry) => entry.fmt(formatter),
2032 }
2033 }
2034}
2035
2036pub struct OccupiedEntry<'map, Key, Value> {
2038 entry: RawOccupiedEntryMut<'map, Index<Key>, MapEntry<Key, Value>, DummyState>,
2039
2040 keys: &'map mut VecList<Key>,
2041
2042 values: &'map mut VecList<ValueEntry<Key, Value>>,
2043}
2044
2045#[allow(clippy::len_without_is_empty)]
2046impl<'map, Key, Value> OccupiedEntry<'map, Key, Value> {
2047 pub fn append(&mut self, value: Value) {
2069 let key_index = *self.entry.key();
2070 let map_entry = self.entry.get_mut();
2071 let mut value_entry = ValueEntry::new(key_index, value);
2072 value_entry.previous_index = Some(map_entry.tail_index);
2073 let index = self.values.push_back(value_entry);
2074 self
2075 .values
2076 .get_mut(map_entry.tail_index)
2077 .unwrap()
2078 .next_index = Some(index);
2079 map_entry.length += 1;
2080 map_entry.tail_index = index;
2081 }
2082
2083 #[must_use]
2100 pub fn get(&self) -> &Value {
2101 let index = self.entry.get().head_index;
2102 &self.values.get(index).unwrap().value
2103 }
2104
2105 #[must_use]
2122 pub fn get_mut(&mut self) -> &mut Value {
2123 let index = self.entry.get().head_index;
2124 &mut self.values.get_mut(index).unwrap().value
2125 }
2126
2127 pub fn insert(&mut self, value: Value) -> Value {
2146 let key_index = *self.entry.key();
2147 let map_entry = self.entry.get_mut();
2148 let first_index = map_entry.head_index;
2149 let mut entry = self.values.remove(first_index).unwrap();
2150 let first_value = entry.value;
2151
2152 while let Some(next_index) = entry.next_index {
2153 entry = self.values.remove(next_index).unwrap();
2154 }
2155
2156 let value_entry = ValueEntry::new(key_index, value);
2157 let index = self.values.push_back(value_entry);
2158 map_entry.head_index = index;
2159 map_entry.length = 1;
2160 map_entry.tail_index = index;
2161 first_value
2162 }
2163
2164 pub fn insert_all(&mut self, value: Value) -> EntryValuesDrain<'_, Key, Value> {
2186 let key_index = *self.entry.key();
2187 let map_entry = self.entry.get_mut();
2188 let value_entry = ValueEntry::new(key_index, value);
2189 let index = self.values.push_back(value_entry);
2190 let iter = EntryValuesDrain::from_map_entry(self.values, map_entry);
2191 map_entry.reset(index);
2192 iter
2193 }
2194
2195 #[must_use]
2212 pub fn into_mut(mut self) -> &'map mut Value {
2213 let index = self.entry.get_mut().head_index;
2214 &mut self.values.get_mut(index).unwrap().value
2215 }
2216
2217 #[must_use]
2239 pub fn iter(&self) -> EntryValues<'_, Key, Value> {
2240 let map_entry = self.entry.get();
2241 EntryValues::from_map_entry(self.values, map_entry)
2242 }
2243
2244 #[must_use]
2266 pub fn iter_mut(&mut self) -> EntryValuesMut<'_, Key, Value> {
2267 let map_entry = self.entry.get_mut();
2268 EntryValuesMut::from_map_entry(self.values, map_entry)
2269 }
2270
2271 #[must_use]
2288 pub fn key(&self) -> &Key {
2289 let key_index = self.entry.key();
2290 self.keys.get(*key_index).unwrap()
2291 }
2292
2293 #[must_use]
2313 pub fn len(&self) -> usize {
2314 self.entry.get().length
2315 }
2316
2317 pub fn remove(self) -> Value {
2334 self.remove_entry().1
2335 }
2336
2337 pub fn remove_all(self) -> EntryValuesDrain<'map, Key, Value> {
2359 self.remove_entry_all().1
2360 }
2361
2362 pub fn remove_entry(self) -> (Key, Value) {
2379 let (key_index, map_entry) = self.entry.remove_entry();
2380 let key = self.keys.remove(key_index).unwrap();
2381 let first_index = map_entry.head_index;
2382 let mut entry = self.values.remove(first_index).unwrap();
2383 let first_value = entry.value;
2384
2385 while let Some(next_index) = entry.next_index {
2386 entry = self.values.remove(next_index).unwrap();
2387 }
2388
2389 (key, first_value)
2390 }
2391
2392 pub fn remove_entry_all(self) -> (Key, EntryValuesDrain<'map, Key, Value>) {
2415 let (key_index, map_entry) = self.entry.remove_entry();
2416 let key = self.keys.remove(key_index).unwrap();
2417 let iter = EntryValuesDrain {
2418 head_index: Some(map_entry.head_index),
2419 remaining: map_entry.length,
2420 tail_index: Some(map_entry.tail_index),
2421 values: self.values,
2422 };
2423 (key, iter)
2424 }
2425}
2426
2427impl<Key, Value> Debug for OccupiedEntry<'_, Key, Value>
2428where
2429 Key: Debug,
2430 Value: Debug,
2431{
2432 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
2433 formatter
2434 .debug_struct("OccupiedEntry")
2435 .field("key", self.key())
2436 .field("values", &self.iter())
2437 .finish()
2438 }
2439}
2440
2441pub struct VacantEntry<'map, Key, Value, State = RandomState> {
2443 build_hasher: &'map State,
2445
2446 hash: u64,
2448
2449 key: Key,
2451
2452 keys: &'map mut VecList<Key>,
2453
2454 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
2456
2457 values: &'map mut VecList<ValueEntry<Key, Value>>,
2458}
2459
2460impl<'map, Key, Value, State> VacantEntry<'map, Key, Value, State>
2461where
2462 Key: Eq + Hash,
2463 State: BuildHasher,
2464{
2465 pub fn insert(self, value: Value) -> &'map mut Value {
2481 let build_hasher = self.build_hasher;
2482 let entry = match raw_entry_mut(self.keys, self.map, self.hash, &self.key) {
2483 RawEntryMut::Vacant(entry) => entry,
2484 _ => panic!("expected vacant entry"),
2485 };
2486 let key_index = self.keys.push_back(self.key);
2487 let value_entry = ValueEntry::new(key_index, value);
2488 let index = self.values.push_back(value_entry);
2489 let map_entry = MapEntry::new(index);
2490 let keys = &self.keys;
2491 let _ = entry.insert_with_hasher(self.hash, key_index, map_entry, |&key_index| {
2492 let key = keys.get(key_index).unwrap();
2493 hash_key(build_hasher, key)
2494 });
2495
2496 &mut self.values.get_mut(index).unwrap().value
2497 }
2498
2499 pub fn insert_entry(self, value: Value) -> OccupiedEntry<'map, Key, Value> {
2516 let build_hasher = self.build_hasher;
2517 let entry = match raw_entry_mut(self.keys, self.map, self.hash, &self.key) {
2518 RawEntryMut::Vacant(entry) => entry,
2519 _ => panic!("expected vacant entry"),
2520 };
2521 let key_index = self.keys.push_back(self.key);
2522 let value_entry = ValueEntry::new(key_index, value);
2523 let index = self.values.push_back(value_entry);
2524 let map_entry = MapEntry::new(index);
2525 let keys = &self.keys;
2526 let _ = entry.insert_with_hasher(self.hash, key_index, map_entry, |&key_index| {
2527 let key = keys.get(key_index).unwrap();
2528 hash_key(build_hasher, key)
2529 });
2530
2531 let key = self.keys.get(key_index).unwrap();
2532 let entry = match raw_entry_mut(self.keys, self.map, self.hash, key) {
2533 RawEntryMut::Occupied(entry) => entry,
2534 _ => panic!("expected occupied entry"),
2535 };
2536
2537 OccupiedEntry {
2538 entry,
2539 keys: self.keys,
2540 values: self.values,
2541 }
2542 }
2543
2544 #[must_use]
2560 pub fn into_key(self) -> Key {
2561 self.key
2562 }
2563
2564 #[must_use]
2580 pub fn key(&self) -> &Key {
2581 &self.key
2582 }
2583}
2584
2585impl<Key, Value, State> Debug for VacantEntry<'_, Key, Value, State>
2586where
2587 Key: Debug,
2588{
2589 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
2590 formatter
2591 .debug_tuple("VacantEntry")
2592 .field(&self.key)
2593 .finish()
2594 }
2595}
2596
2597pub struct EntryValues<'map, Key, Value> {
2600 head_index: Option<Index<ValueEntry<Key, Value>>>,
2602
2603 remaining: usize,
2605
2606 tail_index: Option<Index<ValueEntry<Key, Value>>>,
2608
2609 values: &'map VecList<ValueEntry<Key, Value>>,
2611}
2612
2613impl<'map, Key, Value> EntryValues<'map, Key, Value> {
2614 #[must_use]
2616 fn empty(values: &'map VecList<ValueEntry<Key, Value>>) -> Self {
2617 EntryValues {
2618 head_index: None,
2619 remaining: 0,
2620 tail_index: None,
2621 values,
2622 }
2623 }
2624
2625 #[must_use]
2627 fn from_map_entry(
2628 values: &'map VecList<ValueEntry<Key, Value>>,
2629 map_entry: &MapEntry<Key, Value>,
2630 ) -> Self {
2631 EntryValues {
2632 head_index: Some(map_entry.head_index),
2633 remaining: map_entry.length,
2634 tail_index: Some(map_entry.tail_index),
2635 values,
2636 }
2637 }
2638}
2639
2640impl<'map, Key, Value> Clone for EntryValues<'map, Key, Value> {
2641 fn clone(&self) -> EntryValues<'map, Key, Value> {
2642 EntryValues {
2643 head_index: self.head_index,
2644 remaining: self.remaining,
2645 tail_index: self.tail_index,
2646 values: self.values,
2647 }
2648 }
2649}
2650
2651impl<Key, Value> Debug for EntryValues<'_, Key, Value>
2652where
2653 Value: Debug,
2654{
2655 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
2656 formatter.write_str("EntryValues(")?;
2657 formatter.debug_list().entries(self.clone()).finish()?;
2658 formatter.write_str(")")
2659 }
2660}
2661
2662impl<Key, Value> DoubleEndedIterator for EntryValues<'_, Key, Value> {
2663 fn next_back(&mut self) -> Option<Self::Item> {
2664 if self.remaining == 0 {
2665 None
2666 } else {
2667 self.tail_index.map(|index| {
2668 let entry = self.values.get(index).unwrap();
2669 self.tail_index = entry.previous_index;
2670 self.remaining -= 1;
2671 &entry.value
2672 })
2673 }
2674 }
2675}
2676
2677impl<Key, Value> ExactSizeIterator for EntryValues<'_, Key, Value> {}
2678
2679impl<Key, Value> FusedIterator for EntryValues<'_, Key, Value> {}
2680
2681impl<'map, Key, Value> Iterator for EntryValues<'map, Key, Value> {
2682 type Item = &'map Value;
2683
2684 fn next(&mut self) -> Option<Self::Item> {
2685 if self.remaining == 0 {
2686 None
2687 } else {
2688 self.head_index.map(|index| {
2689 let entry = self.values.get(index).unwrap();
2690 self.head_index = entry.next_index;
2691 self.remaining -= 1;
2692 &entry.value
2693 })
2694 }
2695 }
2696
2697 fn size_hint(&self) -> (usize, Option<usize>) {
2698 (self.remaining, Some(self.remaining))
2699 }
2700}
2701
2702pub struct EntryValuesDrain<'map, Key, Value> {
2705 head_index: Option<Index<ValueEntry<Key, Value>>>,
2707
2708 remaining: usize,
2710
2711 tail_index: Option<Index<ValueEntry<Key, Value>>>,
2713
2714 values: &'map mut VecList<ValueEntry<Key, Value>>,
2716}
2717
2718impl<'map, Key, Value> EntryValuesDrain<'map, Key, Value> {
2719 fn empty(values: &'map mut VecList<ValueEntry<Key, Value>>) -> Self {
2721 EntryValuesDrain {
2722 head_index: None,
2723 remaining: 0,
2724 tail_index: None,
2725 values,
2726 }
2727 }
2728
2729 fn from_map_entry(
2731 values: &'map mut VecList<ValueEntry<Key, Value>>,
2732 map_entry: &MapEntry<Key, Value>,
2733 ) -> Self {
2734 EntryValuesDrain {
2735 head_index: Some(map_entry.head_index),
2736 remaining: map_entry.length,
2737 tail_index: Some(map_entry.tail_index),
2738 values,
2739 }
2740 }
2741
2742 #[must_use]
2744 pub fn iter(&self) -> EntryValues<'_, Key, Value> {
2745 EntryValues {
2746 head_index: self.head_index,
2747 remaining: self.remaining,
2748 tail_index: self.tail_index,
2749 values: self.values,
2750 }
2751 }
2752}
2753
2754impl<Key, Value> Debug for EntryValuesDrain<'_, Key, Value>
2755where
2756 Key: Debug,
2757 Value: Debug,
2758{
2759 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
2760 formatter.write_str("EntryValuesDrain(")?;
2761 formatter.debug_list().entries(self.iter()).finish()?;
2762 formatter.write_str(")")
2763 }
2764}
2765
2766impl<Key, Value> DoubleEndedIterator for EntryValuesDrain<'_, Key, Value> {
2767 fn next_back(&mut self) -> Option<Self::Item> {
2768 if self.remaining == 0 {
2769 None
2770 } else {
2771 self.tail_index.map(|index| {
2772 let entry = self.values.remove(index).unwrap();
2773 self.tail_index = entry.previous_index;
2774 self.remaining -= 1;
2775 entry.value
2776 })
2777 }
2778 }
2779}
2780
2781impl<Key, Value> Drop for EntryValuesDrain<'_, Key, Value> {
2782 fn drop(&mut self) {
2783 for _ in self {}
2784 }
2785}
2786
2787impl<Key, Value> ExactSizeIterator for EntryValuesDrain<'_, Key, Value> {}
2788
2789impl<Key, Value> FusedIterator for EntryValuesDrain<'_, Key, Value> {}
2790
2791impl<Key, Value> Iterator for EntryValuesDrain<'_, Key, Value> {
2792 type Item = Value;
2793
2794 fn next(&mut self) -> Option<Self::Item> {
2795 if self.remaining == 0 {
2796 None
2797 } else {
2798 self.head_index.map(|index| {
2799 let entry = self.values.remove(index).unwrap();
2800 self.head_index = entry.next_index;
2801 self.remaining -= 1;
2802 entry.value
2803 })
2804 }
2805 }
2806
2807 fn size_hint(&self) -> (usize, Option<usize>) {
2808 (self.remaining, Some(self.remaining))
2809 }
2810}
2811
2812pub struct EntryValuesMut<'map, Key, Value> {
2815 head_index: Option<Index<ValueEntry<Key, Value>>>,
2817
2818 phantom: PhantomData<&'map mut VecList<ValueEntry<Key, Value>>>,
2820
2821 remaining: usize,
2823
2824 tail_index: Option<Index<ValueEntry<Key, Value>>>,
2826
2827 values: *mut VecList<ValueEntry<Key, Value>>,
2829}
2830
2831impl<'map, Key, Value> EntryValuesMut<'map, Key, Value> {
2832 #[must_use]
2834 fn empty(values: &'map mut VecList<ValueEntry<Key, Value>>) -> Self {
2835 EntryValuesMut {
2836 head_index: None,
2837 phantom: PhantomData,
2838 remaining: 0,
2839 tail_index: None,
2840 values,
2841 }
2842 }
2843
2844 #[must_use]
2846 fn from_map_entry(
2847 values: &'map mut VecList<ValueEntry<Key, Value>>,
2848 map_entry: &MapEntry<Key, Value>,
2849 ) -> Self {
2850 EntryValuesMut {
2851 head_index: Some(map_entry.head_index),
2852 phantom: PhantomData,
2853 remaining: map_entry.length,
2854 tail_index: Some(map_entry.tail_index),
2855 values,
2856 }
2857 }
2858
2859 #[must_use]
2861 pub fn iter(&self) -> EntryValues<'_, Key, Value> {
2862 EntryValues {
2863 head_index: self.head_index,
2864 remaining: self.remaining,
2865 tail_index: self.tail_index,
2866 values: unsafe { &*self.values },
2867 }
2868 }
2869}
2870
2871impl<Key, Value> Debug for EntryValuesMut<'_, Key, Value>
2872where
2873 Value: Debug,
2874{
2875 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
2876 formatter.write_str("EntryValuesMut(")?;
2877 formatter.debug_list().entries(self.iter()).finish()?;
2878 formatter.write_str(")")
2879 }
2880}
2881
2882impl<Key, Value> DoubleEndedIterator for EntryValuesMut<'_, Key, Value> {
2883 fn next_back(&mut self) -> Option<Self::Item> {
2884 if self.remaining == 0 {
2885 None
2886 } else {
2887 self.tail_index.map(|index| {
2888 let entry = unsafe { (*self.values).get_mut(index) }.unwrap();
2889 self.tail_index = entry.previous_index;
2890 self.remaining -= 1;
2891 &mut entry.value
2892 })
2893 }
2894 }
2895}
2896
2897impl<Key, Value> ExactSizeIterator for EntryValuesMut<'_, Key, Value> {}
2898
2899impl<Key, Value> FusedIterator for EntryValuesMut<'_, Key, Value> {}
2900
2901impl<'map, Key, Value> Iterator for EntryValuesMut<'map, Key, Value> {
2902 type Item = &'map mut Value;
2903
2904 fn next(&mut self) -> Option<Self::Item> {
2905 if self.remaining == 0 {
2906 None
2907 } else {
2908 self.head_index.map(|index| {
2909 let entry = unsafe { (*self.values).get_mut(index) }.unwrap();
2910 self.head_index = entry.next_index;
2911 self.remaining -= 1;
2912 &mut entry.value
2913 })
2914 }
2915 }
2916
2917 fn size_hint(&self) -> (usize, Option<usize>) {
2918 (self.remaining, Some(self.remaining))
2919 }
2920}
2921
2922unsafe impl<Key, Value> Send for EntryValuesMut<'_, Key, Value>
2923where
2924 Key: Send,
2925 Value: Send,
2926{
2927}
2928
2929unsafe impl<Key, Value> Sync for EntryValuesMut<'_, Key, Value>
2930where
2931 Key: Sync,
2932 Value: Sync,
2933{
2934}
2935
2936pub struct IntoIter<Key, Value> {
2940 keys: VecList<Key>,
2942
2943 iter: VecListIntoIter<ValueEntry<Key, Value>>,
2945}
2946
2947impl<Key, Value> IntoIter<Key, Value> {
2948 #[must_use]
2950 pub fn iter(&self) -> Iter<'_, Key, Value> {
2951 Iter {
2952 keys: &self.keys,
2953 iter: self.iter.iter(),
2954 }
2955 }
2956}
2957
2958impl<Key, Value> Debug for IntoIter<Key, Value>
2959where
2960 Key: Debug,
2961 Value: Debug,
2962{
2963 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
2964 formatter.write_str("IntoIter(")?;
2965 formatter.debug_list().entries(self.iter()).finish()?;
2966 formatter.write_str(")")
2967 }
2968}
2969
2970impl<Key, Value> DoubleEndedIterator for IntoIter<Key, Value>
2971where
2972 Key: Clone,
2973{
2974 fn next_back(&mut self) -> Option<Self::Item> {
2975 let value_entry = self.iter.next_back()?;
2976 let key = self.keys.get(value_entry.key_index).cloned().unwrap();
2977 Some((key, value_entry.value))
2978 }
2979}
2980
2981impl<Key, Value> ExactSizeIterator for IntoIter<Key, Value> where Key: Clone {}
2982
2983impl<Key, Value> FusedIterator for IntoIter<Key, Value> where Key: Clone {}
2984
2985impl<Key, Value> Iterator for IntoIter<Key, Value>
2986where
2987 Key: Clone,
2988{
2989 type Item = (Key, Value);
2990
2991 fn next(&mut self) -> Option<Self::Item> {
2992 let value_entry = self.iter.next()?;
2993 let key = self.keys.get(value_entry.key_index).cloned().unwrap();
2994 Some((key, value_entry.value))
2995 }
2996
2997 fn size_hint(&self) -> (usize, Option<usize>) {
2998 self.iter.size_hint()
2999 }
3000}
3001
3002pub struct Iter<'map, Key, Value> {
3005 keys: &'map VecList<Key>,
3007
3008 iter: VecListIter<'map, ValueEntry<Key, Value>>,
3010}
3011
3012impl<'map, Key, Value> Clone for Iter<'map, Key, Value> {
3013 fn clone(&self) -> Iter<'map, Key, Value> {
3014 Iter {
3015 keys: self.keys,
3016 iter: self.iter.clone(),
3017 }
3018 }
3019}
3020
3021impl<Key, Value> Debug for Iter<'_, Key, Value>
3022where
3023 Key: Debug,
3024 Value: Debug,
3025{
3026 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
3027 formatter.write_str("Iter(")?;
3028 formatter.debug_list().entries(self.clone()).finish()?;
3029 formatter.write_str(")")
3030 }
3031}
3032
3033impl<Key, Value> DoubleEndedIterator for Iter<'_, Key, Value> {
3034 fn next_back(&mut self) -> Option<Self::Item> {
3035 let value_entry = self.iter.next_back()?;
3036 let key = self.keys.get(value_entry.key_index).unwrap();
3037 Some((key, &value_entry.value))
3038 }
3039}
3040
3041impl<Key, Value> ExactSizeIterator for Iter<'_, Key, Value> {}
3042
3043impl<Key, Value> FusedIterator for Iter<'_, Key, Value> {}
3044
3045impl<'map, Key, Value> Iterator for Iter<'map, Key, Value> {
3046 type Item = (&'map Key, &'map Value);
3047
3048 fn next(&mut self) -> Option<Self::Item> {
3049 let value_entry = self.iter.next()?;
3050 let key = self.keys.get(value_entry.key_index).unwrap();
3051 Some((key, &value_entry.value))
3052 }
3053
3054 fn size_hint(&self) -> (usize, Option<usize>) {
3055 self.iter.size_hint()
3056 }
3057}
3058
3059pub struct IterMut<'map, Key, Value> {
3062 keys: &'map VecList<Key>,
3064
3065 iter: VecListIterMut<'map, ValueEntry<Key, Value>>,
3067}
3068
3069impl<Key, Value> IterMut<'_, Key, Value> {
3070 #[must_use]
3072 pub fn iter(&self) -> Iter<'_, Key, Value> {
3073 Iter {
3074 keys: self.keys,
3075 iter: self.iter.iter(),
3076 }
3077 }
3078}
3079
3080impl<Key, Value> Debug for IterMut<'_, Key, Value>
3081where
3082 Key: Debug,
3083 Value: Debug,
3084{
3085 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
3086 formatter.write_str("IterMut(")?;
3087 formatter.debug_list().entries(self.iter()).finish()?;
3088 formatter.write_str(")")
3089 }
3090}
3091
3092impl<Key, Value> DoubleEndedIterator for IterMut<'_, Key, Value> {
3093 fn next_back(&mut self) -> Option<Self::Item> {
3094 let value_entry = self.iter.next_back()?;
3095 let key = self.keys.get(value_entry.key_index).unwrap();
3096 Some((key, &mut value_entry.value))
3097 }
3098}
3099
3100impl<Key, Value> ExactSizeIterator for IterMut<'_, Key, Value> {}
3101
3102impl<Key, Value> FusedIterator for IterMut<'_, Key, Value> {}
3103
3104impl<'map, Key, Value> Iterator for IterMut<'map, Key, Value> {
3105 type Item = (&'map Key, &'map mut Value);
3106
3107 fn next(&mut self) -> Option<Self::Item> {
3108 let value_entry = self.iter.next()?;
3109 let key = self.keys.get(value_entry.key_index).unwrap();
3110 Some((key, &mut value_entry.value))
3111 }
3112
3113 fn size_hint(&self) -> (usize, Option<usize>) {
3114 self.iter.size_hint()
3115 }
3116}
3117
3118pub struct KeyValues<'map, Key, Value, State = RandomState> {
3121 build_hasher: &'map State,
3123
3124 keys: &'map VecList<Key>,
3126
3127 iter: VecListIter<'map, Key>,
3129
3130 map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
3132
3133 values: &'map VecList<ValueEntry<Key, Value>>,
3135}
3136
3137impl<'map, Key, Value, State> Clone for KeyValues<'map, Key, Value, State> {
3138 fn clone(&self) -> KeyValues<'map, Key, Value, State> {
3139 KeyValues {
3140 build_hasher: self.build_hasher,
3141 keys: self.keys,
3142 iter: self.iter.clone(),
3143 map: self.map,
3144 values: self.values,
3145 }
3146 }
3147}
3148
3149impl<Key, Value, State> Debug for KeyValues<'_, Key, Value, State>
3150where
3151 Key: Debug + Eq + Hash,
3152 State: BuildHasher,
3153 Value: Debug,
3154{
3155 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
3156 formatter.write_str("KeyValues(")?;
3157 formatter.debug_list().entries(self.clone()).finish()?;
3158 formatter.write_str(")")
3159 }
3160}
3161
3162impl<Key, Value, State> DoubleEndedIterator for KeyValues<'_, Key, Value, State>
3163where
3164 Key: Eq + Hash,
3165 State: BuildHasher,
3166{
3167 fn next_back(&mut self) -> Option<Self::Item> {
3168 let key = self.iter.next_back()?;
3169 let hash = hash_key(self.build_hasher, key);
3170 let (_, map_entry) = raw_entry(self.keys, self.map, hash, key).unwrap();
3171 let iter = EntryValues::from_map_entry(self.values, map_entry);
3172 Some((key, iter))
3173 }
3174}
3175
3176impl<Key, Value, State> ExactSizeIterator for KeyValues<'_, Key, Value, State>
3177where
3178 Key: Eq + Hash,
3179 State: BuildHasher,
3180{
3181}
3182
3183impl<Key, Value, State> FusedIterator for KeyValues<'_, Key, Value, State>
3184where
3185 Key: Eq + Hash,
3186 State: BuildHasher,
3187{
3188}
3189
3190impl<'map, Key, Value, State> Iterator for KeyValues<'map, Key, Value, State>
3191where
3192 Key: Eq + Hash,
3193 State: BuildHasher,
3194{
3195 type Item = (&'map Key, EntryValues<'map, Key, Value>);
3196
3197 fn next(&mut self) -> Option<Self::Item> {
3198 let key = self.iter.next()?;
3199 let hash = hash_key(self.build_hasher, key);
3200 let (_, map_entry) = raw_entry(self.keys, self.map, hash, key).unwrap();
3201 let iter = EntryValues::from_map_entry(self.values, map_entry);
3202 Some((key, iter))
3203 }
3204
3205 fn size_hint(&self) -> (usize, Option<usize>) {
3206 self.iter.size_hint()
3207 }
3208}
3209
3210pub struct KeyValuesMut<'map, Key, Value, State = RandomState> {
3213 build_hasher: &'map State,
3215
3216 keys: &'map VecList<Key>,
3218
3219 iter: VecListIter<'map, Key>,
3221
3222 map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
3224
3225 values: *mut VecList<ValueEntry<Key, Value>>,
3227}
3228
3229impl<Key, Value, State> KeyValuesMut<'_, Key, Value, State> {
3230 #[must_use]
3232 pub fn iter(&self) -> KeyValues<'_, Key, Value, State> {
3233 KeyValues {
3234 build_hasher: self.build_hasher,
3235 keys: self.keys,
3236 iter: self.iter.clone(),
3237 map: self.map,
3238 values: unsafe { &*self.values },
3239 }
3240 }
3241}
3242
3243impl<Key, Value, State> Debug for KeyValuesMut<'_, Key, Value, State>
3244where
3245 Key: Debug + Eq + Hash,
3246 State: BuildHasher,
3247 Value: Debug,
3248{
3249 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
3250 formatter.write_str("KeyValuesMut(")?;
3251 formatter.debug_list().entries(self.iter()).finish()?;
3252 formatter.write_str(")")
3253 }
3254}
3255
3256impl<Key, Value, State> DoubleEndedIterator for KeyValuesMut<'_, Key, Value, State>
3257where
3258 Key: Eq + Hash,
3259 State: BuildHasher,
3260{
3261 fn next_back(&mut self) -> Option<Self::Item> {
3262 let key = self.iter.next_back()?;
3263 let hash = hash_key(self.build_hasher, key);
3264 let (_, map_entry) = raw_entry(self.keys, self.map, hash, key).unwrap();
3265 let iter = EntryValuesMut::from_map_entry(unsafe { &mut *self.values }, map_entry);
3266 Some((key, iter))
3267 }
3268}
3269
3270impl<Key, Value, State> ExactSizeIterator for KeyValuesMut<'_, Key, Value, State>
3271where
3272 Key: Eq + Hash,
3273 State: BuildHasher,
3274{
3275}
3276
3277impl<Key, Value, State> FusedIterator for KeyValuesMut<'_, Key, Value, State>
3278where
3279 Key: Eq + Hash,
3280 State: BuildHasher,
3281{
3282}
3283
3284impl<'map, Key, Value, State> Iterator for KeyValuesMut<'map, Key, Value, State>
3285where
3286 Key: Eq + Hash,
3287 State: BuildHasher,
3288{
3289 type Item = (&'map Key, EntryValuesMut<'map, Key, Value>);
3290
3291 fn next(&mut self) -> Option<Self::Item> {
3292 let key = self.iter.next()?;
3293 let hash = hash_key(self.build_hasher, key);
3294 let (_, map_entry) = raw_entry(self.keys, self.map, hash, key).unwrap();
3295 let iter = EntryValuesMut::from_map_entry(unsafe { &mut *self.values }, map_entry);
3296 Some((key, iter))
3297 }
3298
3299 fn size_hint(&self) -> (usize, Option<usize>) {
3300 self.iter.size_hint()
3301 }
3302}
3303
3304unsafe impl<Key, Value> Send for KeyValuesMut<'_, Key, Value>
3305where
3306 Key: Send,
3307 Value: Send,
3308{
3309}
3310
3311unsafe impl<Key, Value> Sync for KeyValuesMut<'_, Key, Value>
3312where
3313 Key: Sync,
3314 Value: Sync,
3315{
3316}
3317
3318pub struct Keys<'map, Key>(VecListIter<'map, Key>);
3321
3322impl<'map, Key> Clone for Keys<'map, Key> {
3323 fn clone(&self) -> Keys<'map, Key> {
3324 Keys(self.0.clone())
3325 }
3326}
3327
3328impl<Key> Debug for Keys<'_, Key>
3329where
3330 Key: Debug,
3331{
3332 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
3333 formatter.write_str("Keys(")?;
3334 formatter.debug_list().entries(self.clone()).finish()?;
3335 formatter.write_str(")")
3336 }
3337}
3338
3339impl<Key> DoubleEndedIterator for Keys<'_, Key> {
3340 fn next_back(&mut self) -> Option<Self::Item> {
3341 self.0.next_back()
3342 }
3343}
3344
3345impl<Key> ExactSizeIterator for Keys<'_, Key> {}
3346
3347impl<Key> FusedIterator for Keys<'_, Key> {}
3348
3349impl<'map, Key> Iterator for Keys<'map, Key> {
3350 type Item = &'map Key;
3351
3352 fn next(&mut self) -> Option<Self::Item> {
3353 self.0.next()
3354 }
3355
3356 fn size_hint(&self) -> (usize, Option<usize>) {
3357 self.0.size_hint()
3358 }
3359}
3360
3361pub struct Values<'map, Key, Value>(VecListIter<'map, ValueEntry<Key, Value>>);
3364
3365impl<'map, Key, Value> Clone for Values<'map, Key, Value> {
3366 fn clone(&self) -> Values<'map, Key, Value> {
3367 Values(self.0.clone())
3368 }
3369}
3370
3371impl<Key, Value> Debug for Values<'_, Key, Value>
3372where
3373 Key: Debug,
3374 Value: Debug,
3375{
3376 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
3377 formatter.write_str("Values(")?;
3378 formatter.debug_list().entries(self.clone()).finish()?;
3379 formatter.write_str(")")
3380 }
3381}
3382
3383impl<Key, Value> DoubleEndedIterator for Values<'_, Key, Value> {
3384 fn next_back(&mut self) -> Option<Self::Item> {
3385 self.0.next_back().map(|entry| &entry.value)
3386 }
3387}
3388
3389impl<Key, Value> ExactSizeIterator for Values<'_, Key, Value> {}
3390
3391impl<Key, Value> FusedIterator for Values<'_, Key, Value> {}
3392
3393impl<'map, Key, Value> Iterator for Values<'map, Key, Value> {
3394 type Item = &'map Value;
3395
3396 fn next(&mut self) -> Option<Self::Item> {
3397 self.0.next().map(|entry| &entry.value)
3398 }
3399
3400 fn size_hint(&self) -> (usize, Option<usize>) {
3401 self.0.size_hint()
3402 }
3403}
3404
3405pub struct ValuesMut<'map, Key, Value>(VecListIterMut<'map, ValueEntry<Key, Value>>);
3408
3409impl<Key, Value> ValuesMut<'_, Key, Value> {
3410 #[must_use]
3412 pub fn iter(&self) -> Values<'_, Key, Value> {
3413 Values(self.0.iter())
3414 }
3415}
3416
3417impl<Key, Value> Debug for ValuesMut<'_, Key, Value>
3418where
3419 Key: Debug,
3420 Value: Debug,
3421{
3422 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
3423 formatter.write_str("ValuesMut(")?;
3424 formatter.debug_list().entries(self.iter()).finish()?;
3425 formatter.write_str(")")
3426 }
3427}
3428
3429impl<Key, Value> DoubleEndedIterator for ValuesMut<'_, Key, Value> {
3430 fn next_back(&mut self) -> Option<Self::Item> {
3431 self.0.next_back().map(|entry| &mut entry.value)
3432 }
3433}
3434
3435impl<Key, Value> ExactSizeIterator for ValuesMut<'_, Key, Value> {}
3436
3437impl<Key, Value> FusedIterator for ValuesMut<'_, Key, Value> {}
3438
3439impl<'map, Key, Value> Iterator for ValuesMut<'map, Key, Value> {
3440 type Item = &'map mut Value;
3441
3442 fn next(&mut self) -> Option<Self::Item> {
3443 self.0.next().map(|entry| &mut entry.value)
3444 }
3445
3446 fn size_hint(&self) -> (usize, Option<usize>) {
3447 self.0.size_hint()
3448 }
3449}
3450
3451#[derive(Clone, Debug)]
3453pub(crate) struct DummyState;
3454
3455impl BuildHasher for DummyState {
3456 type Hasher = DummyHasher;
3457
3458 fn build_hasher(&self) -> Self::Hasher {
3459 DummyHasher
3460 }
3461}
3462
3463#[derive(Clone, Debug)]
3465pub struct DummyHasher;
3466
3467impl Hasher for DummyHasher {
3468 fn finish(&self) -> u64 {
3469 unimplemented!();
3470 }
3471
3472 fn write(&mut self, _: &[u8]) {
3473 unimplemented!();
3474 }
3475}
3476
3477#[must_use]
3479fn hash_key<KeyQuery, State>(state: &State, key: &KeyQuery) -> u64
3480where
3481 KeyQuery: ?Sized + Eq + Hash,
3482 State: BuildHasher,
3483{
3484 let mut hasher = state.build_hasher();
3485 key.hash(&mut hasher);
3486 hasher.finish()
3487}
3488
3489#[must_use]
3490fn raw_entry<'map, Key, KeyQuery, Value, State>(
3491 keys: &VecList<Key>,
3492 map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, State>,
3493 hash: u64,
3494 key: &KeyQuery,
3495) -> Option<(&'map Index<Key>, &'map MapEntry<Key, Value>)>
3496where
3497 Key: Borrow<KeyQuery> + Eq + Hash,
3498 KeyQuery: ?Sized + Eq + Hash,
3499 State: BuildHasher,
3500{
3501 map.raw_entry().from_hash(hash, |&key_index| {
3502 let existing_key = keys.get(key_index).unwrap();
3503 key == existing_key.borrow()
3504 })
3505}
3506
3507#[must_use]
3508fn raw_entry_mut<'map, Key, KeyQuery, Value, State>(
3509 keys: &VecList<Key>,
3510 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, State>,
3511 hash: u64,
3512 key: &KeyQuery,
3513) -> RawEntryMut<'map, Index<Key>, MapEntry<Key, Value>, State>
3514where
3515 Key: Borrow<KeyQuery> + Eq + Hash,
3516 KeyQuery: ?Sized + Eq + Hash,
3517 State: BuildHasher,
3518{
3519 map.raw_entry_mut().from_hash(hash, |&key_index| {
3520 let existing_key = keys.get(key_index).unwrap();
3521 key == existing_key.borrow()
3522 })
3523}
3524
3525#[must_use]
3526fn raw_entry_mut_empty<'map, Key, KeyQuery, Value, State>(
3527 keys: &VecList<Key>,
3528 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, State>,
3529 hash: u64,
3530) -> RawEntryMut<'map, Index<Key>, MapEntry<Key, Value>, State>
3531where
3532 Key: Borrow<KeyQuery> + Eq + Hash,
3533 KeyQuery: ?Sized + Eq + Hash,
3534 State: BuildHasher,
3535{
3536 map
3537 .raw_entry_mut()
3538 .from_hash(hash, |&key_index| keys.get(key_index).is_none())
3539}
3540
3541#[allow(unused_results)]
3542#[cfg(all(test, feature = "std"))]
3543mod test {
3544 use coverage_helper::test;
3545
3546 use super::*;
3547
3548 #[test]
3549 fn test_bounds() {
3550 fn check_bounds<Type: Send + Sync>() {}
3551
3552 check_bounds::<EntryValues<'static, (), ()>>();
3553 check_bounds::<EntryValuesDrain<'static, (), ()>>();
3554 check_bounds::<EntryValuesMut<'static, (), ()>>();
3555 check_bounds::<IntoIter<(), ()>>();
3556 check_bounds::<Iter<'static, (), ()>>();
3557 check_bounds::<IterMut<'static, (), ()>>();
3558 check_bounds::<KeyValues<'static, (), ()>>();
3559 check_bounds::<KeyValuesMut<'static, (), ()>>();
3560 check_bounds::<ListOrderedMultimap<(), ()>>();
3561 check_bounds::<Values<'static, (), ()>>();
3562 check_bounds::<ValuesMut<'static, (), ()>>();
3563 }
3564
3565 #[test]
3566 fn test_collision() {
3567 struct TestBuildHasher;
3568
3569 impl BuildHasher for TestBuildHasher {
3570 type Hasher = TestHasher;
3571
3572 fn build_hasher(&self) -> Self::Hasher {
3573 TestHasher
3574 }
3575 }
3576
3577 struct TestHasher;
3578
3579 impl Hasher for TestHasher {
3580 fn finish(&self) -> u64 {
3581 0
3582 }
3583
3584 fn write(&mut self, _: &[u8]) {}
3585 }
3586
3587 let mut map = ListOrderedMultimap::with_hasher(TestBuildHasher);
3588 let state = map.hasher();
3589
3590 assert_eq!(hash_key(state, "key1"), hash_key(state, "key2"));
3591
3592 map.insert("key1", "value1");
3593 assert_eq!(map.get(&"key1"), Some(&"value1"));
3594
3595 map.insert("key2", "value2");
3596 assert_eq!(map.get(&"key2"), Some(&"value2"));
3597 }
3598
3599 #[test]
3600 fn test_no_collision() {
3601 let state = RandomState::new();
3602 let hash_1 = hash_key(&state, "key1");
3603 let hash_2 = hash_key(&state, "key2");
3604
3605 assert!(hash_1 != hash_2);
3606 }
3607
3608 #[test]
3609 fn test_entry_and_modify() {
3610 let mut map = ListOrderedMultimap::new();
3611 map
3612 .entry("key")
3613 .and_modify(|_| panic!("entry should be vacant"));
3614
3615 map.insert("key", "value1");
3616 map.entry("key").and_modify(|value| *value = "value2");
3617 assert_eq!(map.get(&"key"), Some(&"value2"));
3618 }
3619
3620 #[test]
3621 fn test_entry_or_insert() {
3622 let mut map = ListOrderedMultimap::new();
3623 let value = map.entry("key").or_insert("value1");
3624 assert_eq!(value, &"value1");
3625
3626 let value = map.entry("key").or_insert("value2");
3627 assert_eq!(value, &"value1");
3628 }
3629
3630 #[test]
3631 fn test_entry_or_insert_entry() {
3632 let mut map = ListOrderedMultimap::new();
3633 let entry = map.entry("key").or_insert_entry("value1");
3634 assert_eq!(entry.get(), &"value1");
3635
3636 let entry = map.entry("key").or_insert_entry("value2");
3637 assert_eq!(entry.get(), &"value1");
3638 }
3639
3640 #[test]
3641 fn test_entry_or_insert_with() {
3642 let mut map = ListOrderedMultimap::new();
3643 let value = map.entry("key").or_insert_with(|| "value1");
3644 assert_eq!(value, &"value1");
3645
3646 let value = map.entry("key").or_insert_with(|| "value2");
3647 assert_eq!(value, &"value1");
3648 }
3649
3650 #[test]
3651 fn test_entry_or_insert_with_entry() {
3652 let mut map = ListOrderedMultimap::new();
3653 let entry = map.entry("key").or_insert_with_entry(|| "value1");
3654 assert_eq!(entry.get(), &"value1");
3655
3656 let entry = map.entry("key").or_insert_with_entry(|| "value2");
3657 assert_eq!(entry.get(), &"value1");
3658 }
3659
3660 #[test]
3661 fn test_entry_debug() {
3662 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3663 let entry = map.entry("key");
3664
3665 assert_eq!(format!("{entry:?}"), r#"VacantEntry("key")"#);
3666 }
3667
3668 #[test]
3669 fn test_entry_values_debug() {
3670 let mut map = ListOrderedMultimap::new();
3671
3672 map.insert("key", "value1");
3673 map.append("key", "value2");
3674 map.append("key", "value3");
3675 map.append("key", "value4");
3676
3677 let iter = map.get_all(&"key");
3678 assert_eq!(
3679 format!("{iter:?}"),
3680 r#"EntryValues(["value1", "value2", "value3", "value4"])"#
3681 );
3682 }
3683
3684 #[test]
3685 fn test_entry_values_double_ended() {
3686 let mut map = ListOrderedMultimap::new();
3687
3688 map.insert("key", "value1");
3689 map.append("key", "value2");
3690 map.append("key", "value3");
3691 map.append("key", "value4");
3692
3693 let mut iter = map.get_all(&"key");
3694 assert_eq!(iter.next(), Some(&"value1"));
3695 assert_eq!(iter.next_back(), Some(&"value4"));
3696 assert_eq!(iter.next(), Some(&"value2"));
3697 assert_eq!(iter.next_back(), Some(&"value3"));
3698 assert_eq!(iter.next(), None);
3699 }
3700
3701 #[test]
3702 fn test_entry_values_drain_debug() {
3703 let mut map = ListOrderedMultimap::new();
3704
3705 map.insert("key", "value1");
3706 map.append("key", "value2");
3707 map.append("key", "value3");
3708 map.append("key", "value4");
3709
3710 let iter = map.remove_all(&"key");
3711 assert_eq!(
3712 format!("{iter:?}"),
3713 r#"EntryValuesDrain(["value1", "value2", "value3", "value4"])"#
3714 );
3715 }
3716
3717 #[test]
3718 fn test_entry_values_drain_double_ended() {
3719 let mut map = ListOrderedMultimap::new();
3720
3721 map.insert("key", "value1");
3722 map.append("key", "value2");
3723 map.append("key", "value3");
3724 map.append("key", "value4");
3725
3726 let mut iter = map.remove_all(&"key");
3727 assert_eq!(iter.next(), Some("value1"));
3728 assert_eq!(iter.next_back(), Some("value4"));
3729 assert_eq!(iter.next(), Some("value2"));
3730 assert_eq!(iter.next_back(), Some("value3"));
3731 assert_eq!(iter.next(), None);
3732 }
3733
3734 #[test]
3735 fn test_entry_values_drain_empty() {
3736 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3737 let mut iter = map.remove_all(&"key");
3738 assert_eq!(iter.next_back(), None);
3739 assert_eq!(iter.next(), None);
3740 }
3741
3742 #[test]
3743 fn test_entry_values_drain_fused() {
3744 let mut map = ListOrderedMultimap::new();
3745
3746 map.insert("key", "value");
3747
3748 let mut iter = map.remove_all(&"key");
3749 assert_eq!(iter.next(), Some("value"));
3750 assert_eq!(iter.next(), None);
3751 assert_eq!(iter.next_back(), None);
3752 assert_eq!(iter.next(), None);
3753 assert_eq!(iter.next_back(), None);
3754 assert_eq!(iter.next(), None);
3755 }
3756
3757 #[test]
3758 fn test_entry_values_drain_size_hint() {
3759 let mut map = ListOrderedMultimap::new();
3760
3761 map.insert("key", "value1");
3762 map.append("key", "value2");
3763 map.append("key", "value3");
3764 map.append("key", "value4");
3765
3766 let mut iter = map.remove_all(&"key");
3767 assert_eq!(iter.size_hint(), (4, Some(4)));
3768 iter.next();
3769 assert_eq!(iter.size_hint(), (3, Some(3)));
3770 iter.next();
3771 assert_eq!(iter.size_hint(), (2, Some(2)));
3772 iter.next();
3773 assert_eq!(iter.size_hint(), (1, Some(1)));
3774 iter.next();
3775 assert_eq!(iter.size_hint(), (0, Some(0)));
3776 }
3777
3778 #[test]
3779 fn test_entry_values_empty() {
3780 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3781 let mut iter = map.get_all(&"key");
3782 assert_eq!(iter.next_back(), None);
3783 assert_eq!(iter.next(), None);
3784 }
3785
3786 #[test]
3787 fn test_entry_values_fused() {
3788 let mut map = ListOrderedMultimap::new();
3789
3790 map.insert("key", "value");
3791
3792 let mut iter = map.get_all(&"key");
3793 assert_eq!(iter.next(), Some(&"value"));
3794 assert_eq!(iter.next(), None);
3795 assert_eq!(iter.next_back(), None);
3796 assert_eq!(iter.next(), None);
3797 assert_eq!(iter.next_back(), None);
3798 assert_eq!(iter.next(), None);
3799 }
3800
3801 #[test]
3802 fn test_entry_values_mut_debug() {
3803 let mut map = ListOrderedMultimap::new();
3804
3805 map.insert("key", "value1");
3806 map.append("key", "value2");
3807 map.append("key", "value3");
3808 map.append("key", "value4");
3809
3810 let iter = map.get_all_mut(&"key");
3811 assert_eq!(
3812 format!("{iter:?}"),
3813 r#"EntryValuesMut(["value1", "value2", "value3", "value4"])"#
3814 );
3815 }
3816
3817 #[test]
3818 fn test_entry_values_mut_double_ended() {
3819 let mut map = ListOrderedMultimap::new();
3820
3821 map.insert("key", "value1");
3822 map.append("key", "value2");
3823 map.append("key", "value3");
3824 map.append("key", "value4");
3825
3826 let mut iter = map.get_all_mut(&"key");
3827 assert_eq!(iter.next(), Some(&mut "value1"));
3828 assert_eq!(iter.next_back(), Some(&mut "value4"));
3829 assert_eq!(iter.next(), Some(&mut "value2"));
3830 assert_eq!(iter.next_back(), Some(&mut "value3"));
3831 assert_eq!(iter.next(), None);
3832 }
3833
3834 #[test]
3835 fn test_entry_values_mut_empty() {
3836 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3837 let mut iter = map.get_all_mut(&"key");
3838 assert_eq!(iter.next_back(), None);
3839 assert_eq!(iter.next(), None);
3840 }
3841
3842 #[test]
3843 fn test_entry_values_mut_fused() {
3844 let mut map = ListOrderedMultimap::new();
3845
3846 map.insert("key", "value");
3847
3848 let mut iter = map.get_all_mut(&"key");
3849 assert_eq!(iter.next(), Some(&mut "value"));
3850 assert_eq!(iter.next(), None);
3851 assert_eq!(iter.next_back(), None);
3852 assert_eq!(iter.next(), None);
3853 assert_eq!(iter.next_back(), None);
3854 assert_eq!(iter.next(), None);
3855 }
3856
3857 #[test]
3858 fn test_entry_values_mut_size_hint() {
3859 let mut map = ListOrderedMultimap::new();
3860
3861 map.insert("key", "value1");
3862 map.append("key", "value2");
3863 map.append("key", "value3");
3864 map.append("key", "value4");
3865
3866 let mut iter = map.get_all_mut(&"key");
3867 assert_eq!(iter.size_hint(), (4, Some(4)));
3868 iter.next();
3869 assert_eq!(iter.size_hint(), (3, Some(3)));
3870 iter.next();
3871 assert_eq!(iter.size_hint(), (2, Some(2)));
3872 iter.next();
3873 assert_eq!(iter.size_hint(), (1, Some(1)));
3874 iter.next();
3875 assert_eq!(iter.size_hint(), (0, Some(0)));
3876 }
3877
3878 #[test]
3879 fn test_entry_values_size_hint() {
3880 let mut map = ListOrderedMultimap::new();
3881
3882 map.insert("key", "value1");
3883 map.append("key", "value2");
3884 map.append("key", "value3");
3885 map.append("key", "value4");
3886
3887 let mut iter = map.get_all(&"key");
3888 assert_eq!(iter.size_hint(), (4, Some(4)));
3889 iter.next();
3890 assert_eq!(iter.size_hint(), (3, Some(3)));
3891 iter.next();
3892 assert_eq!(iter.size_hint(), (2, Some(2)));
3893 iter.next();
3894 assert_eq!(iter.size_hint(), (1, Some(1)));
3895 iter.next();
3896 assert_eq!(iter.size_hint(), (0, Some(0)));
3897 }
3898
3899 #[test]
3900 fn test_iter_debug() {
3901 let mut map = ListOrderedMultimap::new();
3902
3903 map.insert("key1", "value1");
3904 map.append("key2", "value2");
3905 map.append("key2", "value3");
3906 map.append("key1", "value4");
3907
3908 let iter = map.iter();
3909 assert_eq!(
3910 format!("{iter:?}"),
3911 r#"Iter([("key1", "value1"), ("key2", "value2"), ("key2", "value3"), ("key1", "value4")])"#
3912 );
3913 }
3914
3915 #[test]
3916 fn test_iter_double_ended() {
3917 let mut map = ListOrderedMultimap::new();
3918
3919 map.insert("key1", "value1");
3920 map.append("key2", "value2");
3921 map.append("key2", "value3");
3922 map.append("key1", "value4");
3923
3924 let mut iter = map.iter();
3925 assert_eq!(iter.next(), Some((&"key1", &"value1")));
3926 assert_eq!(iter.next_back(), Some((&"key1", &"value4")));
3927 assert_eq!(iter.next(), Some((&"key2", &"value2")));
3928 assert_eq!(iter.next_back(), Some((&"key2", &"value3")));
3929 assert_eq!(iter.next(), None);
3930 }
3931
3932 #[test]
3933 fn test_iter_empty() {
3934 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3935 let mut iter = map.iter();
3936 assert_eq!(iter.next_back(), None);
3937 assert_eq!(iter.next(), None);
3938 }
3939
3940 #[test]
3941 fn test_iter_fused() {
3942 let mut map = ListOrderedMultimap::new();
3943
3944 map.insert("key", "value");
3945
3946 let mut iter = map.iter();
3947 assert_eq!(iter.next(), Some((&"key", &"value")));
3948 assert_eq!(iter.next(), None);
3949 assert_eq!(iter.next_back(), None);
3950 assert_eq!(iter.next(), None);
3951 assert_eq!(iter.next_back(), None);
3952 assert_eq!(iter.next(), None);
3953 }
3954
3955 #[test]
3956 fn test_iter_mut_debug() {
3957 let mut map = ListOrderedMultimap::new();
3958
3959 map.insert("key1", "value1");
3960 map.append("key2", "value2");
3961 map.append("key2", "value3");
3962 map.append("key1", "value4");
3963
3964 let iter = map.iter_mut();
3965 assert_eq!(
3966 format!("{iter:?}"),
3967 r#"IterMut([("key1", "value1"), ("key2", "value2"), ("key2", "value3"), ("key1", "value4")])"#
3968 );
3969 }
3970
3971 #[test]
3972 fn test_iter_mut_double_ended() {
3973 let mut map = ListOrderedMultimap::new();
3974
3975 map.insert("key1", "value1");
3976 map.append("key2", "value2");
3977 map.append("key2", "value3");
3978 map.append("key1", "value4");
3979
3980 let mut iter = map.iter_mut();
3981 assert_eq!(iter.next(), Some((&"key1", &mut "value1")));
3982 assert_eq!(iter.next_back(), Some((&"key1", &mut "value4")));
3983 assert_eq!(iter.next(), Some((&"key2", &mut "value2")));
3984 assert_eq!(iter.next_back(), Some((&"key2", &mut "value3")));
3985 assert_eq!(iter.next(), None);
3986 }
3987
3988 #[test]
3989 fn test_iter_mut_empty() {
3990 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3991 let mut iter = map.iter_mut();
3992 assert_eq!(iter.next_back(), None);
3993 assert_eq!(iter.next(), None);
3994 }
3995
3996 #[test]
3997 fn test_iter_mut_fused() {
3998 let mut map = ListOrderedMultimap::new();
3999
4000 map.insert("key", "value");
4001
4002 let mut iter = map.iter_mut();
4003 assert_eq!(iter.next(), Some((&"key", &mut "value")));
4004 assert_eq!(iter.next(), None);
4005 assert_eq!(iter.next_back(), None);
4006 assert_eq!(iter.next(), None);
4007 assert_eq!(iter.next_back(), None);
4008 assert_eq!(iter.next(), None);
4009 }
4010
4011 #[test]
4012 fn test_iter_mut_size_hint() {
4013 let mut map = ListOrderedMultimap::new();
4014
4015 map.insert("key1", "value1");
4016 map.append("key2", "value2");
4017 map.append("key2", "value3");
4018 map.append("key1", "value4");
4019
4020 let mut iter = map.iter_mut();
4021 assert_eq!(iter.size_hint(), (4, Some(4)));
4022 iter.next();
4023 assert_eq!(iter.size_hint(), (3, Some(3)));
4024 iter.next();
4025 assert_eq!(iter.size_hint(), (2, Some(2)));
4026 iter.next();
4027 assert_eq!(iter.size_hint(), (1, Some(1)));
4028 iter.next();
4029 assert_eq!(iter.size_hint(), (0, Some(0)));
4030 }
4031
4032 #[test]
4033 fn test_iter_size_hint() {
4034 let mut map = ListOrderedMultimap::new();
4035
4036 map.insert("key1", "value1");
4037 map.append("key2", "value2");
4038 map.append("key2", "value3");
4039 map.append("key1", "value4");
4040
4041 let mut iter = map.iter();
4042 assert_eq!(iter.size_hint(), (4, Some(4)));
4043 iter.next();
4044 assert_eq!(iter.size_hint(), (3, Some(3)));
4045 iter.next();
4046 assert_eq!(iter.size_hint(), (2, Some(2)));
4047 iter.next();
4048 assert_eq!(iter.size_hint(), (1, Some(1)));
4049 iter.next();
4050 assert_eq!(iter.size_hint(), (0, Some(0)));
4051 }
4052
4053 #[test]
4054 fn test_into_iter_debug() {
4055 let mut map = ListOrderedMultimap::new();
4056
4057 map.insert("key1", "value1");
4058 map.append("key2", "value2");
4059 map.append("key2", "value3");
4060 map.append("key1", "value4");
4061
4062 let iter = map.into_iter();
4063 assert_eq!(
4064 format!("{iter:?}"),
4065 r#"IntoIter([("key1", "value1"), ("key2", "value2"), ("key2", "value3"), ("key1", "value4")])"#
4066 );
4067 }
4068
4069 #[test]
4070 fn test_into_iter_double_ended() {
4071 let mut map = ListOrderedMultimap::new();
4072
4073 map.insert("key1", "value1");
4074 map.append("key2", "value2");
4075 map.append("key2", "value3");
4076 map.append("key1", "value4");
4077
4078 let mut iter = map.into_iter();
4079 assert_eq!(iter.next(), Some(("key1", "value1")));
4080 assert_eq!(iter.next_back(), Some(("key1", "value4")));
4081 assert_eq!(iter.next(), Some(("key2", "value2")));
4082 assert_eq!(iter.next_back(), Some(("key2", "value3")));
4083 assert_eq!(iter.next(), None);
4084 }
4085
4086 #[test]
4087 fn test_into_iter_empty() {
4088 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4089 let mut iter = map.into_iter();
4090 assert_eq!(iter.next_back(), None);
4091 assert_eq!(iter.next(), None);
4092 }
4093
4094 #[test]
4095 fn test_into_iter_fused() {
4096 let mut map = ListOrderedMultimap::new();
4097
4098 map.insert("key", "value");
4099
4100 let mut iter = map.into_iter();
4101 assert_eq!(iter.next(), Some(("key", "value")));
4102 assert_eq!(iter.next(), None);
4103 assert_eq!(iter.next_back(), None);
4104 assert_eq!(iter.next(), None);
4105 assert_eq!(iter.next_back(), None);
4106 assert_eq!(iter.next(), None);
4107 }
4108
4109 #[test]
4110 fn test_into_iter_size_hint() {
4111 let mut map = ListOrderedMultimap::new();
4112
4113 map.insert("key1", "value1");
4114 map.append("key2", "value2");
4115 map.append("key2", "value3");
4116 map.append("key1", "value4");
4117
4118 let mut iter = map.into_iter();
4119 assert_eq!(iter.size_hint(), (4, Some(4)));
4120 iter.next();
4121 assert_eq!(iter.size_hint(), (3, Some(3)));
4122 iter.next();
4123 assert_eq!(iter.size_hint(), (2, Some(2)));
4124 iter.next();
4125 assert_eq!(iter.size_hint(), (1, Some(1)));
4126 iter.next();
4127 assert_eq!(iter.size_hint(), (0, Some(0)));
4128 }
4129
4130 #[test]
4131 fn test_key_values_debug() {
4132 let mut map = ListOrderedMultimap::new();
4133
4134 map.insert("key1", "value1");
4135 map.append("key2", "value2");
4136 map.append("key2", "value3");
4137 map.append("key1", "value4");
4138
4139 let iter = map.pairs();
4140 assert_eq!(
4141 format!("{iter:?}"),
4142 r#"KeyValues([("key1", EntryValues(["value1", "value4"])), ("key2", EntryValues(["value2", "value3"]))])"#
4143 );
4144 }
4145
4146 #[test]
4147 fn test_key_values_double_ended() {
4148 let mut map = ListOrderedMultimap::new();
4149
4150 map.insert("key1", "value1");
4151 map.append("key2", "value2");
4152 map.append("key2", "value3");
4153 map.append("key1", "value4");
4154
4155 let mut iter = map.pairs();
4156
4157 let (key, mut values) = iter.next().unwrap();
4158 assert_eq!(key, &"key1");
4159 assert_eq!(values.next(), Some(&"value1"));
4160 assert_eq!(values.next(), Some(&"value4"));
4161 assert_eq!(values.next(), None);
4162
4163 let (key, mut values) = iter.next_back().unwrap();
4164 assert_eq!(key, &"key2");
4165 assert_eq!(values.next(), Some(&"value2"));
4166 assert_eq!(values.next(), Some(&"value3"));
4167 assert_eq!(values.next(), None);
4168
4169 assert!(iter.next().is_none());
4170 assert!(iter.next_back().is_none());
4171 }
4172
4173 #[test]
4174 fn test_key_values_empty() {
4175 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4176 let mut iter = map.pairs();
4177 assert!(iter.next_back().is_none());
4178 assert!(iter.next().is_none());
4179 }
4180
4181 #[test]
4182 fn test_key_values_fused() {
4183 let mut map = ListOrderedMultimap::new();
4184
4185 map.insert("key", "value");
4186
4187 let mut iter = map.pairs();
4188
4189 let (key, mut values) = iter.next().unwrap();
4190 assert_eq!(key, &"key");
4191 assert_eq!(values.next(), Some(&"value"));
4192 assert_eq!(values.next(), None);
4193
4194 assert!(iter.next().is_none());
4195 assert!(iter.next_back().is_none());
4196 assert!(iter.next().is_none());
4197 assert!(iter.next_back().is_none());
4198 assert!(iter.next().is_none());
4199 }
4200
4201 #[test]
4202 fn test_key_values_mut_debug() {
4203 let mut map = ListOrderedMultimap::new();
4204
4205 map.insert("key1", "value1");
4206 map.append("key2", "value2");
4207 map.append("key2", "value3");
4208 map.append("key1", "value4");
4209
4210 let iter = map.pairs_mut();
4211 assert_eq!(
4212 format!("{iter:?}"),
4213 r#"KeyValuesMut([("key1", EntryValues(["value1", "value4"])), ("key2", EntryValues(["value2", "value3"]))])"#
4214 );
4215 }
4216
4217 #[test]
4218 fn test_key_values_mut_double_ended() {
4219 let mut map = ListOrderedMultimap::new();
4220
4221 map.insert("key1", "value1");
4222 map.append("key2", "value2");
4223 map.append("key2", "value3");
4224 map.append("key1", "value4");
4225
4226 let mut iter = map.pairs_mut();
4227
4228 let (key, mut values) = iter.next().unwrap();
4229 assert_eq!(key, &"key1");
4230 assert_eq!(values.next(), Some(&mut "value1"));
4231 assert_eq!(values.next(), Some(&mut "value4"));
4232 assert_eq!(values.next(), None);
4233
4234 let (key, mut values) = iter.next_back().unwrap();
4235 assert_eq!(key, &"key2");
4236 assert_eq!(values.next(), Some(&mut "value2"));
4237 assert_eq!(values.next(), Some(&mut "value3"));
4238 assert_eq!(values.next(), None);
4239
4240 assert!(iter.next().is_none());
4241 assert!(iter.next_back().is_none());
4242 }
4243
4244 #[test]
4245 fn test_key_values_mut_empty() {
4246 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4247 let mut iter = map.pairs_mut();
4248 assert!(iter.next_back().is_none());
4249 assert!(iter.next().is_none());
4250 }
4251
4252 #[test]
4253 fn test_key_values_mut_fused() {
4254 let mut map = ListOrderedMultimap::new();
4255
4256 map.insert("key", "value");
4257
4258 let mut iter = map.pairs_mut();
4259
4260 let (key, mut values) = iter.next().unwrap();
4261 assert_eq!(key, &"key");
4262 assert_eq!(values.next(), Some(&mut "value"));
4263 assert_eq!(values.next(), None);
4264
4265 assert!(iter.next().is_none());
4266 assert!(iter.next_back().is_none());
4267 assert!(iter.next().is_none());
4268 assert!(iter.next_back().is_none());
4269 assert!(iter.next().is_none());
4270 }
4271
4272 #[test]
4273 fn test_key_values_mut_size_hint() {
4274 let mut map = ListOrderedMultimap::new();
4275
4276 map.insert("key1", "value1");
4277 map.append("key2", "value2");
4278 map.append("key2", "value3");
4279 map.append("key1", "value4");
4280
4281 let mut iter = map.pairs_mut();
4282 assert_eq!(iter.size_hint(), (2, Some(2)));
4283 iter.next();
4284 assert_eq!(iter.size_hint(), (1, Some(1)));
4285 iter.next();
4286 assert_eq!(iter.size_hint(), (0, Some(0)));
4287 }
4288
4289 #[test]
4290 fn test_key_values_size_hint() {
4291 let mut map = ListOrderedMultimap::new();
4292
4293 map.insert("key1", "value1");
4294 map.append("key2", "value2");
4295 map.append("key2", "value3");
4296 map.append("key1", "value4");
4297
4298 let mut iter = map.pairs();
4299 assert_eq!(iter.size_hint(), (2, Some(2)));
4300 iter.next();
4301 assert_eq!(iter.size_hint(), (1, Some(1)));
4302 iter.next();
4303 assert_eq!(iter.size_hint(), (0, Some(0)));
4304 }
4305
4306 #[test]
4307 fn test_keys_debug() {
4308 let mut map = ListOrderedMultimap::new();
4309
4310 map.insert("key1", "value1");
4311 map.append("key2", "value2");
4312 map.append("key2", "value3");
4313 map.append("key1", "value4");
4314
4315 let iter = map.keys();
4316 assert_eq!(format!("{iter:?}"), r#"Keys(["key1", "key2"])"#);
4317 }
4318
4319 #[test]
4320 fn test_keys_double_ended() {
4321 let mut map = ListOrderedMultimap::new();
4322
4323 map.insert("key1", "value1");
4324 map.append("key2", "value2");
4325 map.append("key2", "value3");
4326 map.append("key1", "value4");
4327
4328 let mut iter = map.keys();
4329 assert_eq!(iter.next(), Some(&"key1"));
4330 assert_eq!(iter.next_back(), Some(&"key2"));
4331 assert_eq!(iter.next(), None);
4332 }
4333
4334 #[test]
4335 fn test_keys_empty() {
4336 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4337 let mut iter = map.keys();
4338 assert_eq!(iter.next_back(), None);
4339 assert_eq!(iter.next(), None);
4340 }
4341
4342 #[test]
4343 fn test_keys_fused() {
4344 let mut map = ListOrderedMultimap::new();
4345
4346 map.insert("key", "value");
4347
4348 let mut iter = map.keys();
4349 assert_eq!(iter.next(), Some(&"key"));
4350 assert_eq!(iter.next(), None);
4351 assert_eq!(iter.next_back(), None);
4352 assert_eq!(iter.next(), None);
4353 assert_eq!(iter.next_back(), None);
4354 assert_eq!(iter.next(), None);
4355 }
4356
4357 #[test]
4358 fn test_keys_size_hint() {
4359 let mut map = ListOrderedMultimap::new();
4360
4361 map.insert("key1", "value1");
4362 map.append("key2", "value2");
4363 map.append("key2", "value3");
4364 map.append("key1", "value4");
4365
4366 let mut iter = map.keys();
4367 assert_eq!(iter.size_hint(), (2, Some(2)));
4368 iter.next();
4369 assert_eq!(iter.size_hint(), (1, Some(1)));
4370 iter.next();
4371 assert_eq!(iter.size_hint(), (0, Some(0)));
4372 }
4373
4374 #[test]
4375 fn test_list_ordered_multimap_append() {
4376 let mut map = ListOrderedMultimap::new();
4377 assert_eq!(map.entry_len(&"key"), 0);
4378
4379 let already_exists = map.append("key", "value1");
4380 assert!(!already_exists);
4381 assert_eq!(map.entry_len(&"key"), 1);
4382
4383 let already_exists = map.append("key", "value2");
4384 assert!(already_exists);
4385 assert_eq!(map.entry_len(&"key"), 2);
4386
4387 let mut iter = map.get_all(&"key");
4388 assert_eq!(iter.next(), Some(&"value1"));
4389 assert_eq!(iter.next(), Some(&"value2"));
4390 assert_eq!(iter.next(), None);
4391 }
4392
4393 #[test]
4394 fn test_list_ordered_multimap_back() {
4395 let mut map = ListOrderedMultimap::new();
4396 assert_eq!(map.back(), None);
4397
4398 map.insert("key1", "value1");
4399 assert_eq!(map.back(), Some((&"key1", &"value1")));
4400
4401 map.append("key2", "value2");
4402 assert_eq!(map.back(), Some((&"key2", &"value2")));
4403
4404 map.remove(&"key2");
4405 assert_eq!(map.back(), Some((&"key1", &"value1")));
4406
4407 map.remove(&"key1");
4408 assert_eq!(map.back(), None);
4409 }
4410
4411 #[test]
4412 fn test_list_ordered_multimap_back_mut() {
4413 let mut map = ListOrderedMultimap::new();
4414 assert_eq!(map.back(), None);
4415
4416 map.insert("key1", "value1");
4417 assert_eq!(map.back(), Some((&"key1", &"value1")));
4418
4419 map.append("key2", "value2");
4420 assert_eq!(map.back(), Some((&"key2", &"value2")));
4421
4422 map.remove(&"key2");
4423 assert_eq!(map.back(), Some((&"key1", &"value1")));
4424
4425 map.remove(&"key1");
4426 assert_eq!(map.back(), None);
4427 }
4428
4429 #[test]
4430 fn test_list_ordered_multimap_clear() {
4431 let mut map = ListOrderedMultimap::new();
4432 map.insert("key", "value");
4433 map.insert("key2", "value");
4434
4435 map.clear();
4436
4437 assert!(map.is_empty());
4438 assert_eq!(map.get(&"key"), None);
4439 assert_eq!(map.get(&"key2"), None);
4440 }
4441
4442 #[test]
4443 fn test_list_ordered_multimap_contains_key() {
4444 let mut map = ListOrderedMultimap::new();
4445 assert!(!map.contains_key(&"key"));
4446
4447 map.insert("key", "value");
4448 assert!(map.contains_key(&"key"));
4449 }
4450
4451 #[test]
4452 fn test_list_ordered_multimap_debug() {
4453 let mut map = ListOrderedMultimap::new();
4454
4455 map.insert("key1", "value1");
4456 map.insert("key2", "value2");
4457 map.append("key2", "value3");
4458 map.append("key1", "value4");
4459
4460 assert_eq!(
4461 format!("{map:?}"),
4462 r#"{"key1": "value1", "key2": "value2", "key2": "value3", "key1": "value4"}"#
4463 );
4464 }
4465
4466 #[test]
4467 fn test_list_ordered_multimap_entry() {
4468 let mut map = ListOrderedMultimap::new();
4469 assert_eq!(map.get(&"key1"), None);
4470
4471 let value = map.entry("key").or_insert("value1");
4472 assert_eq!(value, &"value1");
4473 assert_eq!(map.get(&"key"), Some(&"value1"));
4474
4475 let value = map.entry("key").or_insert("value2");
4476 assert_eq!(value, &"value1");
4477 assert_eq!(map.get(&"key"), Some(&"value1"));
4478 }
4479
4480 #[test]
4481 fn test_list_ordered_multimap_entry_len() {
4482 let mut map = ListOrderedMultimap::new();
4483 assert_eq!(map.entry_len(&"key1"), 0);
4484
4485 map.insert("key", "value");
4486 assert_eq!(map.entry_len(&"key"), 1);
4487
4488 map.insert("key", "value");
4489 assert_eq!(map.entry_len(&"key"), 1);
4490
4491 map.append("key", "value");
4492 assert_eq!(map.entry_len(&"key"), 2);
4493
4494 map.insert("key", "value");
4495 assert_eq!(map.entry_len(&"key"), 1);
4496
4497 map.remove(&"key");
4498 assert_eq!(map.entry_len(&"key"), 0);
4499 }
4500
4501 #[test]
4502 fn test_list_ordered_multimap_equality() {
4503 let mut map_1 = ListOrderedMultimap::new();
4504
4505 map_1.insert("key1", "value1");
4506 map_1.insert("key2", "value2");
4507 map_1.append("key2", "value3");
4508 map_1.append("key1", "value4");
4509
4510 let mut map_2 = map_1.clone();
4511 map_2.pop_back();
4512
4513 assert_ne!(map_1, map_2);
4514
4515 map_2.append("key1", "value4");
4516 assert_eq!(map_1, map_2);
4517 }
4518
4519 #[test]
4520 fn test_list_ordered_multimap_extend() {
4521 let mut map = ListOrderedMultimap::new();
4522 map.extend(vec![
4523 ("key1", "value1"),
4524 ("key2", "value2"),
4525 ("key2", "value3"),
4526 ]);
4527
4528 let mut iter = map.get_all(&"key1");
4529 assert_eq!(iter.next(), Some(&"value1"));
4530 assert_eq!(iter.next(), None);
4531
4532 let mut iter = map.get_all(&"key2");
4533 assert_eq!(iter.next(), Some(&"value2"));
4534 assert_eq!(iter.next(), Some(&"value3"));
4535 assert_eq!(iter.next(), None);
4536
4537 let mut map = ListOrderedMultimap::new();
4538 map.extend(vec![(&1, &1), (&2, &1), (&2, &2)]);
4539
4540 let mut iter = map.get_all(&1);
4541 assert_eq!(iter.next(), Some(&1));
4542 assert_eq!(iter.next(), None);
4543
4544 let mut iter = map.get_all(&2);
4545 assert_eq!(iter.next(), Some(&1));
4546 assert_eq!(iter.next(), Some(&2));
4547 assert_eq!(iter.next(), None);
4548 }
4549
4550 #[test]
4551 fn test_list_ordered_multimap_from_iterator() {
4552 let map: ListOrderedMultimap<_, _, RandomState> = ListOrderedMultimap::from_iter(vec![
4553 ("key1", "value1"),
4554 ("key2", "value2"),
4555 ("key2", "value3"),
4556 ]);
4557
4558 let mut iter = map.get_all(&"key1");
4559 assert_eq!(iter.next(), Some(&"value1"));
4560 assert_eq!(iter.next(), None);
4561
4562 let mut iter = map.get_all(&"key2");
4563 assert_eq!(iter.next(), Some(&"value2"));
4564 assert_eq!(iter.next(), Some(&"value3"));
4565 assert_eq!(iter.next(), None);
4566 }
4567
4568 #[test]
4569 fn test_list_ordered_multimap_get() {
4570 let mut map = ListOrderedMultimap::new();
4571 assert_eq!(map.get(&"key"), None);
4572
4573 map.insert("key", "value");
4574 assert_eq!(map.get(&"key"), Some(&"value"));
4575 }
4576
4577 #[test]
4578 fn test_list_ordered_multimap_get_all() {
4579 let mut map = ListOrderedMultimap::new();
4580
4581 let mut iter = map.get_all(&"key");
4582 assert_eq!(iter.next(), None);
4583
4584 map.insert("key", "value1");
4585 map.append("key", "value2");
4586 map.append("key", "value3");
4587
4588 let mut iter = map.get_all(&"key");
4589 assert_eq!(iter.next(), Some(&"value1"));
4590 assert_eq!(iter.next(), Some(&"value2"));
4591 assert_eq!(iter.next(), Some(&"value3"));
4592 assert_eq!(iter.next(), None);
4593 }
4594
4595 #[test]
4596 fn test_list_ordered_multimap_get_all_mut() {
4597 let mut map = ListOrderedMultimap::new();
4598
4599 let mut iter = map.get_all(&"key");
4600 assert_eq!(iter.next(), None);
4601
4602 map.insert("key", "value1");
4603 map.append("key", "value2");
4604 map.append("key", "value3");
4605
4606 let mut iter = map.get_all_mut(&"key");
4607 assert_eq!(iter.next(), Some(&mut "value1"));
4608 assert_eq!(iter.next(), Some(&mut "value2"));
4609 assert_eq!(iter.next(), Some(&mut "value3"));
4610 assert_eq!(iter.next(), None);
4611 }
4612
4613 #[test]
4614 fn test_list_ordered_multimap_get_mut() {
4615 let mut map = ListOrderedMultimap::new();
4616 assert_eq!(map.get_mut(&"key"), None);
4617
4618 map.insert("key", "value");
4619 assert_eq!(map.get_mut(&"key"), Some(&mut "value"));
4620 }
4621
4622 #[test]
4623 fn test_list_ordered_multimap_insert() {
4624 let mut map = ListOrderedMultimap::new();
4625 assert!(!map.contains_key(&"key"));
4626 assert_eq!(map.get(&"key"), None);
4627
4628 let value = map.insert("key", "value1");
4629 assert_eq!(value, None);
4630 assert!(map.contains_key(&"key"));
4631 assert_eq!(map.get(&"key"), Some(&"value1"));
4632
4633 let value = map.insert("key", "value2");
4634 assert_eq!(value, Some("value1"));
4635 assert!(map.contains_key(&"key"));
4636 assert_eq!(map.get(&"key"), Some(&"value2"));
4637 }
4638
4639 #[test]
4640 fn test_list_ordered_multimap_insert_all() {
4641 let mut map = ListOrderedMultimap::new();
4642 assert!(!map.contains_key(&"key"));
4643 assert_eq!(map.get(&"key"), None);
4644
4645 {
4646 let mut iter = map.insert_all("key", "value1");
4647 assert_eq!(iter.next(), None);
4648 }
4649
4650 assert!(map.contains_key(&"key"));
4651 assert_eq!(map.get(&"key"), Some(&"value1"));
4652
4653 {
4654 let mut iter = map.insert_all("key", "value2");
4655 assert_eq!(iter.next(), Some("value1"));
4656 assert_eq!(iter.next(), None);
4657 }
4658
4659 assert!(map.contains_key(&"key"));
4660 assert_eq!(map.get(&"key"), Some(&"value2"));
4661 }
4662
4663 #[test]
4664 fn test_list_ordered_multimap_is_empty() {
4665 let mut map = ListOrderedMultimap::new();
4666 assert!(map.is_empty());
4667
4668 map.insert("key", "value");
4669 assert!(!map.is_empty());
4670
4671 map.remove(&"key");
4672 assert!(map.is_empty());
4673 }
4674
4675 #[test]
4676 fn test_list_ordered_multimap_iter() {
4677 let mut map = ListOrderedMultimap::new();
4678
4679 let mut iter = map.iter();
4680 assert_eq!(iter.next(), None);
4681
4682 map.insert("key1", "value1");
4683 map.insert("key2", "value2");
4684 map.append("key2", "value3");
4685 map.append("key1", "value4");
4686
4687 let mut iter = map.iter();
4688 assert_eq!(iter.next(), Some((&"key1", &"value1")));
4689 assert_eq!(iter.next(), Some((&"key2", &"value2")));
4690 assert_eq!(iter.next(), Some((&"key2", &"value3")));
4691 assert_eq!(iter.next(), Some((&"key1", &"value4")));
4692 assert_eq!(iter.next(), None);
4693 }
4694
4695 #[test]
4696 fn test_list_ordered_multimap_iter_mut() {
4697 let mut map = ListOrderedMultimap::new();
4698
4699 let mut iter = map.iter_mut();
4700 assert_eq!(iter.next(), None);
4701
4702 map.insert("key1", "value1");
4703 map.insert("key2", "value2");
4704 map.append("key2", "value3");
4705 map.append("key1", "value4");
4706
4707 let mut iter = map.iter_mut();
4708 assert_eq!(iter.next(), Some((&"key1", &mut "value1")));
4709 assert_eq!(iter.next(), Some((&"key2", &mut "value2")));
4710 assert_eq!(iter.next(), Some((&"key2", &mut "value3")));
4711 assert_eq!(iter.next(), Some((&"key1", &mut "value4")));
4712 assert_eq!(iter.next(), None);
4713 }
4714
4715 #[test]
4716 fn test_list_ordered_multimap_keys() {
4717 let mut map = ListOrderedMultimap::new();
4718
4719 let mut iter = map.keys();
4720 assert_eq!(iter.next(), None);
4721
4722 map.insert("key1", "value1");
4723 map.insert("key2", "value2");
4724 map.insert("key1", "value3");
4725 map.insert("key3", "value4");
4726
4727 let mut iter = map.keys();
4728 assert_eq!(iter.next(), Some(&"key1"));
4729 assert_eq!(iter.next(), Some(&"key2"));
4730 assert_eq!(iter.next(), Some(&"key3"));
4731 assert_eq!(iter.next(), None);
4732 }
4733
4734 #[test]
4735 fn test_list_ordered_multimap_keys_capacity() {
4736 let mut map = ListOrderedMultimap::new();
4737 assert_eq!(map.keys_capacity(), 0);
4738 map.insert("key", "value");
4739 assert!(map.keys_capacity() > 0);
4740 }
4741
4742 #[test]
4743 fn test_list_ordered_multimap_keys_len() {
4744 let mut map = ListOrderedMultimap::new();
4745 assert_eq!(map.keys_len(), 0);
4746
4747 map.insert("key1", "value1");
4748 assert_eq!(map.keys_len(), 1);
4749
4750 map.insert("key2", "value2");
4751 assert_eq!(map.keys_len(), 2);
4752
4753 map.append("key1", "value3");
4754 assert_eq!(map.keys_len(), 2);
4755
4756 map.remove(&"key1");
4757 assert_eq!(map.keys_len(), 1);
4758
4759 map.remove(&"key2");
4760 assert_eq!(map.keys_len(), 0);
4761 }
4762
4763 #[test]
4764 fn test_list_ordered_multimap_new() {
4765 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4766 assert_eq!(map.keys_capacity(), 0);
4767 assert_eq!(map.keys_len(), 0);
4768 assert_eq!(map.values_capacity(), 0);
4769 assert_eq!(map.values_len(), 0);
4770 }
4771
4772 #[test]
4773 fn test_list_ordered_multimap_pack_to() {
4774 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
4775 map.pack_to_fit();
4776 assert_eq!(map.keys_capacity(), 0);
4777 assert_eq!(map.values_capacity(), 0);
4778
4779 let mut map = ListOrderedMultimap::with_capacity(10, 10);
4780
4781 map.insert("key1", "value1");
4782 map.insert("key2", "value2");
4783 map.append("key2", "value3");
4784 map.append("key1", "value4");
4785
4786 map.pack_to(5, 5);
4787
4788 assert_eq!(map.get(&"key1"), Some(&"value1"));
4789 assert_eq!(map.get(&"key2"), Some(&"value2"));
4790
4791 assert_eq!(map.keys_capacity(), 5);
4792 assert_eq!(map.keys_len(), 2);
4793 assert_eq!(map.values_capacity(), 5);
4794 assert_eq!(map.values_len(), 4);
4795
4796 let mut iter = map.iter();
4797 assert_eq!(iter.next(), Some((&"key1", &"value1")));
4798 assert_eq!(iter.next(), Some((&"key2", &"value2")));
4799 assert_eq!(iter.next(), Some((&"key2", &"value3")));
4800 assert_eq!(iter.next(), Some((&"key1", &"value4")));
4801 assert_eq!(iter.next(), None);
4802 }
4803
4804 #[should_panic]
4805 #[test]
4806 fn test_list_ordered_multimap_pack_to_panic_key_capacity() {
4807 let mut map = ListOrderedMultimap::new();
4808 map.insert("key1", "value1");
4809 map.insert("key2", "value2");
4810 map.append("key2", "value3");
4811 map.append("key1", "value4");
4812 map.pack_to(1, 5);
4813 }
4814
4815 #[should_panic]
4816 #[test]
4817 fn test_list_ordered_multimap_pack_to_panic_value_capacity() {
4818 let mut map = ListOrderedMultimap::new();
4819 map.insert("key1", "value1");
4820 map.insert("key2", "value2");
4821 map.append("key2", "value3");
4822 map.append("key1", "value4");
4823 map.pack_to(5, 1);
4824 }
4825
4826 #[test]
4827 fn test_list_ordered_multimap_pack_to_fit() {
4828 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
4829 map.pack_to_fit();
4830 assert_eq!(map.keys_capacity(), 0);
4831 assert_eq!(map.values_capacity(), 0);
4832
4833 let mut map = ListOrderedMultimap::with_capacity(5, 5);
4834
4835 map.insert("key1", "value1");
4836 map.insert("key2", "value2");
4837 map.append("key2", "value3");
4838 map.append("key1", "value4");
4839
4840 map.pack_to_fit();
4841 assert_eq!(map.keys_capacity(), 2);
4842 assert_eq!(map.keys_len(), 2);
4843 assert_eq!(map.values_capacity(), 4);
4844 assert_eq!(map.values_len(), 4);
4845
4846 let mut iter = map.iter();
4847 assert_eq!(iter.next(), Some((&"key1", &"value1")));
4848 assert_eq!(iter.next(), Some((&"key2", &"value2")));
4849 assert_eq!(iter.next(), Some((&"key2", &"value3")));
4850 assert_eq!(iter.next(), Some((&"key1", &"value4")));
4851 assert_eq!(iter.next(), None);
4852 }
4853
4854 #[test]
4855 fn test_list_ordered_multimap_pairs() {
4856 let mut map = ListOrderedMultimap::new();
4857
4858 map.insert("key1", "value1");
4859 map.insert("key2", "value2");
4860 map.append("key2", "value3");
4861 map.append("key1", "value4");
4862
4863 let mut iter = map.pairs();
4864
4865 let (key, mut values) = iter.next().unwrap();
4866 assert_eq!(key, &"key1");
4867 assert_eq!(values.next(), Some(&"value1"));
4868 assert_eq!(values.next(), Some(&"value4"));
4869 assert_eq!(values.next(), None);
4870
4871 let (key, mut values) = iter.next().unwrap();
4872 assert_eq!(key, &"key2");
4873 assert_eq!(values.next(), Some(&"value2"));
4874 assert_eq!(values.next(), Some(&"value3"));
4875 assert_eq!(values.next(), None);
4876
4877 assert!(iter.next().is_none());
4878 }
4879
4880 #[test]
4881 fn test_list_ordered_multimap_pairs_mut() {
4882 let mut map = ListOrderedMultimap::new();
4883
4884 map.insert("key1", "value1");
4885 map.insert("key2", "value2");
4886 map.append("key2", "value3");
4887 map.append("key1", "value4");
4888
4889 let mut iter = map.pairs_mut();
4890
4891 let (key, mut values) = iter.next().unwrap();
4892 assert_eq!(key, &"key1");
4893 assert_eq!(values.next(), Some(&mut "value1"));
4894 assert_eq!(values.next(), Some(&mut "value4"));
4895 assert_eq!(values.next(), None);
4896
4897 let (key, mut values) = iter.next().unwrap();
4898 assert_eq!(key, &"key2");
4899 assert_eq!(values.next(), Some(&mut "value2"));
4900 assert_eq!(values.next(), Some(&mut "value3"));
4901 assert_eq!(values.next(), None);
4902
4903 assert!(iter.next().is_none());
4904 }
4905
4906 #[test]
4907 fn test_list_ordered_multimap_pop_back() {
4908 let mut map = ListOrderedMultimap::new();
4909
4910 map.insert("key1", "value1");
4911 map.insert("key2", "value2");
4912 map.append("key2", "value3");
4913 map.append("key1", "value4");
4914
4915 let (key, value) = map.pop_back().unwrap();
4916 assert_eq!(key, KeyWrapper::Borrowed(&"key1"));
4917 assert_eq!(&value, &"value4");
4918 assert_eq!(map.keys_len(), 2);
4919 assert_eq!(map.values_len(), 3);
4920
4921 let (key, value) = map.pop_back().unwrap();
4922 assert_eq!(key, KeyWrapper::Borrowed(&"key2"));
4923 assert_eq!(&value, &"value3");
4924 assert_eq!(map.keys_len(), 2);
4925 assert_eq!(map.values_len(), 2);
4926
4927 let (key, value) = map.pop_back().unwrap();
4928 assert_eq!(key, KeyWrapper::Owned("key2"));
4929 assert_eq!(&value, &"value2");
4930 assert_eq!(map.keys_len(), 1);
4931 assert_eq!(map.values_len(), 1);
4932
4933 let (key, value) = map.pop_back().unwrap();
4934 assert_eq!(key, KeyWrapper::Owned("key1"));
4935 assert_eq!(&value, &"value1");
4936 assert_eq!(map.keys_len(), 0);
4937 assert_eq!(map.values_len(), 0);
4938
4939 assert!(map.pop_back().is_none());
4940 }
4941
4942 #[test]
4943 fn test_list_ordered_multimap_pop_front() {
4944 let mut map = ListOrderedMultimap::new();
4945
4946 map.insert("key1", "value1");
4947 map.insert("key2", "value2");
4948 map.append("key2", "value3");
4949 map.append("key1", "value4");
4950
4951 let (key, value) = map.pop_front().unwrap();
4952 assert_eq!(key, KeyWrapper::Borrowed(&"key1"));
4953 assert_eq!(&value, &"value1");
4954 assert_eq!(map.keys_len(), 2);
4955 assert_eq!(map.values_len(), 3);
4956
4957 let (key, value) = map.pop_front().unwrap();
4958 assert_eq!(key, KeyWrapper::Borrowed(&"key2"));
4959 assert_eq!(&value, &"value2");
4960 assert_eq!(map.keys_len(), 2);
4961 assert_eq!(map.values_len(), 2);
4962
4963 let (key, value) = map.pop_front().unwrap();
4964 assert_eq!(key, KeyWrapper::Owned("key2"));
4965 assert_eq!(&value, &"value3");
4966 assert_eq!(map.keys_len(), 1);
4967 assert_eq!(map.values_len(), 1);
4968
4969 let (key, value) = map.pop_front().unwrap();
4970 assert_eq!(key, KeyWrapper::Owned("key1"));
4971 assert_eq!(&value, &"value4");
4972 assert_eq!(map.keys_len(), 0);
4973 assert_eq!(map.values_len(), 0);
4974
4975 assert!(map.pop_front().is_none());
4976 }
4977
4978 #[test]
4979 fn test_list_ordered_multimap_remove() {
4980 let mut map = ListOrderedMultimap::new();
4981 assert_eq!(map.remove(&"key"), None);
4982
4983 map.insert("key", "value1");
4984 map.append("key", "value2");
4985 assert_eq!(map.remove(&"key"), Some("value1"));
4986 assert_eq!(map.remove(&"key"), None);
4987 }
4988
4989 #[test]
4990 fn test_list_ordered_multimap_remove_all() {
4991 let mut map = ListOrderedMultimap::new();
4992
4993 {
4994 let mut iter = map.remove_all(&"key");
4995 assert_eq!(iter.next(), None);
4996 }
4997
4998 map.insert("key", "value1");
4999 map.append("key", "value2");
5000
5001 {
5002 let mut iter = map.remove_all(&"key");
5003 assert_eq!(iter.next(), Some("value1"));
5004 assert_eq!(iter.next(), Some("value2"));
5005 assert_eq!(iter.next(), None);
5006 }
5007
5008 let mut iter = map.remove_all(&"key");
5009 assert_eq!(iter.next(), None);
5010 }
5011
5012 #[test]
5013 fn test_list_ordered_multimap_remove_entry() {
5014 let mut map = ListOrderedMultimap::new();
5015 assert_eq!(map.remove_entry(&"key"), None);
5016
5017 map.insert("key", "value1");
5018 map.append("key", "value2");
5019 assert_eq!(map.remove_entry(&"key"), Some(("key", "value1")));
5020 assert_eq!(map.remove_entry(&"key"), None);
5021 }
5022
5023 #[test]
5024 fn test_list_ordered_multimap_remove_entry_all() {
5025 let mut map = ListOrderedMultimap::new();
5026
5027 {
5028 let entry = map.remove_entry_all(&"key");
5029 assert!(entry.is_none());
5030 }
5031
5032 map.insert("key", "value1");
5033 map.append("key", "value2");
5034
5035 {
5036 let (key, mut iter) = map.remove_entry_all(&"key").unwrap();
5037 assert_eq!(key, "key");
5038 assert_eq!(iter.next(), Some("value1"));
5039 assert_eq!(iter.next(), Some("value2"));
5040 assert_eq!(iter.next(), None);
5041 }
5042
5043 let entry = map.remove_entry_all(&"key");
5044 assert!(entry.is_none());
5045 }
5046
5047 #[test]
5048 fn test_list_ordered_multimap_reserve_keys() {
5049 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5050 assert_eq!(map.keys_capacity(), 0);
5051
5052 map.reserve_keys(5);
5053 assert!(map.keys_capacity() >= 5);
5054
5055 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
5056 assert_eq!(map.keys_capacity(), 5);
5057
5058 map.reserve_keys(2);
5059 assert_eq!(map.keys_capacity(), 5);
5060 }
5061
5062 #[test]
5063 fn test_list_ordered_multimap_reserve_values() {
5064 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5065 assert_eq!(map.values_capacity(), 0);
5066
5067 map.reserve_values(5);
5068 assert!(map.values_capacity() >= 5);
5069
5070 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
5071 assert_eq!(map.values_capacity(), 5);
5072
5073 map.reserve_values(2);
5074 assert_eq!(map.values_capacity(), 5);
5075 }
5076
5077 #[test]
5078 fn test_list_ordered_multimap_retain() {
5079 let mut map = ListOrderedMultimap::new();
5080
5081 map.insert("key1", 1);
5082 map.insert("key2", 5);
5083 map.append("key1", -1);
5084 map.insert("key3", -10);
5085 map.insert("key4", 1);
5086 map.append("key4", -1);
5087 map.append("key4", 1);
5088
5089 map.retain(|_, &mut value| value >= 0);
5090
5091 let mut iter = map.iter();
5092 assert_eq!(iter.next(), Some((&"key1", &1)));
5093 assert_eq!(iter.next(), Some((&"key2", &5)));
5094 assert_eq!(iter.next(), Some((&"key4", &1)));
5095 assert_eq!(iter.next(), Some((&"key4", &1)));
5096 assert_eq!(iter.next(), None);
5097 }
5098
5099 #[test]
5100 fn test_list_ordered_multimap_values() {
5101 let mut map = ListOrderedMultimap::new();
5102
5103 let mut iter = map.iter();
5104 assert_eq!(iter.next(), None);
5105
5106 map.insert("key1", "value1");
5107 map.insert("key2", "value2");
5108 map.append("key2", "value3");
5109 map.append("key1", "value4");
5110
5111 let mut iter = map.values();
5112 assert_eq!(iter.next(), Some(&"value1"));
5113 assert_eq!(iter.next(), Some(&"value2"));
5114 assert_eq!(iter.next(), Some(&"value3"));
5115 assert_eq!(iter.next(), Some(&"value4"));
5116 assert_eq!(iter.next(), None);
5117 }
5118
5119 #[test]
5120 fn test_list_ordered_multimap_values_mut() {
5121 let mut map = ListOrderedMultimap::new();
5122
5123 let mut iter = map.iter();
5124 assert_eq!(iter.next(), None);
5125
5126 map.insert("key1", "value1");
5127 map.insert("key2", "value2");
5128 map.append("key2", "value3");
5129 map.append("key1", "value4");
5130
5131 let mut iter = map.values_mut();
5132 assert_eq!(iter.next(), Some(&mut "value1"));
5133 assert_eq!(iter.next(), Some(&mut "value2"));
5134 assert_eq!(iter.next(), Some(&mut "value3"));
5135 assert_eq!(iter.next(), Some(&mut "value4"));
5136 assert_eq!(iter.next(), None);
5137 }
5138
5139 #[test]
5140 fn test_list_ordered_multimap_values_capacity() {
5141 let mut map = ListOrderedMultimap::new();
5142 assert_eq!(map.values_capacity(), 0);
5143 map.insert("key", "value");
5144 assert!(map.values_capacity() > 0);
5145 }
5146
5147 #[test]
5148 fn test_list_ordered_multimap_values_len() {
5149 let mut map = ListOrderedMultimap::new();
5150 assert_eq!(map.values_len(), 0);
5151
5152 map.insert("key1", "value1");
5153 assert_eq!(map.values_len(), 1);
5154
5155 map.insert("key2", "value2");
5156 assert_eq!(map.values_len(), 2);
5157
5158 map.append("key1", "value3");
5159 assert_eq!(map.values_len(), 3);
5160
5161 map.remove(&"key1");
5162 assert_eq!(map.values_len(), 1);
5163
5164 map.remove(&"key2");
5165 assert_eq!(map.values_len(), 0);
5166 }
5167
5168 #[test]
5169 fn test_list_ordered_multimap_with_capacity() {
5170 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(1, 2);
5171 assert!(map.keys_capacity() >= 1);
5172 assert_eq!(map.keys_len(), 0);
5173 assert!(map.values_capacity() >= 2);
5174 assert_eq!(map.values_len(), 0);
5175 }
5176
5177 #[test]
5178 fn test_list_ordered_multimap_with_capacity_and_hasher() {
5179 let state = RandomState::new();
5180 let map: ListOrderedMultimap<&str, &str> =
5181 ListOrderedMultimap::with_capacity_and_hasher(1, 2, state);
5182 assert!(map.keys_capacity() >= 1);
5183 assert_eq!(map.keys_len(), 0);
5184 assert!(map.values_capacity() >= 2);
5185 assert_eq!(map.values_len(), 0);
5186 }
5187
5188 #[test]
5189 fn test_occupied_entry_debug() {
5190 let mut map = ListOrderedMultimap::new();
5191
5192 map.insert("key", "value1");
5193 map.append("key", "value2");
5194 map.append("key", "value3");
5195 map.append("key", "value4");
5196
5197 let entry = match map.entry("key") {
5198 Entry::Occupied(entry) => entry,
5199 _ => panic!("expected occupied entry"),
5200 };
5201
5202 assert_eq!(
5203 format!("{entry:?}"),
5204 "OccupiedEntry { \
5205 key: \"key\", \
5206 values: EntryValues([\"value1\", \"value2\", \"value3\", \"value4\"]) \
5207 }"
5208 );
5209 }
5210
5211 #[test]
5212 fn test_vacant_entry_debug() {
5213 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5214 let entry = match map.entry("key") {
5215 Entry::Vacant(entry) => entry,
5216 _ => panic!("expected vacant entry"),
5217 };
5218
5219 assert_eq!(format!("{entry:?}"), r#"VacantEntry("key")"#);
5220 }
5221
5222 #[test]
5223 fn test_values_debug() {
5224 let mut map = ListOrderedMultimap::new();
5225
5226 map.insert("key1", "value1");
5227 map.append("key2", "value2");
5228 map.append("key2", "value3");
5229 map.append("key1", "value4");
5230
5231 let iter = map.values();
5232 assert_eq!(
5233 format!("{iter:?}"),
5234 r#"Values(["value1", "value2", "value3", "value4"])"#
5235 );
5236 }
5237
5238 #[test]
5239 fn test_values_double_ended() {
5240 let mut map = ListOrderedMultimap::new();
5241
5242 map.insert("key1", "value1");
5243 map.append("key2", "value2");
5244 map.append("key2", "value3");
5245 map.append("key1", "value4");
5246
5247 let mut iter = map.values();
5248 assert_eq!(iter.next(), Some(&"value1"));
5249 assert_eq!(iter.next_back(), Some(&"value4"));
5250 assert_eq!(iter.next(), Some(&"value2"));
5251 assert_eq!(iter.next_back(), Some(&"value3"));
5252 assert_eq!(iter.next(), None);
5253 }
5254
5255 #[test]
5256 fn test_values_empty() {
5257 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5258 let mut iter = map.values();
5259 assert_eq!(iter.next_back(), None);
5260 assert_eq!(iter.next(), None);
5261 }
5262
5263 #[test]
5264 fn test_values_fused() {
5265 let mut map = ListOrderedMultimap::new();
5266
5267 map.insert("key", "value");
5268
5269 let mut iter = map.values();
5270 assert_eq!(iter.next(), Some(&"value"));
5271 assert_eq!(iter.next(), None);
5272 assert_eq!(iter.next_back(), None);
5273 assert_eq!(iter.next(), None);
5274 assert_eq!(iter.next_back(), None);
5275 assert_eq!(iter.next(), None);
5276 }
5277
5278 #[test]
5279 fn test_values_mut_debug() {
5280 let mut map = ListOrderedMultimap::new();
5281
5282 map.insert("key1", "value1");
5283 map.append("key2", "value2");
5284 map.append("key2", "value3");
5285 map.append("key1", "value4");
5286
5287 let iter = map.values_mut();
5288 assert_eq!(
5289 format!("{iter:?}"),
5290 r#"ValuesMut(["value1", "value2", "value3", "value4"])"#
5291 );
5292 }
5293
5294 #[test]
5295 fn test_values_mut_double_ended() {
5296 let mut map = ListOrderedMultimap::new();
5297
5298 map.insert("key1", "value1");
5299 map.append("key2", "value2");
5300 map.append("key2", "value3");
5301 map.append("key1", "value4");
5302
5303 let mut iter = map.values_mut();
5304 assert_eq!(iter.next(), Some(&mut "value1"));
5305 assert_eq!(iter.next_back(), Some(&mut "value4"));
5306 assert_eq!(iter.next(), Some(&mut "value2"));
5307 assert_eq!(iter.next_back(), Some(&mut "value3"));
5308 assert_eq!(iter.next(), None);
5309 }
5310
5311 #[test]
5312 fn test_values_mut_empty() {
5313 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5314 let mut iter = map.values_mut();
5315 assert_eq!(iter.next_back(), None);
5316 assert_eq!(iter.next(), None);
5317 }
5318
5319 #[test]
5320 fn test_values_mut_fused() {
5321 let mut map = ListOrderedMultimap::new();
5322
5323 map.insert("key", "value");
5324
5325 let mut iter = map.values_mut();
5326 assert_eq!(iter.next(), Some(&mut "value"));
5327 assert_eq!(iter.next(), None);
5328 assert_eq!(iter.next_back(), None);
5329 assert_eq!(iter.next(), None);
5330 assert_eq!(iter.next_back(), None);
5331 assert_eq!(iter.next(), None);
5332 }
5333
5334 #[test]
5335 fn test_values_mut_size_hint() {
5336 let mut map = ListOrderedMultimap::new();
5337
5338 map.insert("key1", "value1");
5339 map.append("key2", "value2");
5340 map.append("key2", "value3");
5341 map.append("key1", "value4");
5342
5343 let mut iter = map.values_mut();
5344 assert_eq!(iter.size_hint(), (4, Some(4)));
5345 iter.next();
5346 assert_eq!(iter.size_hint(), (3, Some(3)));
5347 iter.next();
5348 assert_eq!(iter.size_hint(), (2, Some(2)));
5349 iter.next();
5350 assert_eq!(iter.size_hint(), (1, Some(1)));
5351 iter.next();
5352 assert_eq!(iter.size_hint(), (0, Some(0)));
5353 }
5354
5355 #[test]
5356 fn test_values_size_hint() {
5357 let mut map = ListOrderedMultimap::new();
5358
5359 map.insert("key1", "value1");
5360 map.append("key2", "value2");
5361 map.append("key2", "value3");
5362 map.append("key1", "value4");
5363
5364 let mut iter = map.values();
5365 assert_eq!(iter.size_hint(), (4, Some(4)));
5366 iter.next();
5367 assert_eq!(iter.size_hint(), (3, Some(3)));
5368 iter.next();
5369 assert_eq!(iter.size_hint(), (2, Some(2)));
5370 iter.next();
5371 assert_eq!(iter.size_hint(), (1, Some(1)));
5372 iter.next();
5373 assert_eq!(iter.size_hint(), (0, Some(0)));
5374 }
5375
5376 #[should_panic]
5377 #[test]
5378 fn test_dummy_hasher_finish() {
5379 let hasher = DummyHasher;
5380 hasher.finish();
5381 }
5382
5383 #[should_panic]
5384 #[test]
5385 fn test_dummy_hasher_write() {
5386 let mut hasher = DummyHasher;
5387 hasher.write(&[]);
5388 }
5389}