1use crate::{
2 collections::{TryClone, TryFromIterator},
3 error::OutOfMemory,
4};
5use core::{
6 borrow::Borrow,
7 cmp::Ordering,
8 fmt,
9 hash::{BuildHasher, Hash},
10 marker::PhantomData,
11 mem,
12 ops::{Index, IndexMut, RangeBounds},
13};
14use indexmap::map as inner;
15
16#[cfg(feature = "std")]
17use std::hash::RandomState as DefaultHashBuilder;
18
19#[cfg(not(feature = "std"))]
20use hashbrown::DefaultHashBuilder;
21
22pub struct TryIndexMap<K, V, S = DefaultHashBuilder> {
25 inner: indexmap::IndexMap<K, V, S>,
26}
27
28impl<K, V, S> TryClone for TryIndexMap<K, V, S>
29where
30 K: Eq + Hash + TryClone,
31 V: TryClone,
32 S: BuildHasher + TryClone,
33{
34 fn try_clone(&self) -> Result<Self, OutOfMemory> {
35 let mut map = Self::with_capacity_and_hasher(self.capacity(), self.hasher().try_clone()?)?;
36 for (k, v) in self.iter() {
37 map.insert(k.try_clone()?, v.try_clone()?)?;
38 }
39 Ok(map)
40 }
41}
42
43impl<K, V, S> fmt::Debug for TryIndexMap<K, V, S>
44where
45 K: fmt::Debug,
46 V: fmt::Debug,
47 S: fmt::Debug,
48{
49 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50 fmt::Debug::fmt(&self.inner, f)
51 }
52}
53
54impl<K, V, S> From<TryIndexMap<K, V, S>> for indexmap::IndexMap<K, V, S> {
55 fn from(map: TryIndexMap<K, V, S>) -> Self {
56 map.inner
57 }
58}
59
60impl<K, V, S> From<indexmap::IndexMap<K, V, S>> for TryIndexMap<K, V, S> {
61 fn from(inner: indexmap::IndexMap<K, V, S>) -> Self {
62 Self { inner }
63 }
64}
65
66impl<K, V, H> serde::ser::Serialize for TryIndexMap<K, V, H>
67where
68 K: serde::ser::Serialize,
69 V: serde::ser::Serialize,
70{
71 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
72 where
73 S: serde::Serializer,
74 {
75 use serde::ser::SerializeMap as _;
76 let mut map = serializer.serialize_map(Some(self.len()))?;
77 for (k, v) in self {
78 map.serialize_entry(k, v)?;
79 }
80 map.end()
81 }
82}
83
84impl<'de, K, V> serde::de::Deserialize<'de> for TryIndexMap<K, V>
85where
86 K: serde::de::Deserialize<'de> + Hash + Eq,
87 V: serde::de::Deserialize<'de>,
88{
89 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
90 where
91 D: serde::Deserializer<'de>,
92 {
93 struct Visitor<K, V>(PhantomData<fn() -> TryIndexMap<K, V>>);
94
95 impl<'de, K, V> serde::de::Visitor<'de> for Visitor<K, V>
96 where
97 K: serde::de::Deserialize<'de> + Hash + Eq,
98 V: serde::de::Deserialize<'de>,
99 {
100 type Value = TryIndexMap<K, V>;
101
102 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
103 f.write_str("an `IndexMap`")
104 }
105
106 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
107 where
108 A: serde::de::MapAccess<'de>,
109 {
110 use serde::de::Error as _;
111
112 let mut result = TryIndexMap::<K, V>::new();
113
114 if let Some(len) = map.size_hint() {
115 result.reserve(len).map_err(|oom| A::Error::custom(oom))?;
116 }
117
118 while let Some((k, v)) = map.next_entry::<K, V>()? {
119 result.insert(k, v).map_err(|oom| A::Error::custom(oom))?;
120 }
121
122 Ok(result)
123 }
124 }
125
126 deserializer.deserialize_map(Visitor(PhantomData))
127 }
128}
129
130impl<K, V> TryFromIterator<(K, V), OutOfMemory> for TryIndexMap<K, V>
131where
132 K: Hash + Eq,
133{
134 fn try_from_iter<I>(iter: I) -> Result<Self, OutOfMemory>
135 where
136 I: Iterator<Item = (K, V)>,
137 {
138 let mut map = Self::with_capacity(iter.size_hint().0)?;
139 for (k, v) in iter {
140 map.insert(k, v)?;
141 }
142 Ok(map)
143 }
144}
145
146impl<K, V, E> TryFromIterator<Result<(K, V), E>, E> for TryIndexMap<K, V>
147where
148 K: Hash + Eq,
149 E: From<OutOfMemory>,
150{
151 fn try_from_iter<I>(iter: I) -> Result<Self, E>
152 where
153 I: Iterator<Item = Result<(K, V), E>>,
154 {
155 let mut map = Self::with_capacity(iter.size_hint().0)?;
156 for item in iter {
157 let (k, v) = item?;
158 map.insert(k, v)?;
159 }
160 Ok(map)
161 }
162}
163
164impl<K, V> TryIndexMap<K, V> {
165 pub fn new() -> Self {
167 Self {
168 inner: indexmap::IndexMap::with_hasher(<_>::default()),
169 }
170 }
171
172 pub fn with_capacity(n: usize) -> Result<Self, OutOfMemory> {
175 Self::with_capacity_and_hasher(n, <_>::default())
176 }
177}
178
179impl<K, V, S> TryIndexMap<K, V, S> {
180 pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Result<Self, OutOfMemory> {
183 let mut map = Self::with_hasher(hash_builder);
184 map.reserve(n)?;
185 Ok(map)
186 }
187
188 pub const fn with_hasher(hash_builder: S) -> Self {
190 TryIndexMap {
191 inner: indexmap::IndexMap::with_hasher(hash_builder),
192 }
193 }
194
195 pub fn capacity(&self) -> usize {
197 self.inner.capacity()
198 }
199
200 pub fn hasher(&self) -> &S {
202 self.inner.hasher()
203 }
204
205 pub fn len(&self) -> usize {
207 self.inner.len()
208 }
209
210 pub fn is_empty(&self) -> bool {
212 self.inner.is_empty()
213 }
214
215 pub fn iter(&self) -> inner::Iter<'_, K, V> {
217 self.inner.iter()
218 }
219
220 pub fn iter_mut(&mut self) -> inner::IterMut<'_, K, V> {
222 self.inner.iter_mut()
223 }
224
225 pub fn keys(&self) -> inner::Keys<'_, K, V> {
227 self.inner.keys()
228 }
229
230 pub fn into_keys(self) -> inner::IntoKeys<K, V> {
232 self.inner.into_keys()
233 }
234
235 pub fn values(&self) -> inner::Values<'_, K, V> {
237 self.inner.values()
238 }
239
240 pub fn values_mut(&mut self) -> inner::ValuesMut<'_, K, V> {
242 self.inner.values_mut()
243 }
244
245 pub fn into_values(self) -> inner::IntoValues<K, V> {
247 self.inner.into_values()
248 }
249
250 pub fn clear(&mut self) {
252 self.inner.clear()
253 }
254
255 pub fn truncate(&mut self, len: usize) {
257 self.inner.truncate(len);
258 }
259
260 pub fn drain<R>(&mut self, range: R) -> inner::Drain<'_, K, V>
262 where
263 R: RangeBounds<usize>,
264 {
265 self.inner.drain(range)
266 }
267
268 pub fn extract_if<F, R>(&mut self, range: R, pred: F) -> inner::ExtractIf<'_, K, V, F>
270 where
271 F: FnMut(&K, &mut V) -> bool,
272 R: RangeBounds<usize>,
273 {
274 self.inner.extract_if(range, pred)
275 }
276
277 pub fn split_off(&mut self, at: usize) -> Result<Self, OutOfMemory>
280 where
281 K: Eq + Hash,
282 S: BuildHasher + TryClone,
283 {
284 assert!(at <= self.len());
285 let mut map = Self::with_capacity_and_hasher(self.len() - at, self.hasher().try_clone()?)?;
286 for (k, v) in self.drain(at..) {
287 map.insert(k, v)?;
288 }
289 Ok(map)
290 }
291
292 pub fn reserve(&mut self, additional: usize) -> Result<(), OutOfMemory> {
295 self.inner.try_reserve(additional).map_err(|_| {
296 let new_len = self.len().saturating_add(additional);
297 OutOfMemory::new(
298 new_len
299 .saturating_mul(mem::size_of::<K>())
300 .saturating_add(new_len.saturating_mul(mem::size_of::<V>())),
301 )
302 })
303 }
304
305 pub fn reserve_exact(&mut self, additional: usize) -> Result<(), OutOfMemory> {
308 self.inner.try_reserve_exact(additional).map_err(|_| {
309 let new_len = self.len().saturating_add(additional);
310 OutOfMemory::new(
311 new_len
312 .saturating_mul(mem::size_of::<K>())
313 .saturating_add(new_len.saturating_mul(mem::size_of::<V>())),
314 )
315 })
316 }
317}
318
319impl<K, V, S> TryIndexMap<K, V, S>
320where
321 K: Hash + Eq,
322 S: BuildHasher,
323{
324 pub fn insert(&mut self, key: K, value: V) -> Result<Option<V>, OutOfMemory> {
327 self.reserve(1)?;
328 Ok(self.inner.insert(key, value))
329 }
330
331 pub fn insert_full(&mut self, key: K, value: V) -> Result<(usize, Option<V>), OutOfMemory> {
334 self.reserve(1)?;
335 Ok(self.inner.insert_full(key, value))
336 }
337
338 pub fn insert_sorted(&mut self, key: K, value: V) -> Result<(usize, Option<V>), OutOfMemory>
341 where
342 K: Ord,
343 {
344 self.reserve(1)?;
345 Ok(self.inner.insert_sorted(key, value))
346 }
347
348 pub fn insert_sorted_by<F>(
351 &mut self,
352 key: K,
353 value: V,
354 cmp: F,
355 ) -> Result<(usize, Option<V>), OutOfMemory>
356 where
357 F: FnMut(&K, &V, &K, &V) -> Ordering,
358 {
359 self.reserve(1)?;
360 Ok(self.inner.insert_sorted_by(key, value, cmp))
361 }
362
363 pub fn insert_sorted_by_key<B, F>(
366 &mut self,
367 key: K,
368 value: V,
369 sort_key: F,
370 ) -> Result<(usize, Option<V>), OutOfMemory>
371 where
372 B: Ord,
373 F: FnMut(&K, &V) -> B,
374 {
375 self.reserve(1)?;
376 Ok(self.inner.insert_sorted_by_key(key, value, sort_key))
377 }
378
379 pub fn insert_before(
382 &mut self,
383 index: usize,
384 key: K,
385 value: V,
386 ) -> Result<(usize, Option<V>), OutOfMemory> {
387 self.reserve(1)?;
388 Ok(self.inner.insert_before(index, key, value))
389 }
390
391 pub fn shift_insert(
394 &mut self,
395 index: usize,
396 key: K,
397 value: V,
398 ) -> Result<Option<V>, OutOfMemory> {
399 self.reserve(1)?;
400 Ok(self.inner.shift_insert(index, key, value))
401 }
402
403 pub fn replace_index(&mut self, index: usize, key: K) -> Result<K, (usize, K)> {
405 self.inner.replace_index(index, key)
406 }
407}
408
409impl<K, V, S> TryIndexMap<K, V, S>
410where
411 S: BuildHasher,
412{
413 pub fn contains_key<Q>(&self, key: &Q) -> bool
415 where
416 Q: ?Sized + Hash + Eq,
417 K: Borrow<Q>,
418 {
419 self.inner.contains_key(key)
420 }
421
422 pub fn get<Q>(&self, key: &Q) -> Option<&V>
424 where
425 Q: ?Sized + Hash + Eq,
426 K: Borrow<Q>,
427 {
428 self.inner.get(key)
429 }
430
431 pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&K, &V)>
433 where
434 Q: ?Sized + Hash + Eq,
435 K: Borrow<Q>,
436 {
437 self.inner.get_key_value(key)
438 }
439
440 pub fn get_full<Q>(&self, key: &Q) -> Option<(usize, &K, &V)>
442 where
443 Q: ?Sized + Hash + Eq,
444 K: Borrow<Q>,
445 {
446 self.inner.get_full(key)
447 }
448
449 pub fn get_index_of<Q>(&self, key: &Q) -> Option<usize>
451 where
452 Q: ?Sized + Hash + Eq,
453 K: Borrow<Q>,
454 {
455 self.inner.get_index_of(key)
456 }
457
458 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
460 where
461 Q: ?Sized + Hash + Eq,
462 K: Borrow<Q>,
463 {
464 self.inner.get_mut(key)
465 }
466
467 pub fn get_key_value_mut<Q>(&mut self, key: &Q) -> Option<(&K, &mut V)>
469 where
470 Q: ?Sized + Hash + Eq,
471 K: Borrow<Q>,
472 {
473 self.inner.get_key_value_mut(key)
474 }
475
476 pub fn get_full_mut<Q>(&mut self, key: &Q) -> Option<(usize, &K, &mut V)>
478 where
479 Q: ?Sized + Hash + Eq,
480 K: Borrow<Q>,
481 {
482 self.inner.get_full_mut(key)
483 }
484
485 pub fn get_disjoint_mut<Q, const N: usize>(&mut self, keys: [&Q; N]) -> [Option<&mut V>; N]
487 where
488 Q: ?Sized + Hash + Eq,
489 K: Borrow<Q>,
490 {
491 self.inner.get_disjoint_mut(keys)
492 }
493
494 pub fn swap_remove<Q>(&mut self, key: &Q) -> Option<V>
496 where
497 Q: ?Sized + Hash + Eq,
498 K: Borrow<Q>,
499 {
500 self.inner.swap_remove(key)
501 }
502
503 pub fn swap_remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
505 where
506 Q: ?Sized + Hash + Eq,
507 K: Borrow<Q>,
508 {
509 self.inner.swap_remove_entry(key)
510 }
511
512 pub fn swap_remove_full<Q>(&mut self, key: &Q) -> Option<(usize, K, V)>
514 where
515 Q: ?Sized + Hash + Eq,
516 K: Borrow<Q>,
517 {
518 self.inner.swap_remove_full(key)
519 }
520
521 pub fn shift_remove<Q>(&mut self, key: &Q) -> Option<V>
523 where
524 Q: ?Sized + Hash + Eq,
525 K: Borrow<Q>,
526 {
527 self.inner.shift_remove(key)
528 }
529
530 pub fn shift_remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
532 where
533 Q: ?Sized + Hash + Eq,
534 K: Borrow<Q>,
535 {
536 self.inner.shift_remove_entry(key)
537 }
538
539 pub fn shift_remove_full<Q>(&mut self, key: &Q) -> Option<(usize, K, V)>
541 where
542 Q: ?Sized + Hash + Eq,
543 K: Borrow<Q>,
544 {
545 self.inner.shift_remove_full(key)
546 }
547}
548
549impl<K, V, S> TryIndexMap<K, V, S> {
550 pub fn pop(&mut self) -> Option<(K, V)> {
552 self.inner.pop()
553 }
554
555 pub fn retain<F>(&mut self, keep: F)
557 where
558 F: FnMut(&K, &mut V) -> bool,
559 {
560 self.inner.retain(keep);
561 }
562
563 pub fn sort_keys(&mut self)
565 where
566 K: Ord,
567 {
568 self.inner.sort_keys();
569 }
570
571 pub fn sort_by<F>(&mut self, cmp: F)
573 where
574 F: FnMut(&K, &V, &K, &V) -> Ordering,
575 {
576 self.inner.sort_by(cmp);
577 }
578
579 pub fn sorted_by<F>(self, cmp: F) -> inner::IntoIter<K, V>
581 where
582 F: FnMut(&K, &V, &K, &V) -> Ordering,
583 {
584 self.inner.sorted_by(cmp)
585 }
586
587 pub fn sort_by_key<T, F>(&mut self, sort_key: F)
589 where
590 T: Ord,
591 F: FnMut(&K, &V) -> T,
592 {
593 self.inner.sort_by_key(sort_key);
594 }
595
596 pub fn sort_unstable_keys(&mut self)
598 where
599 K: Ord,
600 {
601 self.inner.sort_unstable_keys();
602 }
603
604 pub fn sort_unstable_by<F>(&mut self, cmp: F)
606 where
607 F: FnMut(&K, &V, &K, &V) -> Ordering,
608 {
609 self.inner.sort_unstable_by(cmp);
610 }
611
612 pub fn sorted_unstable_by<F>(self, cmp: F) -> inner::IntoIter<K, V>
614 where
615 F: FnMut(&K, &V, &K, &V) -> Ordering,
616 {
617 self.inner.sorted_unstable_by(cmp)
618 }
619
620 pub fn sort_unstable_by_key<T, F>(&mut self, sort_key: F)
622 where
623 T: Ord,
624 F: FnMut(&K, &V) -> T,
625 {
626 self.inner.sort_unstable_by_key(sort_key);
627 }
628
629 pub fn binary_search_keys(&self, x: &K) -> Result<usize, usize>
631 where
632 K: Ord,
633 {
634 self.inner.binary_search_keys(x)
635 }
636
637 pub fn binary_search_by<'a, F>(&'a self, f: F) -> Result<usize, usize>
639 where
640 F: FnMut(&'a K, &'a V) -> Ordering,
641 {
642 self.inner.binary_search_by(f)
643 }
644
645 pub fn binary_search_by_key<'a, B, F>(&'a self, b: &B, f: F) -> Result<usize, usize>
647 where
648 F: FnMut(&'a K, &'a V) -> B,
649 B: Ord,
650 {
651 self.inner.binary_search_by_key(b, f)
652 }
653
654 pub fn is_sorted(&self) -> bool
656 where
657 K: PartialOrd,
658 {
659 self.inner.is_sorted()
660 }
661
662 pub fn is_sorted_by<'a, F>(&'a self, cmp: F) -> bool
664 where
665 F: FnMut(&'a K, &'a V, &'a K, &'a V) -> bool,
666 {
667 self.inner.is_sorted_by(cmp)
668 }
669
670 pub fn is_sorted_by_key<'a, F, T>(&'a self, sort_key: F) -> bool
672 where
673 F: FnMut(&'a K, &'a V) -> T,
674 T: PartialOrd,
675 {
676 self.inner.is_sorted_by_key(sort_key)
677 }
678
679 #[must_use]
681 pub fn partition_point<P>(&self, pred: P) -> usize
682 where
683 P: FnMut(&K, &V) -> bool,
684 {
685 self.inner.partition_point(pred)
686 }
687
688 pub fn reverse(&mut self) {
690 self.inner.reverse()
691 }
692
693 pub fn get_index(&self, index: usize) -> Option<(&K, &V)> {
695 self.inner.get_index(index)
696 }
697
698 pub fn get_index_mut(&mut self, index: usize) -> Option<(&K, &mut V)> {
700 self.inner.get_index_mut(index)
701 }
702
703 pub fn get_disjoint_indices_mut<const N: usize>(
705 &mut self,
706 indices: [usize; N],
707 ) -> Result<[(&K, &mut V); N], indexmap::GetDisjointMutError> {
708 self.inner.get_disjoint_indices_mut(indices)
709 }
710
711 pub fn first(&self) -> Option<(&K, &V)> {
713 self.inner.first()
714 }
715
716 pub fn first_mut(&mut self) -> Option<(&K, &mut V)> {
718 self.inner.first_mut()
719 }
720
721 pub fn last(&self) -> Option<(&K, &V)> {
723 self.inner.last()
724 }
725
726 pub fn last_mut(&mut self) -> Option<(&K, &mut V)> {
728 self.inner.last_mut()
729 }
730
731 pub fn swap_remove_index(&mut self, index: usize) -> Option<(K, V)> {
733 self.inner.swap_remove_index(index)
734 }
735
736 pub fn shift_remove_index(&mut self, index: usize) -> Option<(K, V)> {
738 self.inner.shift_remove_index(index)
739 }
740
741 pub fn move_index(&mut self, from: usize, to: usize) {
743 self.inner.move_index(from, to)
744 }
745
746 pub fn swap_indices(&mut self, a: usize, b: usize) {
748 self.inner.swap_indices(a, b)
749 }
750}
751
752impl<K, V, Q, S> Index<&Q> for TryIndexMap<K, V, S>
753where
754 Q: ?Sized + Hash + Eq,
755 K: Borrow<Q>,
756 S: BuildHasher,
757{
758 type Output = V;
759
760 fn index(&self, key: &Q) -> &V {
761 &self.inner[key]
762 }
763}
764
765impl<K, V, Q, S> IndexMut<&Q> for TryIndexMap<K, V, S>
766where
767 Q: ?Sized + Hash + Eq,
768 K: Borrow<Q>,
769 S: BuildHasher,
770{
771 fn index_mut(&mut self, key: &Q) -> &mut V {
772 &mut self.inner[key]
773 }
774}
775
776impl<K, V, S> Index<usize> for TryIndexMap<K, V, S> {
777 type Output = V;
778
779 fn index(&self, index: usize) -> &V {
780 &self.inner[index]
781 }
782}
783
784impl<K, V, S> IndexMut<usize> for TryIndexMap<K, V, S> {
785 fn index_mut(&mut self, index: usize) -> &mut V {
786 &mut self.inner[index]
787 }
788}
789
790impl<K, V, S> Default for TryIndexMap<K, V, S>
791where
792 S: Default,
793{
794 fn default() -> Self {
795 Self::with_hasher(S::default())
796 }
797}
798
799impl<K, V1, S1, V2, S2> PartialEq<TryIndexMap<K, V2, S2>> for TryIndexMap<K, V1, S1>
800where
801 K: Hash + Eq,
802 V1: PartialEq<V2>,
803 S1: BuildHasher,
804 S2: BuildHasher,
805{
806 fn eq(&self, other: &TryIndexMap<K, V2, S2>) -> bool {
807 &self.inner == &other.inner
808 }
809}
810
811impl<K, V, S> Eq for TryIndexMap<K, V, S>
812where
813 K: Eq + Hash,
814 V: Eq,
815 S: BuildHasher,
816{
817}
818
819impl<'a, K, V, S> IntoIterator for &'a TryIndexMap<K, V, S> {
820 type Item = (&'a K, &'a V);
821 type IntoIter = inner::Iter<'a, K, V>;
822
823 fn into_iter(self) -> Self::IntoIter {
824 self.iter()
825 }
826}
827
828impl<'a, K, V, S> IntoIterator for &'a mut TryIndexMap<K, V, S> {
829 type Item = (&'a K, &'a mut V);
830 type IntoIter = inner::IterMut<'a, K, V>;
831
832 fn into_iter(self) -> Self::IntoIter {
833 self.iter_mut()
834 }
835}
836
837impl<K, V, S> IntoIterator for TryIndexMap<K, V, S> {
838 type Item = (K, V);
839 type IntoIter = inner::IntoIter<K, V>;
840
841 fn into_iter(self) -> Self::IntoIter {
842 self.inner.into_iter()
843 }
844}
845
846#[cfg(test)]
847mod tests {
848 use super::*;
849 use crate::error::Result;
850
851 #[test]
852 fn smoke() -> Result<()> {
853 let mut map = TryIndexMap::new();
854
855 map.insert("a", 10)?;
856 map.insert("b", 20)?;
857 map.insert("c", 30)?;
858
859 assert_eq!(map[&"a"], 10);
860 assert_eq!(map[&"b"], 20);
861 assert_eq!(map[&"c"], 30);
862
863 assert_eq!(map[0], 10);
864 assert_eq!(map[1], 20);
865 assert_eq!(map[2], 30);
866
867 Ok(())
868 }
869}