1use core::borrow::Borrow;
4use core::hash::Hash;
5use core::iter::FusedIterator;
6use core::ops::Index;
7
8mod detail;
9
10#[cfg(test)]
11mod tests;
12
13#[derive(Debug, Clone)]
20pub struct IndexMap<K, V> {
21 inner: detail::IndexMapImpl<K, V>,
22}
23
24impl<K, V> Default for IndexMap<K, V> {
25 #[inline]
26 fn default() -> Self {
27 Self {
28 inner: detail::IndexMapImpl::default(),
29 }
30 }
31}
32
33impl<K, V> IndexMap<K, V> {
34 #[inline]
36 pub fn clear(&mut self) {
37 self.inner.clear()
38 }
39
40 #[inline]
42 pub fn len(&self) -> usize {
43 self.inner.len()
44 }
45
46 #[inline]
48 pub fn is_empty(&self) -> bool {
49 self.inner.is_empty()
50 }
51
52 #[inline]
54 pub fn iter(&self) -> Iter<'_, K, V> {
55 Iter {
56 inner: self.inner.iter(),
57 }
58 }
59
60 #[inline]
62 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
63 IterMut {
64 inner: self.inner.iter_mut(),
65 }
66 }
67
68 #[inline]
70 pub fn keys(&self) -> Keys<'_, K, V> {
71 Keys {
72 inner: self.inner.keys(),
73 }
74 }
75
76 #[inline]
78 pub fn values(&self) -> Values<'_, K, V> {
79 Values {
80 inner: self.inner.values(),
81 }
82 }
83
84 #[inline]
86 pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
87 ValuesMut {
88 inner: self.inner.values_mut(),
89 }
90 }
91
92 #[inline]
94 pub fn get_index(&self, index: usize) -> Option<(&K, &V)> {
95 self.inner.get_index(index)
96 }
97
98 #[inline]
100 pub fn get_index_mut(&mut self, index: usize) -> Option<(&K, &mut V)> {
101 self.inner.get_index_mut(index)
102 }
103}
104
105impl<K, V> IndexMap<K, V>
106where
107 K: Hash + Eq + Ord + Clone,
108{
109 #[inline]
111 pub fn reserve(&mut self, additional: usize) {
112 #[cfg(not(feature = "no-hash-maps"))]
113 self.inner.reserve(additional);
114 #[cfg(feature = "no-hash-maps")]
115 let _ = additional;
116 }
117
118 #[inline]
120 pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
121 where
122 K: Borrow<Q>,
123 Q: Hash + Eq + Ord,
124 {
125 self.inner.contains_key(key)
126 }
127
128 #[inline]
130 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
131 where
132 K: Borrow<Q>,
133 Q: Hash + Eq + Ord,
134 {
135 self.inner.get(key)
136 }
137
138 #[inline]
141 pub fn get_key_value<Q: ?Sized>(&self, key: &Q) -> Option<(&K, &V)>
142 where
143 K: Borrow<Q>,
144 Q: Hash + Eq + Ord,
145 {
146 self.inner.get_key_value(key)
147 }
148
149 #[inline]
156 pub fn get_full<Q: ?Sized>(&self, key: &Q) -> Option<(usize, &K, &V)>
157 where
158 K: Borrow<Q> + Ord,
159 Q: Hash + Eq + Ord,
160 {
161 self.inner.get_full(key)
162 }
163
164 #[inline]
166 pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V>
167 where
168 K: Borrow<Q>,
169 Q: Hash + Eq + Ord,
170 {
171 self.inner.get_mut(key)
172 }
173
174 #[inline]
182 pub fn insert(&mut self, key: K, value: V) -> Option<V> {
183 self.inner.insert(key, value)
184 }
185
186 #[inline]
196 pub fn swap_remove<Q>(&mut self, key: &Q) -> Option<V>
197 where
198 K: Borrow<Q>,
199 Q: ?Sized + Hash + Eq + Ord,
200 {
201 self.inner.swap_remove(key)
202 }
203
204 #[inline]
214 pub fn swap_remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
215 where
216 K: Borrow<Q>,
217 Q: ?Sized + Hash + Eq + Ord,
218 {
219 self.inner.swap_remove_entry(key)
220 }
221
222 #[inline]
224 pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
225 match self.inner.entry(key) {
226 detail::EntryImpl::Occupied(entry) => Entry::Occupied(OccupiedEntry { inner: entry }),
227 detail::EntryImpl::Vacant(entry) => Entry::Vacant(VacantEntry { inner: entry }),
228 }
229 }
230}
231
232impl<K, Q, V> Index<&Q> for IndexMap<K, V>
233where
234 K: Borrow<Q> + Hash + Eq + Ord,
235 Q: ?Sized + Hash + Eq + Ord,
236{
237 type Output = V;
238
239 #[inline]
240 fn index(&self, key: &Q) -> &V {
241 &self.inner[key]
242 }
243}
244
245impl<K, V> Index<usize> for IndexMap<K, V>
246where
247 K: Hash + Eq + Ord,
248{
249 type Output = V;
250
251 #[inline]
252 fn index(&self, key: usize) -> &V {
253 &self.inner[key]
254 }
255}
256
257impl<K, V> Extend<(K, V)> for IndexMap<K, V>
258where
259 K: Eq + Hash + Ord + Clone,
260{
261 #[inline]
262 fn extend<Iter: IntoIterator<Item = (K, V)>>(&mut self, iter: Iter) {
263 self.inner.extend(iter)
264 }
265}
266
267#[derive(Debug)]
271pub enum Entry<'a, K: Ord, V> {
272 Occupied(OccupiedEntry<'a, K, V>),
274 Vacant(VacantEntry<'a, K, V>),
276}
277
278impl<'a, K, V> Entry<'a, K, V>
279where
280 K: Hash + Eq + Ord + Clone,
281{
282 #[inline]
284 pub fn key(&self) -> &K {
285 match *self {
286 Self::Occupied(ref entry) => entry.key(),
287 Self::Vacant(ref entry) => entry.key(),
288 }
289 }
290}
291
292impl<'a, K, V> Entry<'a, K, V>
293where
294 K: Hash + Eq + Ord + Clone,
295 V: Default,
296{
297 #[inline]
300 pub fn or_default(self) -> &'a mut V {
301 match self {
302 Self::Occupied(entry) => entry.into_mut(),
303 Self::Vacant(entry) => entry.insert(Default::default()),
304 }
305 }
306}
307
308#[derive(Debug)]
312pub struct OccupiedEntry<'a, K: Ord, V> {
313 inner: detail::OccupiedEntryImpl<'a, K, V>,
314}
315
316impl<'a, K: 'a, V: 'a> OccupiedEntry<'a, K, V>
317where
318 K: Ord + Clone,
319{
320 #[inline]
322 pub fn key(&self) -> &K {
323 self.inner.key()
324 }
325
326 #[inline]
328 pub fn get(&self) -> &V {
329 self.inner.get()
330 }
331
332 #[inline]
334 pub fn get_mut(&mut self) -> &mut V {
335 self.inner.get_mut()
336 }
337
338 #[inline]
340 pub fn insert(&mut self, value: V) -> V {
341 self.inner.insert(value)
342 }
343
344 #[inline]
347 pub fn into_mut(self) -> &'a mut V {
348 self.inner.into_mut()
349 }
350}
351
352#[derive(Debug)]
356pub struct VacantEntry<'a, K: Ord, V> {
357 inner: detail::VacantEntryImpl<'a, K, V>,
358}
359
360impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V>
361where
362 K: Ord + Clone,
363{
364 #[inline]
366 pub fn key(&self) -> &K {
367 self.inner.key()
368 }
369
370 #[inline]
372 pub fn into_key(self) -> K {
373 self.inner.into_key()
374 }
375
376 #[inline]
378 pub fn insert(self, value: V) -> &'a mut V
379 where
380 K: Hash,
381 {
382 self.inner.insert(value)
383 }
384}
385
386impl<K, V> FromIterator<(K, V)> for IndexMap<K, V>
387where
388 K: Hash + Ord + Eq + Clone,
389{
390 #[inline]
391 fn from_iter<I>(iter: I) -> Self
392 where
393 I: IntoIterator<Item = (K, V)>,
394 {
395 Self {
396 inner: <detail::IndexMapImpl<K, V>>::from_iter(iter),
397 }
398 }
399}
400
401impl<'a, K, V> IntoIterator for &'a IndexMap<K, V> {
402 type Item = (&'a K, &'a V);
403 type IntoIter = Iter<'a, K, V>;
404
405 #[inline]
406 fn into_iter(self) -> Self::IntoIter {
407 self.iter()
408 }
409}
410
411#[derive(Debug, Clone)]
413pub struct Iter<'a, K, V> {
414 inner: detail::IterImpl<'a, K, V>,
415}
416
417impl<'a, K, V> Iterator for Iter<'a, K, V> {
418 type Item = (&'a K, &'a V);
419
420 #[inline]
421 fn size_hint(&self) -> (usize, Option<usize>) {
422 self.inner.size_hint()
423 }
424
425 #[inline]
426 fn next(&mut self) -> Option<Self::Item> {
427 self.inner.next()
428 }
429}
430
431impl<'a, K, V> ExactSizeIterator for Iter<'a, K, V> {
432 #[inline]
433 fn len(&self) -> usize {
434 self.inner.len()
435 }
436}
437
438impl<'a, K, V> FusedIterator for Iter<'a, K, V> {}
439
440impl<'a, K, V> IntoIterator for &'a mut IndexMap<K, V> {
441 type Item = (&'a K, &'a mut V);
442 type IntoIter = IterMut<'a, K, V>;
443
444 #[inline]
445 fn into_iter(self) -> Self::IntoIter {
446 self.iter_mut()
447 }
448}
449
450#[derive(Debug)]
452pub struct IterMut<'a, K, V> {
453 inner: detail::IterMutImpl<'a, K, V>,
454}
455
456impl<'a, K, V> Iterator for IterMut<'a, K, V> {
457 type Item = (&'a K, &'a mut V);
458
459 #[inline]
460 fn size_hint(&self) -> (usize, Option<usize>) {
461 self.inner.size_hint()
462 }
463
464 #[inline]
465 fn next(&mut self) -> Option<Self::Item> {
466 self.inner.next()
467 }
468}
469
470impl<'a, K, V> ExactSizeIterator for IterMut<'a, K, V> {
471 #[inline]
472 fn len(&self) -> usize {
473 self.inner.len()
474 }
475}
476
477impl<'a, K, V> FusedIterator for IterMut<'a, K, V> {}
478
479impl<K, V> IntoIterator for IndexMap<K, V> {
480 type Item = (K, V);
481 type IntoIter = IntoIter<K, V>;
482
483 #[inline]
484 fn into_iter(self) -> Self::IntoIter {
485 IntoIter {
486 inner: self.inner.into_iter(),
487 }
488 }
489}
490
491#[derive(Debug)]
493pub struct IntoIter<K, V> {
494 inner: detail::IntoIterImpl<K, V>,
495}
496
497impl<'a, K, V> Iterator for IntoIter<K, V> {
498 type Item = (K, V);
499
500 #[inline]
501 fn size_hint(&self) -> (usize, Option<usize>) {
502 self.inner.size_hint()
503 }
504
505 #[inline]
506 fn next(&mut self) -> Option<Self::Item> {
507 self.inner.next()
508 }
509}
510
511impl<'a, K, V> ExactSizeIterator for IntoIter<K, V> {
512 #[inline]
513 fn len(&self) -> usize {
514 self.inner.len()
515 }
516}
517
518impl<'a, K, V> FusedIterator for IntoIter<K, V> {}
519
520#[derive(Debug, Clone)]
522pub struct Keys<'a, K, V> {
523 inner: detail::KeysImpl<'a, K, V>,
524}
525
526impl<'a, K, V> Iterator for Keys<'a, K, V> {
527 type Item = &'a K;
528
529 #[inline]
530 fn size_hint(&self) -> (usize, Option<usize>) {
531 self.inner.size_hint()
532 }
533
534 #[inline]
535 fn next(&mut self) -> Option<Self::Item> {
536 self.inner.next()
537 }
538}
539
540impl<'a, K, V> ExactSizeIterator for Keys<'a, K, V> {
541 #[inline]
542 fn len(&self) -> usize {
543 self.inner.len()
544 }
545}
546
547impl<'a, K, V> FusedIterator for Keys<'a, K, V> {}
548
549#[derive(Debug, Clone)]
551pub struct Values<'a, K, V> {
552 inner: detail::ValuesImpl<'a, K, V>,
553}
554
555impl<'a, K, V> Iterator for Values<'a, K, V> {
556 type Item = &'a V;
557
558 #[inline]
559 fn size_hint(&self) -> (usize, Option<usize>) {
560 self.inner.size_hint()
561 }
562
563 #[inline]
564 fn next(&mut self) -> Option<Self::Item> {
565 self.inner.next()
566 }
567}
568
569impl<'a, K, V> ExactSizeIterator for Values<'a, K, V> {
570 #[inline]
571 fn len(&self) -> usize {
572 self.inner.len()
573 }
574}
575
576impl<'a, K, V> FusedIterator for Values<'a, K, V> {}
577
578#[derive(Debug)]
580pub struct ValuesMut<'a, K, V> {
581 inner: detail::ValuesMutImpl<'a, K, V>,
582}
583
584impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
585 type Item = &'a mut V;
586
587 #[inline]
588 fn size_hint(&self) -> (usize, Option<usize>) {
589 self.inner.size_hint()
590 }
591
592 #[inline]
593 fn next(&mut self) -> Option<Self::Item> {
594 self.inner.next()
595 }
596}
597
598impl<'a, K, V> ExactSizeIterator for ValuesMut<'a, K, V> {
599 #[inline]
600 fn len(&self) -> usize {
601 self.inner.len()
602 }
603}
604
605impl<'a, K, V> FusedIterator for ValuesMut<'a, K, V> {}
606
607#[cfg(feature = "serde")]
608impl<K, V> serde::Serialize for IndexMap<K, V>
609where
610 K: serde::Serialize + Eq + Hash + Ord,
611 V: serde::Serialize,
612{
613 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
614 where
615 S: serde::ser::Serializer,
616 {
617 serde::Serialize::serialize(&self.inner, serializer)
618 }
619}
620
621#[cfg(feature = "serde")]
622impl<'a, K, V> serde::Deserialize<'a> for IndexMap<K, V>
623where
624 K: serde::Deserialize<'a> + Eq + Hash + Ord + Clone,
625 V: serde::Deserialize<'a>,
626{
627 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
628 where
629 D: serde::de::Deserializer<'a>,
630 {
631 Ok(IndexMap {
632 inner: serde::Deserialize::deserialize(deserializer)?,
633 })
634 }
635}
636
637impl<K, V> PartialEq for IndexMap<K, V>
638where
639 K: PartialEq + Hash + Ord,
640 V: PartialEq,
641{
642 fn eq(&self, other: &Self) -> bool {
643 self.inner == other.inner
644 }
645
646 fn ne(&self, other: &Self) -> bool {
647 self.inner != other.inner
648 }
649}
650
651impl<K, V> Eq for IndexMap<K, V>
652where
653 K: Eq + Hash + Ord,
654 V: Eq,
655{
656}