ordered_multimap/
list_ordered_multimap.rs

1//! Provides types related to the usage of [`ListOrderedMultimap`].
2
3#![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/// A random state to use for the hashmap in the multimap.
23#[cfg(feature = "std")]
24pub type RandomState = std::collections::hash_map::RandomState;
25
26/// A random state to use for the hashmap in the multimap.
27#[cfg(not(feature = "std"))]
28#[derive(Debug)]
29pub struct RandomState(core::convert::Infallible);
30
31#[cfg(not(feature = "std"))]
32impl RandomState {
33  /// Creates a new random state.
34  #[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)]
60/// A multimap that associates with each key a list of values.
61///
62/// # Ordering
63///
64/// The primary guarantee this type gives is that regardless of what you do to the multimap, you are always able to
65/// iterate through all keys and values in the order they were inserted. Values can be iterated by their insertion order
66/// either for a specific key or for the entire map.
67///
68/// # Allocations
69///
70/// Allocations may be performed on any key-value insertion.
71pub struct ListOrderedMultimap<Key, Value, State = RandomState> {
72  /// The hasher builder that constructs new hashers for hashing keys. We have to keep this separate from the hashmap
73  /// itself as we need to be able to access it when the hashmap keys are reallocated due to changes. We cannot use the
74  /// hash of the actual keys in the map as those hashes are not representative.
75  pub(crate) build_hasher: State,
76
77  /// The list of the keys in the multimap. This is ordered by time of insertion.
78  pub(crate) keys: VecList<Key>,
79
80  /// The map from indices of keys to the indices of their values in the value list. The list of the indices is ordered
81  /// by time of insertion. We never use hasher of the hashmap explicitly here, we instead use
82  /// [`ListOrderedMultimap::build_hasher`].
83  pub(crate) map: HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
84
85  /// The list of the values in the multimap. This is ordered by time of insertion.
86  pub(crate) values: VecList<ValueEntry<Key, Value>>,
87}
88
89#[cfg(feature = "std")]
90impl<Key, Value> ListOrderedMultimap<Key, Value, RandomState> {
91  /// Creates a new multimap with no initial capacity.
92  ///
93  /// # Examples
94  ///
95  /// ```
96  /// use ordered_multimap::ListOrderedMultimap;
97  ///
98  /// let mut map = ListOrderedMultimap::new();
99  /// map.insert("key1", "value1");
100  /// assert_eq!(map.get(&"key1"), Some(&"value1"));
101  /// ```
102  #[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  /// Creates a new multimap with the specified capacities.
113  ///
114  /// The multimap will be able to hold at least `key_capacity` keys and `value_capacity` values without reallocating.
115  /// A capacity of 0 will result in no allocation for the respective container.
116  ///
117  /// # Examples
118  ///
119  /// ```
120  /// use ordered_multimap::ListOrderedMultimap;
121  ///
122  /// let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
123  /// assert_eq!(map.keys_capacity(), 0);
124  /// assert_eq!(map.values_capacity(), 0);
125  ///
126  /// let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 10);
127  /// assert_eq!(map.keys_capacity(), 5);
128  /// assert_eq!(map.values_capacity(), 10);
129  /// ```
130  #[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  /// Creates a new multimap with the specified capacities and the given hash builder to hash keys.
149  ///
150  /// The multimap will be able to hold at least `key_capacity` keys and `value_capacity` values without reallocating. A
151  /// capacity of 0 will result in no allocation for the respective container.
152  ///
153  /// The `state` is normally randomly generated and is designed to allow multimaps to be resistant to attacks that
154  /// cause many collisions and very poor performance. Setting it manually using this function can expose a DoS attack
155  /// vector.
156  ///
157  /// # Examples
158  ///
159  /// ```
160  /// use ordered_multimap::ListOrderedMultimap;
161  /// use std::collections::hash_map::RandomState;
162  ///
163  /// let state = RandomState::new();
164  /// let mut map = ListOrderedMultimap::with_capacity_and_hasher(10, 10, state);
165  /// map.insert("key", "value");
166  /// assert_eq!(map.keys_capacity(), 10);
167  /// assert_eq!(map.values_capacity(), 10);
168  /// ```
169  #[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  /// Creates a new multimap with no capacity which will use the given hash builder to hash keys.
184  ///
185  /// The `state` is normally randomly generated and is designed to allow multimaps to be resistant to attacks that
186  /// cause many collisions and very poor performance. Setting it manually using this function can expose a DoS attack
187  /// vector.
188  ///
189  /// # Examples
190  ///
191  /// ```
192  /// use ordered_multimap::ListOrderedMultimap;
193  /// use std::collections::hash_map::RandomState;
194  ///
195  /// let state = RandomState::new();
196  /// let mut map = ListOrderedMultimap::with_hasher(state);
197  /// map.insert("key", "value");
198  /// ```
199  #[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  /// Returns an immutable reference to the first key-value pair in the multimap
212  ///
213  /// Complexity: O(1)
214  ///
215  /// # Examples
216  ///
217  /// ```
218  /// use ordered_multimap::ListOrderedMultimap;
219  ///
220  /// let mut map = ListOrderedMultimap::new();
221  /// assert_eq!(map.back(), None);
222  ///
223  /// map.insert("key", "value");
224  /// assert_eq!(map.back(), Some((&"key", &"value")));
225  /// ```
226  #[must_use]
227  pub fn back(&self) -> Option<(&Key, &Value)> {
228    self.iter().next_back()
229  }
230
231  /// Returns an immutable reference to the first key-value pair in the multimap
232  ///
233  /// Complexity: O(1)
234  ///
235  /// # Examples
236  ///
237  /// ```
238  /// use ordered_multimap::ListOrderedMultimap;
239  ///
240  /// let mut map = ListOrderedMultimap::new();
241  /// assert_eq!(map.back_mut(), None);
242  ///
243  /// map.insert("key", "value");
244  /// assert_eq!(map.back_mut(), Some((&"key", &mut "value")));
245  /// ```
246  #[must_use]
247  pub fn back_mut(&mut self) -> Option<(&Key, &mut Value)> {
248    self.iter_mut().next_back()
249  }
250
251  /// Removes all keys and values from the multimap.
252  ///
253  /// Complexity: O(|K| + |V|) where |K| is the number of keys and |V| is the number of values.
254  ///
255  /// # Examples
256  ///
257  /// ```
258  /// use ordered_multimap::ListOrderedMultimap;
259  ///
260  /// let mut map = ListOrderedMultimap::new();
261  /// map.insert("key", "value");
262  /// assert_eq!(map.keys_len(), 1);
263  /// assert_eq!(map.values_len(), 1);
264  ///
265  /// map.clear();
266  /// assert_eq!(map.keys_len(), 0);
267  /// assert_eq!(map.values_len(), 0);
268  /// ```
269  pub fn clear(&mut self) {
270    self.keys.clear();
271    self.map.clear();
272    self.values.clear();
273  }
274
275  /// Returns an immutable reference to the first key-value pair in the multimap
276  ///
277  /// Complexity: O(1)
278  ///
279  /// # Examples
280  ///
281  /// ```
282  /// use ordered_multimap::ListOrderedMultimap;
283  ///
284  /// let mut map = ListOrderedMultimap::new();
285  /// assert_eq!(map.front(), None);
286  ///
287  /// map.insert("key", "value");
288  /// assert_eq!(map.front(), Some((&"key", &"value")));
289  /// ```
290  #[must_use]
291  pub fn front(&self) -> Option<(&Key, &Value)> {
292    self.iter().next()
293  }
294
295  /// Returns an immutable reference to the first key-value pair in the multimap
296  ///
297  /// Complexity: O(1)
298  ///
299  /// # Examples
300  ///
301  /// ```
302  /// use ordered_multimap::ListOrderedMultimap;
303  ///
304  /// let mut map = ListOrderedMultimap::new();
305  /// assert_eq!(map.front_mut(), None);
306  ///
307  /// map.insert("key", "value");
308  /// assert_eq!(map.front_mut(), Some((&"key", &mut "value")));
309  /// ```
310  #[must_use]
311  pub fn front_mut(&mut self) -> Option<(&Key, &mut Value)> {
312    self.iter_mut().next()
313  }
314
315  /// Returns a reference to the multimap's [`BuildHasher`].
316  ///
317  /// # Examples
318  ///
319  /// ```
320  /// use ordered_multimap::ListOrderedMultimap;
321  ///
322  /// let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
323  /// let hasher = map.hasher();
324  /// ```
325  #[must_use]
326  pub fn hasher(&self) -> &State {
327    &self.build_hasher
328  }
329
330  /// Returns whether the multimap is empty.
331  ///
332  /// # Examples
333  ///
334  /// ```
335  /// use ordered_multimap::ListOrderedMultimap;
336  ///
337  /// let mut map = ListOrderedMultimap::new();
338  /// assert!(map.is_empty());
339  ///
340  /// map.insert("key1", "value");
341  /// assert!(!map.is_empty());
342  ///
343  /// map.remove(&"key1");
344  /// assert!(map.is_empty());
345  /// ```
346  #[must_use]
347  pub fn is_empty(&self) -> bool {
348    self.keys.is_empty()
349  }
350
351  /// Returns an iterator that yields immutable references to all key-value pairs in the multimap by insertion order.
352  ///
353  /// # Examples
354  ///
355  /// ```
356  /// use ordered_multimap::ListOrderedMultimap;
357  ///
358  /// let mut map = ListOrderedMultimap::new();
359  /// map.insert("key1", "value1");
360  /// map.insert("key2", "value1");
361  /// map.append(&"key1", "value2");
362  /// map.append(&"key2", "value2");
363  ///
364  /// let mut iter = map.iter();
365  /// assert_eq!(iter.size_hint(), (4, Some(4)));
366  /// assert_eq!(iter.next(), Some((&"key1", &"value1")));
367  /// assert_eq!(iter.next(), Some((&"key2", &"value1")));
368  /// assert_eq!(iter.next(), Some((&"key1", &"value2")));
369  /// assert_eq!(iter.next(), Some((&"key2", &"value2")));
370  /// assert_eq!(iter.next(), None);
371  /// ```
372  #[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  /// Returns an iterator that yields mutable references to all key-value pairs in the multimap by insertion order.
381  ///
382  /// Only the values are mutable, the keys are immutable.
383  ///
384  /// # Examples
385  ///
386  /// ```
387  /// use ordered_multimap::ListOrderedMultimap;
388  ///
389  /// let mut map = ListOrderedMultimap::new();
390  /// map.insert("key1", "value1");
391  /// map.insert("key2", "value1");
392  /// map.append(&"key1", "value2");
393  /// map.append(&"key2", "value2");
394  ///
395  /// let mut iter = map.iter_mut();
396  /// assert_eq!(iter.size_hint(), (4, Some(4)));
397  ///
398  /// let first = iter.next().unwrap();
399  /// assert_eq!(first, (&"key1", &mut "value1"));
400  /// *first.1 = "value3";
401  ///
402  /// assert_eq!(iter.next(), Some((&"key2", &mut "value1")));
403  /// assert_eq!(iter.next(), Some((&"key1", &mut "value2")));
404  /// assert_eq!(iter.next(), Some((&"key2", &mut "value2")));
405  /// assert_eq!(iter.next(), None);
406  ///
407  /// assert_eq!(map.get(&"key1"), Some(&"value3"));
408  /// ```
409  #[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  /// Returns an iterator that yields immutable references to all keys in the multimap by insertion order.
418  ///
419  /// Insertion order of keys is determined by the order in which a given key is first inserted into the multimap with a
420  /// value. Any subsequent insertions with that key without first removing it will not affect its ordering.
421  ///
422  /// # Examples
423  ///
424  /// ```
425  /// use ordered_multimap::ListOrderedMultimap;
426  ///
427  /// let mut map = ListOrderedMultimap::new();
428  /// map.insert("key1", "value");
429  /// map.insert("key2", "value");
430  /// map.insert("key3", "value");
431  ///
432  /// let mut keys = map.keys();
433  /// assert_eq!(keys.next(), Some(&"key1"));
434  /// assert_eq!(keys.next(), Some(&"key2"));
435  /// assert_eq!(keys.next(), Some(&"key3"));
436  /// assert_eq!(keys.next(), None);
437  /// ```
438  #[must_use]
439  pub fn keys(&self) -> Keys<'_, Key> {
440    Keys(self.keys.iter())
441  }
442
443  /// Returns the number of keys the multimap can hold without reallocating.
444  ///
445  /// This number is a lower bound, and the multimap may be able to hold more.
446  ///
447  /// # Examples
448  ///
449  /// ```
450  /// use ordered_multimap::ListOrderedMultimap;
451  ///
452  /// let mut map = ListOrderedMultimap::new();
453  /// assert_eq!(map.keys_capacity(), 0);
454  ///
455  /// map.insert("key", "value");
456  /// assert!(map.keys_capacity() > 0);
457  /// ```
458  #[must_use]
459  pub fn keys_capacity(&self) -> usize {
460    self.keys.capacity()
461  }
462
463  /// Returns the number of keys in the multimap.
464  ///
465  /// # Examples
466  ///
467  /// ```
468  /// use ordered_multimap::ListOrderedMultimap;
469  ///
470  /// let mut map = ListOrderedMultimap::new();
471  /// assert_eq!(map.keys_len(), 0);
472  ///
473  /// map.insert("key1", "value");
474  /// map.insert("key2", "value");
475  /// map.insert("key3", "value");
476  /// assert_eq!(map.keys_len(), 3);
477  /// ```
478  #[must_use]
479  pub fn keys_len(&self) -> usize {
480    self.keys.len()
481  }
482
483  /// Returns an iterator that yields immutable references to keys and all associated values with those keys as separate
484  /// iterators. The order of yielded pairs will be the order in which the keys were first inserted into the multimap.
485  ///
486  /// # Examples
487  ///
488  /// ```
489  /// use ordered_multimap::ListOrderedMultimap;
490  ///
491  /// let mut map = ListOrderedMultimap::new();
492  ///
493  /// map.insert("key", "value1");
494  /// map.append("key", "value2");
495  ///
496  /// let mut iter = map.pairs();
497  ///
498  /// let (key, mut values) = iter.next().unwrap();
499  /// assert_eq!(key, &"key");
500  /// assert_eq!(values.next(), Some(&"value1"));
501  /// assert_eq!(values.next(), Some(&"value2"));
502  /// assert_eq!(values.next(), None);
503  /// ```
504  #[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  /// Returns an iterator that yields immutable references to keys and mutable references to all associated values with
516  /// those keys as separate iterators. The order of yielded pairs will be the order in which the keys were first
517  /// inserted into the multimap.
518  ///
519  /// # Examples
520  ///
521  /// ```
522  /// use ordered_multimap::ListOrderedMultimap;
523  ///
524  /// let mut map = ListOrderedMultimap::new();
525  ///
526  /// map.insert("key", "value1");
527  /// map.append("key", "value2");
528  ///
529  /// let mut iter = map.pairs_mut();
530  ///
531  /// let (key, mut values) = iter.next().unwrap();
532  /// assert_eq!(key, &"key");
533  /// assert_eq!(values.next(), Some(&mut "value1"));
534  /// assert_eq!(values.next(), Some(&mut "value2"));
535  /// assert_eq!(values.next(), None);
536  /// ```
537  #[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  /// Reserves additional capacity such that more values can be stored in the multimap.
549  ///
550  /// If the existing capacity minus the current length is enough to satisfy the additional capacity, the capacity will
551  /// remain unchanged.
552  ///
553  /// If the capacity is increased, the capacity may be increased by more than what was requested.
554  ///
555  /// # Examples
556  ///
557  /// ```
558  /// use ordered_multimap::ListOrderedMultimap;
559  ///
560  /// let mut map = ListOrderedMultimap::with_capacity(1, 1);
561  ///
562  /// map.insert("key", "value");
563  /// assert_eq!(map.values_capacity(), 1);
564  ///
565  /// map.reserve_values(10);
566  /// assert!(map.values_capacity() >= 11);
567  /// ```
568  pub fn reserve_values(&mut self, additional_capacity: usize) {
569    self.values.reserve(additional_capacity);
570  }
571
572  /// Returns an iterator that yields immutable references to all values in the multimap by insertion order.
573  ///
574  /// # Examples
575  ///
576  /// ```
577  /// use ordered_multimap::ListOrderedMultimap;
578  ///
579  /// let mut map = ListOrderedMultimap::new();
580  /// map.insert("key1", "value1");
581  /// map.insert("key2", "value1");
582  /// map.append(&"key1", "value2");
583  /// map.append(&"key2", "value2");
584  ///
585  /// let mut iter = map.values();
586  /// assert_eq!(iter.size_hint(), (4, Some(4)));
587  /// assert_eq!(iter.next(), Some(&"value1"));
588  /// assert_eq!(iter.next(), Some(&"value1"));
589  /// assert_eq!(iter.next(), Some(&"value2"));
590  /// assert_eq!(iter.next(), Some(&"value2"));
591  /// assert_eq!(iter.next(), None);
592  /// ```
593  #[must_use]
594  pub fn values(&self) -> Values<'_, Key, Value> {
595    Values(self.values.iter())
596  }
597
598  /// Returns an iterator that yields mutable references to all values in the multimap by insertion order.
599  ///
600  /// # Examples
601  ///
602  /// ```
603  /// use ordered_multimap::ListOrderedMultimap;
604  ///
605  /// let mut map = ListOrderedMultimap::new();
606  /// map.insert("key1", "value1");
607  /// map.insert("key2", "value1");
608  /// map.append(&"key1", "value2");
609  /// map.append(&"key2", "value2");
610  ///
611  /// let mut iter = map.values_mut();
612  /// assert_eq!(iter.size_hint(), (4, Some(4)));
613  ///
614  /// let first = iter.next().unwrap();
615  /// assert_eq!(first, &mut "value1");
616  /// *first = "value3";
617  ///
618  /// assert_eq!(iter.next(), Some(&mut "value1"));
619  /// assert_eq!(iter.next(), Some(&mut "value2"));
620  /// assert_eq!(iter.next(), Some(&mut "value2"));
621  /// assert_eq!(iter.next(), None);
622  ///
623  /// assert_eq!(map.get(&"key1"), Some(&"value3"));
624  /// ```
625  #[must_use]
626  pub fn values_mut(&mut self) -> ValuesMut<'_, Key, Value> {
627    ValuesMut(self.values.iter_mut())
628  }
629
630  /// Returns the number of values the multimap can hold without reallocating.
631  ///
632  /// This number is a lower bound, and the multimap may be able to hold more.
633  ///
634  /// # Examples
635  ///
636  /// ```
637  /// use ordered_multimap::ListOrderedMultimap;
638  ///
639  /// let mut map = ListOrderedMultimap::new();
640  /// assert_eq!(map.values_capacity(), 0);
641  ///
642  /// map.insert("key", "value");
643  /// assert!(map.values_capacity() > 0);
644  /// ```
645  #[must_use]
646  pub fn values_capacity(&self) -> usize {
647    self.values.capacity()
648  }
649
650  /// Returns the total number of values in the multimap across all keys.
651  ///
652  /// # Examples
653  ///
654  /// ```
655  /// use ordered_multimap::ListOrderedMultimap;
656  ///
657  /// let mut map = ListOrderedMultimap::new();
658  /// assert_eq!(map.values_len(), 0);
659  ///
660  /// map.insert("key1", "value1");
661  /// assert_eq!(map.values_len(), 1);
662  ///
663  /// map.append("key1", "value2");
664  /// assert_eq!(map.values_len(), 2);
665  /// ```
666  #[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  /// Appends a value to the list of values associated with the given key.
678  ///
679  /// If the key is not already in the multimap, this will be identical to an insert and the return value will be
680  /// `false`. Otherwise, `true` will be returned.
681  ///
682  /// Complexity: amortized O(1)
683  ///
684  /// # Examples
685  ///
686  /// ```
687  /// use ordered_multimap::ListOrderedMultimap;
688  ///
689  /// let mut map = ListOrderedMultimap::new();
690  /// let already_exists = map.append("key", "value");
691  /// assert!(!already_exists);
692  /// assert_eq!(map.values_len(), 1);
693  /// assert_eq!(map.get(&"key"), Some(&"value"));
694  ///
695  /// let already_exists = map.append("key", "value2");
696  /// assert!(already_exists);
697  /// assert_eq!(map.values_len(), 2);
698  /// ```
699  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  /// Returns whether the given key is in the multimap.
734  ///
735  /// Complexity: O(1)
736  ///
737  /// # Examples
738  ///
739  /// ```
740  /// use ordered_multimap::ListOrderedMultimap;
741  ///
742  /// let mut map = ListOrderedMultimap::new();
743  /// assert!(!map.contains_key(&"key"));
744  /// map.insert("key", "value");
745  /// assert!(map.contains_key(&"key"));
746  /// ```
747  #[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  /// Returns whether the given key is in the multimap.
758  ///
759  /// Complexity: O(1)
760  ///
761  /// # Examples
762  ///
763  /// ```
764  /// use ordered_multimap::ListOrderedMultimap;
765  ///
766  /// let mut map = ListOrderedMultimap::new();
767  /// let value = map.entry("key").or_insert("value");
768  /// assert_eq!(value, &"value");
769  /// assert_eq!(map.get(&"key"), Some(&"value"));
770  /// ```
771  #[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    // TODO: This ugliness arises from borrow checking issues which seems to happen when the vacant entry is created in
776    // the match block further below for `Vacant` even though it should be perfectly safe. Is there a better way to do
777    // this?
778    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  /// Returns the number of values associated with a key.
800  ///
801  /// Complexity: O(1)
802  ///
803  /// # Examples
804  ///
805  /// ```
806  /// use ordered_multimap::ListOrderedMultimap;
807  ///
808  /// let mut map = ListOrderedMultimap::new();
809  /// assert_eq!(map.entry_len(&"key"), 0);
810  ///
811  /// map.insert("key", "value1");
812  /// assert_eq!(map.entry_len(&"key"), 1);
813  ///
814  /// map.append(&"key", "value2");
815  /// assert_eq!(map.entry_len(&"key"), 2);
816  /// ```
817  #[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  /// Returns an immutable reference to the first value, by insertion order, associated with the given key, or `None` if
832  /// the key is not in the multimap.
833  ///
834  /// Complexity: O(1)
835  ///
836  /// # Examples
837  ///
838  /// ```
839  /// use ordered_multimap::ListOrderedMultimap;
840  ///
841  /// let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
842  /// assert_eq!(map.get(&"key"), None);
843  ///
844  /// ```
845  #[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  /// Returns an iterator that yields immutable references to all values associated with the given key by insertion
860  /// order.
861  ///
862  /// If the key is not in the multimap, the iterator will yield no values.
863  ///
864  /// # Examples
865  ///
866  /// ```
867  /// use ordered_multimap::ListOrderedMultimap;
868  ///
869  /// let mut map = ListOrderedMultimap::new();
870  /// map.insert("key", "value");
871  /// map.append("key", "value2");
872  ///
873  /// let mut iter = map.get_all(&"key");
874  /// assert_eq!(iter.next(), Some(&"value"));
875  /// assert_eq!(iter.next(), Some(&"value2"));
876  /// assert_eq!(iter.next(), None);
877  /// ```
878  #[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  /// Returns an iterator that yields mutable references to all values associated with the given key by insertion order.
893  ///
894  /// If the key is not in the multimap, the iterator will yield no values.
895  ///
896  /// # Examples
897  ///
898  /// ```
899  /// use ordered_multimap::ListOrderedMultimap;
900  ///
901  /// let mut map = ListOrderedMultimap::new();
902  /// map.insert("key", "value1");
903  /// map.append("key", "value2");
904  ///
905  /// let mut iter = map.get_all_mut(&"key");
906  ///
907  /// let first = iter.next().unwrap();
908  /// assert_eq!(first, &mut "value1");
909  /// *first = "value3";
910  ///
911  /// assert_eq!(iter.next(), Some(&mut "value2"));
912  /// assert_eq!(iter.next(), None);
913  ///
914  /// assert_eq!(map.get(&"key"), Some(&"value3"));
915  /// ```
916  #[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  /// Returns a mutable reference to the first value, by insertion order, associated with the given key, or `None` if
931  /// the key is not in the multimap.
932  ///
933  /// Complexity: O(1)
934  ///
935  /// # Examples
936  ///
937  /// ```
938  /// use ordered_multimap::ListOrderedMultimap;
939  ///
940  /// let mut map = ListOrderedMultimap::new();
941  /// assert_eq!(map.get(&"key"), None);
942  ///
943  /// map.insert("key", "value");
944  /// assert_eq!(map.get(&"key"), Some(&"value"));
945  ///
946  /// let mut value = map.get_mut(&"key").unwrap();
947  /// *value = "value2";
948  ///
949  /// assert_eq!(map.get(&"key"), Some(&"value2"));
950  /// ```
951  #[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  /// Inserts the key-value pair into the multimap and returns the first value, by insertion order, that was already
966  /// associated with the key.
967  ///
968  /// If the key is not already in the multimap, `None` will be returned. If the key is already in the multimap, the
969  /// insertion ordering of the keys will remain unchanged.
970  ///
971  /// Complexity: O(1) amortized
972  ///
973  /// # Examples
974  ///
975  /// ```
976  /// use ordered_multimap::ListOrderedMultimap;
977  ///
978  /// let mut map = ListOrderedMultimap::new();
979  /// assert!(map.is_empty());
980  ///
981  /// let old_value = map.insert("key", "value");
982  /// assert!(old_value.is_none());
983  /// assert_eq!(map.values_len(), 1);
984  /// assert_eq!(map.get(&"key"), Some(&"value"));
985  ///
986  /// let old_value = map.insert("key", "value2");
987  /// assert_eq!(old_value, Some("value"));
988  /// assert_eq!(map.values_len(), 1);
989  /// assert_eq!(map.get(&"key"), Some(&"value2"));
990  /// ```
991  pub fn insert(&mut self, key: Key, value: Value) -> Option<Value> {
992    self.insert_all(key, value).next()
993  }
994
995  /// Inserts the key-value pair into the multimap and returns an iterator that yields all values previously associated
996  /// with the key by insertion order.
997  ///
998  /// If the key is not already in the multimap, the iterator will yield no values.If the key is already in the
999  /// multimap, the insertion ordering of the keys will remain unchanged.
1000  ///
1001  /// Complexity: O(1) amortized
1002  ///
1003  /// # Examples
1004  ///
1005  /// ```
1006  /// use ordered_multimap::ListOrderedMultimap;
1007  ///
1008  /// let mut map = ListOrderedMultimap::new();
1009  /// assert!(map.is_empty());
1010  ///
1011  /// {
1012  ///   let mut old_values = map.insert_all("key", "value");
1013  ///   assert_eq!(old_values.next(), None);
1014  /// }
1015  ///
1016  /// assert_eq!(map.values_len(), 1);
1017  /// assert_eq!(map.get(&"key"), Some(&"value"));
1018  ///
1019  /// map.append("key", "value2");
1020  ///
1021  /// {
1022  ///   let mut old_values = map.insert_all("key", "value3");
1023  ///   assert_eq!(old_values.next(), Some("value"));
1024  ///   assert_eq!(old_values.next(), Some("value2"));
1025  ///   assert_eq!(old_values.next(), None);
1026  /// }
1027  ///
1028  /// assert_eq!(map.values_len(), 1);
1029  /// assert_eq!(map.get(&"key"), Some(&"value3"));
1030  /// ```
1031  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  /// Reorganizes the multimap to ensure maximum spatial locality and changes the key and value capacities to the
1061  /// provided values.
1062  ///
1063  /// This function can be used to actually increase the capacity of the multimap.
1064  ///
1065  /// Complexity: O(|K| + |V|) where |K| is the number of keys and |V| is the number of values.
1066  ///
1067  /// # Panics
1068  ///
1069  /// Panics if either of the given minimum capacities are less than their current respective lengths.
1070  ///
1071  /// # Examples
1072  ///
1073  /// ```
1074  /// use ordered_multimap::ListOrderedMultimap;
1075  ///
1076  /// let mut map = ListOrderedMultimap::with_capacity(10, 10);
1077  ///
1078  /// map.insert("key1", "value1");
1079  /// map.insert("key2", "value2");
1080  /// map.append("key2", "value3");
1081  /// map.append("key1", "value4");
1082  /// map.pack_to(5, 5);
1083  ///
1084  /// assert_eq!(map.keys_capacity(), 5);
1085  /// assert_eq!(map.keys_len(), 2);
1086  /// assert_eq!(map.values_capacity(), 5);
1087  /// assert_eq!(map.values_len(), 4);
1088  /// ```
1089  #[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  /// Reorganizes the multimap to ensure maximum spatial locality and removes any excess key and value capacity.
1137  ///
1138  /// Complexity: O(|K| + |V|) where |K| is the number of keys and |V| is the number of values.
1139  ///
1140  /// # Examples
1141  ///
1142  /// ```
1143  /// use ordered_multimap::ListOrderedMultimap;
1144  ///
1145  /// let mut map = ListOrderedMultimap::with_capacity(5, 5);
1146  ///
1147  /// map.insert("key1", "value1");
1148  /// map.insert("key2", "value2");
1149  /// map.append("key2", "value3");
1150  /// map.append("key1", "value4");
1151  /// map.pack_to_fit();
1152  ///
1153  /// assert_eq!(map.keys_capacity(), 2);
1154  /// assert_eq!(map.keys_len(), 2);
1155  /// assert_eq!(map.values_capacity(), 4);
1156  /// assert_eq!(map.values_len(), 4);
1157  /// ```
1158  #[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  /// Removes the last key-value pair to have been inserted.
1167  ///
1168  /// Because a single key can be associated with many values, the key returned by this function is a [`KeyWrapper`]
1169  /// which can be either owned or borrowed. If the value removed was the only value associated with the key, then the
1170  /// key will be returned. Otherwise, a reference to the key will be returned.
1171  ///
1172  /// This function along with [`ListOrderedMultimap::pop_front`] act as replacements for a drain iterator since an
1173  /// iterator cannot be done over [`KeyWrapper`].
1174  ///
1175  /// Complexity: O(1)
1176  ///
1177  /// # Examples
1178  ///
1179  /// ```
1180  /// use ordered_multimap::ListOrderedMultimap;
1181  /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1182  ///
1183  /// let mut map = ListOrderedMultimap::new();
1184  ///
1185  /// map.insert("key", "value1");
1186  /// map.append("key", "value2");
1187  ///
1188  /// let (key, value) = map.pop_back().unwrap();
1189  /// assert_eq!(key, KeyWrapper::Borrowed(&"key"));
1190  /// assert_eq!(&value, &"value2");
1191  ///
1192  /// let (key, value) = map.pop_back().unwrap();
1193  /// assert_eq!(key, KeyWrapper::Owned("key"));
1194  /// assert_eq!(&value, &"value1");
1195  /// ```
1196  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  /// Removes the first key-value pair to have been inserted.
1236  ///
1237  /// Because a single key can be associated with many values, the key returned by this function is a [`KeyWrapper`]
1238  /// which can be either owned or borrowed. If the value removed was the only value associated with the key, then the
1239  /// key will be returned. Otherwise, a reference to the key will be returned.
1240  ///
1241  /// This function along with [`ListOrderedMultimap::pop_back`] act as replacements for a drain iterator since an
1242  /// iterator cannot be done over [`KeyWrapper`].
1243  ///
1244  /// Complexity: O(1)
1245  ///
1246  /// # Examples
1247  ///
1248  /// ```
1249  /// use ordered_multimap::ListOrderedMultimap;
1250  /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1251  ///
1252  /// let mut map = ListOrderedMultimap::new();
1253  ///
1254  /// map.insert("key", "value1");
1255  /// map.append("key", "value2");
1256  ///
1257  /// let (key, value) = map.pop_front().unwrap();
1258  /// assert_eq!(key, KeyWrapper::Borrowed(&"key"));
1259  /// assert_eq!(&value, &"value1");
1260  ///
1261  /// let (key, value) = map.pop_front().unwrap();
1262  /// assert_eq!(key, KeyWrapper::Owned("key"));
1263  /// assert_eq!(&value, &"value2");
1264  /// ```
1265  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  /// Removes all values associated with the given key from the map and returns the first value by insertion order.
1305  ///
1306  /// Complexity: O(1)
1307  ///
1308  /// # Examples
1309  ///
1310  /// ```
1311  /// use ordered_multimap::ListOrderedMultimap;
1312  ///
1313  /// let mut map = ListOrderedMultimap::new();
1314  ///
1315  /// let removed_value = map.remove(&"key");
1316  /// assert_eq!(removed_value, None);
1317  ///
1318  /// map.insert("key", "value");
1319  /// assert_eq!(map.get(&"key"), Some(&"value"));
1320  ///
1321  /// let removed_value = map.remove(&"key");
1322  /// assert_eq!(removed_value, Some("value"));
1323  /// assert_eq!(map.get(&"key"), None);
1324  /// ```
1325  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  /// Removes all values associated with the given key from the map and returns an iterator that yields those values.
1334  ///
1335  /// If the key is not already in the map, the iterator will yield no values.
1336  ///
1337  /// Complexity: O(1)
1338  ///
1339  /// # Examples
1340  ///
1341  /// ```
1342  /// use ordered_multimap::ListOrderedMultimap;
1343  ///
1344  /// let mut map = ListOrderedMultimap::new();
1345  ///
1346  /// {
1347  ///     let mut removed_values = map.remove_all(&"key");
1348  ///     assert_eq!(removed_values.next(), None);
1349  /// }
1350  ///
1351  /// map.insert("key", "value1");
1352  /// map.append("key", "value2");
1353  /// assert_eq!(map.get(&"key"), Some(&"value1"));
1354  ///
1355  /// {
1356  ///     let mut removed_values = map.remove_all(&"key");
1357  ///     assert_eq!(removed_values.next(), Some("value1"));
1358  ///     assert_eq!(removed_values.next(), Some("value2"));
1359  ///     assert_eq!(removed_values.next(), None);
1360  /// }
1361  ///
1362  /// assert_eq!(map.get(&"key"), None);
1363  /// ```
1364  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  /// Removes all values associated with the given key from the map and returns the key and first value.
1383  ///
1384  /// If the key is not already in the map, then `None` will be returned.
1385  ///
1386  /// Complexity: O(1)
1387  ///
1388  /// # Examples
1389  ///
1390  /// ```
1391  /// use ordered_multimap::ListOrderedMultimap;
1392  ///
1393  /// let mut map = ListOrderedMultimap::new();
1394  ///
1395  /// let entry = map.remove_entry(&"key");
1396  /// assert_eq!(entry, None);
1397  ///
1398  /// map.insert("key", "value");
1399  /// assert_eq!(map.get(&"key"), Some(&"value"));
1400  ///
1401  /// let entry = map.remove_entry(&"key");
1402  /// assert_eq!(entry, Some(("key", "value")));
1403  /// assert_eq!(map.get(&"key"), None);
1404  /// ```
1405  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  /// Removes all values associated with the given key from the map and returns the key and an iterator that yields
1415  /// those values.
1416  ///
1417  /// If the key is not already in the map, then `None` will be returned.
1418  ///
1419  /// Complexity: O(1)
1420  ///
1421  /// # Examples
1422  ///
1423  /// ```
1424  /// use ordered_multimap::ListOrderedMultimap;
1425  ///
1426  /// let mut map = ListOrderedMultimap::new();
1427  ///
1428  /// {
1429  ///     let entry = map.remove_entry_all(&"key");
1430  ///     assert!(entry.is_none());
1431  /// }
1432  ///
1433  /// map.insert("key", "value1");
1434  /// map.append("key", "value2");
1435  /// assert_eq!(map.get(&"key"), Some(&"value1"));
1436  ///
1437  /// {
1438  ///     let (key, mut iter) = map.remove_entry_all(&"key").unwrap();
1439  ///     assert_eq!(key, "key");
1440  ///     assert_eq!(iter.next(), Some("value1"));
1441  ///     assert_eq!(iter.next(), Some("value2"));
1442  ///     assert_eq!(iter.next(), None);
1443  /// }
1444  ///
1445  /// assert_eq!(map.get(&"key"), None);
1446  /// ```
1447  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  /// Reserves additional capacity such that more keys can be stored in the multimap.
1470  ///
1471  /// If the existing capacity minus the current length is enough to satisfy the additional capacity, the capacity will
1472  /// remain unchanged.
1473  ///
1474  /// If the capacity is increased, the capacity may be increased by more than what was requested.
1475  ///
1476  /// # Examples
1477  ///
1478  /// ```
1479  /// use ordered_multimap::ListOrderedMultimap;
1480  ///
1481  /// let mut map = ListOrderedMultimap::with_capacity(1, 1);
1482  ///
1483  /// map.insert("key", "value");
1484  /// assert_eq!(map.keys_capacity(), 1);
1485  ///
1486  /// map.reserve_keys(10);
1487  /// assert!(map.keys_capacity() >= 11);
1488  /// assert_eq!(map.get(&"key"), Some(&"value"));
1489  /// ```
1490  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  /// Keeps all key-value pairs that satisfy the given predicate function.
1513  ///
1514  /// Complexity: O(|V|) where |V| is the number of values
1515  ///
1516  /// # Examples
1517  ///
1518  /// ```
1519  /// use ordered_multimap::ListOrderedMultimap;
1520  ///
1521  /// let mut map = ListOrderedMultimap::new();
1522  ///
1523  /// map.insert("key1", 1);
1524  /// map.insert("key2", 5);
1525  /// map.append("key1", -1);
1526  /// map.insert("key3", -10);
1527  ///
1528  /// map.retain(|_, &mut value| value >= 0);
1529  ///
1530  /// let mut iter = map.iter();
1531  /// assert_eq!(iter.next(), Some((&"key1", &1)));
1532  /// assert_eq!(iter.next(), Some((&"key2", &5)));
1533  /// assert_eq!(iter.next(), None);
1534  /// ```
1535  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  /// Helper function for [`ListOrderedMultimap::retain`] to deal with borrowing issues.
1549  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/// A wrapper around a key that is either borrowed or owned.
1729///
1730/// This type is similar to [`std::borrow::Cow`] but does not require a [`Clone`] trait bound on the key.
1731#[allow(single_use_lifetimes)]
1732#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
1733pub enum KeyWrapper<'map, Key> {
1734  /// An immutable reference to a key. This implies that the key is still associated to at least one value in the
1735  /// multimap.
1736  Borrowed(&'map Key),
1737
1738  /// An owned key. This will occur when a key is no longer associated with any values in the multimap.
1739  Owned(Key),
1740}
1741
1742impl<Key> KeyWrapper<'_, Key> {
1743  /// If the key wrapped is owned, it is returned. Otherwise, the borrowed key is cloned and returned.
1744  ///
1745  /// # Examples
1746  ///
1747  /// ```
1748  /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1749  ///
1750  /// let borrowed = KeyWrapper::Borrowed(&0);
1751  /// assert_eq!(borrowed.into_owned(), 0);
1752  ///
1753  /// let owned = KeyWrapper::Owned(0);
1754  /// assert_eq!(borrowed.into_owned(), 0);
1755  /// ```
1756  #[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  /// Returns whether the wrapped key is borrowed.
1768  ///
1769  /// # Examples
1770  ///
1771  /// ```
1772  /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1773  ///
1774  /// let borrowed = KeyWrapper::Borrowed(&0);
1775  /// assert!(borrowed.is_borrowed());
1776  ///
1777  /// let owned = KeyWrapper::Owned(0);
1778  /// assert!(!owned.is_borrowed());
1779  /// ```
1780  #[must_use]
1781  pub fn is_borrowed(&self) -> bool {
1782    matches!(self, KeyWrapper::Borrowed(_))
1783  }
1784
1785  /// Returns whether the wrapped key is owned.
1786  ///
1787  /// # Examples
1788  ///
1789  /// ```
1790  /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1791  ///
1792  /// let borrowed = KeyWrapper::Borrowed(&0);
1793  /// assert!(!borrowed.is_owned());
1794  ///
1795  /// let owned = KeyWrapper::Owned(0);
1796  /// assert!(owned.is_owned());
1797  /// ```
1798  #[must_use]
1799  pub fn is_owned(&self) -> bool {
1800    matches!(self, KeyWrapper::Owned(_))
1801  }
1802}
1803
1804/// The value type of the internal hash map.
1805#[derive(Clone)]
1806pub(crate) struct MapEntry<Key, Value> {
1807  /// The index of the first value for this entry.
1808  head_index: Index<ValueEntry<Key, Value>>,
1809
1810  /// The number of values for this entry.
1811  length: usize,
1812
1813  /// The index of the last value for this entry.
1814  tail_index: Index<ValueEntry<Key, Value>>,
1815}
1816
1817impl<Key, Value> MapEntry<Key, Value> {
1818  /// Convenience function for adding a new value to the entry.
1819  pub fn append(&mut self, index: Index<ValueEntry<Key, Value>>) {
1820    self.length += 1;
1821    self.tail_index = index;
1822  }
1823
1824  /// Convenience function for creating a new multimap entry.
1825  #[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  /// Convenience function for resetting the entry to contain only one value.
1835  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/// The value entry that is contained within the internal values list.
1843#[derive(Clone)]
1844pub(crate) struct ValueEntry<Key, Value> {
1845  /// The index of the key in the key list for this entry.
1846  key_index: Index<Key>,
1847
1848  /// The index of the next value with the same key.
1849  next_index: Option<Index<ValueEntry<Key, Value>>>,
1850
1851  /// The index of the previous value with the same key.
1852  previous_index: Option<Index<ValueEntry<Key, Value>>>,
1853
1854  /// The actual value stored in this entry.
1855  value: Value,
1856}
1857
1858impl<Key, Value> ValueEntry<Key, Value> {
1859  /// Convenience function for creating a new value entry.
1860  #[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
1871/// A view into a single entry in the multimap, which may either be vacant or occupied.
1872pub enum Entry<'map, Key, Value, State = RandomState> {
1873  /// An occupied entry associated with one or more values.
1874  Occupied(OccupiedEntry<'map, Key, Value>),
1875
1876  /// A vacant entry with no associated values.
1877  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  /// Calls the given function with a mutable reference to the first value of this entry, by insertion order, if it is
1886  /// vacant, otherwise this function is a no-op.
1887  ///
1888  /// # Examples
1889  ///
1890  /// ```
1891  /// use ordered_multimap::ListOrderedMultimap;
1892  ///
1893  /// let mut map = ListOrderedMultimap::new();
1894  ///
1895  /// map.entry("key")
1896  ///     .and_modify(|value| *value += 1)
1897  ///     .or_insert(42);
1898  /// assert_eq!(map.get(&"key"), Some(&42));
1899  ///
1900  /// map.entry("key")
1901  ///     .and_modify(|value| *value += 1)
1902  ///     .or_insert(42);
1903  /// assert_eq!(map.get(&"key"), Some(&43));
1904  /// ```
1905  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  /// If the entry is vacant, the given value will be inserted into it and a mutable reference to that value will be
1919  /// returned. Otherwise, a mutable reference to the first value, by insertion order, will be returned.
1920  ///
1921  /// # Examples
1922  ///
1923  /// ```
1924  /// use ordered_multimap::ListOrderedMultimap;
1925  ///
1926  /// let mut map = ListOrderedMultimap::new();
1927  /// map.insert("key", "value1");
1928  ///
1929  /// let value = map.entry("key").or_insert("value2");
1930  /// assert_eq!(value, &"value1");
1931  ///
1932  /// let value = map.entry("key2").or_insert("value2");
1933  /// assert_eq!(value, &"value2");
1934  /// ```
1935  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  /// If the entry is vacant, the given value will be inserted into it and the new occupied entry will be returned.
1943  /// Otherwise, the existing occupied entry will be returned.
1944  ///
1945  /// # Examples
1946  ///
1947  /// ```
1948  /// use ordered_multimap::ListOrderedMultimap;
1949  ///
1950  /// let mut map = ListOrderedMultimap::new();
1951  /// map.insert("key", "value1");
1952  ///
1953  /// let entry = map.entry("key").or_insert_entry("value2");
1954  /// assert_eq!(entry.into_mut(), &"value1");
1955  ///
1956  /// let entry = map.entry("key2").or_insert_entry("value2");
1957  /// assert_eq!(entry.into_mut(), &"value2");
1958  /// ```
1959  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  /// If the entry is vacant, the value returned from the given function will be inserted into it and a mutable
1967  /// reference to that value will be returned. Otherwise, a mutable reference to the first value, by insertion order,
1968  /// will be returned.
1969  ///
1970  /// # Examples
1971  ///
1972  /// ```
1973  /// use ordered_multimap::ListOrderedMultimap;
1974  ///
1975  /// let mut map = ListOrderedMultimap::new();
1976  /// map.insert("key", "value1");
1977  ///
1978  /// let value = map.entry("key").or_insert_with(|| "value2");
1979  /// assert_eq!(value, &"value1");
1980  ///
1981  /// let value = map.entry("key2").or_insert_with(|| "value2");
1982  /// assert_eq!(value, &"value2");
1983  /// ```
1984  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  /// If the entry is vacant, the value returned from the given function will be inserted into it and the new occupied
1995  /// entry will be returned. Otherwise, the existing occupied entry will be returned.
1996  ///
1997  /// # Examples
1998  ///
1999  /// ```
2000  /// use ordered_multimap::ListOrderedMultimap;
2001  ///
2002  /// let mut map = ListOrderedMultimap::new();
2003  /// map.insert("key", "value1");
2004  ///
2005  /// let entry = map.entry("key").or_insert_with_entry(|| "value2");
2006  /// assert_eq!(entry.into_mut(), &"value1");
2007  ///
2008  /// let entry = map.entry("key2").or_insert_with_entry(|| "value2");
2009  /// assert_eq!(entry.into_mut(), &"value2");
2010  /// ```
2011  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
2036/// A view into an occupied entry in the multimap.
2037pub 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  /// # Examples
2048  ///
2049  /// ```
2050  /// use ordered_multimap::ListOrderedMultimap;
2051  /// use ordered_multimap::list_ordered_multimap::Entry;
2052  ///
2053  /// let mut map = ListOrderedMultimap::new();
2054  /// map.insert("key", "value1");
2055  ///
2056  /// let mut entry = match map.entry("key") {
2057  ///     Entry::Occupied(entry) => entry,
2058  ///     _ => panic!("expected occupied entry")
2059  /// };
2060  ///
2061  /// entry.append("value2");
2062  ///
2063  /// let mut iter = map.get_all(&"key");
2064  /// assert_eq!(iter.next(), Some(&"value1"));
2065  /// assert_eq!(iter.next(), Some(&"value2"));
2066  /// assert_eq!(iter.next(), None);
2067  /// ```
2068  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  /// # Examples
2084  ///
2085  /// ```
2086  /// use ordered_multimap::ListOrderedMultimap;
2087  /// use ordered_multimap::list_ordered_multimap::Entry;
2088  ///
2089  /// let mut map = ListOrderedMultimap::new();
2090  /// map.insert("key", "value");
2091  ///
2092  /// let mut entry = match map.entry("key") {
2093  ///     Entry::Occupied(entry) => entry,
2094  ///     _ => panic!("expected occupied entry")
2095  /// };
2096  ///
2097  /// assert_eq!(entry.get(), &"value");
2098  /// ```
2099  #[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  /// # Examples
2106  ///
2107  /// ```
2108  /// use ordered_multimap::ListOrderedMultimap;
2109  /// use ordered_multimap::list_ordered_multimap::Entry;
2110  ///
2111  /// let mut map = ListOrderedMultimap::new();
2112  /// map.insert("key", "value");
2113  ///
2114  /// let mut entry = match map.entry("key") {
2115  ///     Entry::Occupied(entry) => entry,
2116  ///     _ => panic!("expected occupied entry")
2117  /// };
2118  ///
2119  /// assert_eq!(entry.get(), &mut "value");
2120  /// ```
2121  #[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  /// # Examples
2128  ///
2129  /// ```
2130  /// use ordered_multimap::ListOrderedMultimap;
2131  /// use ordered_multimap::list_ordered_multimap::Entry;
2132  ///
2133  /// let mut map = ListOrderedMultimap::new();
2134  /// map.insert("key", "value1");
2135  ///
2136  /// let mut entry = match map.entry("key") {
2137  ///     Entry::Occupied(entry) => entry,
2138  ///     _ => panic!("expected occupied entry")
2139  /// };
2140  ///
2141  /// entry.insert("value2");
2142  ///
2143  /// assert_eq!(map.get(&"key"), Some(&"value2"));
2144  /// ```
2145  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  /// # Examples
2165  ///
2166  /// ```
2167  /// use ordered_multimap::ListOrderedMultimap;
2168  /// use ordered_multimap::list_ordered_multimap::Entry;
2169  ///
2170  /// let mut map = ListOrderedMultimap::new();
2171  /// map.insert("key", "value1");
2172  ///
2173  /// let mut entry = match map.entry("key") {
2174  ///   Entry::Occupied(entry) => entry,
2175  ///   _ => panic!("expected occupied entry")
2176  /// };
2177  ///
2178  /// entry.append("value2");
2179  ///
2180  /// let mut iter = entry.insert_all("value3");
2181  /// assert_eq!(iter.next(), Some("value1"));
2182  /// assert_eq!(iter.next(), Some("value2"));
2183  /// assert_eq!(iter.next(), None);
2184  /// ```
2185  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  /// # Examples
2196  ///
2197  /// ```
2198  /// use ordered_multimap::ListOrderedMultimap;
2199  /// use ordered_multimap::list_ordered_multimap::Entry;
2200  ///
2201  /// let mut map = ListOrderedMultimap::new();
2202  /// map.insert("key", "value");
2203  ///
2204  /// let mut entry = match map.entry("key") {
2205  ///   Entry::Occupied(entry) => entry,
2206  ///   _ => panic!("expected occupied entry")
2207  /// };
2208  ///
2209  /// assert_eq!(entry.into_mut(), &mut "value");
2210  /// ```
2211  #[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  /// # Examples
2218  ///
2219  /// ```
2220  /// use ordered_multimap::ListOrderedMultimap;
2221  /// use ordered_multimap::list_ordered_multimap::Entry;
2222  ///
2223  /// let mut map = ListOrderedMultimap::new();
2224  /// map.insert("key", "value1");
2225  ///
2226  /// let mut entry = match map.entry("key") {
2227  ///   Entry::Occupied(entry) => entry,
2228  ///   _ => panic!("expected occupied entry")
2229  /// };
2230  ///
2231  /// entry.append("value2");
2232  ///
2233  /// let mut iter = entry.iter();
2234  /// assert_eq!(iter.next(), Some(&"value1"));
2235  /// assert_eq!(iter.next(), Some(&"value2"));
2236  /// assert_eq!(iter.next(), None);
2237  /// ```
2238  #[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  /// # Examples
2245  ///
2246  /// ```
2247  /// use ordered_multimap::ListOrderedMultimap;
2248  /// use ordered_multimap::list_ordered_multimap::Entry;
2249  ///
2250  /// let mut map = ListOrderedMultimap::new();
2251  /// map.insert("key", "value1");
2252  ///
2253  /// let mut entry = match map.entry("key") {
2254  ///     Entry::Occupied(entry) => entry,
2255  ///     _ => panic!("expected occupied entry")
2256  /// };
2257  ///
2258  /// entry.append("value2");
2259  ///
2260  /// let mut iter = entry.iter_mut();
2261  /// assert_eq!(iter.next(), Some(&mut "value1"));
2262  /// assert_eq!(iter.next(), Some(&mut "value2"));
2263  /// assert_eq!(iter.next(), None);
2264  /// ```
2265  #[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  /// # Examples
2272  ///
2273  /// ```
2274  /// use ordered_multimap::ListOrderedMultimap;
2275  /// use ordered_multimap::list_ordered_multimap::Entry;
2276  ///
2277  /// let mut map = ListOrderedMultimap::new();
2278  /// map.insert("key", "value1");
2279  ///
2280  /// let mut entry = match map.entry("key") {
2281  ///   Entry::Occupied(entry) => entry,
2282  ///   _ => panic!("expected occupied entry")
2283  /// };
2284  ///
2285  /// assert_eq!(entry.key(), &"key");
2286  /// ```
2287  #[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  /// # Examples
2294  ///
2295  /// ```
2296  /// use ordered_multimap::ListOrderedMultimap;
2297  /// use ordered_multimap::list_ordered_multimap::Entry;
2298  ///
2299  /// let mut map = ListOrderedMultimap::new();
2300  /// map.insert("key", "value1");
2301  ///
2302  /// let mut entry = match map.entry("key") {
2303  ///     Entry::Occupied(entry) => entry,
2304  ///     _ => panic!("expected occupied entry")
2305  /// };
2306  ///
2307  /// assert_eq!(entry.len(), 1);
2308  ///
2309  /// entry.append("value2");
2310  /// assert_eq!(entry.len(), 2);
2311  /// ```
2312  #[must_use]
2313  pub fn len(&self) -> usize {
2314    self.entry.get().length
2315  }
2316
2317  /// # Examples
2318  ///
2319  /// ```
2320  /// use ordered_multimap::ListOrderedMultimap;
2321  /// use ordered_multimap::list_ordered_multimap::Entry;
2322  ///
2323  /// let mut map = ListOrderedMultimap::new();
2324  /// map.insert("key", "value");
2325  ///
2326  /// let mut entry = match map.entry("key") {
2327  ///     Entry::Occupied(entry) => entry,
2328  ///     _ => panic!("expected occupied entry")
2329  /// };
2330  ///
2331  /// assert_eq!(entry.remove(), "value");
2332  /// ```
2333  pub fn remove(self) -> Value {
2334    self.remove_entry().1
2335  }
2336
2337  /// # Examples
2338  ///
2339  /// ```
2340  /// use ordered_multimap::ListOrderedMultimap;
2341  /// use ordered_multimap::list_ordered_multimap::Entry;
2342  ///
2343  /// let mut map = ListOrderedMultimap::new();
2344  /// map.insert("key", "value1");
2345  ///
2346  /// let mut entry = match map.entry("key") {
2347  ///     Entry::Occupied(entry) => entry,
2348  ///     _ => panic!("expected occupied entry")
2349  /// };
2350  ///
2351  /// entry.append("value2");
2352  ///
2353  /// let mut iter = entry.remove_all();
2354  /// assert_eq!(iter.next(), Some("value1"));
2355  /// assert_eq!(iter.next(), Some("value2"));
2356  /// assert_eq!(iter.next(), None);
2357  /// ```
2358  pub fn remove_all(self) -> EntryValuesDrain<'map, Key, Value> {
2359    self.remove_entry_all().1
2360  }
2361
2362  /// # Examples
2363  ///
2364  /// ```
2365  /// use ordered_multimap::ListOrderedMultimap;
2366  /// use ordered_multimap::list_ordered_multimap::Entry;
2367  ///
2368  /// let mut map = ListOrderedMultimap::new();
2369  /// map.insert("key", "value");
2370  ///
2371  /// let mut entry = match map.entry("key") {
2372  ///     Entry::Occupied(entry) => entry,
2373  ///     _ => panic!("expected occupied entry")
2374  /// };
2375  ///
2376  /// assert_eq!(entry.remove_entry(), ("key", "value"));
2377  /// ```
2378  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  /// # Examples
2393  ///
2394  /// ```
2395  /// use ordered_multimap::ListOrderedMultimap;
2396  /// use ordered_multimap::list_ordered_multimap::Entry;
2397  ///
2398  /// let mut map = ListOrderedMultimap::new();
2399  /// map.insert("key", "value1");
2400  ///
2401  /// let mut entry = match map.entry("key") {
2402  ///     Entry::Occupied(entry) => entry,
2403  ///     _ => panic!("expected occupied entry")
2404  /// };
2405  ///
2406  /// entry.append("value2");
2407  ///
2408  /// let (key, mut iter) = entry.remove_entry_all();
2409  /// assert_eq!(key, "key");
2410  /// assert_eq!(iter.next(), Some("value1"));
2411  /// assert_eq!(iter.next(), Some("value2"));
2412  /// assert_eq!(iter.next(), None);
2413  /// ```
2414  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
2441/// A view into a vacant entry in the multimap.
2442pub struct VacantEntry<'map, Key, Value, State = RandomState> {
2443  /// The builder hasher for the map, kept separately for mutability concerns.
2444  build_hasher: &'map State,
2445
2446  /// The hash of the key for the entry.
2447  hash: u64,
2448
2449  /// The key for this entry for when it is to be inserted into the map.
2450  key: Key,
2451
2452  keys: &'map mut VecList<Key>,
2453
2454  /// Reference to the multimap.
2455  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  /// # Examples
2466  ///
2467  /// ```
2468  /// use ordered_multimap::ListOrderedMultimap;
2469  /// use ordered_multimap::list_ordered_multimap::Entry;
2470  ///
2471  /// let mut map = ListOrderedMultimap::new();
2472  ///
2473  /// let mut entry = match map.entry("key") {
2474  ///     Entry::Vacant(entry) => entry,
2475  ///     _ => panic!("expected vacant entry")
2476  /// };
2477  ///
2478  /// assert_eq!(entry.insert("value"), &"value");
2479  /// ```
2480  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  /// # Examples
2500  ///
2501  /// ```
2502  /// use ordered_multimap::ListOrderedMultimap;
2503  /// use ordered_multimap::list_ordered_multimap::Entry;
2504  ///
2505  /// let mut map = ListOrderedMultimap::new();
2506  ///
2507  /// let mut entry = match map.entry("key") {
2508  ///     Entry::Vacant(entry) => entry,
2509  ///     _ => panic!("expected vacant entry")
2510  /// };
2511  ///
2512  /// let mut entry = entry.insert_entry("value");
2513  /// assert_eq!(entry.get(), &"value");
2514  /// ```
2515  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  /// # Examples
2545  ///
2546  /// ```
2547  /// use ordered_multimap::ListOrderedMultimap;
2548  /// use ordered_multimap::list_ordered_multimap::Entry;
2549  ///
2550  /// let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
2551  ///
2552  /// let mut entry = match map.entry("key") {
2553  ///     Entry::Vacant(entry) => entry,
2554  ///     _ => panic!("expected vacant entry")
2555  /// };
2556  ///
2557  /// assert_eq!(entry.into_key(), "key");
2558  /// ```
2559  #[must_use]
2560  pub fn into_key(self) -> Key {
2561    self.key
2562  }
2563
2564  /// # Examples
2565  ///
2566  /// ```
2567  /// use ordered_multimap::ListOrderedMultimap;
2568  /// use ordered_multimap::list_ordered_multimap::Entry;
2569  ///
2570  /// let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
2571  ///
2572  /// let mut entry = match map.entry("key") {
2573  ///     Entry::Vacant(entry) => entry,
2574  ///     _ => panic!("expected vacant entry")
2575  /// };
2576  ///
2577  /// assert_eq!(entry.key(), &"key");
2578  /// ```
2579  #[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
2597/// An iterator that yields immutable references to all values of a given key. The order of the values is always in the
2598/// order that they were inserted.
2599pub struct EntryValues<'map, Key, Value> {
2600  /// The first index of the values not yet yielded.
2601  head_index: Option<Index<ValueEntry<Key, Value>>>,
2602
2603  /// The remaining number of values to be yielded.
2604  remaining: usize,
2605
2606  /// The last index of the values not yet yielded.
2607  tail_index: Option<Index<ValueEntry<Key, Value>>>,
2608
2609  /// The list of the values in the map. This is ordered by time of insertion.
2610  values: &'map VecList<ValueEntry<Key, Value>>,
2611}
2612
2613impl<'map, Key, Value> EntryValues<'map, Key, Value> {
2614  /// Convenience function for creating an empty iterator.
2615  #[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  /// Convenience function for creating a new iterator from a map entry.
2626  #[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
2702/// An iterator that moves all values of a given key out of a multimap but preserves the underlying capacity. The order
2703/// of the values is always in the order that they were inserted.
2704pub struct EntryValuesDrain<'map, Key, Value> {
2705  /// The first index of the values not yet yielded.
2706  head_index: Option<Index<ValueEntry<Key, Value>>>,
2707
2708  /// The remaining number of values to be yielded.
2709  remaining: usize,
2710
2711  /// The last index of the values not yet yielded.
2712  tail_index: Option<Index<ValueEntry<Key, Value>>>,
2713
2714  /// The list of the values in the map. This is ordered by time of insertion.
2715  values: &'map mut VecList<ValueEntry<Key, Value>>,
2716}
2717
2718impl<'map, Key, Value> EntryValuesDrain<'map, Key, Value> {
2719  /// Convenience function for creating an empty iterator.
2720  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  /// Convenience function for creating a new iterator from a map entry.
2730  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  /// Creates an iterator that yields immutable references to all values of a given key.
2743  #[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
2812/// An iterator that yields mutable references to all values of a given key. The order of the values is always in the
2813/// order that they were inserted.
2814pub struct EntryValuesMut<'map, Key, Value> {
2815  /// The first index of the values not yet yielded.
2816  head_index: Option<Index<ValueEntry<Key, Value>>>,
2817
2818  /// Because [`EntryValuesMut::values`] is a pointer, we need to have a phantom data here for the lifetime parameter.
2819  phantom: PhantomData<&'map mut VecList<ValueEntry<Key, Value>>>,
2820
2821  /// The remaining number of values to be yielded.
2822  remaining: usize,
2823
2824  /// The last index of the values not yet yielded.
2825  tail_index: Option<Index<ValueEntry<Key, Value>>>,
2826
2827  /// The list of the values in the map. This is ordered by time of insertion.
2828  values: *mut VecList<ValueEntry<Key, Value>>,
2829}
2830
2831impl<'map, Key, Value> EntryValuesMut<'map, Key, Value> {
2832  /// Convenience function for creating an empty iterator.
2833  #[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  /// Convenience function for creating a new iterator from a map entry.
2845  #[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  /// Creates an iterator that yields immutable references to all values of a given key.
2860  #[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
2936/// An iterator that owns and yields all key-value pairs in a multimap by cloning the keys for their possibly multiple
2937/// values. This is unnecessarily expensive whenever [`Iter`] or [`IterMut`] would suit as well. The order of the
2938/// yielded items is always in the order that they were inserted.
2939pub struct IntoIter<Key, Value> {
2940  // The list of the keys in the map. This is ordered by time of insertion.
2941  keys: VecList<Key>,
2942
2943  /// The iterator over the list of all values. This is ordered by time of insertion.
2944  iter: VecListIntoIter<ValueEntry<Key, Value>>,
2945}
2946
2947impl<Key, Value> IntoIter<Key, Value> {
2948  /// Creates an iterator that yields immutable references to all key-value pairs in a multimap.
2949  #[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
3002/// An iterator that yields immutable references to all key-value pairs in a multimap. The order of the yielded items is
3003/// always in the order that they were inserted.
3004pub struct Iter<'map, Key, Value> {
3005  // The list of the keys in the map. This is ordered by time of insertion.
3006  keys: &'map VecList<Key>,
3007
3008  /// The iterator over the list of all values. This is ordered by time of insertion.
3009  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
3059/// An iterator that yields mutable references to all key-value pairs in a multimap. The order of the yielded items is
3060/// always in the order that they were inserted.
3061pub struct IterMut<'map, Key, Value> {
3062  // The list of the keys in the map. This is ordered by time of insertion.
3063  keys: &'map VecList<Key>,
3064
3065  /// The iterator over the list of all values. This is ordered by time of insertion.
3066  iter: VecListIterMut<'map, ValueEntry<Key, Value>>,
3067}
3068
3069impl<Key, Value> IterMut<'_, Key, Value> {
3070  /// Creates an iterator that yields immutable references to all key-value pairs in a multimap.
3071  #[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
3118/// An iterator that yields immutable references to all keys and their value iterators. The order of the yielded items
3119/// is always in the order the keys were first inserted.
3120pub struct KeyValues<'map, Key, Value, State = RandomState> {
3121  /// The builder hasher for the map, kept separately for mutability concerns.
3122  build_hasher: &'map State,
3123
3124  // The list of the keys in the map. This is ordered by time of insertion.
3125  keys: &'map VecList<Key>,
3126
3127  /// The iterator over the list of all values. This is ordered by time of insertion.
3128  iter: VecListIter<'map, Key>,
3129
3130  /// The internal mapping from key hashes to associated value indices.
3131  map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
3132
3133  /// The list of the values in the map. This is ordered by time of insertion.
3134  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
3210/// An iterator that yields mutable references to all keys and their value iterators. The order of the yielded items is
3211/// always in the order the keys were first inserted.
3212pub struct KeyValuesMut<'map, Key, Value, State = RandomState> {
3213  /// The builder hasher for the map, kept separately for mutability concerns.
3214  build_hasher: &'map State,
3215
3216  // The list of the keys in the map. This is ordered by time of insertion.
3217  keys: &'map VecList<Key>,
3218
3219  /// The iterator over the list of all values. This is ordered by time of insertion.
3220  iter: VecListIter<'map, Key>,
3221
3222  /// The internal mapping from key hashes to associated value indices.
3223  map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
3224
3225  /// The list of the values in the map. This is ordered by time of insertion.
3226  values: *mut VecList<ValueEntry<Key, Value>>,
3227}
3228
3229impl<Key, Value, State> KeyValuesMut<'_, Key, Value, State> {
3230  /// Creates an iterator that yields mutable references to all key-value pairs of a multimap.
3231  #[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
3318/// An iterator that yields immutable references to all keys in the multimap. The order of the keys is always in the
3319/// order that they were first inserted.
3320pub 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
3361/// An iterator that yields immutable references to all values of a multimap. The order of the values is always in the
3362/// order that they were inserted.
3363pub 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
3405/// An iterator that yields mutable references to all values of a multimap. The order of the values is always in the
3406/// order that they were inserted.
3407pub struct ValuesMut<'map, Key, Value>(VecListIterMut<'map, ValueEntry<Key, Value>>);
3408
3409impl<Key, Value> ValuesMut<'_, Key, Value> {
3410  /// Creates an iterator that yields immutable references to all values of a multimap.
3411  #[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/// Dummy builder hasher that is not meant to be used. It is simply a placeholder.
3452#[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/// Dummy hasher that is not meant to be used. It is simply a placeholder.
3464#[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/// Computes the hash value of the given key.
3478#[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}