1 use dlv_list::{
2 Drain as VecListDrain, Index, IntoIter as VecListIntoIter, Iter as VecListIter,
3 IterMut as VecListIterMut, VecList,
4 };
5 use hashbrown::hash_map::{RawEntryMut, RawOccupiedEntryMut};
6 use hashbrown::HashMap;
7 use std::borrow::Borrow;
8 use std::collections::hash_map::RandomState;
9 use std::fmt::{self, Debug, Formatter};
10 use std::hash::{BuildHasher, Hash, Hasher};
11 use std::iter::{FromIterator, FusedIterator};
12 use std::marker::PhantomData;
13 use std::sync::atomic::{AtomicUsize, Ordering};
14 use std::sync::Arc;
15
16 #[derive(Clone)]
17 pub struct ListOrderedMultimap<Key, Value, State = RandomState> {
18 /// The hasher builder that constructs new hashers for hashing keys. We have to keep this
19 /// separate from the hashmap itself as we need to be able to access it when the hashmap keys
20 /// are reallocated due to reallocation. We cannot use the hash of the actual keys in the map
21 /// as those hashes are not representative of what hash they truly represent.
22 build_hasher: State,
23
24 /// The list of the keys in the multimap. This is ordered by time of insertion.
25 keys: VecList<Key>,
26
27 /// The map from indices of keys to the indices of their values in the value list. The list of
28 /// the indices is ordered by time of insertion. We never use hasher of the hashmap explicitly
29 /// here, we instead use [`ListOrderedMultimap::build_hasher`].
30 map: HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
31
32 /// The list of the values in the multimap. This is ordered by time of insertion.
33 values: VecList<ValueEntry<Key, Value>>,
34 }
35
36 impl<Key, Value> ListOrderedMultimap<Key, Value, RandomState>
37 where
38 Key: Eq + Hash,
39 {
40 /// Creates a new multimap with no initial capacity.
41 ///
42 /// # Examples
43 ///
44 /// ```
45 /// use ordered_multimap::ListOrderedMultimap;
46 ///
47 /// let mut map = ListOrderedMultimap::new();
48 /// map.insert("key1", "value1");
49 /// assert_eq!(map.get(&"key1"), Some(&"value1"));
50 /// ```
new() -> ListOrderedMultimap<Key, Value, RandomState>51 pub fn new() -> ListOrderedMultimap<Key, Value, RandomState> {
52 ListOrderedMultimap::default()
53 }
54
55 /// Creates a new multimap with the specified capacities.
56 ///
57 /// The multimap will be able to hold at least `key_capacity` keys and `value_capacity` values
58 /// without reallocating. A capacity of 0 will result in no allocation for the respective
59 /// container.
60 ///
61 /// # Examples
62 ///
63 /// ```
64 /// use ordered_multimap::ListOrderedMultimap;
65 ///
66 /// let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
67 /// assert_eq!(map.keys_capacity(), 0);
68 /// assert_eq!(map.values_capacity(), 0);
69 ///
70 /// let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 10);
71 /// assert_eq!(map.keys_capacity(), 5);
72 /// assert_eq!(map.values_capacity(), 10);
73 /// ```
with_capacity( key_capacity: usize, value_capacity: usize, ) -> ListOrderedMultimap<Key, Value, RandomState>74 pub fn with_capacity(
75 key_capacity: usize,
76 value_capacity: usize,
77 ) -> ListOrderedMultimap<Key, Value, RandomState> {
78 ListOrderedMultimap {
79 build_hasher: RandomState::new(),
80 keys: VecList::with_capacity(key_capacity),
81 map: HashMap::with_capacity_and_hasher(key_capacity, DummyState),
82 values: VecList::with_capacity(value_capacity),
83 }
84 }
85 }
86
87 impl<Key, Value, State> ListOrderedMultimap<Key, Value, State>
88 where
89 Key: Eq + Hash,
90 State: BuildHasher,
91 {
92 /// Appends a value to the list of values associated with the given key.
93 ///
94 /// If the key is not already in the multimap, this will be identical to an insert and the
95 /// return value will be `false`. Otherwise, `true` will be returned.
96 ///
97 /// Complexity: amortized O(1)
98 ///
99 /// # Examples
100 ///
101 /// ```
102 /// use ordered_multimap::ListOrderedMultimap;
103 ///
104 /// let mut map = ListOrderedMultimap::new();
105 /// let already_exists = map.append("key", "value");
106 /// assert!(!already_exists);
107 /// assert_eq!(map.values_len(), 1);
108 /// assert_eq!(map.get(&"key"), Some(&"value"));
109 ///
110 /// let already_exists = map.append("key", "value2");
111 /// assert!(already_exists);
112 /// assert_eq!(map.values_len(), 2);
113 /// ```
append(&mut self, key: Key, value: Value) -> bool114 pub fn append(&mut self, key: Key, value: Value) -> bool {
115 use self::RawEntryMut::*;
116
117 let hash = hash_key(&self.build_hasher, &key);
118 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, &key);
119 let build_hasher = &self.build_hasher;
120
121 match entry {
122 Occupied(mut entry) => {
123 let key_index = entry.key();
124 let mut value_entry = ValueEntry::new(*key_index, value);
125 let map_entry = entry.get_mut();
126 value_entry.previous_index = Some(map_entry.tail_index);
127 let index = self.values.push_back(value_entry);
128 self.values
129 .get_mut(map_entry.tail_index)
130 .unwrap()
131 .next_index = Some(index);
132 map_entry.append(index);
133 true
134 }
135 Vacant(entry) => {
136 let key_index = self.keys.push_back(key);
137 let value_entry = ValueEntry::new(key_index, value);
138 let index = self.values.push_back(value_entry);
139 let keys = &self.keys;
140 entry.insert_with_hasher(hash, key_index, MapEntry::new(index), |&key_index| {
141 let key = keys.get(key_index).unwrap();
142 hash_key(build_hasher, key)
143 });
144 false
145 }
146 }
147 }
148
149 /// Returns an immutable reference to the first key-value pair in the multimap
150 ///
151 /// Complexity: O(1)
152 ///
153 /// # Examples
154 ///
155 /// ```
156 /// use ordered_multimap::ListOrderedMultimap;
157 ///
158 /// let mut map = ListOrderedMultimap::new();
159 /// assert_eq!(map.back(), None);
160 ///
161 /// map.insert("key", "value");
162 /// assert_eq!(map.back(), Some((&"key", &"value")));
163 /// ```
back(&self) -> Option<(&Key, &Value)>164 pub fn back(&self) -> Option<(&Key, &Value)> {
165 self.iter().next_back()
166 }
167
168 /// Returns an immutable reference to the first key-value pair in the multimap
169 ///
170 /// Complexity: O(1)
171 ///
172 /// # Examples
173 ///
174 /// ```
175 /// use ordered_multimap::ListOrderedMultimap;
176 ///
177 /// let mut map = ListOrderedMultimap::new();
178 /// assert_eq!(map.back_mut(), None);
179 ///
180 /// map.insert("key", "value");
181 /// assert_eq!(map.back_mut(), Some((&"key", &mut "value")));
182 /// ```
back_mut(&mut self) -> Option<(&Key, &mut Value)>183 pub fn back_mut(&mut self) -> Option<(&Key, &mut Value)> {
184 self.iter_mut().next_back()
185 }
186
187 /// Removes all keys and values from the multimap.
188 ///
189 /// Complexity: O(|K| + |V|) where |K| is the number of keys and |V| is the number of values.
190 ///
191 /// # Examples
192 ///
193 /// ```
194 /// use ordered_multimap::ListOrderedMultimap;
195 ///
196 /// let mut map = ListOrderedMultimap::new();
197 /// map.insert("key", "value");
198 /// assert_eq!(map.keys_len(), 1);
199 /// assert_eq!(map.values_len(), 1);
200 ///
201 /// map.clear();
202 /// assert_eq!(map.keys_len(), 0);
203 /// assert_eq!(map.values_len(), 0);
204 /// ```
clear(&mut self)205 pub fn clear(&mut self) {
206 self.keys.clear();
207 self.map.clear();
208 self.values.clear();
209 }
210
211 /// Returns whether the given key is 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!(!map.contains_key(&"key"));
222 /// map.insert("key", "value");
223 /// assert!(map.contains_key(&"key"));
224 /// ```
contains_key<KeyQuery>(&self, key: &KeyQuery) -> bool where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,225 pub fn contains_key<KeyQuery>(&self, key: &KeyQuery) -> bool
226 where
227 Key: Borrow<KeyQuery>,
228 KeyQuery: ?Sized + Eq + Hash,
229 {
230 let hash = hash_key(&self.build_hasher, &key);
231 raw_entry(&self.keys, &self.map, hash, key).is_some()
232 }
233
234 /// Returns an iterator that yields keys and all associated values with those keys as separate
235 /// drain iterators. The order of yielded pairs will be the order in which the keys were first
236 /// inserted into the multimap.
237 ///
238 /// Regardless of whether this iterator is fully consumed, all keys and values will be removed
239 /// from the map.
240 ///
241 /// # Examples
242 ///
243 /// ```
244 /// use ordered_multimap::ListOrderedMultimap;
245 ///
246 /// let mut map = ListOrderedMultimap::new();
247 ///
248 /// map.insert("key", "value1");
249 /// map.append("key", "value2");
250 ///
251 /// let mut iter = map.drain_pairs();
252 ///
253 /// let (key, mut values) = iter.next().unwrap();
254 /// assert_eq!(key, "key");
255 /// assert_eq!(values.next(), Some("value1"));
256 /// assert_eq!(values.next(), Some("value2"));
257 /// assert_eq!(values.next(), None);
258 /// ```
drain_pairs(&mut self) -> KeyValuesDrain<Key, Value, State>259 pub fn drain_pairs(&mut self) -> KeyValuesDrain<Key, Value, State> {
260 KeyValuesDrain {
261 build_hasher: &self.build_hasher,
262 keys: &self.keys as *const _,
263 dropped: Arc::new(AtomicUsize::new(self.keys_len())),
264 iter: self.keys.drain(),
265 map: &mut self.map,
266 values: &mut self.values as *mut _,
267 }
268 }
269
270 /// Returns whether the given key is in the multimap.
271 ///
272 /// Complexity: O(1)
273 ///
274 /// # Examples
275 ///
276 /// ```
277 /// use ordered_multimap::ListOrderedMultimap;
278 ///
279 /// let mut map = ListOrderedMultimap::new();
280 /// let value = map.entry("key").or_insert("value");
281 /// assert_eq!(value, &"value");
282 /// assert_eq!(map.get(&"key"), Some(&"value"));
283 /// ```
entry(&mut self, key: Key) -> Entry<Key, Value, State>284 pub fn entry(&mut self, key: Key) -> Entry<Key, Value, State> {
285 use self::RawEntryMut::*;
286
287 let hash = hash_key(&self.build_hasher, &key);
288
289 // TODO: This ugliness arises from borrow checking issues which seems to happen when the
290 // vacant entry is created in the match block further below for `Vacant` even though it
291 // should be perfectly safe. Is there a better way to do this?
292 if !self.contains_key(&key) {
293 Entry::Vacant(VacantEntry {
294 build_hasher: &self.build_hasher,
295 hash,
296 key,
297 keys: &mut self.keys,
298 map: &mut self.map,
299 values: &mut self.values,
300 })
301 } else {
302 match raw_entry_mut(&self.keys, &mut self.map, hash, &key) {
303 Occupied(entry) => Entry::Occupied(OccupiedEntry {
304 entry,
305 keys: &mut self.keys,
306 values: &mut self.values,
307 }),
308 _ => panic!("expected occupied entry"),
309 }
310 }
311 }
312
313 /// Returns the number of values associated with a key.
314 ///
315 /// Complexity: O(1)
316 ///
317 /// # Examples
318 ///
319 /// ```
320 /// use ordered_multimap::ListOrderedMultimap;
321 ///
322 /// let mut map = ListOrderedMultimap::new();
323 /// assert_eq!(map.entry_len(&"key"), 0);
324 ///
325 /// map.insert("key", "value1");
326 /// assert_eq!(map.entry_len(&"key"), 1);
327 ///
328 /// map.append(&"key", "value2");
329 /// assert_eq!(map.entry_len(&"key"), 2);
330 /// ```
entry_len<KeyQuery>(&self, key: &KeyQuery) -> usize where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,331 pub fn entry_len<KeyQuery>(&self, key: &KeyQuery) -> usize
332 where
333 Key: Borrow<KeyQuery>,
334 KeyQuery: ?Sized + Eq + Hash,
335 {
336 let hash = hash_key(&self.build_hasher, &key);
337
338 match raw_entry(&self.keys, &self.map, hash, key) {
339 Some((_, map_entry)) => map_entry.length,
340 None => 0,
341 }
342 }
343
344 /// Returns an immutable reference to the first key-value pair in the multimap
345 ///
346 /// Complexity: O(1)
347 ///
348 /// # Examples
349 ///
350 /// ```
351 /// use ordered_multimap::ListOrderedMultimap;
352 ///
353 /// let mut map = ListOrderedMultimap::new();
354 /// assert_eq!(map.front(), None);
355 ///
356 /// map.insert("key", "value");
357 /// assert_eq!(map.front(), Some((&"key", &"value")));
358 /// ```
front(&self) -> Option<(&Key, &Value)>359 pub fn front(&self) -> Option<(&Key, &Value)> {
360 self.iter().next()
361 }
362
363 /// Returns an immutable reference to the first key-value pair in the multimap
364 ///
365 /// Complexity: O(1)
366 ///
367 /// # Examples
368 ///
369 /// ```
370 /// use ordered_multimap::ListOrderedMultimap;
371 ///
372 /// let mut map = ListOrderedMultimap::new();
373 /// assert_eq!(map.front_mut(), None);
374 ///
375 /// map.insert("key", "value");
376 /// assert_eq!(map.front_mut(), Some((&"key", &mut "value")));
377 /// ```
front_mut(&mut self) -> Option<(&Key, &mut Value)>378 pub fn front_mut(&mut self) -> Option<(&Key, &mut Value)> {
379 self.iter_mut().next()
380 }
381
382 /// Returns an immutable reference to the first value, by insertion order, associated with the
383 /// given key, or `None` if the key is not in the multimap.
384 ///
385 /// Complexity: O(1)
386 ///
387 /// # Examples
388 ///
389 /// ```
390 /// use ordered_multimap::ListOrderedMultimap;
391 ///
392 /// let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
393 /// assert_eq!(map.get(&"key"), None);
394 ///
395 /// ```
get<KeyQuery>(&self, key: &KeyQuery) -> Option<&Value> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,396 pub fn get<KeyQuery>(&self, key: &KeyQuery) -> Option<&Value>
397 where
398 Key: Borrow<KeyQuery>,
399 KeyQuery: ?Sized + Eq + Hash,
400 {
401 let hash = hash_key(&self.build_hasher, &key);
402 let (_, map_entry) = raw_entry(&self.keys, &self.map, hash, key)?;
403 self.values
404 .get(map_entry.head_index)
405 .map(|entry| &entry.value)
406 }
407
408 /// Returns an iterator that yields immutable references to all values associated with the
409 /// given key by insertion order.
410 ///
411 /// If the key is not in the multimap, the iterator will yield no values.
412 ///
413 /// # Examples
414 ///
415 /// ```
416 /// use ordered_multimap::ListOrderedMultimap;
417 ///
418 /// let mut map = ListOrderedMultimap::new();
419 /// map.insert("key", "value");
420 /// map.append("key", "value2");
421 ///
422 /// let mut iter = map.get_all(&"key");
423 /// assert_eq!(iter.next(), Some(&"value"));
424 /// assert_eq!(iter.next(), Some(&"value2"));
425 /// assert_eq!(iter.next(), None);
426 /// ```
get_all<KeyQuery>(&self, key: &KeyQuery) -> EntryValues<Key, Value> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,427 pub fn get_all<KeyQuery>(&self, key: &KeyQuery) -> EntryValues<Key, Value>
428 where
429 Key: Borrow<KeyQuery>,
430 KeyQuery: ?Sized + Eq + Hash,
431 {
432 let hash = hash_key(&self.build_hasher, &key);
433
434 match raw_entry(&self.keys, &self.map, hash, key) {
435 Some((_, map_entry)) => EntryValues::from_map_entry(&self.values, &map_entry),
436 None => EntryValues::empty(&self.values),
437 }
438 }
439
440 /// Returns an iterator that yields mutable references to all values associated with the given
441 /// key by insertion order.
442 ///
443 /// If the key is not in the multimap, the iterator will yield no values.
444 ///
445 /// # Examples
446 ///
447 /// ```
448 /// use ordered_multimap::ListOrderedMultimap;
449 ///
450 /// let mut map = ListOrderedMultimap::new();
451 /// map.insert("key", "value1");
452 /// map.append("key", "value2");
453 ///
454 /// let mut iter = map.get_all_mut(&"key");
455 ///
456 /// let first = iter.next().unwrap();
457 /// assert_eq!(first, &mut "value1");
458 /// *first = "value3";
459 ///
460 /// assert_eq!(iter.next(), Some(&mut "value2"));
461 /// assert_eq!(iter.next(), None);
462 ///
463 /// assert_eq!(map.get(&"key"), Some(&"value3"));
464 /// ```
get_all_mut<KeyQuery>(&mut self, key: &KeyQuery) -> EntryValuesMut<Key, Value> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,465 pub fn get_all_mut<KeyQuery>(&mut self, key: &KeyQuery) -> EntryValuesMut<Key, Value>
466 where
467 Key: Borrow<KeyQuery>,
468 KeyQuery: ?Sized + Eq + Hash,
469 {
470 let hash = hash_key(&self.build_hasher, &key);
471
472 match raw_entry(&self.keys, &self.map, hash, key) {
473 Some((_, map_entry)) => EntryValuesMut::from_map_entry(&mut self.values, &map_entry),
474 None => EntryValuesMut::empty(&mut self.values),
475 }
476 }
477
478 /// Returns a mutable reference to the first value, by insertion order, associated with the
479 /// given key, or `None` if the key is not in the multimap.
480 ///
481 /// Complexity: O(1)
482 ///
483 /// # Examples
484 ///
485 /// ```
486 /// use ordered_multimap::ListOrderedMultimap;
487 ///
488 /// let mut map = ListOrderedMultimap::new();
489 /// assert_eq!(map.get(&"key"), None);
490 ///
491 /// map.insert("key", "value");
492 /// assert_eq!(map.get(&"key"), Some(&"value"));
493 ///
494 /// let mut value = map.get_mut(&"key").unwrap();
495 /// *value = "value2";
496 ///
497 /// assert_eq!(map.get(&"key"), Some(&"value2"));
498 /// ```
get_mut<KeyQuery>(&mut self, key: &KeyQuery) -> Option<&mut Value> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,499 pub fn get_mut<KeyQuery>(&mut self, key: &KeyQuery) -> Option<&mut Value>
500 where
501 Key: Borrow<KeyQuery>,
502 KeyQuery: ?Sized + Eq + Hash,
503 {
504 let hash = hash_key(&self.build_hasher, &key);
505 let (_, map_entry) = raw_entry(&self.keys, &self.map, hash, key)?;
506 self.values
507 .get_mut(map_entry.head_index)
508 .map(|entry| &mut entry.value)
509 }
510
511 /// Returns a reference to the multimap's [`BuildHasher`].
512 ///
513 /// # Examples
514 ///
515 /// ```
516 /// use ordered_multimap::ListOrderedMultimap;
517 ///
518 /// let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
519 /// let hasher = map.hasher();
520 /// ```
hasher(&self) -> &State521 pub fn hasher(&self) -> &State {
522 &self.build_hasher
523 }
524
525 /// Inserts the key-value pair into the multimap and returns the first value, by insertion
526 /// order, that was already associated with the key.
527 ///
528 /// If the key is not already in the multimap, `None` will be returned. If the key is already in
529 /// the multimap, the insertion ordering of the keys will remain unchanged.
530 ///
531 /// Complexity: O(1) amortized
532 ///
533 /// # Examples
534 ///
535 /// ```
536 /// use ordered_multimap::ListOrderedMultimap;
537 ///
538 /// let mut map = ListOrderedMultimap::new();
539 /// assert!(map.is_empty());
540 ///
541 /// let old_value = map.insert("key", "value");
542 /// assert!(old_value.is_none());
543 /// assert_eq!(map.values_len(), 1);
544 /// assert_eq!(map.get(&"key"), Some(&"value"));
545 ///
546 /// let old_value = map.insert("key", "value2");
547 /// assert_eq!(old_value, Some("value"));
548 /// assert_eq!(map.values_len(), 1);
549 /// assert_eq!(map.get(&"key"), Some(&"value2"));
550 /// ```
insert(&mut self, key: Key, value: Value) -> Option<Value>551 pub fn insert(&mut self, key: Key, value: Value) -> Option<Value> {
552 self.insert_all(key, value).next()
553 }
554
555 /// Inserts the key-value pair into the multimap and returns an iterator that yields all values
556 /// previously associated with the key by insertion order.
557 ///
558 /// If the key is not already in the multimap, the iterator will yield no values.If the key is
559 /// already in the multimap, the insertion ordering of the keys will remain unchanged.
560 ///
561 /// Complexity: O(1) amortized
562 ///
563 /// # Examples
564 ///
565 /// ```
566 /// use ordered_multimap::ListOrderedMultimap;
567 ///
568 /// let mut map = ListOrderedMultimap::new();
569 /// assert!(map.is_empty());
570 ///
571 /// {
572 /// let mut old_values = map.insert_all("key", "value");
573 /// assert_eq!(old_values.next(), None);
574 /// }
575 ///
576 /// assert_eq!(map.values_len(), 1);
577 /// assert_eq!(map.get(&"key"), Some(&"value"));
578 ///
579 /// map.append("key", "value2");
580 ///
581 /// {
582 /// let mut old_values = map.insert_all("key", "value3");
583 /// assert_eq!(old_values.next(), Some("value"));
584 /// assert_eq!(old_values.next(), Some("value2"));
585 /// assert_eq!(old_values.next(), None);
586 /// }
587 ///
588 /// assert_eq!(map.values_len(), 1);
589 /// assert_eq!(map.get(&"key"), Some(&"value3"));
590 /// ```
insert_all(&mut self, key: Key, value: Value) -> EntryValuesDrain<Key, Value>591 pub fn insert_all(&mut self, key: Key, value: Value) -> EntryValuesDrain<Key, Value> {
592 use self::RawEntryMut::*;
593
594 let hash = hash_key(&self.build_hasher, &key);
595 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, &key);
596 let build_hasher = &self.build_hasher;
597
598 match entry {
599 Occupied(mut entry) => {
600 let key_index = entry.key();
601 let value_entry = ValueEntry::new(*key_index, value);
602 let index = self.values.push_back(value_entry);
603 let map_entry = entry.get_mut();
604 let iter = EntryValuesDrain::from_map_entry(&mut self.values, &map_entry);
605 map_entry.reset(index);
606 iter
607 }
608 Vacant(entry) => {
609 let key_index = self.keys.push_back(key);
610 let value_entry = ValueEntry::new(key_index, value);
611 let index = self.values.push_back(value_entry);
612 let keys = &self.keys;
613 entry.insert_with_hasher(hash, key_index, MapEntry::new(index), |&key_index| {
614 let key = keys.get(key_index).unwrap();
615 hash_key(build_hasher, key)
616 });
617 EntryValuesDrain::empty(&mut self.values)
618 }
619 }
620 }
621
622 /// Returns whether the multimap is empty.
623 ///
624 /// # Examples
625 ///
626 /// ```
627 /// use ordered_multimap::ListOrderedMultimap;
628 ///
629 /// let mut map = ListOrderedMultimap::new();
630 /// assert!(map.is_empty());
631 ///
632 /// map.insert("key1", "value");
633 /// assert!(!map.is_empty());
634 ///
635 /// map.remove(&"key1");
636 /// assert!(map.is_empty());
637 /// ```
is_empty(&self) -> bool638 pub fn is_empty(&self) -> bool {
639 self.keys.is_empty()
640 }
641
642 /// Returns an iterator that yields immutable references to all key-value pairs in the multimap
643 /// by insertion order.
644 ///
645 /// # Examples
646 ///
647 /// ```
648 /// use ordered_multimap::ListOrderedMultimap;
649 ///
650 /// let mut map = ListOrderedMultimap::new();
651 /// map.insert("key1", "value1");
652 /// map.insert("key2", "value1");
653 /// map.append(&"key1", "value2");
654 /// map.append(&"key2", "value2");
655 ///
656 /// let mut iter = map.iter();
657 /// assert_eq!(iter.size_hint(), (4, Some(4)));
658 /// assert_eq!(iter.next(), Some((&"key1", &"value1")));
659 /// assert_eq!(iter.next(), Some((&"key2", &"value1")));
660 /// assert_eq!(iter.next(), Some((&"key1", &"value2")));
661 /// assert_eq!(iter.next(), Some((&"key2", &"value2")));
662 /// assert_eq!(iter.next(), None);
663 /// ```
iter(&self) -> Iter<Key, Value>664 pub fn iter(&self) -> Iter<Key, Value> {
665 Iter {
666 keys: &self.keys,
667 iter: self.values.iter(),
668 }
669 }
670
671 /// Returns an iterator that yields mutable references to all key-value pairs in the multimap by
672 /// insertion order.
673 ///
674 /// Only the values are mutable, the keys are immutable.
675 ///
676 /// # Examples
677 ///
678 /// ```
679 /// use ordered_multimap::ListOrderedMultimap;
680 ///
681 /// let mut map = ListOrderedMultimap::new();
682 /// map.insert("key1", "value1");
683 /// map.insert("key2", "value1");
684 /// map.append(&"key1", "value2");
685 /// map.append(&"key2", "value2");
686 ///
687 /// let mut iter = map.iter_mut();
688 /// assert_eq!(iter.size_hint(), (4, Some(4)));
689 ///
690 /// let first = iter.next().unwrap();
691 /// assert_eq!(first, (&"key1", &mut "value1"));
692 /// *first.1 = "value3";
693 ///
694 /// assert_eq!(iter.next(), Some((&"key2", &mut "value1")));
695 /// assert_eq!(iter.next(), Some((&"key1", &mut "value2")));
696 /// assert_eq!(iter.next(), Some((&"key2", &mut "value2")));
697 /// assert_eq!(iter.next(), None);
698 ///
699 /// assert_eq!(map.get(&"key1"), Some(&"value3"));
700 /// ```
iter_mut(&mut self) -> IterMut<Key, Value>701 pub fn iter_mut(&mut self) -> IterMut<Key, Value> {
702 IterMut {
703 keys: &self.keys,
704 iter: self.values.iter_mut(),
705 }
706 }
707
708 /// Returns an iterator that yields immutable references to all keys in the multimap by
709 /// insertion order.
710 ///
711 /// Insertion order of keys is determined by the order in which a given key is first inserted
712 /// into the multimap with a value. Any subsequent insertions with that key without first
713 /// removing it will not affect its ordering.
714 ///
715 /// # Examples
716 ///
717 /// ```
718 /// use ordered_multimap::ListOrderedMultimap;
719 ///
720 /// let mut map = ListOrderedMultimap::new();
721 /// map.insert("key1", "value");
722 /// map.insert("key2", "value");
723 /// map.insert("key3", "value");
724 ///
725 /// let mut keys = map.keys();
726 /// assert_eq!(keys.next(), Some(&"key1"));
727 /// assert_eq!(keys.next(), Some(&"key2"));
728 /// assert_eq!(keys.next(), Some(&"key3"));
729 /// assert_eq!(keys.next(), None);
730 /// ```
keys(&self) -> Keys<Key>731 pub fn keys(&self) -> Keys<Key> {
732 Keys(self.keys.iter())
733 }
734
735 /// Returns the number of keys the multimap can hold without reallocating.
736 ///
737 /// This number is a lower bound, and the multimap may be able to hold more.
738 ///
739 /// # Examples
740 ///
741 /// ```
742 /// use ordered_multimap::ListOrderedMultimap;
743 ///
744 /// let mut map = ListOrderedMultimap::new();
745 /// assert_eq!(map.keys_capacity(), 0);
746 ///
747 /// map.insert("key", "value");
748 /// assert!(map.keys_capacity() > 0);
749 /// ```
keys_capacity(&self) -> usize750 pub fn keys_capacity(&self) -> usize {
751 self.keys.capacity()
752 }
753
754 /// Returns the number of keys in the multimap.
755 ///
756 /// # Examples
757 ///
758 /// ```
759 /// use ordered_multimap::ListOrderedMultimap;
760 ///
761 /// let mut map = ListOrderedMultimap::new();
762 /// assert_eq!(map.keys_len(), 0);
763 ///
764 /// map.insert("key1", "value");
765 /// map.insert("key2", "value");
766 /// map.insert("key3", "value");
767 /// assert_eq!(map.keys_len(), 3);
768 /// ```
keys_len(&self) -> usize769 pub fn keys_len(&self) -> usize {
770 self.keys.len()
771 }
772
773 /// Reorganizes the multimap to ensure maximum spatial locality and changes the key and value
774 /// capacities to the provided values.
775 ///
776 /// This function can be used to actually increase the capacity of the multimap.
777 ///
778 /// Complexity: O(|K| + |V|) where |K| is the number of keys and |V| is the number of values.
779 ///
780 /// # Panics
781 ///
782 /// Panics if either of the given minimum capacities are less than their current respective
783 /// lengths.
784 ///
785 /// # Examples
786 ///
787 /// ```
788 /// use ordered_multimap::ListOrderedMultimap;
789 ///
790 /// let mut map = ListOrderedMultimap::with_capacity(10, 10);
791 ///
792 /// map.insert("key1", "value1");
793 /// map.insert("key2", "value2");
794 /// map.append("key2", "value3");
795 /// map.append("key1", "value4");
796 /// map.pack_to(5, 5);
797 ///
798 /// assert_eq!(map.keys_capacity(), 5);
799 /// assert_eq!(map.keys_len(), 2);
800 /// assert_eq!(map.values_capacity(), 5);
801 /// assert_eq!(map.values_len(), 4);
802 /// ```
pack_to(&mut self, keys_minimum_capacity: usize, values_minimum_capacity: usize) where State: Default,803 pub fn pack_to(&mut self, keys_minimum_capacity: usize, values_minimum_capacity: usize)
804 where
805 State: Default,
806 {
807 assert!(
808 keys_minimum_capacity >= self.keys_len(),
809 "cannot pack multimap keys lower than current length"
810 );
811 assert!(
812 values_minimum_capacity >= self.values_len(),
813 "cannot pack multimap values lower than current length"
814 );
815
816 let key_map = self.keys.pack_to(keys_minimum_capacity);
817 let value_map = self.values.pack_to(values_minimum_capacity);
818 let mut map = HashMap::with_capacity_and_hasher(keys_minimum_capacity, DummyState);
819 let build_hasher = &self.build_hasher;
820
821 for value_entry in self.values.iter_mut() {
822 value_entry.key_index = key_map[&value_entry.key_index];
823 value_entry.next_index = value_entry.next_index.map(|index| value_map[&index]);
824 value_entry.previous_index = value_entry.previous_index.map(|index| value_map[&index]);
825 }
826
827 for (key_index, mut map_entry) in self.map.drain() {
828 map_entry.head_index = value_map[&map_entry.head_index];
829 map_entry.tail_index = value_map[&map_entry.tail_index];
830 let key_index = key_map[&key_index];
831 let key = self.keys.get(key_index).unwrap();
832 let hash = hash_key(&self.build_hasher, key);
833
834 match map.raw_entry_mut().from_hash(hash, |_| false) {
835 RawEntryMut::Vacant(entry) => {
836 let keys = &self.keys;
837 entry.insert_with_hasher(hash, key_index, map_entry, |&key_index| {
838 let key = keys.get(key_index).unwrap();
839 hash_key(build_hasher, key)
840 });
841 }
842 _ => panic!("expected vacant entry"),
843 }
844 }
845
846 self.map = map;
847 }
848
849 /// Reorganizes the multimap to ensure maximum spatial locality and removes any excess key and
850 /// value capacity.
851 ///
852 /// Complexity: O(|K| + |V|) where |K| is the number of keys and |V| is the number of values.
853 ///
854 /// # Examples
855 ///
856 /// ```
857 /// use ordered_multimap::ListOrderedMultimap;
858 ///
859 /// let mut map = ListOrderedMultimap::with_capacity(5, 5);
860 ///
861 /// map.insert("key1", "value1");
862 /// map.insert("key2", "value2");
863 /// map.append("key2", "value3");
864 /// map.append("key1", "value4");
865 /// map.pack_to_fit();
866 ///
867 /// assert_eq!(map.keys_capacity(), 2);
868 /// assert_eq!(map.keys_len(), 2);
869 /// assert_eq!(map.values_capacity(), 4);
870 /// assert_eq!(map.values_len(), 4);
871 /// ```
pack_to_fit(&mut self) where State: Default,872 pub fn pack_to_fit(&mut self)
873 where
874 State: Default,
875 {
876 self.pack_to(self.keys_len(), self.values_len());
877 }
878
879 /// Returns an iterator that yields immutable references to keys and all associated values with
880 /// those keys as separate iterators. The order of yielded pairs will be the order in which the
881 /// keys were first inserted into the multimap.
882 ///
883 /// # Examples
884 ///
885 /// ```
886 /// use ordered_multimap::ListOrderedMultimap;
887 ///
888 /// let mut map = ListOrderedMultimap::new();
889 ///
890 /// map.insert("key", "value1");
891 /// map.append("key", "value2");
892 ///
893 /// let mut iter = map.pairs();
894 ///
895 /// let (key, mut values) = iter.next().unwrap();
896 /// assert_eq!(key, &"key");
897 /// assert_eq!(values.next(), Some(&"value1"));
898 /// assert_eq!(values.next(), Some(&"value2"));
899 /// assert_eq!(values.next(), None);
900 /// ```
pairs(&self) -> KeyValues<Key, Value, State>901 pub fn pairs(&self) -> KeyValues<Key, Value, State> {
902 KeyValues {
903 build_hasher: &self.build_hasher,
904 keys: &self.keys,
905 iter: self.keys.iter(),
906 map: &self.map,
907 values: &self.values,
908 }
909 }
910
911 /// Returns an iterator that yields immutable references to keys and mutable references to all
912 /// associated values with those keys as separate iterators. The order of yielded pairs will be
913 /// the order in which the keys were first inserted into the multimap.
914 ///
915 /// # Examples
916 ///
917 /// ```
918 /// use ordered_multimap::ListOrderedMultimap;
919 ///
920 /// let mut map = ListOrderedMultimap::new();
921 ///
922 /// map.insert("key", "value1");
923 /// map.append("key", "value2");
924 ///
925 /// let mut iter = map.pairs_mut();
926 ///
927 /// let (key, mut values) = iter.next().unwrap();
928 /// assert_eq!(key, &"key");
929 /// assert_eq!(values.next(), Some(&mut "value1"));
930 /// assert_eq!(values.next(), Some(&mut "value2"));
931 /// assert_eq!(values.next(), None);
932 /// ```
pairs_mut(&mut self) -> KeyValuesMut<Key, Value, State>933 pub fn pairs_mut(&mut self) -> KeyValuesMut<Key, Value, State> {
934 KeyValuesMut {
935 build_hasher: &self.build_hasher,
936 keys: &self.keys,
937 iter: self.keys.iter(),
938 map: &self.map,
939 values: &mut self.values as *mut _,
940 }
941 }
942
943 /// Removes the last key-value pair to have been inserted.
944 ///
945 /// Because a single key can be associated with many values, the key returned by this function
946 /// is a [`KeyWrapper`] which can be either owned or borrowed. If the value removed was the only
947 /// value associated with the key, then the key will be returned. Otherwise, a reference to the
948 /// key will be returned.
949 ///
950 /// This function along with [`ListOrderedMultimap::pop_front`] act as replacements for a drain
951 /// iterator since an iterator cannot be done over [`KeyWrapper`].
952 ///
953 /// Complexity: O(1)
954 ///
955 /// # Examples
956 ///
957 /// ```
958 /// use ordered_multimap::ListOrderedMultimap;
959 /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
960 ///
961 /// let mut map = ListOrderedMultimap::new();
962 ///
963 /// map.insert("key", "value1");
964 /// map.append("key", "value2");
965 ///
966 /// let (key, value) = map.pop_back().unwrap();
967 /// assert_eq!(key, KeyWrapper::Borrowed(&"key"));
968 /// assert_eq!(&value, &"value2");
969 ///
970 /// let (key, value) = map.pop_back().unwrap();
971 /// assert_eq!(key, KeyWrapper::Owned("key"));
972 /// assert_eq!(&value, &"value1");
973 /// ```
pop_back(&mut self) -> Option<(KeyWrapper<Key>, Value)>974 pub fn pop_back(&mut self) -> Option<(KeyWrapper<Key>, Value)> {
975 let value_entry = self.values.pop_back()?;
976
977 let key_wrapper = match value_entry.previous_index {
978 Some(previous_index) => {
979 let key = self.keys.get(value_entry.key_index).unwrap();
980 let hash = hash_key(&self.build_hasher, &key);
981
982 let mut entry = match raw_entry_mut(&self.keys, &mut self.map, hash, key) {
983 RawEntryMut::Occupied(entry) => entry,
984 _ => panic!("expected occupied entry in internal map"),
985 };
986 let map_entry = entry.get_mut();
987 map_entry.length -= 1;
988 map_entry.tail_index = previous_index;
989
990 let previous_value_entry = self.values.get_mut(previous_index).unwrap();
991 previous_value_entry.next_index = None;
992
993 KeyWrapper::Borrowed(key)
994 }
995 None => {
996 let key = self.keys.remove(value_entry.key_index).unwrap();
997 let hash = hash_key(&self.build_hasher, &key);
998
999 match raw_entry_mut_empty(&self.keys, &mut self.map, hash) {
1000 RawEntryMut::Occupied(entry) => {
1001 entry.remove();
1002 }
1003 _ => panic!("expectd occupied entry in internal map"),
1004 }
1005
1006 KeyWrapper::Owned(key)
1007 }
1008 };
1009
1010 Some((key_wrapper, value_entry.value))
1011 }
1012
1013 /// Removes the first key-value pair to have been inserted.
1014 ///
1015 /// Because a single key can be associated with many values, the key returned by this function
1016 /// is a [`KeyWrapper`] which can be either owned or borrowed. If the value removed was the only
1017 /// value associated with the key, then the key will be returned. Otherwise, a reference to the
1018 /// key will be returned.
1019 ///
1020 /// This function along with [`ListOrderedMultimap::pop_back`] act as replacements for a drain
1021 /// iterator since an iterator cannot be done over [`KeyWrapper`].
1022 ///
1023 /// Complexity: O(1)
1024 ///
1025 /// # Examples
1026 ///
1027 /// ```
1028 /// use ordered_multimap::ListOrderedMultimap;
1029 /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1030 ///
1031 /// let mut map = ListOrderedMultimap::new();
1032 ///
1033 /// map.insert("key", "value1");
1034 /// map.append("key", "value2");
1035 ///
1036 /// let (key, value) = map.pop_front().unwrap();
1037 /// assert_eq!(key, KeyWrapper::Borrowed(&"key"));
1038 /// assert_eq!(&value, &"value1");
1039 ///
1040 /// let (key, value) = map.pop_front().unwrap();
1041 /// assert_eq!(key, KeyWrapper::Owned("key"));
1042 /// assert_eq!(&value, &"value2");
1043 /// ```
pop_front(&mut self) -> Option<(KeyWrapper<Key>, Value)>1044 pub fn pop_front(&mut self) -> Option<(KeyWrapper<Key>, Value)> {
1045 let value_entry = self.values.pop_front()?;
1046
1047 let key_wrapper = match value_entry.next_index {
1048 Some(next_index) => {
1049 let key = self.keys.get(value_entry.key_index).unwrap();
1050 let hash = hash_key(&self.build_hasher, &key);
1051
1052 let mut entry = match raw_entry_mut(&self.keys, &mut self.map, hash, key) {
1053 RawEntryMut::Occupied(entry) => entry,
1054 _ => panic!("expected occupied entry in internal map"),
1055 };
1056 let map_entry = entry.get_mut();
1057 map_entry.length -= 1;
1058 map_entry.head_index = next_index;
1059
1060 let next_value_entry = self.values.get_mut(next_index).unwrap();
1061 next_value_entry.previous_index = None;
1062
1063 KeyWrapper::Borrowed(key)
1064 }
1065 None => {
1066 let key = self.keys.remove(value_entry.key_index).unwrap();
1067 let hash = hash_key(&self.build_hasher, &key);
1068
1069 match raw_entry_mut_empty(&self.keys, &mut self.map, hash) {
1070 RawEntryMut::Occupied(entry) => {
1071 entry.remove();
1072 }
1073 _ => panic!("expectd occupied entry in internal map"),
1074 }
1075
1076 KeyWrapper::Owned(key)
1077 }
1078 };
1079
1080 Some((key_wrapper, value_entry.value))
1081 }
1082
1083 /// Removes all values associated with the given key from the map and returns the first value
1084 /// by insertion order.
1085 ///
1086 /// Complexity: O(1)
1087 ///
1088 /// # Examples
1089 ///
1090 /// ```
1091 /// use ordered_multimap::ListOrderedMultimap;
1092 ///
1093 /// let mut map = ListOrderedMultimap::new();
1094 ///
1095 /// let removed_value = map.remove(&"key");
1096 /// assert_eq!(removed_value, None);
1097 ///
1098 /// map.insert("key", "value");
1099 /// assert_eq!(map.get(&"key"), Some(&"value"));
1100 ///
1101 /// let removed_value = map.remove(&"key");
1102 /// assert_eq!(removed_value, Some("value"));
1103 /// assert_eq!(map.get(&"key"), None);
1104 /// ```
remove<KeyQuery>(&mut self, key: &KeyQuery) -> Option<Value> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,1105 pub fn remove<KeyQuery>(&mut self, key: &KeyQuery) -> Option<Value>
1106 where
1107 Key: Borrow<KeyQuery>,
1108 KeyQuery: ?Sized + Eq + Hash,
1109 {
1110 self.remove_entry(key).map(|(_, value)| value)
1111 }
1112
1113 /// Removes all values associated with the given key from the map and returns an iterator that
1114 /// yields those values.
1115 ///
1116 /// If the key is not already in the map, the iterator will yield no values.
1117 ///
1118 /// Complexity: O(1)
1119 ///
1120 /// # Examples
1121 ///
1122 /// ```
1123 /// use ordered_multimap::ListOrderedMultimap;
1124 ///
1125 /// let mut map = ListOrderedMultimap::new();
1126 ///
1127 /// {
1128 /// let mut removed_values = map.remove_all(&"key");
1129 /// assert_eq!(removed_values.next(), None);
1130 /// }
1131 ///
1132 /// map.insert("key", "value1");
1133 /// map.append("key", "value2");
1134 /// assert_eq!(map.get(&"key"), Some(&"value1"));
1135 ///
1136 /// {
1137 /// let mut removed_values = map.remove_all(&"key");
1138 /// assert_eq!(removed_values.next(), Some("value1"));
1139 /// assert_eq!(removed_values.next(), Some("value2"));
1140 /// assert_eq!(removed_values.next(), None);
1141 /// }
1142 ///
1143 /// assert_eq!(map.get(&"key"), None);
1144 /// ```
remove_all<KeyQuery>(&mut self, key: &KeyQuery) -> EntryValuesDrain<Key, Value> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,1145 pub fn remove_all<KeyQuery>(&mut self, key: &KeyQuery) -> EntryValuesDrain<Key, Value>
1146 where
1147 Key: Borrow<KeyQuery>,
1148 KeyQuery: ?Sized + Eq + Hash,
1149 {
1150 use self::RawEntryMut::*;
1151
1152 let hash = hash_key(&self.build_hasher, &key);
1153 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, key);
1154
1155 match entry {
1156 Occupied(entry) => {
1157 let (key_index, map_entry) = entry.remove_entry();
1158 self.keys.remove(key_index).unwrap();
1159 EntryValuesDrain::from_map_entry(&mut self.values, &map_entry)
1160 }
1161 Vacant(_) => EntryValuesDrain::empty(&mut self.values),
1162 }
1163 }
1164
1165 /// Removes all values associated with the given key from the map and returns the key and first
1166 /// value.
1167 ///
1168 /// If the key is not already in the map, then `None` will be returned.
1169 ///
1170 /// Complexity: O(1)
1171 ///
1172 /// # Examples
1173 ///
1174 /// ```
1175 /// use ordered_multimap::ListOrderedMultimap;
1176 ///
1177 /// let mut map = ListOrderedMultimap::new();
1178 ///
1179 /// let entry = map.remove_entry(&"key");
1180 /// assert_eq!(entry, None);
1181 ///
1182 /// map.insert("key", "value");
1183 /// assert_eq!(map.get(&"key"), Some(&"value"));
1184 ///
1185 /// let entry = map.remove_entry(&"key");
1186 /// assert_eq!(entry, Some(("key", "value")));
1187 /// assert_eq!(map.get(&"key"), None);
1188 /// ```
remove_entry<KeyQuery>(&mut self, key: &KeyQuery) -> Option<(Key, Value)> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,1189 pub fn remove_entry<KeyQuery>(&mut self, key: &KeyQuery) -> Option<(Key, Value)>
1190 where
1191 Key: Borrow<KeyQuery>,
1192 KeyQuery: ?Sized + Eq + Hash,
1193 {
1194 let (key, mut iter) = self.remove_entry_all(key)?;
1195 Some((key, iter.next().unwrap()))
1196 }
1197
1198 /// Removes all values associated with the given key from the map and returns the key and an
1199 /// iterator that yields those values.
1200 ///
1201 /// If the key is not already in the map, then `None` will be returned.
1202 ///
1203 /// Complexity: O(1)
1204 ///
1205 /// # Examples
1206 ///
1207 /// ```
1208 /// use ordered_multimap::ListOrderedMultimap;
1209 ///
1210 /// let mut map = ListOrderedMultimap::new();
1211 ///
1212 /// {
1213 /// let entry = map.remove_entry_all(&"key");
1214 /// assert!(entry.is_none());
1215 /// }
1216 ///
1217 /// map.insert("key", "value1");
1218 /// map.append("key", "value2");
1219 /// assert_eq!(map.get(&"key"), Some(&"value1"));
1220 ///
1221 /// {
1222 /// let (key, mut iter) = map.remove_entry_all(&"key").unwrap();
1223 /// assert_eq!(key, "key");
1224 /// assert_eq!(iter.next(), Some("value1"));
1225 /// assert_eq!(iter.next(), Some("value2"));
1226 /// assert_eq!(iter.next(), None);
1227 /// }
1228 ///
1229 /// assert_eq!(map.get(&"key"), None);
1230 /// ```
remove_entry_all<KeyQuery>( &mut self, key: &KeyQuery, ) -> Option<(Key, EntryValuesDrain<Key, Value>)> where Key: Borrow<KeyQuery>, KeyQuery: ?Sized + Eq + Hash,1231 pub fn remove_entry_all<KeyQuery>(
1232 &mut self,
1233 key: &KeyQuery,
1234 ) -> Option<(Key, EntryValuesDrain<Key, Value>)>
1235 where
1236 Key: Borrow<KeyQuery>,
1237 KeyQuery: ?Sized + Eq + Hash,
1238 {
1239 let hash = hash_key(&self.build_hasher, &key);
1240 let entry = raw_entry_mut(&self.keys, &mut self.map, hash, key);
1241
1242 match entry {
1243 RawEntryMut::Occupied(entry) => {
1244 let (key_index, map_entry) = entry.remove_entry();
1245 let key = self.keys.remove(key_index).unwrap();
1246 let iter = EntryValuesDrain::from_map_entry(&mut self.values, &map_entry);
1247 Some((key, iter))
1248 }
1249 _ => None,
1250 }
1251 }
1252
1253 /// Reserves additional capacity such that more keys can be stored in the multimap.
1254 ///
1255 /// If the existing capacity minus the current length is enough to satisfy the additional
1256 /// capacity, the capacity will remain unchanged.
1257 ///
1258 /// If the capacity is increased, the capacity may be increased by more than what was requested.
1259 ///
1260 /// # Examples
1261 ///
1262 /// ```
1263 /// use ordered_multimap::ListOrderedMultimap;
1264 ///
1265 /// let mut map = ListOrderedMultimap::with_capacity(1, 1);
1266 ///
1267 /// map.insert("key", "value");
1268 /// assert_eq!(map.keys_capacity(), 1);
1269 ///
1270 /// map.reserve_keys(10);
1271 /// assert!(map.keys_capacity() >= 11);
1272 /// assert_eq!(map.get(&"key"), Some(&"value"));
1273 /// ```
reserve_keys(&mut self, additional_capacity: usize)1274 pub fn reserve_keys(&mut self, additional_capacity: usize) {
1275 if self.keys.capacity() - self.keys.len() >= additional_capacity {
1276 return;
1277 }
1278
1279 let capacity = self.map.capacity() + additional_capacity;
1280 let mut map = HashMap::with_capacity_and_hasher(capacity, DummyState);
1281
1282 for (key_index, map_entry) in self.map.drain() {
1283 let key = self.keys.get(key_index).unwrap();
1284 let hash = hash_key(&self.build_hasher, key);
1285 let entry = match raw_entry_mut(&self.keys, &mut map, hash, key) {
1286 RawEntryMut::Vacant(entry) => entry,
1287 _ => panic!("expected vacant entry"),
1288 };
1289 entry.insert_hashed_nocheck(hash, key_index, map_entry);
1290 }
1291
1292 self.keys.reserve(additional_capacity);
1293 self.map = map;
1294 }
1295
1296 /// Reserves additional capacity such that more values can be stored in the multimap.
1297 ///
1298 /// If the existing capacity minus the current length is enough to satisfy the additional
1299 /// capacity, the capacity will remain unchanged.
1300 ///
1301 /// If the capacity is increased, the capacity may be increased by more than what was requested.
1302 ///
1303 /// # Examples
1304 ///
1305 /// ```
1306 /// use ordered_multimap::ListOrderedMultimap;
1307 ///
1308 /// let mut map = ListOrderedMultimap::with_capacity(1, 1);
1309 ///
1310 /// map.insert("key", "value");
1311 /// assert_eq!(map.values_capacity(), 1);
1312 ///
1313 /// map.reserve_values(10);
1314 /// assert!(map.values_capacity() >= 11);
1315 /// ```
reserve_values(&mut self, additional_capacity: usize)1316 pub fn reserve_values(&mut self, additional_capacity: usize) {
1317 self.values.reserve(additional_capacity);
1318 }
1319
1320 /// Keeps all key-value pairs that satisfy the given predicate function.
1321 ///
1322 /// Complexity: O(|V|) where |V| is the number of values
1323 ///
1324 /// # Examples
1325 ///
1326 /// ```
1327 /// use ordered_multimap::ListOrderedMultimap;
1328 ///
1329 /// let mut map = ListOrderedMultimap::new();
1330 ///
1331 /// map.insert("key1", 1);
1332 /// map.insert("key2", 5);
1333 /// map.append("key1", -1);
1334 /// map.insert("key3", -10);
1335 ///
1336 /// map.retain(|_, &mut value| value >= 0);
1337 ///
1338 /// let mut iter = map.iter();
1339 /// assert_eq!(iter.next(), Some((&"key1", &1)));
1340 /// assert_eq!(iter.next(), Some((&"key2", &5)));
1341 /// assert_eq!(iter.next(), None);
1342 /// ```
retain<Function>(&mut self, function: Function) where Function: FnMut(&Key, &mut Value) -> bool,1343 pub fn retain<Function>(&mut self, function: Function)
1344 where
1345 Function: FnMut(&Key, &mut Value) -> bool,
1346 {
1347 ListOrderedMultimap::retain_helper(
1348 &self.build_hasher,
1349 &mut self.keys,
1350 &mut self.map,
1351 &mut self.values,
1352 function,
1353 );
1354 }
1355
1356 /// Helper function for [`ListOrderedMultimap::retain`] to deal with borrowing issues.
retain_helper<'map, Function>( build_hasher: &'map State, keys: &'map mut VecList<Key>, map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>, values: &'map mut VecList<ValueEntry<Key, Value>>, mut function: Function, ) where Function: FnMut(&Key, &mut Value) -> bool,1357 fn retain_helper<'map, Function>(
1358 build_hasher: &'map State,
1359 keys: &'map mut VecList<Key>,
1360 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
1361 values: &'map mut VecList<ValueEntry<Key, Value>>,
1362 mut function: Function,
1363 ) where
1364 Function: FnMut(&Key, &mut Value) -> bool,
1365 {
1366 let values_ptr = values as *mut VecList<ValueEntry<Key, Value>>;
1367 values.retain(|value_entry| {
1368 let key = keys.get(value_entry.key_index).unwrap();
1369
1370 if !function(key, &mut value_entry.value) {
1371 let hash = hash_key(build_hasher, key);
1372 let mut entry = match raw_entry_mut(keys, map, hash, key) {
1373 RawEntryMut::Occupied(entry) => entry,
1374 _ => panic!("expected occupied entry in internal map"),
1375 };
1376
1377 if value_entry.previous_index.is_none() && value_entry.next_index.is_none() {
1378 entry.remove();
1379 keys.remove(value_entry.key_index);
1380 } else {
1381 let map_entry = entry.get_mut();
1382 map_entry.length -= 1;
1383
1384 if let Some(previous_index) = value_entry.previous_index {
1385 let previous_value_entry =
1386 unsafe { (*values_ptr).get_mut(previous_index) }.unwrap();
1387 previous_value_entry.next_index = value_entry.next_index;
1388 } else {
1389 map_entry.head_index = value_entry.next_index.unwrap();
1390 }
1391
1392 if let Some(next_index) = value_entry.next_index {
1393 let next_value_entry =
1394 unsafe { (*values_ptr).get_mut(next_index) }.unwrap();
1395 next_value_entry.previous_index = value_entry.previous_index;
1396 } else {
1397 map_entry.tail_index = value_entry.previous_index.unwrap();
1398 }
1399 }
1400
1401 false
1402 } else {
1403 true
1404 }
1405 });
1406 }
1407
1408 /// Returns an iterator that yields immutable references to all values in the multimap by
1409 /// insertion order.
1410 ///
1411 /// # Examples
1412 ///
1413 /// ```
1414 /// use ordered_multimap::ListOrderedMultimap;
1415 ///
1416 /// let mut map = ListOrderedMultimap::new();
1417 /// map.insert("key1", "value1");
1418 /// map.insert("key2", "value1");
1419 /// map.append(&"key1", "value2");
1420 /// map.append(&"key2", "value2");
1421 ///
1422 /// let mut iter = map.values();
1423 /// assert_eq!(iter.size_hint(), (4, Some(4)));
1424 /// assert_eq!(iter.next(), Some(&"value1"));
1425 /// assert_eq!(iter.next(), Some(&"value1"));
1426 /// assert_eq!(iter.next(), Some(&"value2"));
1427 /// assert_eq!(iter.next(), Some(&"value2"));
1428 /// assert_eq!(iter.next(), None);
1429 /// ```
values(&self) -> Values<Key, Value>1430 pub fn values(&self) -> Values<Key, Value> {
1431 Values(self.values.iter())
1432 }
1433
1434 /// Returns an iterator that yields mutable references to all values in the multimap by
1435 /// insertion order.
1436 ///
1437 /// # Examples
1438 ///
1439 /// ```
1440 /// use ordered_multimap::ListOrderedMultimap;
1441 ///
1442 /// let mut map = ListOrderedMultimap::new();
1443 /// map.insert("key1", "value1");
1444 /// map.insert("key2", "value1");
1445 /// map.append(&"key1", "value2");
1446 /// map.append(&"key2", "value2");
1447 ///
1448 /// let mut iter = map.values_mut();
1449 /// assert_eq!(iter.size_hint(), (4, Some(4)));
1450 ///
1451 /// let first = iter.next().unwrap();
1452 /// assert_eq!(first, &mut "value1");
1453 /// *first = "value3";
1454 ///
1455 /// assert_eq!(iter.next(), Some(&mut "value1"));
1456 /// assert_eq!(iter.next(), Some(&mut "value2"));
1457 /// assert_eq!(iter.next(), Some(&mut "value2"));
1458 /// assert_eq!(iter.next(), None);
1459 ///
1460 /// assert_eq!(map.get(&"key1"), Some(&"value3"));
1461 /// ```
values_mut(&mut self) -> ValuesMut<Key, Value>1462 pub fn values_mut(&mut self) -> ValuesMut<Key, Value> {
1463 ValuesMut(self.values.iter_mut())
1464 }
1465
1466 /// Returns the number of values the multimap can hold without reallocating.
1467 ///
1468 /// This number is a lower bound, and the multimap may be able to hold more.
1469 ///
1470 /// # Examples
1471 ///
1472 /// ```
1473 /// use ordered_multimap::ListOrderedMultimap;
1474 ///
1475 /// let mut map = ListOrderedMultimap::new();
1476 /// assert_eq!(map.values_capacity(), 0);
1477 ///
1478 /// map.insert("key", "value");
1479 /// assert!(map.values_capacity() > 0);
1480 /// ```
values_capacity(&self) -> usize1481 pub fn values_capacity(&self) -> usize {
1482 self.values.capacity()
1483 }
1484
1485 /// Returns the total number of values in the multimap across all keys.
1486 ///
1487 /// # Examples
1488 ///
1489 /// ```
1490 /// use ordered_multimap::ListOrderedMultimap;
1491 ///
1492 /// let mut map = ListOrderedMultimap::new();
1493 /// assert_eq!(map.values_len(), 0);
1494 ///
1495 /// map.insert("key1", "value1");
1496 /// assert_eq!(map.values_len(), 1);
1497 ///
1498 /// map.append("key1", "value2");
1499 /// assert_eq!(map.values_len(), 2);
1500 /// ```
values_len(&self) -> usize1501 pub fn values_len(&self) -> usize {
1502 self.values.len()
1503 }
1504
1505 /// Creates a new multimap with the specified capacities and the given hash builder to hash
1506 /// keys.
1507 ///
1508 /// The multimap will be able to hold at least `key_capacity` keys and `value_capacity` values
1509 /// without reallocating. A capacity of 0 will result in no allocation for the respective
1510 /// container.
1511 ///
1512 /// The `state` is normally randomly generated and is designed to allow multimaps to be
1513 /// resistant to attacks that cause many collisions and very poor performance. Setting it
1514 /// manually using this function can expose a DoS attack vector.
1515 ///
1516 /// # Examples
1517 ///
1518 /// ```
1519 /// use ordered_multimap::ListOrderedMultimap;
1520 /// use std::collections::hash_map::RandomState;
1521 ///
1522 /// let state = RandomState::new();
1523 /// let mut map = ListOrderedMultimap::with_capacity_and_hasher(10, 10, state);
1524 /// map.insert("key", "value");
1525 /// assert_eq!(map.keys_capacity(), 10);
1526 /// assert_eq!(map.values_capacity(), 10);
1527 /// ```
with_capacity_and_hasher( key_capacity: usize, value_capacity: usize, state: State, ) -> ListOrderedMultimap<Key, Value, State>1528 pub fn with_capacity_and_hasher(
1529 key_capacity: usize,
1530 value_capacity: usize,
1531 state: State,
1532 ) -> ListOrderedMultimap<Key, Value, State> {
1533 ListOrderedMultimap {
1534 build_hasher: state,
1535 keys: VecList::with_capacity(key_capacity),
1536 map: HashMap::with_capacity_and_hasher(key_capacity, DummyState),
1537 values: VecList::with_capacity(value_capacity),
1538 }
1539 }
1540
1541 /// Creates a new multimap with no capacity which will use the given hash builder to hash keys.
1542 ///
1543 /// The `state` is normally randomly generated and is designed to allow multimaps to be
1544 /// resistant to attacks that cause many collisions and very poor performance. Setting it
1545 /// manually using this function can expose a DoS attack vector.
1546 ///
1547 /// # Examples
1548 ///
1549 /// ```
1550 /// use ordered_multimap::ListOrderedMultimap;
1551 /// use std::collections::hash_map::RandomState;
1552 ///
1553 /// let state = RandomState::new();
1554 /// let mut map = ListOrderedMultimap::with_hasher(state);
1555 /// map.insert("key", "value");
1556 /// ```
with_hasher(state: State) -> ListOrderedMultimap<Key, Value, State>1557 pub fn with_hasher(state: State) -> ListOrderedMultimap<Key, Value, State> {
1558 ListOrderedMultimap {
1559 build_hasher: state,
1560 keys: VecList::new(),
1561 map: HashMap::with_hasher(DummyState),
1562 values: VecList::new(),
1563 }
1564 }
1565 }
1566
1567 impl<Key, Value, State> Debug for ListOrderedMultimap<Key, Value, State>
1568 where
1569 Key: Debug + Eq + Hash,
1570 Value: Debug,
1571 State: BuildHasher,
1572 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result1573 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
1574 formatter.debug_map().entries(self.iter()).finish()
1575 }
1576 }
1577
1578 impl<Key, Value> Default for ListOrderedMultimap<Key, Value, RandomState>
1579 where
1580 Key: Eq + Hash,
1581 {
default() -> Self1582 fn default() -> Self {
1583 ListOrderedMultimap {
1584 build_hasher: RandomState::new(),
1585 keys: VecList::new(),
1586 map: HashMap::with_hasher(DummyState),
1587 values: VecList::new(),
1588 }
1589 }
1590 }
1591
1592 impl<Key, Value, State> Eq for ListOrderedMultimap<Key, Value, State>
1593 where
1594 Key: Eq + Hash,
1595 Value: PartialEq,
1596 State: BuildHasher,
1597 {
1598 }
1599
1600 impl<Key, Value, State> Extend<(Key, Value)> for ListOrderedMultimap<Key, Value, State>
1601 where
1602 Key: Eq + Hash,
1603 State: BuildHasher,
1604 {
extend<Iter>(&mut self, iter: Iter) where Iter: IntoIterator<Item = (Key, Value)>,1605 fn extend<Iter>(&mut self, iter: Iter)
1606 where
1607 Iter: IntoIterator<Item = (Key, Value)>,
1608 {
1609 let iter = iter.into_iter();
1610 self.reserve_values(iter.size_hint().0);
1611
1612 for (key, value) in iter {
1613 self.append(key, value);
1614 }
1615 }
1616 }
1617
1618 impl<'a, Key, Value, State> Extend<(&'a Key, &'a Value)> for ListOrderedMultimap<Key, Value, State>
1619 where
1620 Key: Copy + Eq + Hash,
1621 Value: Copy,
1622 State: BuildHasher,
1623 {
extend<Iter>(&mut self, iter: Iter) where Iter: IntoIterator<Item = (&'a Key, &'a Value)>,1624 fn extend<Iter>(&mut self, iter: Iter)
1625 where
1626 Iter: IntoIterator<Item = (&'a Key, &'a Value)>,
1627 {
1628 self.extend(iter.into_iter().map(|(&key, &value)| (key, value)));
1629 }
1630 }
1631
1632 impl<Key, Value, State> FromIterator<(Key, Value)> for ListOrderedMultimap<Key, Value, State>
1633 where
1634 Key: Eq + Hash,
1635 State: BuildHasher + Default,
1636 {
from_iter<Iter>(iter: Iter) -> Self where Iter: IntoIterator<Item = (Key, Value)>,1637 fn from_iter<Iter>(iter: Iter) -> Self
1638 where
1639 Iter: IntoIterator<Item = (Key, Value)>,
1640 {
1641 let mut map = ListOrderedMultimap::with_hasher(State::default());
1642 map.extend(iter);
1643 map
1644 }
1645 }
1646
1647 impl<Key, Value, State> IntoIterator for ListOrderedMultimap<Key, Value, State>
1648 where
1649 Key: Clone + Eq + Hash,
1650 State: BuildHasher,
1651 {
1652 type IntoIter = IntoIter<Key, Value>;
1653 type Item = (Key, Value);
1654
into_iter(self) -> Self::IntoIter1655 fn into_iter(self) -> Self::IntoIter {
1656 IntoIter {
1657 keys: self.keys,
1658 iter: self.values.into_iter(),
1659 }
1660 }
1661 }
1662
1663 impl<'map, Key, Value, State> IntoIterator for &'map ListOrderedMultimap<Key, Value, State>
1664 where
1665 Key: Eq + Hash,
1666 State: BuildHasher,
1667 {
1668 type IntoIter = Iter<'map, Key, Value>;
1669 type Item = (&'map Key, &'map Value);
1670
into_iter(self) -> Self::IntoIter1671 fn into_iter(self) -> Self::IntoIter {
1672 self.iter()
1673 }
1674 }
1675
1676 impl<'map, Key, Value, State> IntoIterator for &'map mut ListOrderedMultimap<Key, Value, State>
1677 where
1678 Key: Eq + Hash,
1679 State: BuildHasher,
1680 {
1681 type IntoIter = IterMut<'map, Key, Value>;
1682 type Item = (&'map Key, &'map mut Value);
1683
into_iter(self) -> Self::IntoIter1684 fn into_iter(self) -> Self::IntoIter {
1685 self.iter_mut()
1686 }
1687 }
1688
1689 impl<Key, Value, State> PartialEq for ListOrderedMultimap<Key, Value, State>
1690 where
1691 Key: Eq + Hash,
1692 Value: PartialEq,
1693 State: BuildHasher,
1694 {
eq(&self, other: &ListOrderedMultimap<Key, Value, State>) -> bool1695 fn eq(&self, other: &ListOrderedMultimap<Key, Value, State>) -> bool {
1696 if self.keys_len() != other.keys_len() || self.values_len() != other.values_len() {
1697 return false;
1698 }
1699
1700 self.iter().eq(other.iter())
1701 }
1702 }
1703
1704 /// A wrapper around a key that is either borrowed or owned.
1705 ///
1706 /// This type is similar to [`std::borrow::Cow`] but does not require a [`Clone`] trait bound on the
1707 /// key.
1708 #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
1709 pub enum KeyWrapper<'map, Key> {
1710 /// An immutable reference to a key. This implies that the key is still associated to at least
1711 /// one value in the multimap.
1712 Borrowed(&'map Key),
1713
1714 /// An owned key. This will occur when a key is no longer associated with any values in the
1715 /// multimap.
1716 Owned(Key),
1717 }
1718
1719 impl<'map, Key> KeyWrapper<'map, Key> {
1720 /// If the key wrapped is owned, it is returned. Otherwise, the borrowed key is cloned and
1721 /// returned.
1722 ///
1723 /// # Examples
1724 ///
1725 /// ```
1726 /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1727 ///
1728 /// let borrowed = KeyWrapper::Borrowed(&0);
1729 /// assert_eq!(borrowed.into_owned(), 0);
1730 ///
1731 /// let owned = KeyWrapper::Owned(0);
1732 /// assert_eq!(borrowed.into_owned(), 0);
1733 /// ```
into_owned(self) -> Key where Key: Clone,1734 pub fn into_owned(self) -> Key
1735 where
1736 Key: Clone,
1737 {
1738 use self::KeyWrapper::*;
1739
1740 match self {
1741 Borrowed(key) => key.clone(),
1742 Owned(key) => key,
1743 }
1744 }
1745
1746 /// Returns whether the wrapped key is borrowed.
1747 ///
1748 /// # Examples
1749 ///
1750 /// ```
1751 /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1752 ///
1753 /// let borrowed = KeyWrapper::Borrowed(&0);
1754 /// assert!(borrowed.is_borrowed());
1755 ///
1756 /// let owned = KeyWrapper::Owned(0);
1757 /// assert!(!owned.is_borrowed());
1758 /// ```
is_borrowed(&self) -> bool1759 pub fn is_borrowed(&self) -> bool {
1760 match self {
1761 KeyWrapper::Borrowed(_) => true,
1762 _ => false,
1763 }
1764 }
1765
1766 /// Returns whether the wrapped key is owned.
1767 ///
1768 /// # Examples
1769 ///
1770 /// ```
1771 /// use ordered_multimap::list_ordered_multimap::KeyWrapper;
1772 ///
1773 /// let borrowed = KeyWrapper::Borrowed(&0);
1774 /// assert!(!borrowed.is_owned());
1775 ///
1776 /// let owned = KeyWrapper::Owned(0);
1777 /// assert!(owned.is_owned());
1778 /// ```
is_owned(&self) -> bool1779 pub fn is_owned(&self) -> bool {
1780 match self {
1781 KeyWrapper::Owned(_) => true,
1782 _ => false,
1783 }
1784 }
1785 }
1786
1787 /// The value type of the internal hash map.
1788 #[derive(Clone)]
1789 struct MapEntry<Key, Value> {
1790 /// The index of the first value for this entry.
1791 head_index: Index<ValueEntry<Key, Value>>,
1792
1793 /// The number of values for this entry.
1794 length: usize,
1795
1796 /// The index of the last value for this entry.
1797 tail_index: Index<ValueEntry<Key, Value>>,
1798 }
1799
1800 impl<Key, Value> MapEntry<Key, Value> {
1801 /// Convenience function for adding a new value to the entry.
append(&mut self, index: Index<ValueEntry<Key, Value>>)1802 pub fn append(&mut self, index: Index<ValueEntry<Key, Value>>) {
1803 self.length += 1;
1804 self.tail_index = index;
1805 }
1806
1807 /// Convenience function for creating a new multimap entry.
new(index: Index<ValueEntry<Key, Value>>) -> Self1808 pub fn new(index: Index<ValueEntry<Key, Value>>) -> Self {
1809 MapEntry {
1810 head_index: index,
1811 length: 1,
1812 tail_index: index,
1813 }
1814 }
1815
1816 /// Convenience function for resetting the entry to contain only one value.
reset(&mut self, index: Index<ValueEntry<Key, Value>>)1817 pub fn reset(&mut self, index: Index<ValueEntry<Key, Value>>) {
1818 self.head_index = index;
1819 self.length = 1;
1820 self.tail_index = index;
1821 }
1822 }
1823
1824 /// The value entry that is contained within the internal values list.
1825 #[derive(Clone)]
1826 struct ValueEntry<Key, Value> {
1827 /// The index of the key in the key list for this entry.
1828 key_index: Index<Key>,
1829
1830 /// The index of the next value with the same key.
1831 next_index: Option<Index<ValueEntry<Key, Value>>>,
1832
1833 /// The index of the previous value with the same key.
1834 previous_index: Option<Index<ValueEntry<Key, Value>>>,
1835
1836 /// The actual value stored in this entry.
1837 value: Value,
1838 }
1839
1840 impl<Key, Value> ValueEntry<Key, Value> {
1841 /// Convenience function for creating a new value entry.
new(key_index: Index<Key>, value: Value) -> Self1842 pub fn new(key_index: Index<Key>, value: Value) -> Self {
1843 ValueEntry {
1844 key_index,
1845 next_index: None,
1846 previous_index: None,
1847 value,
1848 }
1849 }
1850 }
1851
1852 /// A view into a single entry in the multimap, which may either be vacant or occupied.
1853 pub enum Entry<'map, Key, Value, State = RandomState> {
1854 /// An occupied entry associated with one or more values.
1855 Occupied(OccupiedEntry<'map, Key, Value>),
1856
1857 /// A vacant entry with no associated values.
1858 Vacant(VacantEntry<'map, Key, Value, State>),
1859 }
1860
1861 impl<'map, Key, Value, State> Entry<'map, Key, Value, State>
1862 where
1863 Key: Eq + Hash,
1864 State: BuildHasher,
1865 {
1866 /// Calls the given function with a mutable reference to the first value of this entry, by
1867 /// insertion order, if it is vacant, otherwise this function is a no-op.
1868 ///
1869 /// # Examples
1870 ///
1871 /// ```
1872 /// use ordered_multimap::ListOrderedMultimap;
1873 ///
1874 /// let mut map = ListOrderedMultimap::new();
1875 ///
1876 /// map.entry("key")
1877 /// .and_modify(|value| *value += 1)
1878 /// .or_insert(42);
1879 /// assert_eq!(map.get(&"key"), Some(&42));
1880 ///
1881 /// map.entry("key")
1882 /// .and_modify(|value| *value += 1)
1883 /// .or_insert(42);
1884 /// assert_eq!(map.get(&"key"), Some(&43));
1885 /// ```
and_modify<Function>(self, function: Function) -> Self where Function: FnOnce(&mut Value),1886 pub fn and_modify<Function>(self, function: Function) -> Self
1887 where
1888 Function: FnOnce(&mut Value),
1889 {
1890 use self::Entry::*;
1891
1892 match self {
1893 Occupied(mut entry) => {
1894 function(entry.get_mut());
1895 Occupied(entry)
1896 }
1897 Vacant(entry) => Vacant(entry),
1898 }
1899 }
1900
1901 /// If the entry is vacant, the given value will be inserted into it and a mutable reference to
1902 /// that value will be returned. Otherwise, a mutable reference to the first value, by insertion
1903 /// order, will be returned.
1904 ///
1905 /// # Examples
1906 ///
1907 /// ```
1908 /// use ordered_multimap::ListOrderedMultimap;
1909 ///
1910 /// let mut map = ListOrderedMultimap::new();
1911 /// map.insert("key", "value1");
1912 ///
1913 /// let value = map.entry("key").or_insert("value2");
1914 /// assert_eq!(value, &"value1");
1915 ///
1916 /// let value = map.entry("key2").or_insert("value2");
1917 /// assert_eq!(value, &"value2");
1918 /// ```
or_insert(self, value: Value) -> &'map mut Value1919 pub fn or_insert(self, value: Value) -> &'map mut Value {
1920 use self::Entry::*;
1921
1922 match self {
1923 Occupied(entry) => entry.into_mut(),
1924 Vacant(entry) => entry.insert(value),
1925 }
1926 }
1927
1928 /// If the entry is vacant, the given value will be inserted into it and the new occupied entry
1929 /// will be returned. Otherwise, the existing occupied entry will be returned.
1930 ///
1931 /// # Examples
1932 ///
1933 /// ```
1934 /// use ordered_multimap::ListOrderedMultimap;
1935 ///
1936 /// let mut map = ListOrderedMultimap::new();
1937 /// map.insert("key", "value1");
1938 ///
1939 /// let entry = map.entry("key").or_insert_entry("value2");
1940 /// assert_eq!(entry.into_mut(), &"value1");
1941 ///
1942 /// let entry = map.entry("key2").or_insert_entry("value2");
1943 /// assert_eq!(entry.into_mut(), &"value2");
1944 /// ```
or_insert_entry(self, value: Value) -> OccupiedEntry<'map, Key, Value>1945 pub fn or_insert_entry(self, value: Value) -> OccupiedEntry<'map, Key, Value> {
1946 use self::Entry::*;
1947
1948 match self {
1949 Occupied(entry) => entry,
1950 Vacant(entry) => entry.insert_entry(value),
1951 }
1952 }
1953
1954 /// If the entry is vacant, the value returned from the given function will be inserted into it
1955 /// and a mutable reference to that value will be returned. Otherwise, a mutable reference to
1956 /// the first value, by insertion order, will be returned.
1957 ///
1958 /// # Examples
1959 ///
1960 /// ```
1961 /// use ordered_multimap::ListOrderedMultimap;
1962 ///
1963 /// let mut map = ListOrderedMultimap::new();
1964 /// map.insert("key", "value1");
1965 ///
1966 /// let value = map.entry("key").or_insert_with(|| "value2");
1967 /// assert_eq!(value, &"value1");
1968 ///
1969 /// let value = map.entry("key2").or_insert_with(|| "value2");
1970 /// assert_eq!(value, &"value2");
1971 /// ```
or_insert_with<Function>(self, function: Function) -> &'map mut Value where Function: FnOnce() -> Value,1972 pub fn or_insert_with<Function>(self, function: Function) -> &'map mut Value
1973 where
1974 Function: FnOnce() -> Value,
1975 {
1976 use self::Entry::*;
1977
1978 match self {
1979 Occupied(entry) => entry.into_mut(),
1980 Vacant(entry) => entry.insert(function()),
1981 }
1982 }
1983
1984 /// If the entry is vacant, the value returned from the given function will be inserted into it
1985 /// and the new occupied entry will be returned. Otherwise, the existing occupied entry will be
1986 /// returned.
1987 ///
1988 /// # Examples
1989 ///
1990 /// ```
1991 /// use ordered_multimap::ListOrderedMultimap;
1992 ///
1993 /// let mut map = ListOrderedMultimap::new();
1994 /// map.insert("key", "value1");
1995 ///
1996 /// let entry = map.entry("key").or_insert_with_entry(|| "value2");
1997 /// assert_eq!(entry.into_mut(), &"value1");
1998 ///
1999 /// let entry = map.entry("key2").or_insert_with_entry(|| "value2");
2000 /// assert_eq!(entry.into_mut(), &"value2");
2001 /// ```
or_insert_with_entry<Function>( self, function: Function, ) -> OccupiedEntry<'map, Key, Value> where Function: FnOnce() -> Value,2002 pub fn or_insert_with_entry<Function>(
2003 self,
2004 function: Function,
2005 ) -> OccupiedEntry<'map, Key, Value>
2006 where
2007 Function: FnOnce() -> Value,
2008 {
2009 use self::Entry::*;
2010
2011 match self {
2012 Occupied(entry) => entry,
2013 Vacant(entry) => entry.insert_entry(function()),
2014 }
2015 }
2016 }
2017
2018 impl<'map, Key, Value, State> Debug for Entry<'map, Key, Value, State>
2019 where
2020 Key: Debug,
2021 State: BuildHasher,
2022 Value: Debug,
2023 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result2024 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
2025 use self::Entry::*;
2026
2027 match self {
2028 Occupied(entry) => entry.fmt(formatter),
2029 Vacant(entry) => entry.fmt(formatter),
2030 }
2031 }
2032 }
2033
2034 /// A view into an occupied entry in the multimap.
2035 pub struct OccupiedEntry<'map, Key, Value> {
2036 entry: RawOccupiedEntryMut<'map, Index<Key>, MapEntry<Key, Value>, DummyState>,
2037
2038 keys: &'map mut VecList<Key>,
2039
2040 values: &'map mut VecList<ValueEntry<Key, Value>>,
2041 }
2042
2043 #[allow(clippy::len_without_is_empty)]
2044 impl<'map, Key, Value> OccupiedEntry<'map, Key, Value> {
2045 /// # Examples
2046 ///
2047 /// ```
2048 /// use ordered_multimap::ListOrderedMultimap;
2049 /// use ordered_multimap::list_ordered_multimap::Entry;
2050 ///
2051 /// let mut map = ListOrderedMultimap::new();
2052 /// map.insert("key", "value1");
2053 ///
2054 /// let mut entry = match map.entry("key") {
2055 /// Entry::Occupied(entry) => entry,
2056 /// _ => panic!("expected occupied entry")
2057 /// };
2058 ///
2059 /// entry.append("value2");
2060 ///
2061 /// let mut iter = map.get_all(&"key");
2062 /// assert_eq!(iter.next(), Some(&"value1"));
2063 /// assert_eq!(iter.next(), Some(&"value2"));
2064 /// assert_eq!(iter.next(), None);
2065 /// ```
append(&mut self, value: Value)2066 pub fn append(&mut self, value: Value) {
2067 let key_index = *self.entry.key();
2068 let map_entry = self.entry.get_mut();
2069 let mut value_entry = ValueEntry::new(key_index, value);
2070 value_entry.previous_index = Some(map_entry.tail_index);
2071 let index = self.values.push_back(value_entry);
2072 self.values
2073 .get_mut(map_entry.tail_index)
2074 .unwrap()
2075 .next_index = Some(index);
2076 map_entry.length += 1;
2077 map_entry.tail_index = index;
2078 }
2079
2080 /// # Examples
2081 ///
2082 /// ```
2083 /// use ordered_multimap::ListOrderedMultimap;
2084 /// use ordered_multimap::list_ordered_multimap::Entry;
2085 ///
2086 /// let mut map = ListOrderedMultimap::new();
2087 /// map.insert("key", "value");
2088 ///
2089 /// let mut entry = match map.entry("key") {
2090 /// Entry::Occupied(entry) => entry,
2091 /// _ => panic!("expected occupied entry")
2092 /// };
2093 ///
2094 /// assert_eq!(entry.get(), &"value");
2095 /// ```
get(&self) -> &Value2096 pub fn get(&self) -> &Value {
2097 let index = self.entry.get().head_index;
2098 &self.values.get(index).unwrap().value
2099 }
2100
2101 /// # Examples
2102 ///
2103 /// ```
2104 /// use ordered_multimap::ListOrderedMultimap;
2105 /// use ordered_multimap::list_ordered_multimap::Entry;
2106 ///
2107 /// let mut map = ListOrderedMultimap::new();
2108 /// map.insert("key", "value");
2109 ///
2110 /// let mut entry = match map.entry("key") {
2111 /// Entry::Occupied(entry) => entry,
2112 /// _ => panic!("expected occupied entry")
2113 /// };
2114 ///
2115 /// assert_eq!(entry.get(), &mut "value");
2116 /// ```
get_mut(&mut self) -> &mut Value2117 pub fn get_mut(&mut self) -> &mut Value {
2118 let index = self.entry.get().head_index;
2119 &mut self.values.get_mut(index).unwrap().value
2120 }
2121
2122 /// # Examples
2123 ///
2124 /// ```
2125 /// use ordered_multimap::ListOrderedMultimap;
2126 /// use ordered_multimap::list_ordered_multimap::Entry;
2127 ///
2128 /// let mut map = ListOrderedMultimap::new();
2129 /// map.insert("key", "value1");
2130 ///
2131 /// let mut entry = match map.entry("key") {
2132 /// Entry::Occupied(entry) => entry,
2133 /// _ => panic!("expected occupied entry")
2134 /// };
2135 ///
2136 /// entry.insert("value2");
2137 ///
2138 /// assert_eq!(map.get(&"key"), Some(&"value2"));
2139 /// ```
insert(&mut self, value: Value) -> Value2140 pub fn insert(&mut self, value: Value) -> Value {
2141 let key_index = *self.entry.key();
2142 let map_entry = self.entry.get_mut();
2143 let first_index = map_entry.head_index;
2144 let mut entry = self.values.remove(first_index).unwrap();
2145 let first_value = entry.value;
2146
2147 while let Some(next_index) = entry.next_index {
2148 entry = self.values.remove(next_index).unwrap();
2149 }
2150
2151 let value_entry = ValueEntry::new(key_index, value);
2152 let index = self.values.push_back(value_entry);
2153 map_entry.head_index = index;
2154 map_entry.length = 1;
2155 map_entry.tail_index = index;
2156 first_value
2157 }
2158
2159 /// # Examples
2160 ///
2161 /// ```
2162 /// use ordered_multimap::ListOrderedMultimap;
2163 /// use ordered_multimap::list_ordered_multimap::Entry;
2164 ///
2165 /// let mut map = ListOrderedMultimap::new();
2166 /// map.insert("key", "value1");
2167 ///
2168 /// let mut entry = match map.entry("key") {
2169 /// Entry::Occupied(entry) => entry,
2170 /// _ => panic!("expected occupied entry")
2171 /// };
2172 ///
2173 /// entry.append("value2");
2174 ///
2175 /// let mut iter = entry.insert_all("value3");
2176 /// assert_eq!(iter.next(), Some("value1"));
2177 /// assert_eq!(iter.next(), Some("value2"));
2178 /// assert_eq!(iter.next(), None);
2179 /// ```
insert_all(&mut self, value: Value) -> EntryValuesDrain<Key, Value>2180 pub fn insert_all(&mut self, value: Value) -> EntryValuesDrain<Key, Value> {
2181 let key_index = *self.entry.key();
2182 let map_entry = self.entry.get_mut();
2183 let value_entry = ValueEntry::new(key_index, value);
2184 let index = self.values.push_back(value_entry);
2185 let iter = EntryValuesDrain::from_map_entry(&mut self.values, &map_entry);
2186 map_entry.reset(index);
2187 iter
2188 }
2189
2190 /// # Examples
2191 ///
2192 /// ```
2193 /// use ordered_multimap::ListOrderedMultimap;
2194 /// use ordered_multimap::list_ordered_multimap::Entry;
2195 ///
2196 /// let mut map = ListOrderedMultimap::new();
2197 /// map.insert("key", "value");
2198 ///
2199 /// let mut entry = match map.entry("key") {
2200 /// Entry::Occupied(entry) => entry,
2201 /// _ => panic!("expected occupied entry")
2202 /// };
2203 ///
2204 /// assert_eq!(entry.into_mut(), &mut "value");
2205 /// ```
into_mut(mut self) -> &'map mut Value2206 pub fn into_mut(mut self) -> &'map mut Value {
2207 let index = self.entry.get_mut().head_index;
2208 &mut self.values.get_mut(index).unwrap().value
2209 }
2210
2211 /// # Examples
2212 ///
2213 /// ```
2214 /// use ordered_multimap::ListOrderedMultimap;
2215 /// use ordered_multimap::list_ordered_multimap::Entry;
2216 ///
2217 /// let mut map = ListOrderedMultimap::new();
2218 /// map.insert("key", "value1");
2219 ///
2220 /// let mut entry = match map.entry("key") {
2221 /// Entry::Occupied(entry) => entry,
2222 /// _ => panic!("expected occupied entry")
2223 /// };
2224 ///
2225 /// entry.append("value2");
2226 ///
2227 /// let mut iter = entry.iter();
2228 /// assert_eq!(iter.next(), Some(&"value1"));
2229 /// assert_eq!(iter.next(), Some(&"value2"));
2230 /// assert_eq!(iter.next(), None);
2231 /// ```
iter(&self) -> EntryValues<Key, Value>2232 pub fn iter(&self) -> EntryValues<Key, Value> {
2233 let map_entry = self.entry.get();
2234 EntryValues::from_map_entry(&self.values, &map_entry)
2235 }
2236
2237 /// # Examples
2238 ///
2239 /// ```
2240 /// use ordered_multimap::ListOrderedMultimap;
2241 /// use ordered_multimap::list_ordered_multimap::Entry;
2242 ///
2243 /// let mut map = ListOrderedMultimap::new();
2244 /// map.insert("key", "value1");
2245 ///
2246 /// let mut entry = match map.entry("key") {
2247 /// Entry::Occupied(entry) => entry,
2248 /// _ => panic!("expected occupied entry")
2249 /// };
2250 ///
2251 /// entry.append("value2");
2252 ///
2253 /// let mut iter = entry.iter_mut();
2254 /// assert_eq!(iter.next(), Some(&mut "value1"));
2255 /// assert_eq!(iter.next(), Some(&mut "value2"));
2256 /// assert_eq!(iter.next(), None);
2257 /// ```
iter_mut(&mut self) -> EntryValuesMut<Key, Value>2258 pub fn iter_mut(&mut self) -> EntryValuesMut<Key, Value> {
2259 let map_entry = self.entry.get_mut();
2260 EntryValuesMut::from_map_entry(&mut self.values, &map_entry)
2261 }
2262
2263 /// # Examples
2264 ///
2265 /// ```
2266 /// use ordered_multimap::ListOrderedMultimap;
2267 /// use ordered_multimap::list_ordered_multimap::Entry;
2268 ///
2269 /// let mut map = ListOrderedMultimap::new();
2270 /// map.insert("key", "value1");
2271 ///
2272 /// let mut entry = match map.entry("key") {
2273 /// Entry::Occupied(entry) => entry,
2274 /// _ => panic!("expected occupied entry")
2275 /// };
2276 ///
2277 /// assert_eq!(entry.key(), &"key");
2278 /// ```
key(&self) -> &Key2279 pub fn key(&self) -> &Key {
2280 let key_index = self.entry.key();
2281 self.keys.get(*key_index).unwrap()
2282 }
2283
2284 /// # Examples
2285 ///
2286 /// ```
2287 /// use ordered_multimap::ListOrderedMultimap;
2288 /// use ordered_multimap::list_ordered_multimap::Entry;
2289 ///
2290 /// let mut map = ListOrderedMultimap::new();
2291 /// map.insert("key", "value1");
2292 ///
2293 /// let mut entry = match map.entry("key") {
2294 /// Entry::Occupied(entry) => entry,
2295 /// _ => panic!("expected occupied entry")
2296 /// };
2297 ///
2298 /// assert_eq!(entry.len(), 1);
2299 ///
2300 /// entry.append("value2");
2301 /// assert_eq!(entry.len(), 2);
2302 /// ```
len(&self) -> usize2303 pub fn len(&self) -> usize {
2304 self.entry.get().length
2305 }
2306
2307 /// # Examples
2308 ///
2309 /// ```
2310 /// use ordered_multimap::ListOrderedMultimap;
2311 /// use ordered_multimap::list_ordered_multimap::Entry;
2312 ///
2313 /// let mut map = ListOrderedMultimap::new();
2314 /// map.insert("key", "value");
2315 ///
2316 /// let mut entry = match map.entry("key") {
2317 /// Entry::Occupied(entry) => entry,
2318 /// _ => panic!("expected occupied entry")
2319 /// };
2320 ///
2321 /// assert_eq!(entry.remove(), "value");
2322 /// ```
remove(self) -> Value2323 pub fn remove(self) -> Value {
2324 self.remove_entry().1
2325 }
2326
2327 /// # Examples
2328 ///
2329 /// ```
2330 /// use ordered_multimap::ListOrderedMultimap;
2331 /// use ordered_multimap::list_ordered_multimap::Entry;
2332 ///
2333 /// let mut map = ListOrderedMultimap::new();
2334 /// map.insert("key", "value1");
2335 ///
2336 /// let mut entry = match map.entry("key") {
2337 /// Entry::Occupied(entry) => entry,
2338 /// _ => panic!("expected occupied entry")
2339 /// };
2340 ///
2341 /// entry.append("value2");
2342 ///
2343 /// let mut iter = entry.remove_all();
2344 /// assert_eq!(iter.next(), Some("value1"));
2345 /// assert_eq!(iter.next(), Some("value2"));
2346 /// assert_eq!(iter.next(), None);
2347 /// ```
remove_all(self) -> EntryValuesDrain<'map, Key, Value>2348 pub fn remove_all(self) -> EntryValuesDrain<'map, Key, Value> {
2349 self.remove_entry_all().1
2350 }
2351
2352 /// # Examples
2353 ///
2354 /// ```
2355 /// use ordered_multimap::ListOrderedMultimap;
2356 /// use ordered_multimap::list_ordered_multimap::Entry;
2357 ///
2358 /// let mut map = ListOrderedMultimap::new();
2359 /// map.insert("key", "value");
2360 ///
2361 /// let mut entry = match map.entry("key") {
2362 /// Entry::Occupied(entry) => entry,
2363 /// _ => panic!("expected occupied entry")
2364 /// };
2365 ///
2366 /// assert_eq!(entry.remove_entry(), ("key", "value"));
2367 /// ```
remove_entry(self) -> (Key, Value)2368 pub fn remove_entry(self) -> (Key, Value) {
2369 let (key_index, map_entry) = self.entry.remove_entry();
2370 let key = self.keys.remove(key_index).unwrap();
2371 let first_index = map_entry.head_index;
2372 let mut entry = self.values.remove(first_index).unwrap();
2373 let first_value = entry.value;
2374
2375 while let Some(next_index) = entry.next_index {
2376 entry = self.values.remove(next_index).unwrap();
2377 }
2378
2379 (key, first_value)
2380 }
2381
2382 /// # Examples
2383 ///
2384 /// ```
2385 /// use ordered_multimap::ListOrderedMultimap;
2386 /// use ordered_multimap::list_ordered_multimap::Entry;
2387 ///
2388 /// let mut map = ListOrderedMultimap::new();
2389 /// map.insert("key", "value1");
2390 ///
2391 /// let mut entry = match map.entry("key") {
2392 /// Entry::Occupied(entry) => entry,
2393 /// _ => panic!("expected occupied entry")
2394 /// };
2395 ///
2396 /// entry.append("value2");
2397 ///
2398 /// let (key, mut iter) = entry.remove_entry_all();
2399 /// assert_eq!(key, "key");
2400 /// assert_eq!(iter.next(), Some("value1"));
2401 /// assert_eq!(iter.next(), Some("value2"));
2402 /// assert_eq!(iter.next(), None);
2403 /// ```
remove_entry_all(self) -> (Key, EntryValuesDrain<'map, Key, Value>)2404 pub fn remove_entry_all(self) -> (Key, EntryValuesDrain<'map, Key, Value>) {
2405 let (key_index, map_entry) = self.entry.remove_entry();
2406 let key = self.keys.remove(key_index).unwrap();
2407 let iter = EntryValuesDrain {
2408 head_index: Some(map_entry.head_index),
2409 remaining: map_entry.length,
2410 tail_index: Some(map_entry.tail_index),
2411 values: self.values,
2412 };
2413 (key, iter)
2414 }
2415 }
2416
2417 impl<Key, Value> Debug for OccupiedEntry<'_, Key, Value>
2418 where
2419 Key: Debug,
2420 Value: Debug,
2421 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result2422 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
2423 formatter
2424 .debug_struct("OccupiedEntry")
2425 .field("key", self.key())
2426 .field("values", &self.iter())
2427 .finish()
2428 }
2429 }
2430
2431 /// A view into a vacant entry in the multimap.
2432 pub struct VacantEntry<'map, Key, Value, State = RandomState> {
2433 /// The builder hasher for the map, kept separately for mutability concerns.
2434 build_hasher: &'map State,
2435
2436 /// The hash of the key for the entry.
2437 hash: u64,
2438
2439 /// The key for this entry for when it is to be inserted into the map.
2440 key: Key,
2441
2442 keys: &'map mut VecList<Key>,
2443
2444 /// Reference to the multimap.
2445 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
2446
2447 values: &'map mut VecList<ValueEntry<Key, Value>>,
2448 }
2449
2450 impl<'map, Key, Value, State> VacantEntry<'map, Key, Value, State>
2451 where
2452 Key: Eq + Hash,
2453 State: BuildHasher,
2454 {
2455 /// # Examples
2456 ///
2457 /// ```
2458 /// use ordered_multimap::ListOrderedMultimap;
2459 /// use ordered_multimap::list_ordered_multimap::Entry;
2460 ///
2461 /// let mut map = ListOrderedMultimap::new();
2462 ///
2463 /// let mut entry = match map.entry("key") {
2464 /// Entry::Vacant(entry) => entry,
2465 /// _ => panic!("expected vacant entry")
2466 /// };
2467 ///
2468 /// assert_eq!(entry.insert("value"), &"value");
2469 /// ```
insert(self, value: Value) -> &'map mut Value2470 pub fn insert(self, value: Value) -> &'map mut Value {
2471 let build_hasher = self.build_hasher;
2472 let entry = match raw_entry_mut(self.keys, self.map, self.hash, &self.key) {
2473 RawEntryMut::Vacant(entry) => entry,
2474 _ => panic!("expected vacant entry"),
2475 };
2476 let key_index = self.keys.push_back(self.key);
2477 let value_entry = ValueEntry::new(key_index, value);
2478 let index = self.values.push_back(value_entry);
2479 let map_entry = MapEntry::new(index);
2480 let keys = &self.keys;
2481 entry.insert_with_hasher(self.hash, key_index, map_entry, |&key_index| {
2482 let key = keys.get(key_index).unwrap();
2483 hash_key(build_hasher, key)
2484 });
2485
2486 &mut self.values.get_mut(index).unwrap().value
2487 }
2488
2489 /// # Examples
2490 ///
2491 /// ```
2492 /// use ordered_multimap::ListOrderedMultimap;
2493 /// use ordered_multimap::list_ordered_multimap::Entry;
2494 ///
2495 /// let mut map = ListOrderedMultimap::new();
2496 ///
2497 /// let mut entry = match map.entry("key") {
2498 /// Entry::Vacant(entry) => entry,
2499 /// _ => panic!("expected vacant entry")
2500 /// };
2501 ///
2502 /// let mut entry = entry.insert_entry("value");
2503 /// assert_eq!(entry.get(), &"value");
2504 /// ```
insert_entry(self, value: Value) -> OccupiedEntry<'map, Key, Value>2505 pub fn insert_entry(self, value: Value) -> OccupiedEntry<'map, Key, Value> {
2506 let build_hasher = self.build_hasher;
2507 let entry = match raw_entry_mut(self.keys, self.map, self.hash, &self.key) {
2508 RawEntryMut::Vacant(entry) => entry,
2509 _ => panic!("expected vacant entry"),
2510 };
2511 let key_index = self.keys.push_back(self.key);
2512 let value_entry = ValueEntry::new(key_index, value);
2513 let index = self.values.push_back(value_entry);
2514 let map_entry = MapEntry::new(index);
2515 let keys = &self.keys;
2516 entry.insert_with_hasher(self.hash, key_index, map_entry, |&key_index| {
2517 let key = keys.get(key_index).unwrap();
2518 hash_key(build_hasher, key)
2519 });
2520
2521 let key = self.keys.get(key_index).unwrap();
2522 let entry = match raw_entry_mut(self.keys, self.map, self.hash, key) {
2523 RawEntryMut::Occupied(entry) => entry,
2524 _ => panic!("expected occupied entry"),
2525 };
2526
2527 OccupiedEntry {
2528 entry,
2529 keys: self.keys,
2530 values: self.values,
2531 }
2532 }
2533
2534 /// # Examples
2535 ///
2536 /// ```
2537 /// use ordered_multimap::ListOrderedMultimap;
2538 /// use ordered_multimap::list_ordered_multimap::Entry;
2539 ///
2540 /// let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
2541 ///
2542 /// let mut entry = match map.entry("key") {
2543 /// Entry::Vacant(entry) => entry,
2544 /// _ => panic!("expected vacant entry")
2545 /// };
2546 ///
2547 /// assert_eq!(entry.into_key(), "key");
2548 /// ```
into_key(self) -> Key2549 pub fn into_key(self) -> Key {
2550 self.key
2551 }
2552
2553 /// # Examples
2554 ///
2555 /// ```
2556 /// use ordered_multimap::ListOrderedMultimap;
2557 /// use ordered_multimap::list_ordered_multimap::Entry;
2558 ///
2559 /// let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
2560 ///
2561 /// let mut entry = match map.entry("key") {
2562 /// Entry::Vacant(entry) => entry,
2563 /// _ => panic!("expected vacant entry")
2564 /// };
2565 ///
2566 /// assert_eq!(entry.key(), &"key");
2567 /// ```
key(&self) -> &Key2568 pub fn key(&self) -> &Key {
2569 &self.key
2570 }
2571 }
2572
2573 impl<Key, Value, State> Debug for VacantEntry<'_, Key, Value, State>
2574 where
2575 Key: Debug,
2576 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result2577 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
2578 formatter
2579 .debug_tuple("VacantEntry")
2580 .field(&self.key)
2581 .finish()
2582 }
2583 }
2584
2585 /// An iterator that yields immutable references to all values of a given key. The order of the
2586 /// values is always in the order that they were inserted.
2587 pub struct EntryValues<'map, Key, Value> {
2588 /// The first index of the values not yet yielded.
2589 head_index: Option<Index<ValueEntry<Key, Value>>>,
2590
2591 /// The remaining number of values to be yielded.
2592 remaining: usize,
2593
2594 /// The last index of the values not yet yielded.
2595 tail_index: Option<Index<ValueEntry<Key, Value>>>,
2596
2597 /// The list of the values in the map. This is ordered by time of insertion.
2598 values: &'map VecList<ValueEntry<Key, Value>>,
2599 }
2600
2601 impl<'map, Key, Value> EntryValues<'map, Key, Value> {
2602 /// Convenience function for creating an empty iterator.
empty(values: &'map VecList<ValueEntry<Key, Value>>) -> Self2603 fn empty(values: &'map VecList<ValueEntry<Key, Value>>) -> Self {
2604 EntryValues {
2605 head_index: None,
2606 remaining: 0,
2607 tail_index: None,
2608 values,
2609 }
2610 }
2611
2612 /// Convenience function for creating a new iterator from a map entry.
from_map_entry( values: &'map VecList<ValueEntry<Key, Value>>, map_entry: &MapEntry<Key, Value>, ) -> Self2613 fn from_map_entry(
2614 values: &'map VecList<ValueEntry<Key, Value>>,
2615 map_entry: &MapEntry<Key, Value>,
2616 ) -> Self {
2617 EntryValues {
2618 head_index: Some(map_entry.head_index),
2619 remaining: map_entry.length,
2620 tail_index: Some(map_entry.tail_index),
2621 values,
2622 }
2623 }
2624 }
2625
2626 impl<'map, Key, Value> Clone for EntryValues<'map, Key, Value> {
clone(&self) -> EntryValues<'map, Key, Value>2627 fn clone(&self) -> EntryValues<'map, Key, Value> {
2628 EntryValues {
2629 head_index: self.head_index,
2630 remaining: self.remaining,
2631 tail_index: self.tail_index,
2632 values: self.values,
2633 }
2634 }
2635 }
2636
2637 impl<Key, Value> Debug for EntryValues<'_, Key, Value>
2638 where
2639 Value: Debug,
2640 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result2641 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
2642 formatter.write_str("EntryValues(")?;
2643 formatter.debug_list().entries(self.clone()).finish()?;
2644 formatter.write_str(")")
2645 }
2646 }
2647
2648 impl<Key, Value> DoubleEndedIterator for EntryValues<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>2649 fn next_back(&mut self) -> Option<Self::Item> {
2650 if self.remaining == 0 {
2651 None
2652 } else {
2653 self.tail_index.map(|index| {
2654 let entry = self.values.get(index).unwrap();
2655 self.tail_index = entry.previous_index;
2656 self.remaining -= 1;
2657 &entry.value
2658 })
2659 }
2660 }
2661 }
2662
2663 impl<Key, Value> ExactSizeIterator for EntryValues<'_, Key, Value> {}
2664
2665 impl<Key, Value> FusedIterator for EntryValues<'_, Key, Value> {}
2666
2667 impl<'map, Key, Value> Iterator for EntryValues<'map, Key, Value> {
2668 type Item = &'map Value;
2669
next(&mut self) -> Option<Self::Item>2670 fn next(&mut self) -> Option<Self::Item> {
2671 if self.remaining == 0 {
2672 None
2673 } else {
2674 self.head_index.map(|index| {
2675 let entry = self.values.get(index).unwrap();
2676 self.head_index = entry.next_index;
2677 self.remaining -= 1;
2678 &entry.value
2679 })
2680 }
2681 }
2682
size_hint(&self) -> (usize, Option<usize>)2683 fn size_hint(&self) -> (usize, Option<usize>) {
2684 (self.remaining, Some(self.remaining))
2685 }
2686 }
2687
2688 /// An iterator that moves all values of a given key out of a multimap but preserves the underlying
2689 /// capacity. The order of the values is always in the order that they were inserted.
2690 pub struct EntryValuesDrain<'map, Key, Value> {
2691 /// The first index of the values not yet yielded.
2692 head_index: Option<Index<ValueEntry<Key, Value>>>,
2693
2694 /// The remaining number of values to be yielded.
2695 remaining: usize,
2696
2697 /// The last index of the values not yet yielded.
2698 tail_index: Option<Index<ValueEntry<Key, Value>>>,
2699
2700 /// The list of the values in the map. This is ordered by time of insertion.
2701 values: &'map mut VecList<ValueEntry<Key, Value>>,
2702 }
2703
2704 impl<'map, Key, Value> EntryValuesDrain<'map, Key, Value> {
2705 /// Convenience function for creating an empty iterator.
empty(values: &'map mut VecList<ValueEntry<Key, Value>>) -> Self2706 fn empty(values: &'map mut VecList<ValueEntry<Key, Value>>) -> Self {
2707 EntryValuesDrain {
2708 head_index: None,
2709 remaining: 0,
2710 tail_index: None,
2711 values,
2712 }
2713 }
2714
2715 /// Convenience function for creating a new iterator from a map entry.
from_map_entry( values: &'map mut VecList<ValueEntry<Key, Value>>, map_entry: &MapEntry<Key, Value>, ) -> Self2716 fn from_map_entry(
2717 values: &'map mut VecList<ValueEntry<Key, Value>>,
2718 map_entry: &MapEntry<Key, Value>,
2719 ) -> Self {
2720 EntryValuesDrain {
2721 head_index: Some(map_entry.head_index),
2722 remaining: map_entry.length,
2723 tail_index: Some(map_entry.tail_index),
2724 values,
2725 }
2726 }
2727
2728 /// Creates an iterator that yields immutable references to all values of a given key.
iter(&self) -> EntryValues<Key, Value>2729 pub fn iter(&self) -> EntryValues<Key, Value> {
2730 EntryValues {
2731 head_index: self.head_index,
2732 remaining: self.remaining,
2733 tail_index: self.tail_index,
2734 values: self.values,
2735 }
2736 }
2737 }
2738
2739 impl<Key, Value> Debug for EntryValuesDrain<'_, Key, Value>
2740 where
2741 Key: Debug,
2742 Value: Debug,
2743 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result2744 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
2745 formatter.write_str("EntryValuesDrain(")?;
2746 formatter.debug_list().entries(self.iter()).finish()?;
2747 formatter.write_str(")")
2748 }
2749 }
2750
2751 impl<Key, Value> DoubleEndedIterator for EntryValuesDrain<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>2752 fn next_back(&mut self) -> Option<Self::Item> {
2753 if self.remaining == 0 {
2754 None
2755 } else {
2756 self.tail_index.map(|index| {
2757 let entry = self.values.remove(index).unwrap();
2758 self.tail_index = entry.previous_index;
2759 self.remaining -= 1;
2760 entry.value
2761 })
2762 }
2763 }
2764 }
2765
2766 impl<Key, Value> Drop for EntryValuesDrain<'_, Key, Value> {
drop(&mut self)2767 fn drop(&mut self) {
2768 for _ in self {}
2769 }
2770 }
2771
2772 impl<Key, Value> ExactSizeIterator for EntryValuesDrain<'_, Key, Value> {}
2773
2774 impl<Key, Value> FusedIterator for EntryValuesDrain<'_, Key, Value> {}
2775
2776 impl<Key, Value> Iterator for EntryValuesDrain<'_, Key, Value> {
2777 type Item = Value;
2778
next(&mut self) -> Option<Self::Item>2779 fn next(&mut self) -> Option<Self::Item> {
2780 if self.remaining == 0 {
2781 None
2782 } else {
2783 self.head_index.map(|index| {
2784 let entry = self.values.remove(index).unwrap();
2785 self.head_index = entry.next_index;
2786 self.remaining -= 1;
2787 entry.value
2788 })
2789 }
2790 }
2791
size_hint(&self) -> (usize, Option<usize>)2792 fn size_hint(&self) -> (usize, Option<usize>) {
2793 (self.remaining, Some(self.remaining))
2794 }
2795 }
2796
2797 /// An iterator that yields mutable references to all values of a given key. The order of the values
2798 /// is always in the order that they were inserted.
2799 pub struct EntryValuesMut<'map, Key, Value> {
2800 /// The first index of the values not yet yielded.
2801 head_index: Option<Index<ValueEntry<Key, Value>>>,
2802
2803 /// Because [`EntryValuesMut::values`] is a pointer, we need to have a phantom data here for the
2804 /// lifetime parameter.
2805 phantom: PhantomData<&'map mut VecList<ValueEntry<Key, Value>>>,
2806
2807 /// The remaining number of values to be yielded.
2808 remaining: usize,
2809
2810 /// The last index of the values not yet yielded.
2811 tail_index: Option<Index<ValueEntry<Key, Value>>>,
2812
2813 /// The list of the values in the map. This is ordered by time of insertion.
2814 values: *mut VecList<ValueEntry<Key, Value>>,
2815 }
2816
2817 impl<'map, Key, Value> EntryValuesMut<'map, Key, Value> {
2818 /// Convenience function for creating an empty iterator.
empty(values: &'map mut VecList<ValueEntry<Key, Value>>) -> Self2819 fn empty(values: &'map mut VecList<ValueEntry<Key, Value>>) -> Self {
2820 EntryValuesMut {
2821 head_index: None,
2822 phantom: PhantomData,
2823 remaining: 0,
2824 tail_index: None,
2825 values: values as *mut _,
2826 }
2827 }
2828
2829 /// Convenience function for creating a new iterator from a map entry.
from_map_entry( values: &'map mut VecList<ValueEntry<Key, Value>>, map_entry: &MapEntry<Key, Value>, ) -> Self2830 fn from_map_entry(
2831 values: &'map mut VecList<ValueEntry<Key, Value>>,
2832 map_entry: &MapEntry<Key, Value>,
2833 ) -> Self {
2834 EntryValuesMut {
2835 head_index: Some(map_entry.head_index),
2836 phantom: PhantomData,
2837 remaining: map_entry.length,
2838 tail_index: Some(map_entry.tail_index),
2839 values: values as *mut _,
2840 }
2841 }
2842
2843 /// Creates an iterator that yields immutable references to all values of a given key.
iter(&self) -> EntryValues<Key, Value>2844 pub fn iter(&self) -> EntryValues<Key, Value> {
2845 EntryValues {
2846 head_index: self.head_index,
2847 remaining: self.remaining,
2848 tail_index: self.tail_index,
2849 values: unsafe { &*self.values },
2850 }
2851 }
2852 }
2853
2854 impl<Key, Value> Debug for EntryValuesMut<'_, Key, Value>
2855 where
2856 Value: Debug,
2857 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result2858 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
2859 formatter.write_str("EntryValuesMut(")?;
2860 formatter.debug_list().entries(self.iter()).finish()?;
2861 formatter.write_str(")")
2862 }
2863 }
2864
2865 impl<Key, Value> DoubleEndedIterator for EntryValuesMut<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>2866 fn next_back(&mut self) -> Option<Self::Item> {
2867 if self.remaining == 0 {
2868 None
2869 } else {
2870 self.tail_index.map(|index| {
2871 let entry = unsafe { (*self.values).get_mut(index) }.unwrap();
2872 self.tail_index = entry.previous_index;
2873 self.remaining -= 1;
2874 &mut entry.value
2875 })
2876 }
2877 }
2878 }
2879
2880 impl<Key, Value> ExactSizeIterator for EntryValuesMut<'_, Key, Value> {}
2881
2882 impl<Key, Value> FusedIterator for EntryValuesMut<'_, Key, Value> {}
2883
2884 impl<'map, Key, Value> Iterator for EntryValuesMut<'map, Key, Value> {
2885 type Item = &'map mut Value;
2886
next(&mut self) -> Option<Self::Item>2887 fn next(&mut self) -> Option<Self::Item> {
2888 if self.remaining == 0 {
2889 None
2890 } else {
2891 self.head_index.map(|index| {
2892 let entry = unsafe { (*self.values).get_mut(index) }.unwrap();
2893 self.head_index = entry.next_index;
2894 self.remaining -= 1;
2895 &mut entry.value
2896 })
2897 }
2898 }
2899
size_hint(&self) -> (usize, Option<usize>)2900 fn size_hint(&self) -> (usize, Option<usize>) {
2901 (self.remaining, Some(self.remaining))
2902 }
2903 }
2904
2905 unsafe impl<Key, Value> Send for EntryValuesMut<'_, Key, Value>
2906 where
2907 Key: Send,
2908 Value: Send,
2909 {
2910 }
2911
2912 unsafe impl<Key, Value> Sync for EntryValuesMut<'_, Key, Value>
2913 where
2914 Key: Sync,
2915 Value: Sync,
2916 {
2917 }
2918
2919 /// An iterator that owns and yields all key-value pairs in a multimap by cloning the keys for their
2920 /// possibly multiple values. This is unnecessarily expensive whenever [`Iter`] or [`IterMut`] would
2921 /// suit as well. The order of the yielded items is always in the order that they were inserted.
2922 pub struct IntoIter<Key, Value> {
2923 // The list of the keys in the map. This is ordered by time of insertion.
2924 keys: VecList<Key>,
2925
2926 /// The iterator over the list of all values. This is ordered by time of insertion.
2927 iter: VecListIntoIter<ValueEntry<Key, Value>>,
2928 }
2929
2930 impl<Key, Value> IntoIter<Key, Value> {
2931 /// Creates an iterator that yields immutable references to all key-value pairs in a multimap.
iter(&self) -> Iter<Key, Value>2932 pub fn iter(&self) -> Iter<Key, Value> {
2933 Iter {
2934 keys: &self.keys,
2935 iter: self.iter.iter(),
2936 }
2937 }
2938 }
2939
2940 impl<Key, Value> Debug for IntoIter<Key, Value>
2941 where
2942 Key: Debug,
2943 Value: Debug,
2944 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result2945 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
2946 formatter.write_str("IntoIter(")?;
2947 formatter.debug_list().entries(self.iter()).finish()?;
2948 formatter.write_str(")")
2949 }
2950 }
2951
2952 impl<Key, Value> DoubleEndedIterator for IntoIter<Key, Value>
2953 where
2954 Key: Clone,
2955 {
next_back(&mut self) -> Option<Self::Item>2956 fn next_back(&mut self) -> Option<Self::Item> {
2957 let value_entry = self.iter.next_back()?;
2958 let key = self.keys.get(value_entry.key_index).cloned().unwrap();
2959 Some((key, value_entry.value))
2960 }
2961 }
2962
2963 impl<Key, Value> ExactSizeIterator for IntoIter<Key, Value> where Key: Clone {}
2964
2965 impl<Key, Value> FusedIterator for IntoIter<Key, Value> where Key: Clone {}
2966
2967 impl<Key, Value> Iterator for IntoIter<Key, Value>
2968 where
2969 Key: Clone,
2970 {
2971 type Item = (Key, Value);
2972
next(&mut self) -> Option<Self::Item>2973 fn next(&mut self) -> Option<Self::Item> {
2974 let value_entry = self.iter.next()?;
2975 let key = self.keys.get(value_entry.key_index).cloned().unwrap();
2976 Some((key, value_entry.value))
2977 }
2978
size_hint(&self) -> (usize, Option<usize>)2979 fn size_hint(&self) -> (usize, Option<usize>) {
2980 self.iter.size_hint()
2981 }
2982 }
2983
2984 /// An iterator that yields immutable references to all key-value pairs in a multimap. The order of
2985 /// the yielded items is always in the order that they were inserted.
2986 pub struct Iter<'map, Key, Value> {
2987 // The list of the keys in the map. This is ordered by time of insertion.
2988 keys: &'map VecList<Key>,
2989
2990 /// The iterator over the list of all values. This is ordered by time of insertion.
2991 iter: VecListIter<'map, ValueEntry<Key, Value>>,
2992 }
2993
2994 impl<'map, Key, Value> Clone for Iter<'map, Key, Value> {
clone(&self) -> Iter<'map, Key, Value>2995 fn clone(&self) -> Iter<'map, Key, Value> {
2996 Iter {
2997 keys: self.keys,
2998 iter: self.iter.clone(),
2999 }
3000 }
3001 }
3002
3003 impl<Key, Value> Debug for Iter<'_, Key, Value>
3004 where
3005 Key: Debug,
3006 Value: Debug,
3007 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3008 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3009 formatter.write_str("Iter(")?;
3010 formatter.debug_list().entries(self.clone()).finish()?;
3011 formatter.write_str(")")
3012 }
3013 }
3014
3015 impl<Key, Value> DoubleEndedIterator for Iter<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>3016 fn next_back(&mut self) -> Option<Self::Item> {
3017 let value_entry = self.iter.next_back()?;
3018 let key = self.keys.get(value_entry.key_index).unwrap();
3019 Some((key, &value_entry.value))
3020 }
3021 }
3022
3023 impl<Key, Value> ExactSizeIterator for Iter<'_, Key, Value> {}
3024
3025 impl<Key, Value> FusedIterator for Iter<'_, Key, Value> {}
3026
3027 impl<'map, Key, Value> Iterator for Iter<'map, Key, Value> {
3028 type Item = (&'map Key, &'map Value);
3029
next(&mut self) -> Option<Self::Item>3030 fn next(&mut self) -> Option<Self::Item> {
3031 let value_entry = self.iter.next()?;
3032 let key = self.keys.get(value_entry.key_index).unwrap();
3033 Some((key, &value_entry.value))
3034 }
3035
size_hint(&self) -> (usize, Option<usize>)3036 fn size_hint(&self) -> (usize, Option<usize>) {
3037 self.iter.size_hint()
3038 }
3039 }
3040
3041 /// An iterator that yields mutable references to all key-value pairs in a multimap. The order of
3042 /// the yielded items is always in the order that they were inserted.
3043 pub struct IterMut<'map, Key, Value> {
3044 // The list of the keys in the map. This is ordered by time of insertion.
3045 keys: &'map VecList<Key>,
3046
3047 /// The iterator over the list of all values. This is ordered by time of insertion.
3048 iter: VecListIterMut<'map, ValueEntry<Key, Value>>,
3049 }
3050
3051 impl<Key, Value> IterMut<'_, Key, Value> {
3052 /// Creates an iterator that yields immutable references to all key-value pairs in a multimap.
iter(&self) -> Iter<Key, Value>3053 pub fn iter(&self) -> Iter<Key, Value> {
3054 Iter {
3055 keys: self.keys,
3056 iter: self.iter.iter(),
3057 }
3058 }
3059 }
3060
3061 impl<Key, Value> Debug for IterMut<'_, Key, Value>
3062 where
3063 Key: Debug,
3064 Value: Debug,
3065 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3066 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3067 formatter.write_str("IterMut(")?;
3068 formatter.debug_list().entries(self.iter()).finish()?;
3069 formatter.write_str(")")
3070 }
3071 }
3072
3073 impl<Key, Value> DoubleEndedIterator for IterMut<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>3074 fn next_back(&mut self) -> Option<Self::Item> {
3075 let value_entry = self.iter.next_back()?;
3076 let key = self.keys.get(value_entry.key_index).unwrap();
3077 Some((key, &mut value_entry.value))
3078 }
3079 }
3080
3081 impl<Key, Value> ExactSizeIterator for IterMut<'_, Key, Value> {}
3082
3083 impl<Key, Value> FusedIterator for IterMut<'_, Key, Value> {}
3084
3085 impl<'map, Key, Value> Iterator for IterMut<'map, Key, Value> {
3086 type Item = (&'map Key, &'map mut Value);
3087
next(&mut self) -> Option<Self::Item>3088 fn next(&mut self) -> Option<Self::Item> {
3089 let value_entry = self.iter.next()?;
3090 let key = self.keys.get(value_entry.key_index).unwrap();
3091 Some((key, &mut value_entry.value))
3092 }
3093
size_hint(&self) -> (usize, Option<usize>)3094 fn size_hint(&self) -> (usize, Option<usize>) {
3095 self.iter.size_hint()
3096 }
3097 }
3098
3099 /// An iterator that yields immutable references to all keys and their value iterators. The order of
3100 /// the yielded items is always in the order the keys were first inserted.
3101 pub struct KeyValues<'map, Key, Value, State = RandomState> {
3102 /// The builder hasher for the map, kept separately for mutability concerns.
3103 build_hasher: &'map State,
3104
3105 // The list of the keys in the map. This is ordered by time of insertion.
3106 keys: &'map VecList<Key>,
3107
3108 /// The iterator over the list of all values. This is ordered by time of insertion.
3109 iter: VecListIter<'map, Key>,
3110
3111 /// The internal mapping from key hashes to associated value indices.
3112 map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
3113
3114 /// The list of the values in the map. This is ordered by time of insertion.
3115 values: &'map VecList<ValueEntry<Key, Value>>,
3116 }
3117
3118 impl<'map, Key, Value, State> Clone for KeyValues<'map, Key, Value, State> {
clone(&self) -> KeyValues<'map, Key, Value, State>3119 fn clone(&self) -> KeyValues<'map, Key, Value, State> {
3120 KeyValues {
3121 build_hasher: self.build_hasher,
3122 keys: self.keys,
3123 iter: self.iter.clone(),
3124 map: self.map,
3125 values: self.values,
3126 }
3127 }
3128 }
3129
3130 impl<Key, Value, State> Debug for KeyValues<'_, Key, Value, State>
3131 where
3132 Key: Debug + Eq + Hash,
3133 State: BuildHasher,
3134 Value: Debug,
3135 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3136 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3137 formatter.write_str("KeyValues(")?;
3138 formatter.debug_list().entries(self.clone()).finish()?;
3139 formatter.write_str(")")
3140 }
3141 }
3142
3143 impl<Key, Value, State> DoubleEndedIterator for KeyValues<'_, Key, Value, State>
3144 where
3145 Key: Eq + Hash,
3146 State: BuildHasher,
3147 {
next_back(&mut self) -> Option<Self::Item>3148 fn next_back(&mut self) -> Option<Self::Item> {
3149 let key = self.iter.next_back()?;
3150 let hash = hash_key(self.build_hasher, key);
3151 let (_, map_entry) = raw_entry(&self.keys, self.map, hash, key).unwrap();
3152 let iter = EntryValues::from_map_entry(&self.values, &map_entry);
3153 Some((key, iter))
3154 }
3155 }
3156
3157 impl<Key, Value, State> ExactSizeIterator for KeyValues<'_, Key, Value, State>
3158 where
3159 Key: Eq + Hash,
3160 State: BuildHasher,
3161 {
3162 }
3163
3164 impl<Key, Value, State> FusedIterator for KeyValues<'_, Key, Value, State>
3165 where
3166 Key: Eq + Hash,
3167 State: BuildHasher,
3168 {
3169 }
3170
3171 impl<'map, Key, Value, State> Iterator for KeyValues<'map, Key, Value, State>
3172 where
3173 Key: Eq + Hash,
3174 State: BuildHasher,
3175 {
3176 type Item = (&'map Key, EntryValues<'map, Key, Value>);
3177
next(&mut self) -> Option<Self::Item>3178 fn next(&mut self) -> Option<Self::Item> {
3179 let key = self.iter.next()?;
3180 let hash = hash_key(self.build_hasher, key);
3181 let (_, map_entry) = raw_entry(&self.keys, self.map, hash, key).unwrap();
3182 let iter = EntryValues::from_map_entry(&self.values, &map_entry);
3183 Some((key, iter))
3184 }
3185
size_hint(&self) -> (usize, Option<usize>)3186 fn size_hint(&self) -> (usize, Option<usize>) {
3187 self.iter.size_hint()
3188 }
3189 }
3190
3191 /// An iterator that drains the multimap of all keys and their value drain iterators. The order of
3192 /// the yielded items is always in the order the keys were first inserted.
3193 pub struct KeyValuesDrain<'map, Key, Value, State = RandomState>
3194 where
3195 Key: Eq + Hash,
3196 State: BuildHasher,
3197 {
3198 /// The builder hasher for the map, kept separately for mutability concerns.
3199 build_hasher: &'map State,
3200
3201 /// The number of keys whose value drain iterators have yet to have been fully consumed. This is
3202 /// needed to make this type thread-safe.
3203 dropped: Arc<AtomicUsize>,
3204
3205 /// The drain iterator over the list of all values. This is ordered by time of insertion.
3206 iter: VecListDrain<'map, Key>,
3207
3208 // The list of the keys in the map. This is ordered by time of insertion.
3209 keys: *const VecList<Key>,
3210
3211 /// The internal mapping from key hashes to associated value indices.
3212 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
3213
3214 /// The list of the values in the map. This is ordered by time of insertion.
3215 values: *mut VecList<ValueEntry<Key, Value>>,
3216 }
3217
3218 impl<Key, Value, State> KeyValuesDrain<'_, Key, Value, State>
3219 where
3220 Key: Eq + Hash,
3221 State: BuildHasher,
3222 {
3223 /// Creates an iterator that yields immutable references to all keys and their value iterators.
iter(&self) -> KeyValues<Key, Value, State>3224 pub fn iter(&self) -> KeyValues<Key, Value, State> {
3225 KeyValues {
3226 build_hasher: self.build_hasher,
3227 keys: unsafe { &*self.keys },
3228 iter: self.iter.iter(),
3229 map: self.map,
3230 values: unsafe { &*self.values },
3231 }
3232 }
3233 }
3234
3235 impl<Key, Value, State> Debug for KeyValuesDrain<'_, Key, Value, State>
3236 where
3237 Key: Debug + Eq + Hash,
3238 State: BuildHasher,
3239 Value: Debug,
3240 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3241 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3242 formatter.write_str("KeyValuesDrain(")?;
3243 formatter.debug_list().entries(self.iter()).finish()?;
3244 formatter.write_str(")")
3245 }
3246 }
3247
3248 impl<Key, Value, State> DoubleEndedIterator for KeyValuesDrain<'_, Key, Value, State>
3249 where
3250 Key: Eq + Hash,
3251 State: BuildHasher,
3252 {
next_back(&mut self) -> Option<Self::Item>3253 fn next_back(&mut self) -> Option<Self::Item> {
3254 let key = self.iter.next_back()?;
3255 let hash = hash_key(self.build_hasher, &key);
3256 let entry = match raw_entry_mut_empty(unsafe { &*self.keys }, self.map, hash) {
3257 RawEntryMut::Occupied(entry) => entry,
3258 _ => panic!("expected occupied entry in internal map"),
3259 };
3260 let map_entry = entry.remove();
3261 let iter = KeyValuesEntryDrain::from_map_entry(
3262 unsafe { &mut *self.values },
3263 &map_entry,
3264 self.dropped.clone(),
3265 );
3266 Some((key, iter))
3267 }
3268 }
3269
3270 impl<Key, Value, State> Drop for KeyValuesDrain<'_, Key, Value, State>
3271 where
3272 Key: Eq + Hash,
3273 State: BuildHasher,
3274 {
drop(&mut self)3275 fn drop(&mut self) {
3276 for _ in self {}
3277 }
3278 }
3279
3280 impl<Key, Value, State> ExactSizeIterator for KeyValuesDrain<'_, Key, Value, State>
3281 where
3282 Key: Eq + Hash,
3283 State: BuildHasher,
3284 {
3285 }
3286
3287 impl<Key, Value, State> FusedIterator for KeyValuesDrain<'_, Key, Value, State>
3288 where
3289 Key: Eq + Hash,
3290 State: BuildHasher,
3291 {
3292 }
3293
3294 impl<'map, Key, Value, State> Iterator for KeyValuesDrain<'map, Key, Value, State>
3295 where
3296 Key: Eq + Hash,
3297 State: BuildHasher,
3298 {
3299 type Item = (Key, KeyValuesEntryDrain<'map, Key, Value>);
3300
next(&mut self) -> Option<Self::Item>3301 fn next(&mut self) -> Option<Self::Item> {
3302 let key = self.iter.next()?;
3303 let hash = hash_key(self.build_hasher, &key);
3304 let entry = match raw_entry_mut_empty(unsafe { &*self.keys }, self.map, hash) {
3305 RawEntryMut::Occupied(entry) => entry,
3306 _ => panic!("expected occupied entry in internal map"),
3307 };
3308 let map_entry = entry.remove();
3309 let iter = KeyValuesEntryDrain::from_map_entry(
3310 unsafe { &mut *self.values },
3311 &map_entry,
3312 self.dropped.clone(),
3313 );
3314 Some((key, iter))
3315 }
3316
size_hint(&self) -> (usize, Option<usize>)3317 fn size_hint(&self) -> (usize, Option<usize>) {
3318 self.iter.size_hint()
3319 }
3320 }
3321
3322 unsafe impl<Key, Value, State> Send for KeyValuesDrain<'_, Key, Value, State>
3323 where
3324 Key: Eq + Hash + Send,
3325 State: BuildHasher,
3326 Value: Send,
3327 {
3328 }
3329
3330 unsafe impl<Key, Value, State> Sync for KeyValuesDrain<'_, Key, Value, State>
3331 where
3332 Key: Eq + Hash + Sync,
3333 State: BuildHasher,
3334 Value: Sync,
3335 {
3336 }
3337
3338 /// An iterator that drains all values for a given key. The order of the yielded items is always in
3339 /// the order the values were first inserted.
3340 ///
3341 /// This is only used with [`KeyValuesDrain`] to account for thread saftey.
3342 pub struct KeyValuesEntryDrain<'map, Key, Value> {
3343 /// The number of keys whose value drain iterators have yet to have been fully consumed. This is
3344 /// needed to make this type thread-safe. This originates from [`KeyValuesDrain`].
3345 dropped: Arc<AtomicUsize>,
3346
3347 /// The first index of the values not yet yielded.
3348 head_index: Option<Index<ValueEntry<Key, Value>>>,
3349
3350 /// The remaining number of values to be yielded.
3351 remaining: usize,
3352
3353 /// The last index of the values not yet yielded.
3354 tail_index: Option<Index<ValueEntry<Key, Value>>>,
3355
3356 /// The list of the values in the map. This is ordered by time of insertion.
3357 values: &'map mut VecList<ValueEntry<Key, Value>>,
3358 }
3359
3360 impl<'map, Key, Value> KeyValuesEntryDrain<'map, Key, Value> {
3361 /// Convenience function for creating a new iterator from a map entry.
from_map_entry( values: &'map mut VecList<ValueEntry<Key, Value>>, map_entry: &MapEntry<Key, Value>, dropped: Arc<AtomicUsize>, ) -> Self3362 fn from_map_entry(
3363 values: &'map mut VecList<ValueEntry<Key, Value>>,
3364 map_entry: &MapEntry<Key, Value>,
3365 dropped: Arc<AtomicUsize>,
3366 ) -> Self {
3367 KeyValuesEntryDrain {
3368 dropped,
3369 head_index: Some(map_entry.head_index),
3370 remaining: map_entry.length,
3371 tail_index: Some(map_entry.tail_index),
3372 values,
3373 }
3374 }
3375
3376 /// Creates an iterator that yields immutable references to all values of a key.
iter(&self) -> EntryValues<Key, Value>3377 pub fn iter(&self) -> EntryValues<Key, Value> {
3378 EntryValues {
3379 head_index: self.head_index,
3380 remaining: self.remaining,
3381 tail_index: self.tail_index,
3382 values: self.values,
3383 }
3384 }
3385 }
3386
3387 impl<Key, Value> Debug for KeyValuesEntryDrain<'_, Key, Value>
3388 where
3389 Key: Debug,
3390 Value: Debug,
3391 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3392 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3393 formatter.write_str("KeyValuesEntryDrain(")?;
3394 formatter.debug_list().entries(self.iter()).finish()?;
3395 formatter.write_str(")")
3396 }
3397 }
3398
3399 impl<Key, Value> DoubleEndedIterator for KeyValuesEntryDrain<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>3400 fn next_back(&mut self) -> Option<Self::Item> {
3401 if self.remaining == 0 {
3402 None
3403 } else {
3404 self.tail_index.map(|index| {
3405 let entry = unsafe { self.values.remove_sync(index) };
3406 self.tail_index = entry.previous_index;
3407 self.remaining -= 1;
3408 entry.value
3409 })
3410 }
3411 }
3412 }
3413
3414 impl<Key, Value> Drop for KeyValuesEntryDrain<'_, Key, Value> {
drop(&mut self)3415 fn drop(&mut self) {
3416 while let Some(_) = self.next() {}
3417
3418 let previous = self.dropped.fetch_sub(1, Ordering::SeqCst);
3419
3420 if previous == 1 {
3421 self.values.clear()
3422 }
3423 }
3424 }
3425
3426 impl<Key, Value> ExactSizeIterator for KeyValuesEntryDrain<'_, Key, Value> {}
3427
3428 impl<Key, Value> FusedIterator for KeyValuesEntryDrain<'_, Key, Value> {}
3429
3430 impl<Key, Value> Iterator for KeyValuesEntryDrain<'_, Key, Value> {
3431 type Item = Value;
3432
next(&mut self) -> Option<Self::Item>3433 fn next(&mut self) -> Option<Self::Item> {
3434 if self.remaining == 0 {
3435 None
3436 } else {
3437 self.head_index.map(|index| {
3438 let entry = unsafe { self.values.remove_sync(index) };
3439 self.head_index = entry.next_index;
3440 self.remaining -= 1;
3441 entry.value
3442 })
3443 }
3444 }
3445
size_hint(&self) -> (usize, Option<usize>)3446 fn size_hint(&self) -> (usize, Option<usize>) {
3447 (self.remaining, Some(self.remaining))
3448 }
3449 }
3450
3451 pub struct KeyValuesMut<'map, Key, Value, State = RandomState> {
3452 /// The builder hasher for the map, kept separately for mutability concerns.
3453 build_hasher: &'map State,
3454
3455 // The list of the keys in the map. This is ordered by time of insertion.
3456 keys: &'map VecList<Key>,
3457
3458 /// The iterator over the list of all values. This is ordered by time of insertion.
3459 iter: VecListIter<'map, Key>,
3460
3461 /// The internal mapping from key hashes to associated value indices.
3462 map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, DummyState>,
3463
3464 /// The list of the values in the map. This is ordered by time of insertion.
3465 values: *mut VecList<ValueEntry<Key, Value>>,
3466 }
3467
3468 impl<Key, Value, State> KeyValuesMut<'_, Key, Value, State> {
3469 /// Creates an iterator that yields mutable references to all key-value pairs of a multimap.
iter(&self) -> KeyValues<Key, Value, State>3470 pub fn iter(&self) -> KeyValues<Key, Value, State> {
3471 KeyValues {
3472 build_hasher: self.build_hasher,
3473 keys: self.keys,
3474 iter: self.iter.clone(),
3475 map: self.map,
3476 values: unsafe { &*self.values },
3477 }
3478 }
3479 }
3480
3481 impl<Key, Value, State> Debug for KeyValuesMut<'_, Key, Value, State>
3482 where
3483 Key: Debug + Eq + Hash,
3484 State: BuildHasher,
3485 Value: Debug,
3486 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3487 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3488 formatter.write_str("KeyValuesMut(")?;
3489 formatter.debug_list().entries(self.iter()).finish()?;
3490 formatter.write_str(")")
3491 }
3492 }
3493
3494 impl<Key, Value, State> DoubleEndedIterator for KeyValuesMut<'_, Key, Value, State>
3495 where
3496 Key: Eq + Hash,
3497 State: BuildHasher,
3498 {
next_back(&mut self) -> Option<Self::Item>3499 fn next_back(&mut self) -> Option<Self::Item> {
3500 let key = self.iter.next_back()?;
3501 let hash = hash_key(self.build_hasher, key);
3502 let (_, map_entry) = raw_entry(&self.keys, self.map, hash, key).unwrap();
3503 let iter = EntryValuesMut::from_map_entry(unsafe { &mut *self.values }, &map_entry);
3504 Some((key, iter))
3505 }
3506 }
3507
3508 impl<Key, Value, State> ExactSizeIterator for KeyValuesMut<'_, Key, Value, State>
3509 where
3510 Key: Eq + Hash,
3511 State: BuildHasher,
3512 {
3513 }
3514
3515 impl<Key, Value, State> FusedIterator for KeyValuesMut<'_, Key, Value, State>
3516 where
3517 Key: Eq + Hash,
3518 State: BuildHasher,
3519 {
3520 }
3521
3522 impl<'map, Key, Value, State> Iterator for KeyValuesMut<'map, Key, Value, State>
3523 where
3524 Key: Eq + Hash,
3525 State: BuildHasher,
3526 {
3527 type Item = (&'map Key, EntryValuesMut<'map, Key, Value>);
3528
next(&mut self) -> Option<Self::Item>3529 fn next(&mut self) -> Option<Self::Item> {
3530 let key = self.iter.next()?;
3531 let hash = hash_key(self.build_hasher, key);
3532 let (_, map_entry) = raw_entry(&self.keys, self.map, hash, key).unwrap();
3533 let iter = EntryValuesMut::from_map_entry(unsafe { &mut *self.values }, &map_entry);
3534 Some((key, iter))
3535 }
3536
size_hint(&self) -> (usize, Option<usize>)3537 fn size_hint(&self) -> (usize, Option<usize>) {
3538 self.iter.size_hint()
3539 }
3540 }
3541
3542 unsafe impl<Key, Value> Send for KeyValuesMut<'_, Key, Value>
3543 where
3544 Key: Send,
3545 Value: Send,
3546 {
3547 }
3548
3549 unsafe impl<Key, Value> Sync for KeyValuesMut<'_, Key, Value>
3550 where
3551 Key: Sync,
3552 Value: Sync,
3553 {
3554 }
3555
3556 /// An iterator that yields immutable references to all keys in the multimap. The order of the keys
3557 /// is always in the order that they were first inserted.
3558 pub struct Keys<'map, Key>(VecListIter<'map, Key>);
3559
3560 impl<'map, Key> Clone for Keys<'map, Key> {
clone(&self) -> Keys<'map, Key>3561 fn clone(&self) -> Keys<'map, Key> {
3562 Keys(self.0.clone())
3563 }
3564 }
3565
3566 impl<Key> Debug for Keys<'_, Key>
3567 where
3568 Key: Debug,
3569 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3570 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3571 formatter.write_str("Keys(")?;
3572 formatter.debug_list().entries(self.clone()).finish()?;
3573 formatter.write_str(")")
3574 }
3575 }
3576
3577 impl<Key> DoubleEndedIterator for Keys<'_, Key> {
next_back(&mut self) -> Option<Self::Item>3578 fn next_back(&mut self) -> Option<Self::Item> {
3579 self.0.next_back()
3580 }
3581 }
3582
3583 impl<Key> ExactSizeIterator for Keys<'_, Key> {}
3584
3585 impl<Key> FusedIterator for Keys<'_, Key> {}
3586
3587 impl<'map, Key> Iterator for Keys<'map, Key> {
3588 type Item = &'map Key;
3589
next(&mut self) -> Option<Self::Item>3590 fn next(&mut self) -> Option<Self::Item> {
3591 self.0.next()
3592 }
3593
size_hint(&self) -> (usize, Option<usize>)3594 fn size_hint(&self) -> (usize, Option<usize>) {
3595 self.0.size_hint()
3596 }
3597 }
3598
3599 /// An iterator that yields immutable references to all values of a multimap. The order of the
3600 /// values is always in the order that they were inserted.
3601 pub struct Values<'map, Key, Value>(VecListIter<'map, ValueEntry<Key, Value>>);
3602
3603 impl<'map, Key, Value> Clone for Values<'map, Key, Value> {
clone(&self) -> Values<'map, Key, Value>3604 fn clone(&self) -> Values<'map, Key, Value> {
3605 Values(self.0.clone())
3606 }
3607 }
3608
3609 impl<Key, Value> Debug for Values<'_, Key, Value>
3610 where
3611 Key: Debug,
3612 Value: Debug,
3613 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3614 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3615 formatter.write_str("Values(")?;
3616 formatter.debug_list().entries(self.clone()).finish()?;
3617 formatter.write_str(")")
3618 }
3619 }
3620
3621 impl<Key, Value> DoubleEndedIterator for Values<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>3622 fn next_back(&mut self) -> Option<Self::Item> {
3623 self.0.next_back().map(|entry| &entry.value)
3624 }
3625 }
3626
3627 impl<Key, Value> ExactSizeIterator for Values<'_, Key, Value> {}
3628
3629 impl<Key, Value> FusedIterator for Values<'_, Key, Value> {}
3630
3631 impl<'map, Key, Value> Iterator for Values<'map, Key, Value> {
3632 type Item = &'map Value;
3633
next(&mut self) -> Option<Self::Item>3634 fn next(&mut self) -> Option<Self::Item> {
3635 self.0.next().map(|entry| &entry.value)
3636 }
3637
size_hint(&self) -> (usize, Option<usize>)3638 fn size_hint(&self) -> (usize, Option<usize>) {
3639 self.0.size_hint()
3640 }
3641 }
3642
3643 /// An iterator that yields mutable references to all values of a multimap. The order of the values
3644 /// is always in the order that they were inserted.
3645 pub struct ValuesMut<'map, Key, Value>(VecListIterMut<'map, ValueEntry<Key, Value>>);
3646
3647 impl<Key, Value> ValuesMut<'_, Key, Value> {
3648 /// Creates an iterator that yields immutable references to all values of a multimap.
iter(&self) -> Values<Key, Value>3649 pub fn iter(&self) -> Values<Key, Value> {
3650 Values(self.0.iter())
3651 }
3652 }
3653
3654 impl<Key, Value> Debug for ValuesMut<'_, Key, Value>
3655 where
3656 Key: Debug,
3657 Value: Debug,
3658 {
fmt(&self, formatter: &mut Formatter) -> fmt::Result3659 fn fmt(&self, formatter: &mut Formatter) -> fmt::Result {
3660 formatter.write_str("ValuesMut(")?;
3661 formatter.debug_list().entries(self.iter()).finish()?;
3662 formatter.write_str(")")
3663 }
3664 }
3665
3666 impl<Key, Value> DoubleEndedIterator for ValuesMut<'_, Key, Value> {
next_back(&mut self) -> Option<Self::Item>3667 fn next_back(&mut self) -> Option<Self::Item> {
3668 self.0.next_back().map(|entry| &mut entry.value)
3669 }
3670 }
3671
3672 impl<Key, Value> ExactSizeIterator for ValuesMut<'_, Key, Value> {}
3673
3674 impl<Key, Value> FusedIterator for ValuesMut<'_, Key, Value> {}
3675
3676 impl<'map, Key, Value> Iterator for ValuesMut<'map, Key, Value> {
3677 type Item = &'map mut Value;
3678
next(&mut self) -> Option<Self::Item>3679 fn next(&mut self) -> Option<Self::Item> {
3680 self.0.next().map(|entry| &mut entry.value)
3681 }
3682
size_hint(&self) -> (usize, Option<usize>)3683 fn size_hint(&self) -> (usize, Option<usize>) {
3684 self.0.size_hint()
3685 }
3686 }
3687
3688 /// Dummy builder hasher that is not meant to be used. It is simply a placeholder.
3689 #[derive(Clone, Debug)]
3690 struct DummyState;
3691
3692 impl BuildHasher for DummyState {
3693 type Hasher = DummyHasher;
3694
build_hasher(&self) -> Self::Hasher3695 fn build_hasher(&self) -> Self::Hasher {
3696 DummyHasher
3697 }
3698 }
3699
3700 /// Dummy hasher that is not meant to be used. It is simply a placeholder.
3701 #[derive(Clone, Debug)]
3702 struct DummyHasher;
3703
3704 impl Hasher for DummyHasher {
finish(&self) -> u643705 fn finish(&self) -> u64 {
3706 unimplemented!();
3707 }
3708
write(&mut self, _: &[u8])3709 fn write(&mut self, _: &[u8]) {
3710 unimplemented!();
3711 }
3712 }
3713
3714 /// Computes the hash value of the given key.
hash_key<KeyQuery, State>(state: &State, key: &KeyQuery) -> u64 where KeyQuery: ?Sized + Eq + Hash, State: BuildHasher,3715 fn hash_key<KeyQuery, State>(state: &State, key: &KeyQuery) -> u64
3716 where
3717 KeyQuery: ?Sized + Eq + Hash,
3718 State: BuildHasher,
3719 {
3720 let mut hasher = state.build_hasher();
3721 key.hash(&mut hasher);
3722 hasher.finish()
3723 }
3724
raw_entry<'map, Key, KeyQuery, Value, State>( keys: &VecList<Key>, map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, State>, hash: u64, key: &KeyQuery, ) -> Option<(&'map Index<Key>, &'map MapEntry<Key, Value>)> where Key: Borrow<KeyQuery> + Eq + Hash, KeyQuery: ?Sized + Eq + Hash, State: BuildHasher,3725 fn raw_entry<'map, Key, KeyQuery, Value, State>(
3726 keys: &VecList<Key>,
3727 map: &'map HashMap<Index<Key>, MapEntry<Key, Value>, State>,
3728 hash: u64,
3729 key: &KeyQuery,
3730 ) -> Option<(&'map Index<Key>, &'map MapEntry<Key, Value>)>
3731 where
3732 Key: Borrow<KeyQuery> + Eq + Hash,
3733 KeyQuery: ?Sized + Eq + Hash,
3734 State: BuildHasher,
3735 {
3736 // TODO(https://github.com/rust-lang/rust/issues/56158): Avoids segmentation fault.
3737 if map.capacity() == 0 {
3738 return None;
3739 }
3740
3741 map.raw_entry().from_hash(hash, |&key_index| {
3742 let existing_key = keys.get(key_index).unwrap();
3743 key == existing_key.borrow()
3744 })
3745 }
3746
raw_entry_mut<'map, Key, KeyQuery, Value, State>( keys: &VecList<Key>, map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, State>, hash: u64, key: &KeyQuery, ) -> RawEntryMut<'map, Index<Key>, MapEntry<Key, Value>, State> where Key: Borrow<KeyQuery> + Eq + Hash, KeyQuery: ?Sized + Eq + Hash, State: BuildHasher,3747 fn raw_entry_mut<'map, Key, KeyQuery, Value, State>(
3748 keys: &VecList<Key>,
3749 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, State>,
3750 hash: u64,
3751 key: &KeyQuery,
3752 ) -> RawEntryMut<'map, Index<Key>, MapEntry<Key, Value>, State>
3753 where
3754 Key: Borrow<KeyQuery> + Eq + Hash,
3755 KeyQuery: ?Sized + Eq + Hash,
3756 State: BuildHasher,
3757 {
3758 map.raw_entry_mut().from_hash(hash, |&key_index| {
3759 let existing_key = keys.get(key_index).unwrap();
3760 key == existing_key.borrow()
3761 })
3762 }
3763
raw_entry_mut_empty<'map, Key, KeyQuery, Value, State>( keys: &VecList<Key>, map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, State>, hash: u64, ) -> RawEntryMut<'map, Index<Key>, MapEntry<Key, Value>, State> where Key: Borrow<KeyQuery> + Eq + Hash, KeyQuery: ?Sized + Eq + Hash, State: BuildHasher,3764 fn raw_entry_mut_empty<'map, Key, KeyQuery, Value, State>(
3765 keys: &VecList<Key>,
3766 map: &'map mut HashMap<Index<Key>, MapEntry<Key, Value>, State>,
3767 hash: u64,
3768 ) -> RawEntryMut<'map, Index<Key>, MapEntry<Key, Value>, State>
3769 where
3770 Key: Borrow<KeyQuery> + Eq + Hash,
3771 KeyQuery: ?Sized + Eq + Hash,
3772 State: BuildHasher,
3773 {
3774 map.raw_entry_mut()
3775 .from_hash(hash, |&key_index| keys.get(key_index).is_none())
3776 }
3777
3778 #[cfg(test)]
3779 mod test {
3780 use super::*;
3781
3782 #[test]
test_bounds()3783 fn test_bounds() {
3784 fn check_bounds<Type: Send + Sync>() {}
3785
3786 check_bounds::<EntryValues<'static, (), ()>>();
3787 check_bounds::<EntryValuesDrain<'static, (), ()>>();
3788 check_bounds::<EntryValuesMut<'static, (), ()>>();
3789 check_bounds::<IntoIter<(), ()>>();
3790 check_bounds::<Iter<'static, (), ()>>();
3791 check_bounds::<IterMut<'static, (), ()>>();
3792 check_bounds::<KeyValues<'static, (), ()>>();
3793 check_bounds::<KeyValuesDrain<'static, (), ()>>();
3794 check_bounds::<KeyValuesEntryDrain<'static, (), ()>>();
3795 check_bounds::<KeyValuesMut<'static, (), ()>>();
3796 check_bounds::<ListOrderedMultimap<(), ()>>();
3797 check_bounds::<Values<'static, (), ()>>();
3798 check_bounds::<ValuesMut<'static, (), ()>>();
3799 }
3800
3801 #[test]
test_collision()3802 fn test_collision() {
3803 struct TestBuildHasher;
3804
3805 impl BuildHasher for TestBuildHasher {
3806 type Hasher = TestHasher;
3807
3808 fn build_hasher(&self) -> Self::Hasher {
3809 TestHasher
3810 }
3811 }
3812
3813 struct TestHasher;
3814
3815 impl Hasher for TestHasher {
3816 fn finish(&self) -> u64 {
3817 0
3818 }
3819
3820 fn write(&mut self, _: &[u8]) {}
3821 }
3822
3823 let mut map = ListOrderedMultimap::with_hasher(TestBuildHasher);
3824
3825 map.insert("key1", "value1");
3826 assert_eq!(map.get(&"key1"), Some(&"value1"));
3827
3828 map.insert("key2", "value2");
3829 assert_eq!(map.get(&"key2"), Some(&"value2"));
3830 }
3831
3832 #[test]
test_entry_and_modify()3833 fn test_entry_and_modify() {
3834 let mut map = ListOrderedMultimap::new();
3835 map.entry("key")
3836 .and_modify(|_| panic!("entry should be vacant"));
3837
3838 map.insert("key", "value1");
3839 map.entry("key").and_modify(|value| *value = "value2");
3840 assert_eq!(map.get(&"key"), Some(&"value2"));
3841 }
3842
3843 #[test]
test_entry_or_insert()3844 fn test_entry_or_insert() {
3845 let mut map = ListOrderedMultimap::new();
3846 let value = map.entry("key").or_insert("value1");
3847 assert_eq!(value, &"value1");
3848
3849 let value = map.entry("key").or_insert("value2");
3850 assert_eq!(value, &"value1");
3851 }
3852
3853 #[test]
test_entry_or_insert_entry()3854 fn test_entry_or_insert_entry() {
3855 let mut map = ListOrderedMultimap::new();
3856 let entry = map.entry("key").or_insert_entry("value1");
3857 assert_eq!(entry.get(), &"value1");
3858
3859 let entry = map.entry("key").or_insert_entry("value2");
3860 assert_eq!(entry.get(), &"value1");
3861 }
3862
3863 #[test]
test_entry_or_insert_with()3864 fn test_entry_or_insert_with() {
3865 let mut map = ListOrderedMultimap::new();
3866 let value = map.entry("key").or_insert_with(|| "value1");
3867 assert_eq!(value, &"value1");
3868
3869 let value = map.entry("key").or_insert_with(|| "value2");
3870 assert_eq!(value, &"value1");
3871 }
3872
3873 #[test]
test_entry_or_insert_with_entry()3874 fn test_entry_or_insert_with_entry() {
3875 let mut map = ListOrderedMultimap::new();
3876 let entry = map.entry("key").or_insert_with_entry(|| "value1");
3877 assert_eq!(entry.get(), &"value1");
3878
3879 let entry = map.entry("key").or_insert_with_entry(|| "value2");
3880 assert_eq!(entry.get(), &"value1");
3881 }
3882
3883 #[test]
test_entry_values_debug()3884 fn test_entry_values_debug() {
3885 let mut map = ListOrderedMultimap::new();
3886
3887 map.insert("key", "value1");
3888 map.append("key", "value2");
3889 map.append("key", "value3");
3890 map.append("key", "value4");
3891
3892 let iter = map.get_all(&"key");
3893 assert_eq!(
3894 format!("{:?}", iter),
3895 r#"EntryValues(["value1", "value2", "value3", "value4"])"#
3896 );
3897 }
3898
3899 #[test]
test_entry_values_double_ended()3900 fn test_entry_values_double_ended() {
3901 let mut map = ListOrderedMultimap::new();
3902
3903 map.insert("key", "value1");
3904 map.append("key", "value2");
3905 map.append("key", "value3");
3906 map.append("key", "value4");
3907
3908 let mut iter = map.remove_all(&"key");
3909 assert_eq!(iter.next(), Some("value1"));
3910 assert_eq!(iter.next_back(), Some("value4"));
3911 assert_eq!(iter.next(), Some("value2"));
3912 assert_eq!(iter.next_back(), Some("value3"));
3913 assert_eq!(iter.next(), None);
3914 }
3915
3916 #[test]
test_entry_values_drain_debug()3917 fn test_entry_values_drain_debug() {
3918 let mut map = ListOrderedMultimap::new();
3919
3920 map.insert("key", "value1");
3921 map.append("key", "value2");
3922 map.append("key", "value3");
3923 map.append("key", "value4");
3924
3925 let iter = map.remove_all(&"key");
3926 assert_eq!(
3927 format!("{:?}", iter),
3928 r#"EntryValuesDrain(["value1", "value2", "value3", "value4"])"#
3929 );
3930 }
3931
3932 #[test]
test_entry_values_drain_double_ended()3933 fn test_entry_values_drain_double_ended() {
3934 let mut map = ListOrderedMultimap::new();
3935
3936 map.insert("key", "value1");
3937 map.append("key", "value2");
3938 map.append("key", "value3");
3939 map.append("key", "value4");
3940
3941 let mut iter = map.remove_all(&"key");
3942 assert_eq!(iter.next(), Some("value1"));
3943 assert_eq!(iter.next_back(), Some("value4"));
3944 assert_eq!(iter.next(), Some("value2"));
3945 assert_eq!(iter.next_back(), Some("value3"));
3946 assert_eq!(iter.next(), None);
3947 }
3948
3949 #[test]
test_entry_values_drain_empty()3950 fn test_entry_values_drain_empty() {
3951 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3952 let mut iter = map.remove_all(&"key");
3953 assert_eq!(iter.next_back(), None);
3954 assert_eq!(iter.next(), None);
3955 }
3956
3957 #[test]
test_entry_values_drain_fused()3958 fn test_entry_values_drain_fused() {
3959 let mut map = ListOrderedMultimap::new();
3960
3961 map.insert("key", "value");
3962
3963 let mut iter = map.remove_all(&"key");
3964 assert_eq!(iter.next(), Some("value"));
3965 assert_eq!(iter.next(), None);
3966 assert_eq!(iter.next_back(), None);
3967 assert_eq!(iter.next(), None);
3968 assert_eq!(iter.next_back(), None);
3969 assert_eq!(iter.next(), None);
3970 }
3971
3972 #[test]
test_entry_values_drain_size_hint()3973 fn test_entry_values_drain_size_hint() {
3974 let mut map = ListOrderedMultimap::new();
3975
3976 map.insert("key", "value1");
3977 map.append("key", "value2");
3978 map.append("key", "value3");
3979 map.append("key", "value4");
3980
3981 let mut iter = map.remove_all(&"key");
3982 assert_eq!(iter.size_hint(), (4, Some(4)));
3983 iter.next();
3984 assert_eq!(iter.size_hint(), (3, Some(3)));
3985 iter.next();
3986 assert_eq!(iter.size_hint(), (2, Some(2)));
3987 iter.next();
3988 assert_eq!(iter.size_hint(), (1, Some(1)));
3989 iter.next();
3990 assert_eq!(iter.size_hint(), (0, Some(0)));
3991 }
3992
3993 #[test]
test_entry_values_empty()3994 fn test_entry_values_empty() {
3995 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
3996 let mut iter = map.get_all(&"key");
3997 assert_eq!(iter.next_back(), None);
3998 assert_eq!(iter.next(), None);
3999 }
4000
4001 #[test]
test_entry_values_fused()4002 fn test_entry_values_fused() {
4003 let mut map = ListOrderedMultimap::new();
4004
4005 map.insert("key", "value");
4006
4007 let mut iter = map.get_all(&"key");
4008 assert_eq!(iter.next(), Some(&"value"));
4009 assert_eq!(iter.next(), None);
4010 assert_eq!(iter.next_back(), None);
4011 assert_eq!(iter.next(), None);
4012 assert_eq!(iter.next_back(), None);
4013 assert_eq!(iter.next(), None);
4014 }
4015
4016 #[test]
test_entry_values_mut_debug()4017 fn test_entry_values_mut_debug() {
4018 let mut map = ListOrderedMultimap::new();
4019
4020 map.insert("key", "value1");
4021 map.append("key", "value2");
4022 map.append("key", "value3");
4023 map.append("key", "value4");
4024
4025 let iter = map.get_all_mut(&"key");
4026 assert_eq!(
4027 format!("{:?}", iter),
4028 r#"EntryValuesMut(["value1", "value2", "value3", "value4"])"#
4029 );
4030 }
4031
4032 #[test]
test_entry_values_mut_double_ended()4033 fn test_entry_values_mut_double_ended() {
4034 let mut map = ListOrderedMultimap::new();
4035
4036 map.insert("key", "value1");
4037 map.append("key", "value2");
4038 map.append("key", "value3");
4039 map.append("key", "value4");
4040
4041 let mut iter = map.get_all_mut(&"key");
4042 assert_eq!(iter.next(), Some(&mut "value1"));
4043 assert_eq!(iter.next_back(), Some(&mut "value4"));
4044 assert_eq!(iter.next(), Some(&mut "value2"));
4045 assert_eq!(iter.next_back(), Some(&mut "value3"));
4046 assert_eq!(iter.next(), None);
4047 }
4048
4049 #[test]
test_entry_values_mut_empty()4050 fn test_entry_values_mut_empty() {
4051 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4052 let mut iter = map.get_all_mut(&"key");
4053 assert_eq!(iter.next_back(), None);
4054 assert_eq!(iter.next(), None);
4055 }
4056
4057 #[test]
test_entry_values_mut_fused()4058 fn test_entry_values_mut_fused() {
4059 let mut map = ListOrderedMultimap::new();
4060
4061 map.insert("key", "value");
4062
4063 let mut iter = map.get_all_mut(&"key");
4064 assert_eq!(iter.next(), Some(&mut "value"));
4065 assert_eq!(iter.next(), None);
4066 assert_eq!(iter.next_back(), None);
4067 assert_eq!(iter.next(), None);
4068 assert_eq!(iter.next_back(), None);
4069 assert_eq!(iter.next(), None);
4070 }
4071
4072 #[test]
test_entry_values_mut_size_hint()4073 fn test_entry_values_mut_size_hint() {
4074 let mut map = ListOrderedMultimap::new();
4075
4076 map.insert("key", "value1");
4077 map.append("key", "value2");
4078 map.append("key", "value3");
4079 map.append("key", "value4");
4080
4081 let mut iter = map.get_all_mut(&"key");
4082 assert_eq!(iter.size_hint(), (4, Some(4)));
4083 iter.next();
4084 assert_eq!(iter.size_hint(), (3, Some(3)));
4085 iter.next();
4086 assert_eq!(iter.size_hint(), (2, Some(2)));
4087 iter.next();
4088 assert_eq!(iter.size_hint(), (1, Some(1)));
4089 iter.next();
4090 assert_eq!(iter.size_hint(), (0, Some(0)));
4091 }
4092
4093 #[test]
test_entry_values_size_hint()4094 fn test_entry_values_size_hint() {
4095 let mut map = ListOrderedMultimap::new();
4096
4097 map.insert("key", "value1");
4098 map.append("key", "value2");
4099 map.append("key", "value3");
4100 map.append("key", "value4");
4101
4102 let mut iter = map.get_all(&"key");
4103 assert_eq!(iter.size_hint(), (4, Some(4)));
4104 iter.next();
4105 assert_eq!(iter.size_hint(), (3, Some(3)));
4106 iter.next();
4107 assert_eq!(iter.size_hint(), (2, Some(2)));
4108 iter.next();
4109 assert_eq!(iter.size_hint(), (1, Some(1)));
4110 iter.next();
4111 assert_eq!(iter.size_hint(), (0, Some(0)));
4112 }
4113
4114 #[test]
test_iter_debug()4115 fn test_iter_debug() {
4116 let mut map = ListOrderedMultimap::new();
4117
4118 map.insert("key1", "value1");
4119 map.append("key2", "value2");
4120 map.append("key2", "value3");
4121 map.append("key1", "value4");
4122
4123 let iter = map.iter();
4124 assert_eq!(
4125 format!("{:?}", iter),
4126 r#"Iter([("key1", "value1"), ("key2", "value2"), ("key2", "value3"), ("key1", "value4")])"#
4127 );
4128 }
4129
4130 #[test]
test_iter_double_ended()4131 fn test_iter_double_ended() {
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 mut iter = map.iter();
4140 assert_eq!(iter.next(), Some((&"key1", &"value1")));
4141 assert_eq!(iter.next_back(), Some((&"key1", &"value4")));
4142 assert_eq!(iter.next(), Some((&"key2", &"value2")));
4143 assert_eq!(iter.next_back(), Some((&"key2", &"value3")));
4144 assert_eq!(iter.next(), None);
4145 }
4146
4147 #[test]
test_iter_empty()4148 fn test_iter_empty() {
4149 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4150 let mut iter = map.iter();
4151 assert_eq!(iter.next_back(), None);
4152 assert_eq!(iter.next(), None);
4153 }
4154
4155 #[test]
test_iter_fused()4156 fn test_iter_fused() {
4157 let mut map = ListOrderedMultimap::new();
4158
4159 map.insert("key", "value");
4160
4161 let mut iter = map.iter();
4162 assert_eq!(iter.next(), Some((&"key", &"value")));
4163 assert_eq!(iter.next(), None);
4164 assert_eq!(iter.next_back(), None);
4165 assert_eq!(iter.next(), None);
4166 assert_eq!(iter.next_back(), None);
4167 assert_eq!(iter.next(), None);
4168 }
4169
4170 #[test]
test_iter_mut_debug()4171 fn test_iter_mut_debug() {
4172 let mut map = ListOrderedMultimap::new();
4173
4174 map.insert("key1", "value1");
4175 map.append("key2", "value2");
4176 map.append("key2", "value3");
4177 map.append("key1", "value4");
4178
4179 let iter = map.iter_mut();
4180 assert_eq!(
4181 format!("{:?}", iter),
4182 r#"IterMut([("key1", "value1"), ("key2", "value2"), ("key2", "value3"), ("key1", "value4")])"#
4183 );
4184 }
4185
4186 #[test]
test_iter_mut_double_ended()4187 fn test_iter_mut_double_ended() {
4188 let mut map = ListOrderedMultimap::new();
4189
4190 map.insert("key1", "value1");
4191 map.append("key2", "value2");
4192 map.append("key2", "value3");
4193 map.append("key1", "value4");
4194
4195 let mut iter = map.iter_mut();
4196 assert_eq!(iter.next(), Some((&"key1", &mut "value1")));
4197 assert_eq!(iter.next_back(), Some((&"key1", &mut "value4")));
4198 assert_eq!(iter.next(), Some((&"key2", &mut "value2")));
4199 assert_eq!(iter.next_back(), Some((&"key2", &mut "value3")));
4200 assert_eq!(iter.next(), None);
4201 }
4202
4203 #[test]
test_iter_mut_empty()4204 fn test_iter_mut_empty() {
4205 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4206 let mut iter = map.iter_mut();
4207 assert_eq!(iter.next_back(), None);
4208 assert_eq!(iter.next(), None);
4209 }
4210
4211 #[test]
test_iter_mut_fused()4212 fn test_iter_mut_fused() {
4213 let mut map = ListOrderedMultimap::new();
4214
4215 map.insert("key", "value");
4216
4217 let mut iter = map.iter_mut();
4218 assert_eq!(iter.next(), Some((&"key", &mut "value")));
4219 assert_eq!(iter.next(), None);
4220 assert_eq!(iter.next_back(), None);
4221 assert_eq!(iter.next(), None);
4222 assert_eq!(iter.next_back(), None);
4223 assert_eq!(iter.next(), None);
4224 }
4225
4226 #[test]
test_iter_mut_size_hint()4227 fn test_iter_mut_size_hint() {
4228 let mut map = ListOrderedMultimap::new();
4229
4230 map.insert("key1", "value1");
4231 map.append("key2", "value2");
4232 map.append("key2", "value3");
4233 map.append("key1", "value4");
4234
4235 let mut iter = map.iter_mut();
4236 assert_eq!(iter.size_hint(), (4, Some(4)));
4237 iter.next();
4238 assert_eq!(iter.size_hint(), (3, Some(3)));
4239 iter.next();
4240 assert_eq!(iter.size_hint(), (2, Some(2)));
4241 iter.next();
4242 assert_eq!(iter.size_hint(), (1, Some(1)));
4243 iter.next();
4244 assert_eq!(iter.size_hint(), (0, Some(0)));
4245 }
4246
4247 #[test]
test_iter_size_hint()4248 fn test_iter_size_hint() {
4249 let mut map = ListOrderedMultimap::new();
4250
4251 map.insert("key1", "value1");
4252 map.append("key2", "value2");
4253 map.append("key2", "value3");
4254 map.append("key1", "value4");
4255
4256 let mut iter = map.iter();
4257 assert_eq!(iter.size_hint(), (4, Some(4)));
4258 iter.next();
4259 assert_eq!(iter.size_hint(), (3, Some(3)));
4260 iter.next();
4261 assert_eq!(iter.size_hint(), (2, Some(2)));
4262 iter.next();
4263 assert_eq!(iter.size_hint(), (1, Some(1)));
4264 iter.next();
4265 assert_eq!(iter.size_hint(), (0, Some(0)));
4266 }
4267
4268 #[test]
test_into_iter_debug()4269 fn test_into_iter_debug() {
4270 let mut map = ListOrderedMultimap::new();
4271
4272 map.insert("key1", "value1");
4273 map.append("key2", "value2");
4274 map.append("key2", "value3");
4275 map.append("key1", "value4");
4276
4277 let iter = map.into_iter();
4278 assert_eq!(
4279 format!("{:?}", iter),
4280 r#"IntoIter([("key1", "value1"), ("key2", "value2"), ("key2", "value3"), ("key1", "value4")])"#
4281 );
4282 }
4283
4284 #[test]
test_into_iter_double_ended()4285 fn test_into_iter_double_ended() {
4286 let mut map = ListOrderedMultimap::new();
4287
4288 map.insert("key1", "value1");
4289 map.append("key2", "value2");
4290 map.append("key2", "value3");
4291 map.append("key1", "value4");
4292
4293 let mut iter = map.into_iter();
4294 assert_eq!(iter.next(), Some(("key1", "value1")));
4295 assert_eq!(iter.next_back(), Some(("key1", "value4")));
4296 assert_eq!(iter.next(), Some(("key2", "value2")));
4297 assert_eq!(iter.next_back(), Some(("key2", "value3")));
4298 assert_eq!(iter.next(), None);
4299 }
4300
4301 #[test]
test_into_iter_empty()4302 fn test_into_iter_empty() {
4303 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4304 let mut iter = map.into_iter();
4305 assert_eq!(iter.next_back(), None);
4306 assert_eq!(iter.next(), None);
4307 }
4308
4309 #[test]
test_into_iter_fused()4310 fn test_into_iter_fused() {
4311 let mut map = ListOrderedMultimap::new();
4312
4313 map.insert("key", "value");
4314
4315 let mut iter = map.into_iter();
4316 assert_eq!(iter.next(), Some(("key", "value")));
4317 assert_eq!(iter.next(), None);
4318 assert_eq!(iter.next_back(), None);
4319 assert_eq!(iter.next(), None);
4320 assert_eq!(iter.next_back(), None);
4321 assert_eq!(iter.next(), None);
4322 }
4323
4324 #[test]
test_into_iter_size_hint()4325 fn test_into_iter_size_hint() {
4326 let mut map = ListOrderedMultimap::new();
4327
4328 map.insert("key1", "value1");
4329 map.append("key2", "value2");
4330 map.append("key2", "value3");
4331 map.append("key1", "value4");
4332
4333 let mut iter = map.into_iter();
4334 assert_eq!(iter.size_hint(), (4, Some(4)));
4335 iter.next();
4336 assert_eq!(iter.size_hint(), (3, Some(3)));
4337 iter.next();
4338 assert_eq!(iter.size_hint(), (2, Some(2)));
4339 iter.next();
4340 assert_eq!(iter.size_hint(), (1, Some(1)));
4341 iter.next();
4342 assert_eq!(iter.size_hint(), (0, Some(0)));
4343 }
4344
4345 #[test]
test_key_values_debug()4346 fn test_key_values_debug() {
4347 let mut map = ListOrderedMultimap::new();
4348
4349 map.insert("key1", "value1");
4350 map.append("key2", "value2");
4351 map.append("key2", "value3");
4352 map.append("key1", "value4");
4353
4354 let iter = map.pairs();
4355 assert_eq!(
4356 format!("{:?}", iter),
4357 r#"KeyValues([("key1", EntryValues(["value1", "value4"])), ("key2", EntryValues(["value2", "value3"]))])"#
4358 );
4359 }
4360
4361 #[test]
test_key_values_double_ended()4362 fn test_key_values_double_ended() {
4363 let mut map = ListOrderedMultimap::new();
4364
4365 map.insert("key1", "value1");
4366 map.append("key2", "value2");
4367 map.append("key2", "value3");
4368 map.append("key1", "value4");
4369
4370 let mut iter = map.pairs();
4371
4372 let (key, mut values) = iter.next().unwrap();
4373 assert_eq!(key, &"key1");
4374 assert_eq!(values.next(), Some(&"value1"));
4375 assert_eq!(values.next(), Some(&"value4"));
4376 assert_eq!(values.next(), None);
4377
4378 let (key, mut values) = iter.next().unwrap();
4379 assert_eq!(key, &"key2");
4380 assert_eq!(values.next(), Some(&"value2"));
4381 assert_eq!(values.next(), Some(&"value3"));
4382 assert_eq!(values.next(), None);
4383
4384 assert!(iter.next().is_none());
4385 }
4386
4387 #[test]
test_key_values_drain_debug()4388 fn test_key_values_drain_debug() {
4389 let mut map = ListOrderedMultimap::new();
4390
4391 map.insert("key1", "value1");
4392 map.append("key2", "value2");
4393 map.append("key2", "value3");
4394 map.append("key1", "value4");
4395
4396 let iter = map.drain_pairs();
4397 assert_eq!(
4398 format!("{:?}", iter),
4399 r#"KeyValuesDrain([("key1", EntryValues(["value1", "value4"])), ("key2", EntryValues(["value2", "value3"]))])"#
4400 );
4401 }
4402
4403 #[test]
test_key_values_drain_double_ended()4404 fn test_key_values_drain_double_ended() {
4405 let mut map = ListOrderedMultimap::new();
4406
4407 map.insert("key1", "value1");
4408 map.append("key2", "value2");
4409 map.append("key2", "value3");
4410 map.append("key1", "value4");
4411
4412 let mut iter = map.drain_pairs();
4413
4414 let (key, mut values) = iter.next().unwrap();
4415 assert_eq!(key, "key1");
4416 assert_eq!(values.next(), Some("value1"));
4417 assert_eq!(values.next(), Some("value4"));
4418 assert_eq!(values.next(), None);
4419
4420 let (key, mut values) = iter.next().unwrap();
4421 assert_eq!(key, "key2");
4422 assert_eq!(values.next(), Some("value2"));
4423 assert_eq!(values.next(), Some("value3"));
4424 assert_eq!(values.next(), None);
4425
4426 assert!(iter.next().is_none());
4427 }
4428
4429 #[test]
test_key_values_drain_empty()4430 fn test_key_values_drain_empty() {
4431 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4432 let mut iter = map.drain_pairs();
4433 assert!(iter.next_back().is_none());
4434 assert!(iter.next().is_none());
4435 }
4436
4437 #[test]
test_key_values_drain_fused()4438 fn test_key_values_drain_fused() {
4439 let mut map = ListOrderedMultimap::new();
4440
4441 map.insert("key", "value");
4442
4443 let mut iter = map.drain_pairs();
4444
4445 let (key, mut values) = iter.next().unwrap();
4446 assert_eq!(key, "key");
4447 assert_eq!(values.next(), Some("value"));
4448 assert_eq!(values.next(), None);
4449
4450 assert!(iter.next().is_none());
4451 assert!(iter.next_back().is_none());
4452 assert!(iter.next().is_none());
4453 assert!(iter.next_back().is_none());
4454 assert!(iter.next().is_none());
4455 }
4456
4457 #[test]
test_key_values_drain_size_hint()4458 fn test_key_values_drain_size_hint() {
4459 let mut map = ListOrderedMultimap::new();
4460
4461 map.insert("key1", "value1");
4462 map.append("key2", "value2");
4463 map.append("key2", "value3");
4464 map.append("key1", "value4");
4465
4466 let mut iter = map.drain_pairs();
4467 assert_eq!(iter.size_hint(), (2, Some(2)));
4468 iter.next();
4469 assert_eq!(iter.size_hint(), (1, Some(1)));
4470 iter.next();
4471 assert_eq!(iter.size_hint(), (0, Some(0)));
4472 }
4473
4474 #[test]
test_key_values_empty()4475 fn test_key_values_empty() {
4476 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4477 let mut iter = map.pairs();
4478 assert!(iter.next_back().is_none());
4479 assert!(iter.next().is_none());
4480 }
4481
4482 #[test]
test_key_values_entry_drain_debug()4483 fn test_key_values_entry_drain_debug() {
4484 let mut map = ListOrderedMultimap::new();
4485
4486 map.insert("key", "value1");
4487 map.append("key", "value2");
4488 map.append("key", "value3");
4489 map.append("key", "value4");
4490
4491 let mut iter = map.drain_pairs();
4492 let (_, values) = iter.next().unwrap();
4493
4494 assert_eq!(
4495 format!("{:?}", values),
4496 r#"KeyValuesEntryDrain(["value1", "value2", "value3", "value4"])"#
4497 );
4498 }
4499
4500 #[test]
test_key_values_entry_drain_double_ended()4501 fn test_key_values_entry_drain_double_ended() {
4502 let mut map = ListOrderedMultimap::new();
4503
4504 map.insert("key", "value1");
4505 map.append("key", "value2");
4506 map.append("key", "value3");
4507 map.append("key", "value4");
4508
4509 let mut iter = map.drain_pairs();
4510 let (_, mut values) = iter.next().unwrap();
4511 assert_eq!(values.next(), Some("value1"));
4512 assert_eq!(values.next_back(), Some("value4"));
4513 assert_eq!(values.next(), Some("value2"));
4514 assert_eq!(values.next_back(), Some("value3"));
4515 assert_eq!(values.next(), None);
4516
4517 assert!(iter.next().is_none());
4518 }
4519
4520 #[test]
test_key_values_entry_drain_fused()4521 fn test_key_values_entry_drain_fused() {
4522 let mut map = ListOrderedMultimap::new();
4523
4524 map.insert("key", "value");
4525
4526 let mut iter = map.drain_pairs();
4527 let (_, mut values) = iter.next().unwrap();
4528 assert_eq!(values.next(), Some("value"));
4529 assert_eq!(values.next(), None);
4530 assert_eq!(values.next_back(), None);
4531 assert_eq!(values.next(), None);
4532 assert_eq!(values.next_back(), None);
4533 }
4534
4535 #[test]
test_key_values_entry_drain_size_hint()4536 fn test_key_values_entry_drain_size_hint() {
4537 let mut map = ListOrderedMultimap::new();
4538
4539 map.insert("key1", "value1");
4540 map.append("key2", "value2");
4541 map.append("key2", "value3");
4542 map.append("key1", "value4");
4543
4544 let mut iter = map.drain_pairs();
4545 let (_, mut values) = iter.next().unwrap();
4546 assert_eq!(values.size_hint(), (2, Some(2)));
4547 values.next();
4548 assert_eq!(values.size_hint(), (1, Some(1)));
4549 values.next();
4550 assert_eq!(values.size_hint(), (0, Some(0)));
4551 }
4552
4553 #[test]
test_key_values_fused()4554 fn test_key_values_fused() {
4555 let mut map = ListOrderedMultimap::new();
4556
4557 map.insert("key", "value");
4558
4559 let mut iter = map.pairs();
4560
4561 let (key, mut values) = iter.next().unwrap();
4562 assert_eq!(key, &"key");
4563 assert_eq!(values.next(), Some(&"value"));
4564 assert_eq!(values.next(), None);
4565
4566 assert!(iter.next().is_none());
4567 assert!(iter.next_back().is_none());
4568 assert!(iter.next().is_none());
4569 assert!(iter.next_back().is_none());
4570 assert!(iter.next().is_none());
4571 }
4572
4573 #[test]
test_key_values_mut_debug()4574 fn test_key_values_mut_debug() {
4575 let mut map = ListOrderedMultimap::new();
4576
4577 map.insert("key1", "value1");
4578 map.append("key2", "value2");
4579 map.append("key2", "value3");
4580 map.append("key1", "value4");
4581
4582 let iter = map.pairs_mut();
4583 assert_eq!(
4584 format!("{:?}", iter),
4585 r#"KeyValuesMut([("key1", EntryValues(["value1", "value4"])), ("key2", EntryValues(["value2", "value3"]))])"#
4586 );
4587 }
4588
4589 #[test]
test_key_values_mut_double_ended()4590 fn test_key_values_mut_double_ended() {
4591 let mut map = ListOrderedMultimap::new();
4592
4593 map.insert("key1", "value1");
4594 map.append("key2", "value2");
4595 map.append("key2", "value3");
4596 map.append("key1", "value4");
4597
4598 let mut iter = map.pairs_mut();
4599
4600 let (key, mut values) = iter.next().unwrap();
4601 assert_eq!(key, &"key1");
4602 assert_eq!(values.next(), Some(&mut "value1"));
4603 assert_eq!(values.next(), Some(&mut "value4"));
4604 assert_eq!(values.next(), None);
4605
4606 let (key, mut values) = iter.next().unwrap();
4607 assert_eq!(key, &"key2");
4608 assert_eq!(values.next(), Some(&mut "value2"));
4609 assert_eq!(values.next(), Some(&mut "value3"));
4610 assert_eq!(values.next(), None);
4611
4612 assert!(iter.next().is_none());
4613 }
4614
4615 #[test]
test_key_values_mut_empty()4616 fn test_key_values_mut_empty() {
4617 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4618 let mut iter = map.pairs_mut();
4619 assert!(iter.next_back().is_none());
4620 assert!(iter.next().is_none());
4621 }
4622
4623 #[test]
test_key_values_mut_fused()4624 fn test_key_values_mut_fused() {
4625 let mut map = ListOrderedMultimap::new();
4626
4627 map.insert("key", "value");
4628
4629 let mut iter = map.pairs_mut();
4630
4631 let (key, mut values) = iter.next().unwrap();
4632 assert_eq!(key, &"key");
4633 assert_eq!(values.next(), Some(&mut "value"));
4634 assert_eq!(values.next(), None);
4635
4636 assert!(iter.next().is_none());
4637 assert!(iter.next_back().is_none());
4638 assert!(iter.next().is_none());
4639 assert!(iter.next_back().is_none());
4640 assert!(iter.next().is_none());
4641 }
4642
4643 #[test]
test_key_values_mut_size_hint()4644 fn test_key_values_mut_size_hint() {
4645 let mut map = ListOrderedMultimap::new();
4646
4647 map.insert("key1", "value1");
4648 map.append("key2", "value2");
4649 map.append("key2", "value3");
4650 map.append("key1", "value4");
4651
4652 let mut iter = map.pairs_mut();
4653 assert_eq!(iter.size_hint(), (2, Some(2)));
4654 iter.next();
4655 assert_eq!(iter.size_hint(), (1, Some(1)));
4656 iter.next();
4657 assert_eq!(iter.size_hint(), (0, Some(0)));
4658 }
4659
4660 #[test]
test_key_values_size_hint()4661 fn test_key_values_size_hint() {
4662 let mut map = ListOrderedMultimap::new();
4663
4664 map.insert("key1", "value1");
4665 map.append("key2", "value2");
4666 map.append("key2", "value3");
4667 map.append("key1", "value4");
4668
4669 let mut iter = map.pairs();
4670 assert_eq!(iter.size_hint(), (2, Some(2)));
4671 iter.next();
4672 assert_eq!(iter.size_hint(), (1, Some(1)));
4673 iter.next();
4674 assert_eq!(iter.size_hint(), (0, Some(0)));
4675 }
4676
4677 #[test]
test_keys_debug()4678 fn test_keys_debug() {
4679 let mut map = ListOrderedMultimap::new();
4680
4681 map.insert("key1", "value1");
4682 map.append("key2", "value2");
4683 map.append("key2", "value3");
4684 map.append("key1", "value4");
4685
4686 let iter = map.keys();
4687 assert_eq!(format!("{:?}", iter), r#"Keys(["key1", "key2"])"#);
4688 }
4689
4690 #[test]
test_keys_double_ended()4691 fn test_keys_double_ended() {
4692 let mut map = ListOrderedMultimap::new();
4693
4694 map.insert("key1", "value1");
4695 map.append("key2", "value2");
4696 map.append("key2", "value3");
4697 map.append("key1", "value4");
4698
4699 let mut iter = map.keys();
4700 assert_eq!(iter.next(), Some(&"key1"));
4701 assert_eq!(iter.next_back(), Some(&"key2"));
4702 assert_eq!(iter.next(), None);
4703 }
4704
4705 #[test]
test_keys_empty()4706 fn test_keys_empty() {
4707 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
4708 let mut iter = map.keys();
4709 assert_eq!(iter.next_back(), None);
4710 assert_eq!(iter.next(), None);
4711 }
4712
4713 #[test]
test_keys_fused()4714 fn test_keys_fused() {
4715 let mut map = ListOrderedMultimap::new();
4716
4717 map.insert("key", "value");
4718
4719 let mut iter = map.keys();
4720 assert_eq!(iter.next(), Some(&"key"));
4721 assert_eq!(iter.next(), None);
4722 assert_eq!(iter.next_back(), None);
4723 assert_eq!(iter.next(), None);
4724 assert_eq!(iter.next_back(), None);
4725 assert_eq!(iter.next(), None);
4726 }
4727
4728 #[test]
test_keys_size_hint()4729 fn test_keys_size_hint() {
4730 let mut map = ListOrderedMultimap::new();
4731
4732 map.insert("key1", "value1");
4733 map.append("key2", "value2");
4734 map.append("key2", "value3");
4735 map.append("key1", "value4");
4736
4737 let mut iter = map.keys();
4738 assert_eq!(iter.size_hint(), (2, Some(2)));
4739 iter.next();
4740 assert_eq!(iter.size_hint(), (1, Some(1)));
4741 iter.next();
4742 assert_eq!(iter.size_hint(), (0, Some(0)));
4743 }
4744
4745 #[test]
test_list_ordered_multimap_append()4746 fn test_list_ordered_multimap_append() {
4747 let mut map = ListOrderedMultimap::new();
4748 assert_eq!(map.entry_len(&"key"), 0);
4749
4750 let already_exists = map.append("key", "value1");
4751 assert!(!already_exists);
4752 assert_eq!(map.entry_len(&"key"), 1);
4753
4754 let already_exists = map.append("key", "value2");
4755 assert!(already_exists);
4756 assert_eq!(map.entry_len(&"key"), 2);
4757
4758 let mut iter = map.get_all(&"key");
4759 assert_eq!(iter.next(), Some(&"value1"));
4760 assert_eq!(iter.next(), Some(&"value2"));
4761 assert_eq!(iter.next(), None);
4762 }
4763
4764 #[test]
test_list_ordered_multimap_back()4765 fn test_list_ordered_multimap_back() {
4766 let mut map = ListOrderedMultimap::new();
4767 assert_eq!(map.back(), None);
4768
4769 map.insert("key1", "value1");
4770 assert_eq!(map.back(), Some((&"key1", &"value1")));
4771
4772 map.append("key2", "value2");
4773 assert_eq!(map.back(), Some((&"key2", &"value2")));
4774
4775 map.remove(&"key2");
4776 assert_eq!(map.back(), Some((&"key1", &"value1")));
4777
4778 map.remove(&"key1");
4779 assert_eq!(map.back(), None);
4780 }
4781
4782 #[test]
test_list_ordered_multimap_back_mut()4783 fn test_list_ordered_multimap_back_mut() {
4784 let mut map = ListOrderedMultimap::new();
4785 assert_eq!(map.back(), None);
4786
4787 map.insert("key1", "value1");
4788 assert_eq!(map.back(), Some((&"key1", &"value1")));
4789
4790 map.append("key2", "value2");
4791 assert_eq!(map.back(), Some((&"key2", &"value2")));
4792
4793 map.remove(&"key2");
4794 assert_eq!(map.back(), Some((&"key1", &"value1")));
4795
4796 map.remove(&"key1");
4797 assert_eq!(map.back(), None);
4798 }
4799
4800 #[test]
test_list_ordered_multimap_clear()4801 fn test_list_ordered_multimap_clear() {
4802 let mut map = ListOrderedMultimap::new();
4803 map.insert("key", "value");
4804 map.insert("key2", "value");
4805
4806 map.clear();
4807
4808 assert!(map.is_empty());
4809 assert_eq!(map.get(&"key"), None);
4810 assert_eq!(map.get(&"key2"), None);
4811 }
4812
4813 #[test]
test_list_ordered_multimap_contains_key()4814 fn test_list_ordered_multimap_contains_key() {
4815 let mut map = ListOrderedMultimap::new();
4816 assert!(!map.contains_key(&"key"));
4817
4818 map.insert("key", "value");
4819 assert!(map.contains_key(&"key"));
4820 }
4821
4822 #[test]
test_list_ordered_multimap_debug()4823 fn test_list_ordered_multimap_debug() {
4824 let mut map = ListOrderedMultimap::new();
4825
4826 map.insert("key1", "value1");
4827 map.insert("key2", "value2");
4828 map.append("key2", "value3");
4829 map.append("key1", "value4");
4830
4831 assert_eq!(
4832 format!("{:?}", map),
4833 r#"{"key1": "value1", "key2": "value2", "key2": "value3", "key1": "value4"}"#
4834 );
4835 }
4836
4837 #[test]
test_list_ordered_multimap_drain_pairs()4838 fn test_list_ordered_multimap_drain_pairs() {
4839 let mut map = ListOrderedMultimap::new();
4840
4841 map.insert("key1", "value1");
4842 map.insert("key2", "value2");
4843 map.append("key2", "value3");
4844 map.append("key1", "value4");
4845
4846 let prior_keys_capacity = map.keys_capacity();
4847 let prior_values_capacity = map.values_capacity();
4848
4849 {
4850 let mut iter = map.drain_pairs();
4851
4852 let (key, mut values) = iter.next().unwrap();
4853 assert_eq!(key, "key1");
4854 assert_eq!(values.next(), Some("value1"));
4855 assert_eq!(values.next(), Some("value4"));
4856 assert_eq!(values.next(), None);
4857
4858 let (key, mut values) = iter.next().unwrap();
4859 assert_eq!(key, "key2");
4860 assert_eq!(values.next(), Some("value2"));
4861 assert_eq!(values.next(), Some("value3"));
4862 assert_eq!(values.next(), None);
4863
4864 assert!(iter.next().is_none());
4865 }
4866
4867 assert!(map.is_empty());
4868 assert_eq!(map.keys_capacity(), prior_keys_capacity);
4869 assert_eq!(map.values_capacity(), prior_values_capacity);
4870 }
4871
4872 #[test]
test_list_ordered_multimap_entry()4873 fn test_list_ordered_multimap_entry() {
4874 let mut map = ListOrderedMultimap::new();
4875 assert_eq!(map.get(&"key1"), None);
4876
4877 let value = map.entry("key").or_insert("value1");
4878 assert_eq!(value, &"value1");
4879 assert_eq!(map.get(&"key"), Some(&"value1"));
4880
4881 let value = map.entry("key").or_insert("value2");
4882 assert_eq!(value, &"value1");
4883 assert_eq!(map.get(&"key"), Some(&"value1"));
4884 }
4885
4886 #[test]
test_list_ordered_multimap_entry_len()4887 fn test_list_ordered_multimap_entry_len() {
4888 let mut map = ListOrderedMultimap::new();
4889 assert_eq!(map.entry_len(&"key1"), 0);
4890
4891 map.insert("key", "value");
4892 assert_eq!(map.entry_len(&"key"), 1);
4893
4894 map.insert("key", "value");
4895 assert_eq!(map.entry_len(&"key"), 1);
4896
4897 map.append("key", "value");
4898 assert_eq!(map.entry_len(&"key"), 2);
4899
4900 map.insert("key", "value");
4901 assert_eq!(map.entry_len(&"key"), 1);
4902
4903 map.remove(&"key");
4904 assert_eq!(map.entry_len(&"key"), 0);
4905 }
4906
4907 #[test]
test_list_ordered_multimap_equality()4908 fn test_list_ordered_multimap_equality() {
4909 let mut map_1 = ListOrderedMultimap::new();
4910
4911 map_1.insert("key1", "value1");
4912 map_1.insert("key2", "value2");
4913 map_1.append("key2", "value3");
4914 map_1.append("key1", "value4");
4915
4916 let mut map_2 = map_1.clone();
4917 map_2.pop_back();
4918
4919 assert_ne!(map_1, map_2);
4920
4921 map_2.append("key1", "value4");
4922 assert_eq!(map_1, map_2);
4923 }
4924
4925 #[test]
test_list_ordered_multimap_extend()4926 fn test_list_ordered_multimap_extend() {
4927 let mut map = ListOrderedMultimap::new();
4928 map.extend(vec![("key1", "value1"), ("key2", "value2"), ("key2", "value3")].into_iter());
4929
4930 let mut iter = map.get_all(&"key1");
4931 assert_eq!(iter.next(), Some(&"value1"));
4932 assert_eq!(iter.next(), None);
4933
4934 let mut iter = map.get_all(&"key2");
4935 assert_eq!(iter.next(), Some(&"value2"));
4936 assert_eq!(iter.next(), Some(&"value3"));
4937 assert_eq!(iter.next(), None);
4938
4939 let mut map = ListOrderedMultimap::new();
4940 map.extend(vec![(&1, &1), (&2, &1), (&2, &2)].into_iter());
4941
4942 let mut iter = map.get_all(&1);
4943 assert_eq!(iter.next(), Some(&1));
4944 assert_eq!(iter.next(), None);
4945
4946 let mut iter = map.get_all(&2);
4947 assert_eq!(iter.next(), Some(&1));
4948 assert_eq!(iter.next(), Some(&2));
4949 assert_eq!(iter.next(), None);
4950 }
4951
4952 #[test]
test_list_ordered_multimap_from_iterator()4953 fn test_list_ordered_multimap_from_iterator() {
4954 let map: ListOrderedMultimap<_, _, RandomState> = ListOrderedMultimap::from_iter(
4955 vec![("key1", "value1"), ("key2", "value2"), ("key2", "value3")].into_iter(),
4956 );
4957
4958 let mut iter = map.get_all(&"key1");
4959 assert_eq!(iter.next(), Some(&"value1"));
4960 assert_eq!(iter.next(), None);
4961
4962 let mut iter = map.get_all(&"key2");
4963 assert_eq!(iter.next(), Some(&"value2"));
4964 assert_eq!(iter.next(), Some(&"value3"));
4965 assert_eq!(iter.next(), None);
4966 }
4967
4968 #[test]
test_list_ordered_multimap_get()4969 fn test_list_ordered_multimap_get() {
4970 let mut map = ListOrderedMultimap::new();
4971 assert_eq!(map.get(&"key"), None);
4972
4973 map.insert("key", "value");
4974 assert_eq!(map.get(&"key"), Some(&"value"));
4975 }
4976
4977 #[test]
test_list_ordered_multimap_get_all()4978 fn test_list_ordered_multimap_get_all() {
4979 let mut map = ListOrderedMultimap::new();
4980
4981 let mut iter = map.get_all(&"key");
4982 assert_eq!(iter.next(), None);
4983
4984 map.insert("key", "value1");
4985 map.append("key", "value2");
4986 map.append("key", "value3");
4987
4988 let mut iter = map.get_all(&"key");
4989 assert_eq!(iter.next(), Some(&"value1"));
4990 assert_eq!(iter.next(), Some(&"value2"));
4991 assert_eq!(iter.next(), Some(&"value3"));
4992 assert_eq!(iter.next(), None);
4993 }
4994
4995 #[test]
test_list_ordered_multimap_get_all_mut()4996 fn test_list_ordered_multimap_get_all_mut() {
4997 let mut map = ListOrderedMultimap::new();
4998
4999 let mut iter = map.get_all(&"key");
5000 assert_eq!(iter.next(), None);
5001
5002 map.insert("key", "value1");
5003 map.append("key", "value2");
5004 map.append("key", "value3");
5005
5006 let mut iter = map.get_all_mut(&"key");
5007 assert_eq!(iter.next(), Some(&mut "value1"));
5008 assert_eq!(iter.next(), Some(&mut "value2"));
5009 assert_eq!(iter.next(), Some(&mut "value3"));
5010 assert_eq!(iter.next(), None);
5011 }
5012
5013 #[test]
test_list_ordered_multimap_get_mut()5014 fn test_list_ordered_multimap_get_mut() {
5015 let mut map = ListOrderedMultimap::new();
5016 assert_eq!(map.get_mut(&"key"), None);
5017
5018 map.insert("key", "value");
5019 assert_eq!(map.get_mut(&"key"), Some(&mut "value"));
5020 }
5021
5022 #[test]
test_list_ordered_multimap_insert()5023 fn test_list_ordered_multimap_insert() {
5024 let mut map = ListOrderedMultimap::new();
5025 assert!(!map.contains_key(&"key"));
5026 assert_eq!(map.get(&"key"), None);
5027
5028 let value = map.insert("key", "value1");
5029 assert_eq!(value, None);
5030 assert!(map.contains_key(&"key"));
5031 assert_eq!(map.get(&"key"), Some(&"value1"));
5032
5033 let value = map.insert("key", "value2");
5034 assert_eq!(value, Some("value1"));
5035 assert!(map.contains_key(&"key"));
5036 assert_eq!(map.get(&"key"), Some(&"value2"));
5037 }
5038
5039 #[test]
test_list_ordered_multimap_insert_all()5040 fn test_list_ordered_multimap_insert_all() {
5041 let mut map = ListOrderedMultimap::new();
5042 assert!(!map.contains_key(&"key"));
5043 assert_eq!(map.get(&"key"), None);
5044
5045 {
5046 let mut iter = map.insert_all("key", "value1");
5047 assert_eq!(iter.next(), None);
5048 }
5049
5050 assert!(map.contains_key(&"key"));
5051 assert_eq!(map.get(&"key"), Some(&"value1"));
5052
5053 {
5054 let mut iter = map.insert_all("key", "value2");
5055 assert_eq!(iter.next(), Some("value1"));
5056 assert_eq!(iter.next(), None);
5057 }
5058
5059 assert!(map.contains_key(&"key"));
5060 assert_eq!(map.get(&"key"), Some(&"value2"));
5061 }
5062
5063 #[test]
test_list_ordered_multimap_is_empty()5064 fn test_list_ordered_multimap_is_empty() {
5065 let mut map = ListOrderedMultimap::new();
5066 assert!(map.is_empty());
5067
5068 map.insert("key", "value");
5069 assert!(!map.is_empty());
5070
5071 map.remove(&"key");
5072 assert!(map.is_empty());
5073 }
5074
5075 #[test]
test_list_ordered_multimap_iter()5076 fn test_list_ordered_multimap_iter() {
5077 let mut map = ListOrderedMultimap::new();
5078
5079 let mut iter = map.iter();
5080 assert_eq!(iter.next(), None);
5081
5082 map.insert("key1", "value1");
5083 map.insert("key2", "value2");
5084 map.append("key2", "value3");
5085 map.append("key1", "value4");
5086
5087 let mut iter = map.iter();
5088 assert_eq!(iter.next(), Some((&"key1", &"value1")));
5089 assert_eq!(iter.next(), Some((&"key2", &"value2")));
5090 assert_eq!(iter.next(), Some((&"key2", &"value3")));
5091 assert_eq!(iter.next(), Some((&"key1", &"value4")));
5092 assert_eq!(iter.next(), None);
5093 }
5094
5095 #[test]
test_list_ordered_multimap_iter_mut()5096 fn test_list_ordered_multimap_iter_mut() {
5097 let mut map = ListOrderedMultimap::new();
5098
5099 let mut iter = map.iter_mut();
5100 assert_eq!(iter.next(), None);
5101
5102 map.insert("key1", "value1");
5103 map.insert("key2", "value2");
5104 map.append("key2", "value3");
5105 map.append("key1", "value4");
5106
5107 let mut iter = map.iter_mut();
5108 assert_eq!(iter.next(), Some((&"key1", &mut "value1")));
5109 assert_eq!(iter.next(), Some((&"key2", &mut "value2")));
5110 assert_eq!(iter.next(), Some((&"key2", &mut "value3")));
5111 assert_eq!(iter.next(), Some((&"key1", &mut "value4")));
5112 assert_eq!(iter.next(), None);
5113 }
5114
5115 #[test]
test_list_ordered_multimap_keys()5116 fn test_list_ordered_multimap_keys() {
5117 let mut map = ListOrderedMultimap::new();
5118
5119 let mut iter = map.keys();
5120 assert_eq!(iter.next(), None);
5121
5122 map.insert("key1", "value1");
5123 map.insert("key2", "value2");
5124 map.insert("key1", "value3");
5125 map.insert("key3", "value4");
5126
5127 let mut iter = map.keys();
5128 assert_eq!(iter.next(), Some(&"key1"));
5129 assert_eq!(iter.next(), Some(&"key2"));
5130 assert_eq!(iter.next(), Some(&"key3"));
5131 assert_eq!(iter.next(), None);
5132 }
5133
5134 #[test]
test_list_ordered_multimap_keys_capacity()5135 fn test_list_ordered_multimap_keys_capacity() {
5136 let mut map = ListOrderedMultimap::new();
5137 assert_eq!(map.keys_capacity(), 0);
5138 map.insert("key", "value");
5139 assert!(map.keys_capacity() > 0);
5140 }
5141
5142 #[test]
test_list_ordered_multimap_keys_len()5143 fn test_list_ordered_multimap_keys_len() {
5144 let mut map = ListOrderedMultimap::new();
5145 assert_eq!(map.keys_len(), 0);
5146
5147 map.insert("key1", "value1");
5148 assert_eq!(map.keys_len(), 1);
5149
5150 map.insert("key2", "value2");
5151 assert_eq!(map.keys_len(), 2);
5152
5153 map.append("key1", "value3");
5154 assert_eq!(map.keys_len(), 2);
5155
5156 map.remove(&"key1");
5157 assert_eq!(map.keys_len(), 1);
5158
5159 map.remove(&"key2");
5160 assert_eq!(map.keys_len(), 0);
5161 }
5162
5163 #[test]
test_list_ordered_multimap_new()5164 fn test_list_ordered_multimap_new() {
5165 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5166 assert_eq!(map.keys_capacity(), 0);
5167 assert_eq!(map.keys_len(), 0);
5168 assert_eq!(map.values_capacity(), 0);
5169 assert_eq!(map.values_len(), 0);
5170 }
5171
5172 #[test]
test_list_ordered_multimap_pack_to()5173 fn test_list_ordered_multimap_pack_to() {
5174 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
5175 map.pack_to_fit();
5176 assert_eq!(map.keys_capacity(), 0);
5177 assert_eq!(map.values_capacity(), 0);
5178
5179 let mut map = ListOrderedMultimap::with_capacity(10, 10);
5180
5181 map.insert("key1", "value1");
5182 map.insert("key2", "value2");
5183 map.append("key2", "value3");
5184 map.append("key1", "value4");
5185
5186 map.pack_to(5, 5);
5187
5188 assert_eq!(map.get(&"key1"), Some(&"value1"));
5189 assert_eq!(map.get(&"key2"), Some(&"value2"));
5190
5191 assert_eq!(map.keys_capacity(), 5);
5192 assert_eq!(map.keys_len(), 2);
5193 assert_eq!(map.values_capacity(), 5);
5194 assert_eq!(map.values_len(), 4);
5195
5196 let mut iter = map.iter();
5197 assert_eq!(iter.next(), Some((&"key1", &"value1")));
5198 assert_eq!(iter.next(), Some((&"key2", &"value2")));
5199 assert_eq!(iter.next(), Some((&"key2", &"value3")));
5200 assert_eq!(iter.next(), Some((&"key1", &"value4")));
5201 assert_eq!(iter.next(), None);
5202 }
5203
5204 #[should_panic]
5205 #[test]
test_list_ordered_multimap_pack_to_panic_key_capacity()5206 fn test_list_ordered_multimap_pack_to_panic_key_capacity() {
5207 let mut map = ListOrderedMultimap::new();
5208 map.insert("key1", "value1");
5209 map.insert("key2", "value2");
5210 map.append("key2", "value3");
5211 map.append("key1", "value4");
5212 map.pack_to(1, 5);
5213 }
5214
5215 #[should_panic]
5216 #[test]
test_list_ordered_multimap_pack_to_panic_value_capacity()5217 fn test_list_ordered_multimap_pack_to_panic_value_capacity() {
5218 let mut map = ListOrderedMultimap::new();
5219 map.insert("key1", "value1");
5220 map.insert("key2", "value2");
5221 map.append("key2", "value3");
5222 map.append("key1", "value4");
5223 map.pack_to(5, 1);
5224 }
5225
5226 #[test]
test_list_ordered_multimap_pack_to_fit()5227 fn test_list_ordered_multimap_pack_to_fit() {
5228 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
5229 map.pack_to_fit();
5230 assert_eq!(map.keys_capacity(), 0);
5231 assert_eq!(map.values_capacity(), 0);
5232
5233 let mut map = ListOrderedMultimap::with_capacity(5, 5);
5234
5235 map.insert("key1", "value1");
5236 map.insert("key2", "value2");
5237 map.append("key2", "value3");
5238 map.append("key1", "value4");
5239
5240 map.pack_to_fit();
5241 assert_eq!(map.keys_capacity(), 2);
5242 assert_eq!(map.keys_len(), 2);
5243 assert_eq!(map.values_capacity(), 4);
5244 assert_eq!(map.values_len(), 4);
5245
5246 let mut iter = map.iter();
5247 assert_eq!(iter.next(), Some((&"key1", &"value1")));
5248 assert_eq!(iter.next(), Some((&"key2", &"value2")));
5249 assert_eq!(iter.next(), Some((&"key2", &"value3")));
5250 assert_eq!(iter.next(), Some((&"key1", &"value4")));
5251 assert_eq!(iter.next(), None);
5252 }
5253
5254 #[test]
test_list_ordered_multimap_pairs()5255 fn test_list_ordered_multimap_pairs() {
5256 let mut map = ListOrderedMultimap::new();
5257
5258 map.insert("key1", "value1");
5259 map.insert("key2", "value2");
5260 map.append("key2", "value3");
5261 map.append("key1", "value4");
5262
5263 let mut iter = map.pairs();
5264
5265 let (key, mut values) = iter.next().unwrap();
5266 assert_eq!(key, &"key1");
5267 assert_eq!(values.next(), Some(&"value1"));
5268 assert_eq!(values.next(), Some(&"value4"));
5269 assert_eq!(values.next(), None);
5270
5271 let (key, mut values) = iter.next().unwrap();
5272 assert_eq!(key, &"key2");
5273 assert_eq!(values.next(), Some(&"value2"));
5274 assert_eq!(values.next(), Some(&"value3"));
5275 assert_eq!(values.next(), None);
5276
5277 assert!(iter.next().is_none());
5278 }
5279
5280 #[test]
test_list_ordered_multimap_pairs_mut()5281 fn test_list_ordered_multimap_pairs_mut() {
5282 let mut map = ListOrderedMultimap::new();
5283
5284 map.insert("key1", "value1");
5285 map.insert("key2", "value2");
5286 map.append("key2", "value3");
5287 map.append("key1", "value4");
5288
5289 let mut iter = map.pairs_mut();
5290
5291 let (key, mut values) = iter.next().unwrap();
5292 assert_eq!(key, &"key1");
5293 assert_eq!(values.next(), Some(&mut "value1"));
5294 assert_eq!(values.next(), Some(&mut "value4"));
5295 assert_eq!(values.next(), None);
5296
5297 let (key, mut values) = iter.next().unwrap();
5298 assert_eq!(key, &"key2");
5299 assert_eq!(values.next(), Some(&mut "value2"));
5300 assert_eq!(values.next(), Some(&mut "value3"));
5301 assert_eq!(values.next(), None);
5302
5303 assert!(iter.next().is_none());
5304 }
5305
5306 #[test]
test_list_ordered_multimap_pop_back()5307 fn test_list_ordered_multimap_pop_back() {
5308 let mut map = ListOrderedMultimap::new();
5309
5310 map.insert("key1", "value1");
5311 map.insert("key2", "value2");
5312 map.append("key2", "value3");
5313 map.append("key1", "value4");
5314
5315 let (key, value) = map.pop_back().unwrap();
5316 assert_eq!(key, KeyWrapper::Borrowed(&"key1"));
5317 assert_eq!(&value, &"value4");
5318 assert_eq!(map.keys_len(), 2);
5319 assert_eq!(map.values_len(), 3);
5320
5321 let (key, value) = map.pop_back().unwrap();
5322 assert_eq!(key, KeyWrapper::Borrowed(&"key2"));
5323 assert_eq!(&value, &"value3");
5324 assert_eq!(map.keys_len(), 2);
5325 assert_eq!(map.values_len(), 2);
5326
5327 let (key, value) = map.pop_back().unwrap();
5328 assert_eq!(key, KeyWrapper::Owned("key2"));
5329 assert_eq!(&value, &"value2");
5330 assert_eq!(map.keys_len(), 1);
5331 assert_eq!(map.values_len(), 1);
5332
5333 let (key, value) = map.pop_back().unwrap();
5334 assert_eq!(key, KeyWrapper::Owned("key1"));
5335 assert_eq!(&value, &"value1");
5336 assert_eq!(map.keys_len(), 0);
5337 assert_eq!(map.values_len(), 0);
5338
5339 assert!(map.pop_back().is_none());
5340 }
5341
5342 #[test]
test_list_ordered_multimap_pop_front()5343 fn test_list_ordered_multimap_pop_front() {
5344 let mut map = ListOrderedMultimap::new();
5345
5346 map.insert("key1", "value1");
5347 map.insert("key2", "value2");
5348 map.append("key2", "value3");
5349 map.append("key1", "value4");
5350
5351 let (key, value) = map.pop_front().unwrap();
5352 assert_eq!(key, KeyWrapper::Borrowed(&"key1"));
5353 assert_eq!(&value, &"value1");
5354 assert_eq!(map.keys_len(), 2);
5355 assert_eq!(map.values_len(), 3);
5356
5357 let (key, value) = map.pop_front().unwrap();
5358 assert_eq!(key, KeyWrapper::Borrowed(&"key2"));
5359 assert_eq!(&value, &"value2");
5360 assert_eq!(map.keys_len(), 2);
5361 assert_eq!(map.values_len(), 2);
5362
5363 let (key, value) = map.pop_front().unwrap();
5364 assert_eq!(key, KeyWrapper::Owned("key2"));
5365 assert_eq!(&value, &"value3");
5366 assert_eq!(map.keys_len(), 1);
5367 assert_eq!(map.values_len(), 1);
5368
5369 let (key, value) = map.pop_front().unwrap();
5370 assert_eq!(key, KeyWrapper::Owned("key1"));
5371 assert_eq!(&value, &"value4");
5372 assert_eq!(map.keys_len(), 0);
5373 assert_eq!(map.values_len(), 0);
5374
5375 assert!(map.pop_front().is_none());
5376 }
5377
5378 #[test]
test_list_ordered_multimap_remove()5379 fn test_list_ordered_multimap_remove() {
5380 let mut map = ListOrderedMultimap::new();
5381 assert_eq!(map.remove(&"key"), None);
5382
5383 map.insert("key", "value1");
5384 map.append("key", "value2");
5385 assert_eq!(map.remove(&"key"), Some("value1"));
5386 assert_eq!(map.remove(&"key"), None);
5387 }
5388
5389 #[test]
test_list_ordered_multimap_remove_all()5390 fn test_list_ordered_multimap_remove_all() {
5391 let mut map = ListOrderedMultimap::new();
5392
5393 {
5394 let mut iter = map.remove_all(&"key");
5395 assert_eq!(iter.next(), None);
5396 }
5397
5398 map.insert("key", "value1");
5399 map.append("key", "value2");
5400
5401 {
5402 let mut iter = map.remove_all(&"key");
5403 assert_eq!(iter.next(), Some("value1"));
5404 assert_eq!(iter.next(), Some("value2"));
5405 assert_eq!(iter.next(), None);
5406 }
5407
5408 let mut iter = map.remove_all(&"key");
5409 assert_eq!(iter.next(), None);
5410 }
5411
5412 #[test]
test_list_ordered_multimap_remove_entry()5413 fn test_list_ordered_multimap_remove_entry() {
5414 let mut map = ListOrderedMultimap::new();
5415 assert_eq!(map.remove_entry(&"key"), None);
5416
5417 map.insert("key", "value1");
5418 map.append("key", "value2");
5419 assert_eq!(map.remove_entry(&"key"), Some(("key", "value1")));
5420 assert_eq!(map.remove_entry(&"key"), None);
5421 }
5422
5423 #[test]
test_list_ordered_multimap_remove_entry_all()5424 fn test_list_ordered_multimap_remove_entry_all() {
5425 let mut map = ListOrderedMultimap::new();
5426
5427 {
5428 let entry = map.remove_entry_all(&"key");
5429 assert!(entry.is_none());
5430 }
5431
5432 map.insert("key", "value1");
5433 map.append("key", "value2");
5434
5435 {
5436 let (key, mut iter) = map.remove_entry_all(&"key").unwrap();
5437 assert_eq!(key, "key");
5438 assert_eq!(iter.next(), Some("value1"));
5439 assert_eq!(iter.next(), Some("value2"));
5440 assert_eq!(iter.next(), None);
5441 }
5442
5443 let entry = map.remove_entry_all(&"key");
5444 assert!(entry.is_none());
5445 }
5446
5447 #[test]
test_list_ordered_multimap_reserve_keys()5448 fn test_list_ordered_multimap_reserve_keys() {
5449 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5450 assert_eq!(map.keys_capacity(), 0);
5451
5452 map.reserve_keys(5);
5453 assert!(map.keys_capacity() >= 5);
5454
5455 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
5456 assert_eq!(map.keys_capacity(), 5);
5457
5458 map.reserve_keys(2);
5459 assert_eq!(map.keys_capacity(), 5);
5460 }
5461
5462 #[test]
test_list_ordered_multimap_reserve_values()5463 fn test_list_ordered_multimap_reserve_values() {
5464 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5465 assert_eq!(map.values_capacity(), 0);
5466
5467 map.reserve_values(5);
5468 assert!(map.values_capacity() >= 5);
5469
5470 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(5, 5);
5471 assert_eq!(map.values_capacity(), 5);
5472
5473 map.reserve_values(2);
5474 assert_eq!(map.values_capacity(), 5);
5475 }
5476
5477 #[test]
test_list_ordered_multimap_retain()5478 fn test_list_ordered_multimap_retain() {
5479 let mut map = ListOrderedMultimap::new();
5480
5481 map.insert("key1", 1);
5482 map.insert("key2", 5);
5483 map.append("key1", -1);
5484 map.insert("key3", -10);
5485 map.insert("key4", 1);
5486 map.append("key4", -1);
5487 map.append("key4", 1);
5488
5489 map.retain(|_, &mut value| value >= 0);
5490
5491 let mut iter = map.iter();
5492 assert_eq!(iter.next(), Some((&"key1", &1)));
5493 assert_eq!(iter.next(), Some((&"key2", &5)));
5494 assert_eq!(iter.next(), Some((&"key4", &1)));
5495 assert_eq!(iter.next(), Some((&"key4", &1)));
5496 assert_eq!(iter.next(), None);
5497 }
5498
5499 #[test]
test_list_ordered_multimap_values()5500 fn test_list_ordered_multimap_values() {
5501 let mut map = ListOrderedMultimap::new();
5502
5503 let mut iter = map.iter();
5504 assert_eq!(iter.next(), None);
5505
5506 map.insert("key1", "value1");
5507 map.insert("key2", "value2");
5508 map.append("key2", "value3");
5509 map.append("key1", "value4");
5510
5511 let mut iter = map.values();
5512 assert_eq!(iter.next(), Some(&"value1"));
5513 assert_eq!(iter.next(), Some(&"value2"));
5514 assert_eq!(iter.next(), Some(&"value3"));
5515 assert_eq!(iter.next(), Some(&"value4"));
5516 assert_eq!(iter.next(), None);
5517 }
5518
5519 #[test]
test_list_ordered_multimap_values_mut()5520 fn test_list_ordered_multimap_values_mut() {
5521 let mut map = ListOrderedMultimap::new();
5522
5523 let mut iter = map.iter();
5524 assert_eq!(iter.next(), None);
5525
5526 map.insert("key1", "value1");
5527 map.insert("key2", "value2");
5528 map.append("key2", "value3");
5529 map.append("key1", "value4");
5530
5531 let mut iter = map.values_mut();
5532 assert_eq!(iter.next(), Some(&mut "value1"));
5533 assert_eq!(iter.next(), Some(&mut "value2"));
5534 assert_eq!(iter.next(), Some(&mut "value3"));
5535 assert_eq!(iter.next(), Some(&mut "value4"));
5536 assert_eq!(iter.next(), None);
5537 }
5538
5539 #[test]
test_list_ordered_multimap_values_capacity()5540 fn test_list_ordered_multimap_values_capacity() {
5541 let mut map = ListOrderedMultimap::new();
5542 assert_eq!(map.values_capacity(), 0);
5543 map.insert("key", "value");
5544 assert!(map.values_capacity() > 0);
5545 }
5546
5547 #[test]
test_list_ordered_multimap_values_len()5548 fn test_list_ordered_multimap_values_len() {
5549 let mut map = ListOrderedMultimap::new();
5550 assert_eq!(map.values_len(), 0);
5551
5552 map.insert("key1", "value1");
5553 assert_eq!(map.values_len(), 1);
5554
5555 map.insert("key2", "value2");
5556 assert_eq!(map.values_len(), 2);
5557
5558 map.append("key1", "value3");
5559 assert_eq!(map.values_len(), 3);
5560
5561 map.remove(&"key1");
5562 assert_eq!(map.values_len(), 1);
5563
5564 map.remove(&"key2");
5565 assert_eq!(map.values_len(), 0);
5566 }
5567
5568 #[test]
test_list_ordered_multimap_with_capacity()5569 fn test_list_ordered_multimap_with_capacity() {
5570 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::with_capacity(1, 2);
5571 assert!(map.keys_capacity() >= 1);
5572 assert_eq!(map.keys_len(), 0);
5573 assert!(map.values_capacity() >= 2);
5574 assert_eq!(map.values_len(), 0);
5575 }
5576
5577 #[test]
test_list_ordered_multimap_with_capacity_and_hasher()5578 fn test_list_ordered_multimap_with_capacity_and_hasher() {
5579 let state = RandomState::new();
5580 let map: ListOrderedMultimap<&str, &str> =
5581 ListOrderedMultimap::with_capacity_and_hasher(1, 2, state);
5582 assert!(map.keys_capacity() >= 1);
5583 assert_eq!(map.keys_len(), 0);
5584 assert!(map.values_capacity() >= 2);
5585 assert_eq!(map.values_len(), 0);
5586 }
5587
5588 #[test]
test_occupied_entry_debug()5589 fn test_occupied_entry_debug() {
5590 let mut map = ListOrderedMultimap::new();
5591
5592 map.insert("key", "value1");
5593 map.append("key", "value2");
5594 map.append("key", "value3");
5595 map.append("key", "value4");
5596
5597 let entry = match map.entry(&"key") {
5598 Entry::Occupied(entry) => entry,
5599 _ => panic!("expected occupied entry"),
5600 };
5601
5602 assert_eq!(
5603 format!("{:?}", entry),
5604 "OccupiedEntry { \
5605 key: \"key\", \
5606 values: EntryValues([\"value1\", \"value2\", \"value3\", \"value4\"]) \
5607 }"
5608 );
5609 }
5610
5611 #[test]
test_vacant_entry_debug()5612 fn test_vacant_entry_debug() {
5613 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5614 let entry = match map.entry(&"key") {
5615 Entry::Vacant(entry) => entry,
5616 _ => panic!("expected vacant entry"),
5617 };
5618
5619 assert_eq!(format!("{:?}", entry), r#"VacantEntry("key")"#);
5620 }
5621
5622 #[test]
test_values_debug()5623 fn test_values_debug() {
5624 let mut map = ListOrderedMultimap::new();
5625
5626 map.insert("key1", "value1");
5627 map.append("key2", "value2");
5628 map.append("key2", "value3");
5629 map.append("key1", "value4");
5630
5631 let iter = map.values();
5632 assert_eq!(
5633 format!("{:?}", iter),
5634 r#"Values(["value1", "value2", "value3", "value4"])"#
5635 );
5636 }
5637
5638 #[test]
test_values_double_ended()5639 fn test_values_double_ended() {
5640 let mut map = ListOrderedMultimap::new();
5641
5642 map.insert("key1", "value1");
5643 map.append("key2", "value2");
5644 map.append("key2", "value3");
5645 map.append("key1", "value4");
5646
5647 let mut iter = map.values();
5648 assert_eq!(iter.next(), Some(&"value1"));
5649 assert_eq!(iter.next_back(), Some(&"value4"));
5650 assert_eq!(iter.next(), Some(&"value2"));
5651 assert_eq!(iter.next_back(), Some(&"value3"));
5652 assert_eq!(iter.next(), None);
5653 }
5654
5655 #[test]
test_values_empty()5656 fn test_values_empty() {
5657 let map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5658 let mut iter = map.values();
5659 assert_eq!(iter.next_back(), None);
5660 assert_eq!(iter.next(), None);
5661 }
5662
5663 #[test]
test_values_fused()5664 fn test_values_fused() {
5665 let mut map = ListOrderedMultimap::new();
5666
5667 map.insert("key", "value");
5668
5669 let mut iter = map.values();
5670 assert_eq!(iter.next(), Some(&"value"));
5671 assert_eq!(iter.next(), None);
5672 assert_eq!(iter.next_back(), None);
5673 assert_eq!(iter.next(), None);
5674 assert_eq!(iter.next_back(), None);
5675 assert_eq!(iter.next(), None);
5676 }
5677
5678 #[test]
test_values_mut_debug()5679 fn test_values_mut_debug() {
5680 let mut map = ListOrderedMultimap::new();
5681
5682 map.insert("key1", "value1");
5683 map.append("key2", "value2");
5684 map.append("key2", "value3");
5685 map.append("key1", "value4");
5686
5687 let iter = map.values_mut();
5688 assert_eq!(
5689 format!("{:?}", iter),
5690 r#"ValuesMut(["value1", "value2", "value3", "value4"])"#
5691 );
5692 }
5693
5694 #[test]
test_values_mut_double_ended()5695 fn test_values_mut_double_ended() {
5696 let mut map = ListOrderedMultimap::new();
5697
5698 map.insert("key1", "value1");
5699 map.append("key2", "value2");
5700 map.append("key2", "value3");
5701 map.append("key1", "value4");
5702
5703 let mut iter = map.values_mut();
5704 assert_eq!(iter.next(), Some(&mut "value1"));
5705 assert_eq!(iter.next_back(), Some(&mut "value4"));
5706 assert_eq!(iter.next(), Some(&mut "value2"));
5707 assert_eq!(iter.next_back(), Some(&mut "value3"));
5708 assert_eq!(iter.next(), None);
5709 }
5710
5711 #[test]
test_values_mut_empty()5712 fn test_values_mut_empty() {
5713 let mut map: ListOrderedMultimap<&str, &str> = ListOrderedMultimap::new();
5714 let mut iter = map.values_mut();
5715 assert_eq!(iter.next_back(), None);
5716 assert_eq!(iter.next(), None);
5717 }
5718
5719 #[test]
test_values_mut_fused()5720 fn test_values_mut_fused() {
5721 let mut map = ListOrderedMultimap::new();
5722
5723 map.insert("key", "value");
5724
5725 let mut iter = map.values_mut();
5726 assert_eq!(iter.next(), Some(&mut "value"));
5727 assert_eq!(iter.next(), None);
5728 assert_eq!(iter.next_back(), None);
5729 assert_eq!(iter.next(), None);
5730 assert_eq!(iter.next_back(), None);
5731 assert_eq!(iter.next(), None);
5732 }
5733
5734 #[test]
test_values_mut_size_hint()5735 fn test_values_mut_size_hint() {
5736 let mut map = ListOrderedMultimap::new();
5737
5738 map.insert("key1", "value1");
5739 map.append("key2", "value2");
5740 map.append("key2", "value3");
5741 map.append("key1", "value4");
5742
5743 let mut iter = map.values_mut();
5744 assert_eq!(iter.size_hint(), (4, Some(4)));
5745 iter.next();
5746 assert_eq!(iter.size_hint(), (3, Some(3)));
5747 iter.next();
5748 assert_eq!(iter.size_hint(), (2, Some(2)));
5749 iter.next();
5750 assert_eq!(iter.size_hint(), (1, Some(1)));
5751 iter.next();
5752 assert_eq!(iter.size_hint(), (0, Some(0)));
5753 }
5754
5755 #[test]
test_values_size_hint()5756 fn test_values_size_hint() {
5757 let mut map = ListOrderedMultimap::new();
5758
5759 map.insert("key1", "value1");
5760 map.append("key2", "value2");
5761 map.append("key2", "value3");
5762 map.append("key1", "value4");
5763
5764 let mut iter = map.values();
5765 assert_eq!(iter.size_hint(), (4, Some(4)));
5766 iter.next();
5767 assert_eq!(iter.size_hint(), (3, Some(3)));
5768 iter.next();
5769 assert_eq!(iter.size_hint(), (2, Some(2)));
5770 iter.next();
5771 assert_eq!(iter.size_hint(), (1, Some(1)));
5772 iter.next();
5773 assert_eq!(iter.size_hint(), (0, Some(0)));
5774 }
5775 }
5776