nekolib/ds/
btree_bimap.rs1use std::borrow::Borrow;
4use std::collections::{btree_map::Range, BTreeMap};
5use std::fmt::Debug;
6use std::ops::RangeBounds;
7
8#[derive(Clone, Debug, Default)]
31pub struct BTreeBimap<L: Ord, R: Ord> {
32 left: BTreeMap<L, R>,
33 right: BTreeMap<R, L>,
34}
35
36impl<L: Clone + Ord, R: Clone + Ord> BTreeBimap<L, R> {
37 pub fn new() -> Self {
38 Self { left: BTreeMap::new(), right: BTreeMap::new() }
39 }
40 pub fn is_empty(&self) -> bool { self.left.is_empty() }
41 pub fn len(&self) -> usize { self.left.len() }
42 pub fn insert(&mut self, l: L, r: R) {
43 if let Some(old_r) = self.left.insert(l.clone(), r.clone()) {
44 self.right.remove(&old_r);
45 }
46 if let Some(old_l) = self.right.insert(r, l) {
47 self.left.remove(&old_l);
48 }
49 }
50 pub fn remove_left(&mut self, l: &L) {
51 if let Some(old_r) = self.left.remove(l) {
52 self.right.remove(&old_r);
53 }
54 }
55 pub fn remove_right(&mut self, r: &R) {
56 if let Some(old_l) = self.right.remove(r) {
57 self.left.remove(&old_l);
58 }
59 }
60
61 pub fn range_left<T, B>(&self, range: B) -> Range<'_, L, R>
65 where
66 T: Ord,
67 L: Borrow<T>,
68 B: RangeBounds<T>,
69 {
70 self.left.range(range)
71 }
72 pub fn range_right<T, B>(&self, range: B) -> Range<'_, R, L>
73 where
74 T: Ord,
75 R: Borrow<T>,
76 B: RangeBounds<T>,
77 {
78 self.right.range(range)
79 }
80}
81
82#[test]
83fn test_eq() {
84 let mut b = BTreeBimap::new();
85 b.insert(2, 20);
86 b.insert(2, 20);
87 assert_eq!(b.len(), 1);
88}