1use core::fmt;
2use equivalent::Comparable;
3use raw_btree::RawBTree;
4use std::{
5 cmp::Ordering,
6 hash::{Hash, Hasher},
7 iter::FusedIterator,
8 mem::MaybeUninit,
9 ops::Index,
10};
11
12#[derive(Clone)]
39pub struct BTreeIndexMap<K, V> {
40 entries: Vec<(K, V)>,
41 map: RawBTree<usize>,
42}
43
44impl<K, V> Default for BTreeIndexMap<K, V> {
45 fn default() -> Self {
46 Self::new()
47 }
48}
49
50impl<K, V> BTreeIndexMap<K, V> {
51 pub fn new() -> Self {
53 Self {
54 entries: Vec::new(),
55 map: RawBTree::new(),
56 }
57 }
58
59 pub fn singleton(key: K, value: V) -> Self
61 where
62 K: Ord,
63 {
64 let mut result = Self::new();
65 result.force_insert_full(key, value);
66 result
67 }
68
69 pub fn clear(&mut self) {
73 self.entries.clear();
74 self.map.clear();
75 }
76
77 pub fn as_entries(&self) -> &[(K, V)] {
80 &self.entries
81 }
82
83 pub fn is_empty(&self) -> bool {
85 self.entries.is_empty()
86 }
87
88 pub fn len(&self) -> usize {
90 self.entries.len()
91 }
92
93 pub fn get_full<Q>(&self, key: &Q) -> Option<(usize, &K, &V)>
96 where
97 Q: ?Sized + Comparable<K>,
98 {
99 self.map
100 .get(outer_cmp(&self.entries), key)
101 .copied()
102 .map(|i| {
103 let (k, v) = &self.entries[i];
104 (i, k, v)
105 })
106 }
107
108 pub fn get_entry<Q>(&self, key: &Q) -> Option<(&K, &V)>
110 where
111 Q: ?Sized + Comparable<K>,
112 {
113 self.get_full(key).map(|(_, k, v)| (k, v))
114 }
115
116 pub fn get<Q>(&self, key: &Q) -> Option<&V>
118 where
119 Q: ?Sized + Comparable<K>,
120 {
121 self.get_full(key).map(|(_, _, v)| v)
122 }
123
124 pub fn get_mut_full<Q>(&mut self, key: &Q) -> Option<(usize, &K, &mut V)>
127 where
128 Q: ?Sized + Comparable<K>,
129 {
130 self.map
131 .get(outer_cmp(&self.entries), key)
132 .copied()
133 .map(|i| {
134 let (k, v) = &mut self.entries[i];
135 (i, &*k, v)
136 })
137 }
138
139 pub fn get_mut_entry<Q>(&mut self, key: &Q) -> Option<(&K, &mut V)>
142 where
143 Q: ?Sized + Comparable<K>,
144 {
145 self.get_mut_full(key).map(|(_, k, v)| (k, v))
146 }
147
148 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
151 where
152 Q: ?Sized + Comparable<K>,
153 {
154 self.get_mut_full(key).map(|(_, _, v)| v)
155 }
156
157 pub fn entry(&mut self, key: K) -> Entry<'_, K, V>
176 where
177 K: Ord,
178 {
179 match self.map.get(outer_cmp(&self.entries), &key).copied() {
180 Some(i) => Entry::Occupied(OccupiedEntry { map: self, i }),
181 None => Entry::Vacant(VacantEntry { map: self, key }),
182 }
183 }
184
185 pub fn insert_full(&mut self, key: K, value: V) -> (usize, Option<V>)
188 where
189 K: Ord,
190 {
191 match self.map.get(outer_cmp(&self.entries), &key).copied() {
192 Some(i) => (i, Some(std::mem::replace(&mut self.entries[i].1, value))),
193 None => {
194 let i = self.force_insert_full(key, value);
195 (i, None)
196 }
197 }
198 }
199
200 fn force_insert_full(&mut self, key: K, value: V) -> usize
201 where
202 K: Ord,
203 {
204 let i = self.entries.len();
205 self.entries.push((key, value));
206 self.map.insert(inner_cmp(&self.entries), i);
207 i
208 }
209
210 pub fn insert(&mut self, key: K, value: V) -> Option<V>
213 where
214 K: Ord,
215 {
216 self.insert_full(key, value).1
217 }
218
219 pub fn shift_remove_full<Q>(&mut self, key: &Q) -> Option<(usize, K, V)>
224 where
225 Q: ?Sized + Comparable<K>,
226 {
227 let i = self.map.remove(outer_cmp(&self.entries), key)?;
228
229 let (k, v) = self.entries.remove(i);
230
231 for j in self.map.iter_mut() {
233 if *j > i {
234 *j -= 1;
235 }
236 }
237
238 Some((i, k, v))
239 }
240
241 pub fn shift_remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
246 where
247 Q: ?Sized + Comparable<K>,
248 {
249 self.shift_remove_full(key).map(|(_, k, v)| (k, v))
250 }
251
252 pub fn shift_remove<Q>(&mut self, key: &Q) -> Option<V>
257 where
258 Q: ?Sized + Comparable<K>,
259 {
260 self.shift_remove_full(key).map(|(_, _, v)| v)
261 }
262
263 pub fn swap_remove_full<Q>(&mut self, key: &Q) -> Option<(usize, K, V)>
268 where
269 Q: ?Sized + Comparable<K>,
270 K: Ord,
271 {
272 let i = self.map.remove(outer_cmp(&self.entries), key)?;
273
274 let j = self.entries.len() - 1;
275
276 if j > i {
278 *self.map.get_mut(inner_cmp(&self.entries), &j).unwrap() = i;
279 self.entries.swap(i, j);
280 }
281
282 let (k, v) = self.entries.pop().unwrap();
283 Some((i, k, v))
284 }
285
286 pub fn swap_remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
291 where
292 Q: ?Sized + Comparable<K>,
293 K: Ord,
294 {
295 self.swap_remove_full(key).map(|(_, k, v)| (k, v))
296 }
297
298 pub fn swap_remove<Q>(&mut self, key: &Q) -> Option<V>
303 where
304 Q: ?Sized + Comparable<K>,
305 K: Ord,
306 {
307 self.swap_remove_full(key).map(|(_, _, v)| v)
308 }
309
310 pub fn iter(&self) -> Iter<'_, K, V> {
313 Iter(self.entries.iter())
314 }
315
316 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
319 IterMut(self.entries.iter_mut())
320 }
321
322 pub fn iter_sorted(&self) -> IterSorted<'_, K, V> {
325 IterSorted {
326 entries: &self.entries,
327 inner: self.map.iter(),
328 }
329 }
330
331 pub fn iter_mut_sorted(&mut self) -> IterMutSorted<'_, K, V> {
335 IterMutSorted {
336 entries: &mut self.entries,
337 inner: self.map.iter(),
338 }
339 }
340
341 pub fn into_iter_sorted(self) -> IntoIterSorted<K, V> {
344 IntoIterSorted {
345 entries: unsafe {
346 std::mem::transmute::<Vec<(K, V)>, Vec<MaybeUninit<(K, V)>>>(self.entries)
349 },
350 inner: self.map.into_iter(),
351 }
352 }
353
354 pub fn keys(&self) -> Keys<'_, K, V> {
357 Keys(self.entries.iter())
358 }
359
360 pub fn values(&self) -> Values<'_, K, V> {
363 Values(self.entries.iter())
364 }
365
366 pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
369 ValuesMut(self.entries.iter_mut())
370 }
371}
372
373fn inner_cmp<K, V>(entries: &[(K, V)]) -> impl use<'_, K, V> + Fn(&usize, &usize) -> Ordering
374where
375 K: Ord,
376{
377 |&i, &j| entries[i].0.cmp(&entries[j].0)
378}
379
380fn outer_cmp<K, V, Q>(entries: &[(K, V)]) -> impl use<'_, K, V, Q> + Fn(&usize, &Q) -> Ordering
381where
382 Q: ?Sized + Comparable<K>,
383{
384 |&i, q| q.compare(&entries[i].0).reverse()
385}
386
387impl<K, V, Q> Index<&Q> for BTreeIndexMap<K, V>
388where
389 Q: ?Sized + Comparable<K>,
390{
391 type Output = V;
392
393 fn index(&self, key: &Q) -> &Self::Output {
397 self.get(key).expect("no entry found for key")
398 }
399}
400
401pub type IntoIter<K, V> = std::vec::IntoIter<(K, V)>;
404
405impl<K, V> IntoIterator for BTreeIndexMap<K, V> {
406 type IntoIter = IntoIter<K, V>;
407 type Item = (K, V);
408
409 fn into_iter(self) -> Self::IntoIter {
410 self.entries.into_iter()
411 }
412}
413
414impl<K: PartialEq, V: PartialEq> PartialEq for BTreeIndexMap<K, V> {
415 fn eq(&self, other: &Self) -> bool {
416 self.iter_sorted().eq(other.iter_sorted())
417 }
418}
419
420impl<K: Eq, V: Eq> Eq for BTreeIndexMap<K, V> {}
421
422impl<K: PartialOrd, V: PartialOrd> PartialOrd for BTreeIndexMap<K, V> {
423 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
424 self.iter_sorted().partial_cmp(other.iter_sorted())
425 }
426}
427
428impl<K: Ord, V: Ord> Ord for BTreeIndexMap<K, V> {
429 fn cmp(&self, other: &Self) -> Ordering {
430 self.iter_sorted().cmp(other.iter_sorted())
431 }
432}
433
434impl<K: Hash, V: Hash> Hash for BTreeIndexMap<K, V> {
435 fn hash<H: Hasher>(&self, state: &mut H) {
436 state.write_usize(self.len());
437 for item in self.iter_sorted() {
438 item.hash(state);
439 }
440 }
441}
442
443impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for BTreeIndexMap<K, V> {
444 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
445 f.debug_set().entries(self.iter()).finish()
446 }
447}
448
449impl<K: Ord, V> Extend<(K, V)> for BTreeIndexMap<K, V> {
450 fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
451 for (key, value) in iter {
452 self.insert(key, value);
453 }
454 }
455}
456
457impl<K: Ord, V> FromIterator<(K, V)> for BTreeIndexMap<K, V> {
458 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
459 let mut result = Self::new();
460 result.extend(iter);
461 result
462 }
463}
464
465pub struct Iter<'a, K, V>(std::slice::Iter<'a, (K, V)>);
467
468impl<K, V> Clone for Iter<'_, K, V> {
469 fn clone(&self) -> Self {
470 Self(self.0.clone())
471 }
472}
473
474impl<'a, K, V> Iterator for Iter<'a, K, V> {
475 type Item = (&'a K, &'a V);
476
477 fn size_hint(&self) -> (usize, Option<usize>) {
478 self.0.size_hint()
479 }
480
481 fn next(&mut self) -> Option<Self::Item> {
482 self.0.next().map(|(k, v)| (k, v))
483 }
484}
485
486impl<K, V> DoubleEndedIterator for Iter<'_, K, V> {
487 fn next_back(&mut self) -> Option<Self::Item> {
488 self.0.next_back().map(|(k, v)| (k, v))
489 }
490}
491
492impl<K, V> ExactSizeIterator for Iter<'_, K, V> {}
493
494impl<K, V> FusedIterator for Iter<'_, K, V> {}
495
496impl<'a, K, V> IntoIterator for &'a BTreeIndexMap<K, V> {
497 type IntoIter = Iter<'a, K, V>;
498 type Item = (&'a K, &'a V);
499
500 fn into_iter(self) -> Self::IntoIter {
501 self.iter()
502 }
503}
504
505pub struct IterMut<'a, K, V>(std::slice::IterMut<'a, (K, V)>);
508
509impl<'a, K, V> Iterator for IterMut<'a, K, V> {
510 type Item = (&'a K, &'a mut V);
511
512 fn size_hint(&self) -> (usize, Option<usize>) {
513 self.0.size_hint()
514 }
515
516 fn next(&mut self) -> Option<Self::Item> {
517 self.0.next().map(|(k, v)| (&*k, v))
518 }
519}
520
521impl<K, V> DoubleEndedIterator for IterMut<'_, K, V> {
522 fn next_back(&mut self) -> Option<Self::Item> {
523 self.0.next_back().map(|(k, v)| (&*k, v))
524 }
525}
526
527impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {}
528
529impl<K, V> FusedIterator for IterMut<'_, K, V> {}
530
531impl<'a, K, V> IntoIterator for &'a mut BTreeIndexMap<K, V> {
532 type IntoIter = IterMut<'a, K, V>;
533 type Item = (&'a K, &'a mut V);
534
535 fn into_iter(self) -> Self::IntoIter {
536 self.iter_mut()
537 }
538}
539
540pub struct IterSorted<'a, K, V> {
543 entries: &'a [(K, V)],
544 inner: raw_btree::Iter<'a, usize>,
545}
546
547impl<K, V> Clone for IterSorted<'_, K, V> {
548 fn clone(&self) -> Self {
549 Self {
550 entries: self.entries,
551 inner: self.inner,
552 }
553 }
554}
555
556impl<'a, K, V> Iterator for IterSorted<'a, K, V> {
557 type Item = (&'a K, &'a V);
558
559 fn size_hint(&self) -> (usize, Option<usize>) {
560 self.inner.size_hint()
561 }
562
563 fn next(&mut self) -> Option<Self::Item> {
564 self.inner.next().copied().map(|i| {
565 let (k, v) = &self.entries[i];
566 (k, v)
567 })
568 }
569}
570
571impl<K, V> DoubleEndedIterator for IterSorted<'_, K, V> {
572 fn next_back(&mut self) -> Option<Self::Item> {
573 self.inner.next_back().copied().map(|i| {
574 let (k, v) = &self.entries[i];
575 (k, v)
576 })
577 }
578}
579
580impl<K, V> ExactSizeIterator for IterSorted<'_, K, V> {}
581
582impl<K, V> FusedIterator for IterSorted<'_, K, V> {}
583
584pub struct IterMutSorted<'a, K, V> {
588 entries: &'a mut [(K, V)],
589 inner: raw_btree::Iter<'a, usize>,
590}
591
592impl<'a, K, V> Iterator for IterMutSorted<'a, K, V> {
593 type Item = (&'a K, &'a mut V);
594
595 fn size_hint(&self) -> (usize, Option<usize>) {
596 self.inner.size_hint()
597 }
598
599 fn next(&mut self) -> Option<Self::Item> {
600 self.inner.next().copied().map(|i| {
601 let (k, v) = &mut self.entries[i];
602 (
603 unsafe {
604 std::mem::transmute::<&mut K, &'a K>(k)
607 },
608 unsafe {
609 std::mem::transmute::<&mut V, &'a mut V>(v)
612 },
613 )
614 })
615 }
616}
617
618impl<'a, K, V> DoubleEndedIterator for IterMutSorted<'a, K, V> {
619 fn next_back(&mut self) -> Option<Self::Item> {
620 self.inner.next_back().copied().map(|i| {
621 let (k, v) = &mut self.entries[i];
622 (
623 unsafe {
624 std::mem::transmute::<&mut K, &'a K>(k)
627 },
628 unsafe {
629 std::mem::transmute::<&mut V, &'a mut V>(v)
632 },
633 )
634 })
635 }
636}
637
638impl<K, V> ExactSizeIterator for IterMutSorted<'_, K, V> {}
639
640impl<K, V> FusedIterator for IterMutSorted<'_, K, V> {}
641
642pub struct IntoIterSorted<K, V> {
645 entries: Vec<MaybeUninit<(K, V)>>,
646 inner: raw_btree::IntoIter<usize>,
647}
648
649impl<K, V> Iterator for IntoIterSorted<K, V> {
650 type Item = (K, V);
651
652 fn size_hint(&self) -> (usize, Option<usize>) {
653 self.inner.size_hint()
654 }
655
656 fn next(&mut self) -> Option<Self::Item> {
657 self.inner.next().map(|i| {
658 unsafe {
659 self.entries[i].assume_init_read()
662 }
663 })
664 }
665}
666
667impl<K, V> DoubleEndedIterator for IntoIterSorted<K, V> {
668 fn next_back(&mut self) -> Option<Self::Item> {
669 self.inner.next_back().map(|i| {
670 unsafe {
671 self.entries[i].assume_init_read()
674 }
675 })
676 }
677}
678
679impl<K, V> ExactSizeIterator for IntoIterSorted<K, V> {}
680
681impl<K, V> FusedIterator for IntoIterSorted<K, V> {}
682
683impl<K, V> Drop for IntoIterSorted<K, V> {
684 fn drop(&mut self) {
685 self.last();
687 }
688}
689
690pub struct Keys<'a, K, V>(std::slice::Iter<'a, (K, V)>);
692
693impl<K, V> Clone for Keys<'_, K, V> {
694 fn clone(&self) -> Self {
695 Self(self.0.clone())
696 }
697}
698
699impl<'a, K, V> Iterator for Keys<'a, K, V> {
700 type Item = &'a K;
701
702 fn size_hint(&self) -> (usize, Option<usize>) {
703 self.0.size_hint()
704 }
705
706 fn next(&mut self) -> Option<Self::Item> {
707 self.0.next().map(|(k, _)| k)
708 }
709}
710
711impl<K, V> DoubleEndedIterator for Keys<'_, K, V> {
712 fn next_back(&mut self) -> Option<Self::Item> {
713 self.0.next_back().map(|(k, _)| k)
714 }
715}
716
717impl<K, V> ExactSizeIterator for Keys<'_, K, V> {}
718
719impl<K, V> FusedIterator for Keys<'_, K, V> {}
720
721pub struct Values<'a, K, V>(std::slice::Iter<'a, (K, V)>);
723
724impl<K, V> Clone for Values<'_, K, V> {
725 fn clone(&self) -> Self {
726 Self(self.0.clone())
727 }
728}
729
730impl<'a, K, V> Iterator for Values<'a, K, V> {
731 type Item = &'a V;
732
733 fn size_hint(&self) -> (usize, Option<usize>) {
734 self.0.size_hint()
735 }
736
737 fn next(&mut self) -> Option<Self::Item> {
738 self.0.next().map(|(_, v)| v)
739 }
740}
741
742impl<K, V> DoubleEndedIterator for Values<'_, K, V> {
743 fn next_back(&mut self) -> Option<Self::Item> {
744 self.0.next_back().map(|(_, v)| v)
745 }
746}
747
748impl<K, V> ExactSizeIterator for Values<'_, K, V> {}
749
750impl<K, V> FusedIterator for Values<'_, K, V> {}
751
752pub struct ValuesMut<'a, K, V>(std::slice::IterMut<'a, (K, V)>);
755
756impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
757 type Item = &'a mut V;
758
759 fn size_hint(&self) -> (usize, Option<usize>) {
760 self.0.size_hint()
761 }
762
763 fn next(&mut self) -> Option<Self::Item> {
764 self.0.next().map(|(_, v)| v)
765 }
766}
767
768impl<K, V> DoubleEndedIterator for ValuesMut<'_, K, V> {
769 fn next_back(&mut self) -> Option<Self::Item> {
770 self.0.next_back().map(|(_, v)| v)
771 }
772}
773
774impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {}
775
776impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
777
778pub enum Entry<'a, K, V> {
783 Vacant(VacantEntry<'a, K, V>),
784 Occupied(OccupiedEntry<'a, K, V>),
785}
786
787pub struct VacantEntry<'a, K, V> {
791 map: &'a mut BTreeIndexMap<K, V>,
792 key: K,
793}
794
795impl<'a, K, V> VacantEntry<'a, K, V> {
796 pub fn key(&self) -> &K {
798 &self.key
799 }
800
801 pub fn into_key(self) -> K {
803 self.key
804 }
805
806 pub fn insert_full(self, value: V) -> (usize, &'a K, &'a mut V)
809 where
810 K: Ord,
811 {
812 let i = self.map.force_insert_full(self.key, value);
813 let (k, v) = &mut self.map.entries[i];
814 (i, &*k, v)
815 }
816
817 pub fn insert_entry(self, value: V) -> (&'a K, &'a mut V)
820 where
821 K: Ord,
822 {
823 let (_, k, v) = self.insert_full(value);
824 (k, v)
825 }
826
827 pub fn insert(self, value: V) -> &'a mut V
830 where
831 K: Ord,
832 {
833 self.insert_full(value).2
834 }
835}
836
837pub struct OccupiedEntry<'a, K, V> {
841 map: &'a mut BTreeIndexMap<K, V>,
842 i: usize,
843}
844
845impl<'a, K, V> OccupiedEntry<'a, K, V> {
846 pub fn key(&self) -> &K {
848 &self.map.entries[self.i].0
849 }
850
851 pub fn get_full(&self) -> (usize, &K, &V) {
853 let (k, v) = &self.map.entries[self.i];
854 (self.i, k, v)
855 }
856
857 pub fn get_entry(&self) -> (&K, &V) {
859 let (k, v) = &self.map.entries[self.i];
860 (k, v)
861 }
862
863 pub fn get(&self) -> &V {
865 &self.map.entries[self.i].1
866 }
867
868 pub fn get_mut_full(&mut self) -> (usize, &K, &mut V) {
871 let (k, v) = &mut self.map.entries[self.i];
872 (self.i, &*k, v)
873 }
874
875 pub fn get_mut_entry(&mut self) -> (&K, &mut V) {
877 let (k, v) = &mut self.map.entries[self.i];
878 (&*k, v)
879 }
880
881 pub fn get_mut(&mut self) -> &mut V {
883 &mut self.map.entries[self.i].1
884 }
885
886 pub fn into_mut_full(self) -> (usize, &'a K, &'a mut V) {
889 let (k, v) = &mut self.map.entries[self.i];
890 (self.i, &*k, v)
891 }
892
893 pub fn into_mut_entry(self) -> (&'a K, &'a mut V) {
896 let (k, v) = &mut self.map.entries[self.i];
897 (&*k, v)
898 }
899
900 pub fn into_mut(self) -> &'a mut V {
903 &mut self.map.entries[self.i].1
904 }
905
906 pub fn insert(&mut self, value: V) -> V {
908 std::mem::replace(&mut self.map.entries[self.i].1, value)
909 }
910}