1#[cfg(feature = "concurrent")]
2pub mod concurrent;
3
4#[cfg(feature = "concurrent")]
5pub mod cdc;
6
7pub mod core;
8
9use crate::Entry::{Occupied, Vacant};
10use core::constants::DEFAULT_INNER_SIZE;
11use core::node::*;
12use core::pair::Pair;
13use ftree::FenwickTree;
14#[cfg(feature = "serde")]
15use serde::{Deserialize, Serialize};
16use std::borrow::Borrow;
17use std::cmp::Ordering;
18use std::collections::Bound;
19use std::iter::FusedIterator;
20use std::mem::swap;
21use std::ops::{Index, RangeBounds};
22
23type Node<T> = Vec<T>;
24
25#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
81#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
82pub struct BTreeSet<T>
83where
84    T: Ord,
85{
86    inner: Vec<Node<T>>,
87    index: FenwickTree<usize>,
88    node_capacity: usize,
89    len: usize,
90}
91
92impl<T: Ord> BTreeSet<T> {
93    pub fn new() -> Self {
109        Self {
110            ..Default::default()
111        }
112    }
113    pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
124        let mut new: Self = Default::default();
125        new.inner = vec![Node::with_capacity(maximum_node_size)];
126        new.node_capacity = maximum_node_size;
127
128        new
129    }
130    pub fn clear(&mut self) {
143        self.inner = vec![Node::with_capacity(self.node_capacity)];
144        self.index = FenwickTree::from_iter(vec![0]);
145        self.len = 0;
146    }
147    fn locate_node<Q>(&self, value: &Q) -> usize
148    where
149        T: Borrow<Q>,
150        Q: Ord + ?Sized,
151    {
152        let mut node_idx = self.inner.partition_point(|node| {
153            if let Some(&max) = node.last().as_ref() {
154                return max.borrow() < value;
155            };
156
157            false
158        });
159
160        if self.inner.get(node_idx).is_none() {
165            node_idx -= 1
166        }
167
168        node_idx
169    }
170    fn locate_node_cmp<P, Q>(&self, mut cmp: P) -> usize
171    where
172        T: Borrow<Q>,
173        Q: Ord + ?Sized,
174        P: FnMut(&Q) -> bool,
175    {
176        let mut node_idx = self.inner.partition_point(|node| {
177            if let Some(max) = node.last() {
178                return cmp(max.borrow());
179            }
180
181            true
182        });
183
184        if self.inner.get(node_idx).is_none() {
185            node_idx -= 1
186        }
187
188        node_idx
189    }
190    fn locate_value<Q>(&self, value: &Q) -> (usize, usize)
191    where
192        T: Borrow<Q>,
193        Q: Ord + ?Sized,
194    {
195        let node_idx = self.locate_node(value);
196        let position_within_node =
197            self.inner[node_idx].partition_point(|item| item.borrow() < value);
198
199        (node_idx, position_within_node)
200    }
201    fn locate_value_cmp<P, Q>(&self, mut cmp: P) -> (usize, usize)
202    where
203        T: Borrow<Q>,
204        Q: Ord + ?Sized,
205        P: FnMut(&Q) -> bool,
206    {
207        let node_idx = self.locate_node_cmp(&mut cmp);
208        let position_within_node = self.inner[node_idx].partition_point(|item| cmp(item.borrow()));
209
210        (node_idx, position_within_node)
211    }
212    fn locate_ith(&self, idx: usize) -> (usize, usize) {
213        let mut node_index = self.index.index_of(idx);
214        let mut offset = 0;
215
216        if node_index != 0 {
217            offset = self.index.prefix_sum(node_index, 0);
218        }
219
220        let mut position_within_node = idx - offset;
221        if let Some(node) = self.inner.get(node_index) {
222            if position_within_node == node.len() {
223                node_index += 1;
224                position_within_node = 0;
225            }
226        }
227
228        (node_index, position_within_node)
229    }
230    pub fn get_index(&self, idx: usize) -> Option<&T> {
247        let (node_idx, position_within_node) = self.locate_ith(idx);
248        if let Some(candidate_node) = self.inner.get(node_idx) {
249            return candidate_node.get(position_within_node);
250        }
251
252        None
253    }
254    fn get_mut_index(&mut self, index: usize) -> Option<&mut T> {
255        let (node_idx, position_within_node) = self.locate_ith(index);
256        if let Some(_) = self.inner.get(node_idx) {
257            return self.inner[node_idx].get_mut(position_within_node);
258        }
259
260        None
261    }
262    pub fn get<Q>(&self, value: &Q) -> Option<&T>
279    where
280        T: Borrow<Q> + Ord,
281        Q: Ord + ?Sized,
282    {
283        let (node_idx, position_within_node) = self.locate_value(value);
284        if let Some(candidate_node) = self.inner.get(node_idx) {
285            return candidate_node.get(position_within_node);
286        }
287
288        None
289    }
290    pub fn lower_bound<Q>(&self, value: &Q) -> Option<&T>
307    where
308        T: Borrow<Q>,
309        Q: Ord + ?Sized,
310    {
311        let (node_idx, position_within_node) = self.locate_value(value);
312        if let Some(candidate_node) = self.inner.get(node_idx) {
313            return candidate_node.get(position_within_node);
314        }
315
316        None
317    }
318    pub fn len(&self) -> usize {
331        self.len
332    }
333    pub fn insert(&mut self, value: T) -> bool {
358        let node_idx = self.locate_node(&value);
359        if self.inner[node_idx].len() == self.node_capacity {
360            let new_node = self.inner[node_idx].halve();
361            let mut insert_node_idx = node_idx;
362            if value >= new_node[0] {
363                insert_node_idx += 1;
364            }
365
366            self.inner.insert(node_idx + 1, new_node);
367            if NodeLike::insert(&mut self.inner[insert_node_idx], value).0 {
368                self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
370                self.len += 1;
371
372                true
373            } else {
374                self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
376                false
377            }
378        } else if NodeLike::insert(&mut self.inner[node_idx], value).0 {
379            self.index.add_at(node_idx, 1);
380            self.len += 1;
381
382            true
383        } else {
384            false
385        }
386    }
387
388    pub fn replace(&mut self, value: T) -> Option<T> {
405        let replaced_element = self.take(&value);
406        self.insert(value);
407
408        replaced_element
409    }
410    pub fn contains<Q>(&self, value: &Q) -> bool
426    where
427        T: Borrow<Q>,
428        Q: Ord + ?Sized,
429    {
430        let (node_idx, position_within_node) = self.locate_value(value);
431        if let Some(candidate_node) = self.inner.get(node_idx) {
432            if let Some(candidate_value) = candidate_node.get(position_within_node) {
433                return value == candidate_value.borrow();
434            }
435        }
436
437        false
438    }
439    fn contains_cmp<P, Q, R>(&self, cmp: P, mut cmp2: R) -> bool
440    where
441        T: Borrow<Q>,
442        Q: Ord + ?Sized,
443        P: FnMut(&Q) -> bool,
444        R: FnMut(&Q) -> bool,
445    {
446        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
447        if let Some(candidate_node) = self.inner.get(node_idx) {
448            if let Some(candidate_value) = candidate_node.get(position_within_node) {
449                return cmp2(candidate_value.borrow());
450            }
451        }
452
453        false
454    }
455    fn delete_at(&mut self, node_idx: usize, position_within_node: usize) -> T {
456        let removal = self.inner[node_idx].remove(position_within_node);
457
458        let mut decrease_length = false;
459        if self.inner[node_idx].len() == 0 {
461            if self.inner.len() > 1 {
463                self.inner.remove(node_idx);
464                self.len -= 1;
465                self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
466            } else {
467                decrease_length = true;
468            }
469        } else {
470            decrease_length = true;
471        }
472
473        if decrease_length {
474            self.index.sub_at(node_idx, 1);
475            self.len -= 1;
476        }
477
478        removal
479    }
480    fn delete<Q>(&mut self, value: &Q) -> (Option<T>, bool)
481    where
482        T: Borrow<Q>,
483        Q: Ord + ?Sized,
484    {
485        let mut removed = false;
486        let mut removal = None;
487        let (node_idx, position_within_node) = self.locate_value(value);
488        if let Some(candidate_node) = self.inner.get(node_idx) {
489            if let Some(candidate_value) = candidate_node.get(position_within_node) {
490                if value == candidate_value.borrow() {
491                    removal = Some(self.delete_at(node_idx, position_within_node));
492                    removed = true;
493                }
494            }
495        }
496
497        (removal, removed)
498    }
499    fn delete_cmp<P, Q, R>(&mut self, cmp: P, mut cmp2: R) -> (Option<T>, bool)
500    where
501        T: Borrow<Q>,
502        Q: Ord + ?Sized,
503        P: FnMut(&Q) -> bool,
504        R: FnMut(&Q) -> bool,
505    {
506        let mut removed = false;
507        let mut removal = None;
508        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
509        if let Some(candidate_node) = self.inner.get(node_idx) {
510            if let Some(candidate_value) = candidate_node.get(position_within_node) {
511                if cmp2(candidate_value.borrow()) {
512                    removal = Some(self.delete_at(node_idx, position_within_node));
513                    removed = true;
514                }
515            }
516        }
517
518        (removal, removed)
519    }
520    pub fn remove<Q>(&mut self, value: &Q) -> bool
539    where
540        T: Borrow<Q>,
541        Q: Ord + ?Sized,
542    {
543        self.delete(value).1
544    }
545    pub fn take<Q>(&mut self, value: &Q) -> Option<T>
562    where
563        T: Borrow<Q>,
564        Q: Ord + ?Sized,
565    {
566        self.delete(value).0
567    }
568    pub fn first(&self) -> Option<&T> {
586        if let Some(candidate_node) = self.inner.get(0) {
587            return candidate_node.get(0);
588        }
589
590        None
591    }
592    pub fn last(&self) -> Option<&T> {
610        if let Some(candidate_node) = self.inner.get(self.inner.len() - 1) {
611            if candidate_node.len() > 0 {
612                return candidate_node.get(candidate_node.len() - 1);
613            }
614        }
615
616        None
617    }
618    pub fn pop_first(&mut self) -> Option<T> {
635        let (first_node_idx, first_position_within_node) = (0, 0);
636        if let Some(candidate_node) = self.inner.get(first_node_idx) {
637            if candidate_node.get(first_position_within_node).is_some() {
638                return Some(self.delete_at(first_node_idx, first_position_within_node));
639            }
640        }
641
642        None
643    }
644    pub fn pop_index(&mut self, idx: usize) -> T {
660        let (node_idx, position_within_node) = self.locate_ith(idx);
661
662        self.delete_at(node_idx, position_within_node)
663    }
664    pub fn pop_last(&mut self) -> Option<T> {
681        let last_node_idx = self.inner.len() - 1;
682        let mut last_position_within_node = self.inner[last_node_idx].len();
683        last_position_within_node = last_position_within_node.saturating_sub(1);
684
685        if let Some(candidate_node) = self.inner.get(last_node_idx) {
686            if candidate_node.get(last_position_within_node).is_some() {
687                return Some(self.delete_at(last_node_idx, last_position_within_node));
688            }
689        }
690
691        None
692    }
693    pub fn is_empty(&self) -> bool {
706        self.len() == 0
707    }
708    pub fn is_subset(&self, other: &Self) -> bool {
726        if self.difference(other).next().is_some() {
727            return false;
728        }
729
730        true
731    }
732    pub fn is_superset(&self, other: &Self) -> bool {
753        if other.difference(self).next().is_some() {
754            return false;
755        }
756
757        true
758    }
759    pub fn is_disjoint(&self, other: &Self) -> bool {
777        if self.intersection(other).next().is_some() {
778            return false;
779        }
780
781        true
782    }
783    pub fn iter(&self) -> Iter<'_, T> {
812        Iter::new(self)
813    }
814    pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
833        Union {
834            merge_iter: MergeIter {
835                start: true,
836                left_iter: self.iter(),
837                current_left: None,
838                right_iter: other.iter(),
839                current_right: None,
840            },
841        }
842    }
843    pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T> {
864        Difference {
865            merge_iter: MergeIter {
866                start: true,
867                left_iter: self.iter(),
868                current_left: None,
869                right_iter: other.iter(),
870                current_right: None,
871            },
872        }
873    }
874    pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T> {
895        SymmetricDifference {
896            merge_iter: MergeIter {
897                start: true,
898                left_iter: self.iter(),
899                current_left: None,
900                right_iter: other.iter(),
901                current_right: None,
902            },
903        }
904    }
905    pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
926        Intersection {
927            merge_iter: MergeIter {
928                start: true,
929                left_iter: self.iter(),
930                current_left: None,
931                right_iter: other.iter(),
932                current_right: None,
933            },
934        }
935    }
936    pub fn retain<F, Q>(&mut self, mut f: F)
952    where
953        T: Borrow<Q>,
954        Q: Ord + ?Sized,
955        F: FnMut(&Q) -> bool,
956    {
957        let mut positions_to_delete = vec![];
958        for (node_idx, node) in self.inner.iter().enumerate() {
959            for (position_within_node, item) in node.iter().enumerate() {
960                if !f(item.borrow()) {
961                    positions_to_delete.push((node_idx, position_within_node));
962                }
963            }
964        }
965        positions_to_delete.reverse();
966
967        positions_to_delete
968            .into_iter()
969            .for_each(|(node_idx, position_within_node)| {
970                self.delete_at(node_idx, position_within_node);
971            })
972    }
973    fn split_off_cmp<P, Q>(&mut self, cmp: P) -> Self
974    where
975        T: Borrow<Q>,
976        Q: Ord + ?Sized,
977        P: FnMut(&Q) -> bool,
978    {
979        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
980        let first_node = self.inner[node_idx].split_off(position_within_node);
981        let mut remaining_nodes = vec![];
982        while self.inner.len() > node_idx + 1 {
983            remaining_nodes.push(self.inner.pop().unwrap());
984        }
985        remaining_nodes.reverse();
986        remaining_nodes.insert(0, first_node);
987        let mut latter_half = BTreeSet::default();
988        latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
989        latter_half.inner = remaining_nodes;
990        latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
991
992        if self.inner[node_idx].len() == 0 && self.inner.len() > 1 {
993            self.inner.remove(node_idx);
994        }
995
996        self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
997        self.len = self.inner.iter().map(|node| node.len()).sum();
998
999        latter_half
1000    }
1001    pub fn split_off<Q>(&mut self, value: &Q) -> Self
1031    where
1032        T: Borrow<Q>,
1033        Q: Ord + ?Sized,
1034    {
1035        let (node_idx, position_within_node) = self.locate_value(value);
1036        let first_node = self.inner[node_idx].split_off(position_within_node);
1037        let mut remaining_nodes = vec![];
1038        while self.inner.len() > node_idx + 1 {
1039            remaining_nodes.push(self.inner.pop().unwrap());
1040        }
1041        remaining_nodes.reverse();
1042        remaining_nodes.insert(0, first_node);
1043        let mut latter_half = BTreeSet::default();
1044        latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
1045        latter_half.inner = remaining_nodes;
1046        latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
1047
1048        if self.inner[node_idx].len() == 0 && self.inner.len() > 1 {
1049            self.inner.remove(node_idx);
1050        }
1051
1052        self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
1053        self.len = self.inner.iter().map(|node| node.len()).sum();
1054
1055        latter_half
1056    }
1057    pub fn append(&mut self, other: &mut Self) {
1086        while let Some(value) = other.pop_first() {
1087            self.replace(value);
1088        }
1089    }
1090    fn resolve_range<R>(&self, range: R) -> ((usize, usize, usize), (usize, usize, usize))
1091    where
1092        R: RangeBounds<usize>,
1093    {
1094        let mut global_front_idx: usize = 0;
1095        let mut global_back_idx: usize =
1096            self.index.prefix_sum(self.inner.len(), 0).saturating_sub(1);
1097
1098        let start = range.start_bound();
1100        match start {
1101            Bound::Included(bound) => {
1102                global_front_idx = *bound;
1103            }
1104            Bound::Excluded(bound) => {
1105                global_front_idx = *bound + 1;
1106            }
1107            Bound::Unbounded => (),
1108        }
1109
1110        let end = range.end_bound();
1111        match end {
1112            Bound::Included(bound) => {
1113                global_back_idx = *bound;
1114            }
1115            Bound::Excluded(bound) => {
1116                global_back_idx = *bound - 1;
1117            }
1118            Bound::Unbounded => (),
1119        }
1120        let (front_node_idx, front_start_idx) = self.locate_ith(global_front_idx);
1122        let (back_node_idx, back_start_idx) = self.locate_ith(global_back_idx);
1123
1124        (
1125            (global_front_idx, front_node_idx, front_start_idx),
1126            (global_back_idx, back_node_idx, back_start_idx),
1127        )
1128    }
1129    pub fn range<R, Q>(&self, range: R) -> Range<'_, T>
1157    where
1158        Q: Ord + ?Sized,
1159        T: Borrow<Q>,
1160        R: RangeBounds<Q>,
1161    {
1162        let start_idx = match range.start_bound() {
1163            Bound::Included(bound) => self.rank(bound),
1164            Bound::Excluded(bound) => self.rank(bound) + 1,
1165            Bound::Unbounded => 0,
1166        };
1167        let end_idx = match range.end_bound() {
1168            Bound::Included(bound) => self.rank(bound),
1169            Bound::Excluded(bound) => self.rank(bound).saturating_sub(1),
1170            Bound::Unbounded => self.len().saturating_sub(1),
1171        };
1172
1173        self.range_idx(start_idx..=end_idx)
1174    }
1175    pub fn rank<Q>(&self, value: &Q) -> usize
1194    where
1195        Q: Ord + ?Sized,
1196        T: Borrow<Q>,
1197    {
1198        let (node_idx, position_within_node) = self.locate_value(value);
1199
1200        let offset = self.index.prefix_sum(node_idx, 0);
1201
1202        offset + position_within_node
1203    }
1204    fn rank_cmp<Q, P>(&self, cmp: P) -> usize
1205    where
1206        T: Borrow<Q>,
1207        Q: Ord + ?Sized,
1208        P: FnMut(&Q) -> bool,
1209    {
1210        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
1211
1212        let offset = self.index.prefix_sum(node_idx, 0);
1213
1214        offset + position_within_node
1215    }
1216    pub fn range_idx<R>(&self, range: R) -> Range<'_, T>
1217    where
1218        R: RangeBounds<usize>,
1219    {
1220        let (
1221            (global_front_idx, front_node_idx, front_start_idx),
1222            (global_back_idx, back_node_idx, back_start_idx),
1223        ) = self.resolve_range(range);
1224
1225        let front_iter = if front_node_idx < self.inner.len() {
1226            Some(self.inner[front_node_idx][front_start_idx..].iter())
1227        } else {
1228            None
1229        };
1230
1231        let back_iter = if back_node_idx < self.inner.len() {
1232            Some(self.inner[back_node_idx][..=back_start_idx].iter())
1233        } else {
1234            None
1235        };
1236
1237        Range {
1238            spine_iter: Iter {
1239                btree: self,
1240                current_front_node_idx: front_node_idx,
1241                current_front_idx: global_front_idx,
1242                current_back_node_idx: back_node_idx,
1243                current_back_idx: global_back_idx + 1,
1244                current_front_iterator: front_iter,
1245                current_back_iterator: back_iter,
1246            },
1247        }
1248    }
1249}
1250
1251impl<T> FromIterator<T> for BTreeSet<T>
1252where
1253    T: Ord,
1254{
1255    fn from_iter<K: IntoIterator<Item = T>>(iter: K) -> Self {
1256        let mut btree = BTreeSet::new();
1257        iter.into_iter().for_each(|item| {
1258            btree.insert(item);
1259        });
1260
1261        btree
1262    }
1263}
1264
1265impl<T, const N: usize> From<[T; N]> for BTreeSet<T>
1266where
1267    T: Ord,
1268{
1269    fn from(value: [T; N]) -> Self {
1270        let mut btree: BTreeSet<T> = Default::default();
1271
1272        value.into_iter().for_each(|item| {
1273            btree.insert(item);
1274        });
1275
1276        btree
1277    }
1278}
1279
1280impl<T> Default for BTreeSet<T>
1281where
1282    T: Ord,
1283{
1284    fn default() -> Self {
1285        let node_capacity = DEFAULT_INNER_SIZE;
1286
1287        Self {
1288            inner: vec![Node::with_capacity(node_capacity)],
1289            index: FenwickTree::from_iter(vec![0]),
1290            node_capacity,
1291            len: 0,
1292        }
1293    }
1294}
1295
1296pub struct Iter<'a, T>
1303where
1304    T: Ord,
1305{
1306    btree: &'a BTreeSet<T>,
1307    current_front_node_idx: usize,
1308    current_front_idx: usize,
1309    current_back_node_idx: usize,
1310    current_back_idx: usize,
1311    current_front_iterator: Option<std::slice::Iter<'a, T>>,
1312    current_back_iterator: Option<std::slice::Iter<'a, T>>,
1313}
1314
1315impl<'a, T> Iter<'a, T>
1316where
1317    T: Ord,
1318{
1319    pub fn new(btree: &'a BTreeSet<T>) -> Self {
1320        Self {
1321            btree,
1322            current_front_node_idx: 0,
1323            current_front_idx: 0,
1324            current_back_node_idx: btree.inner.len() - 1,
1325            current_back_idx: btree.len(),
1326            current_front_iterator: Some(btree.inner[0].iter()),
1327            current_back_iterator: Some(btree.inner[btree.inner.len() - 1].iter()),
1328        }
1329    }
1330}
1331
1332impl<'a, T> Iterator for Iter<'a, T>
1333where
1334    T: Ord,
1335{
1336    type Item = &'a T;
1337
1338    fn next(&mut self) -> Option<Self::Item> {
1339        if self.current_front_idx == self.current_back_idx {
1340            return None;
1341        }
1342        if let Some(value) = self.current_front_iterator.as_mut().and_then(|i| i.next()) {
1343            self.current_front_idx += 1;
1344            Some(value)
1345        } else {
1346            self.current_front_node_idx += 1;
1347            if self.current_front_node_idx >= self.btree.inner.len() {
1348                return None;
1349            }
1350            self.current_front_iterator =
1351                Some(self.btree.inner[self.current_front_node_idx].iter());
1352
1353            self.next()
1354        }
1355    }
1356}
1357
1358impl<'a, T> DoubleEndedIterator for Iter<'a, T>
1359where
1360    T: Ord,
1361{
1362    fn next_back(&mut self) -> Option<Self::Item> {
1363        if self.current_front_idx == self.current_back_idx {
1364            return None;
1365        }
1366        if let Some(value) = self
1367            .current_back_iterator
1368            .as_mut()
1369            .and_then(|i| i.next_back())
1370        {
1371            self.current_back_idx -= 1;
1372            Some(value)
1373        } else {
1374            if self.current_back_node_idx == 0 {
1375                return None;
1376            };
1377            self.current_back_node_idx -= 1;
1378            self.current_back_iterator = Some(self.btree.inner[self.current_back_node_idx].iter());
1379
1380            self.next_back()
1381        }
1382    }
1383}
1384
1385impl<'a, T> FusedIterator for Iter<'a, T> where T: Ord {}
1386
1387impl<'a, T> IntoIterator for &'a BTreeSet<T>
1388where
1389    T: Ord,
1390{
1391    type Item = &'a T;
1392
1393    type IntoIter = Iter<'a, T>;
1394
1395    fn into_iter(self) -> Self::IntoIter {
1396        Iter::new(self)
1397    }
1398}
1399
1400pub struct IntoIter<T>
1407where
1408    T: Ord,
1409{
1410    btree: BTreeSet<T>,
1411}
1412
1413impl<T> Iterator for IntoIter<T>
1414where
1415    T: Ord,
1416{
1417    type Item = T;
1418
1419    fn next(&mut self) -> Option<Self::Item> {
1420        self.btree.pop_first()
1421    }
1422}
1423
1424impl<T> DoubleEndedIterator for IntoIter<T>
1425where
1426    T: Ord,
1427{
1428    fn next_back(&mut self) -> Option<Self::Item> {
1429        self.btree.pop_last()
1430    }
1431}
1432
1433impl<T> FusedIterator for IntoIter<T> where T: Ord {}
1434
1435impl<T> IntoIterator for BTreeSet<T>
1436where
1437    T: Ord,
1438{
1439    type Item = T;
1440
1441    type IntoIter = IntoIter<T>;
1442
1443    fn into_iter(self) -> Self::IntoIter {
1444        IntoIter { btree: self }
1446    }
1447}
1448
1449struct MergeIter<'a, T>
1450where
1451    T: Ord,
1452{
1453    start: bool,
1454    left_iter: Iter<'a, T>,
1455    current_left: Option<&'a T>,
1456    right_iter: Iter<'a, T>,
1457    current_right: Option<&'a T>,
1458}
1459
1460impl<'a, T> Iterator for MergeIter<'a, T>
1461where
1462    T: Ord,
1463{
1464    type Item = (Option<&'a T>, Option<&'a T>);
1465    fn next(&mut self) -> Option<Self::Item> {
1466        if !self.start {
1467            if let Some(left) = self.current_left {
1468                if let Some(right) = self.current_right {
1469                    match left.cmp(right) {
1470                        Ordering::Less => {
1471                            self.current_left = self.left_iter.next();
1472                        }
1473                        Ordering::Equal => {
1474                            self.current_left = self.left_iter.next();
1475                            self.current_right = self.right_iter.next();
1476                        }
1477                        Ordering::Greater => {
1478                            self.current_right = self.right_iter.next();
1479                        }
1480                    }
1481                } else {
1482                    self.current_left = self.left_iter.next();
1483                }
1484            } else if let Some(_) = self.current_right {
1485                self.current_right = self.right_iter.next();
1486            } else {
1487                return None;
1488            }
1489        } else {
1490            self.current_left = self.left_iter.next();
1491            self.current_right = self.right_iter.next();
1492            self.start = false;
1493        }
1494
1495        Some((self.current_left, self.current_right))
1496    }
1497}
1498
1499pub struct Union<'a, T>
1506where
1507    T: Ord,
1508{
1509    merge_iter: MergeIter<'a, T>,
1510}
1511
1512impl<'a, T> Iterator for Union<'a, T>
1513where
1514    T: Ord,
1515{
1516    type Item = &'a T;
1517
1518    fn next(&mut self) -> Option<Self::Item> {
1519        if let Some((current_left, current_right)) = self.merge_iter.next() {
1520            return match (current_left, current_right) {
1521                (Some(left), Some(right)) => {
1522                    if right < left {
1523                        Some(right)
1524                    } else {
1525                        Some(left)
1526                    }
1527                }
1528                (Some(left), None) => Some(left),
1529                (None, Some(right)) => Some(right),
1530                (None, None) => None,
1531            };
1532        }
1533
1534        None
1535    }
1536}
1537
1538impl<'a, T> FusedIterator for Union<'a, T> where T: Ord {}
1539
1540pub struct Difference<'a, T>
1547where
1548    T: Ord,
1549{
1550    merge_iter: MergeIter<'a, T>,
1551}
1552
1553impl<'a, T> Iterator for Difference<'a, T>
1554where
1555    T: Ord,
1556{
1557    type Item = &'a T;
1558
1559    fn next(&mut self) -> Option<Self::Item> {
1560        loop {
1561            return if let Some((current_left, current_right)) = self.merge_iter.next() {
1562                match (current_left, current_right) {
1563                    (Some(left), Some(right)) => {
1564                        if left < right {
1565                            Some(left)
1566                        } else {
1567                            continue;
1568                        }
1569                    }
1570                    (Some(left), None) => Some(left),
1571                    (None, _) => None,
1572                }
1573            } else {
1574                None
1575            };
1576        }
1577    }
1578}
1579
1580impl<'a, T> FusedIterator for Difference<'a, T> where T: Ord {}
1581
1582pub struct SymmetricDifference<'a, T>
1589where
1590    T: Ord,
1591{
1592    merge_iter: MergeIter<'a, T>,
1593}
1594
1595impl<'a, T> Iterator for SymmetricDifference<'a, T>
1596where
1597    T: Ord,
1598{
1599    type Item = &'a T;
1600
1601    fn next(&mut self) -> Option<Self::Item> {
1602        loop {
1603            return if let Some((current_left, current_right)) = self.merge_iter.next() {
1604                match (current_left, current_right) {
1605                    (Some(left), Some(right)) => {
1606                        if left < right {
1607                            Some(left)
1608                        } else if right < left {
1609                            Some(right)
1610                        } else {
1611                            continue;
1612                        }
1613                    }
1614                    (Some(left), None) => Some(left),
1615                    (None, Some(right)) => Some(right),
1616                    (None, _) => None,
1617                }
1618            } else {
1619                None
1620            };
1621        }
1622    }
1623}
1624
1625impl<'a, T> FusedIterator for SymmetricDifference<'a, T> where T: Ord {}
1626
1627pub struct Intersection<'a, T>
1634where
1635    T: Ord,
1636{
1637    merge_iter: MergeIter<'a, T>,
1638}
1639
1640impl<'a, T> Iterator for Intersection<'a, T>
1641where
1642    T: Ord,
1643{
1644    type Item = &'a T;
1645
1646    fn next(&mut self) -> Option<Self::Item> {
1647        loop {
1648            if let Some((current_left, current_right)) = self.merge_iter.next() {
1649                match (current_left, current_right) {
1650                    (Some(left), Some(right)) => {
1651                        if left == right {
1652                            return Some(left);
1653                        } else {
1654                            continue;
1655                        }
1656                    }
1657                    (None, _) | (_, None) => return None,
1658                }
1659            } else {
1660                return None;
1661            }
1662        }
1663    }
1664}
1665
1666impl<'a, T> FusedIterator for Intersection<'a, T> where T: Ord {}
1667
1668pub struct Range<'a, T>
1675where
1676    T: Ord,
1677{
1678    spine_iter: Iter<'a, T>,
1679}
1680
1681impl<'a, T> Iterator for Range<'a, T>
1682where
1683    T: Ord,
1684{
1685    type Item = &'a T;
1686
1687    fn next(&mut self) -> Option<Self::Item> {
1688        self.spine_iter.next()
1689    }
1690}
1691
1692impl<'a, T> DoubleEndedIterator for Range<'a, T>
1693where
1694    T: Ord,
1695{
1696    fn next_back(&mut self) -> Option<Self::Item> {
1697        self.spine_iter.next_back()
1698    }
1699}
1700
1701impl<'a, T> FusedIterator for Range<'a, T> where T: Ord {}
1702
1703impl<T> Index<usize> for BTreeSet<T>
1704where
1705    T: Ord,
1706{
1707    type Output = T;
1708
1709    fn index(&self, index: usize) -> &Self::Output {
1710        self.get_index(index).unwrap()
1711    }
1712}
1713
1714pub struct VacantEntry<'a, K, V>
1715where
1716    K: Ord,
1717{
1718    map: &'a mut BTreeMap<K, V>,
1719    key: K,
1720}
1721
1722pub struct OccupiedEntry<'a, K, V>
1723where
1724    K: Ord,
1725{
1726    map: &'a mut BTreeMap<K, V>,
1727    idx: usize,
1728}
1729
1730pub enum Entry<'a, K, V>
1731where
1732    K: 'a + Ord,
1733    V: 'a,
1734{
1735    Vacant(VacantEntry<'a, K, V>),
1736    Occupied(OccupiedEntry<'a, K, V>),
1737}
1738
1739impl<'a, K, V> Entry<'a, K, V>
1740where
1741    K: 'a + Ord,
1742    V: 'a,
1743{
1744    pub fn or_insert(self, default: V) -> &'a mut V {
1745        match self {
1746            Vacant(entry) => entry.insert(default),
1747            Occupied(entry) => entry.into_mut(),
1748        }
1749    }
1750    pub fn or_insert_with<F>(self, default: F) -> &'a mut V
1751    where
1752        F: FnOnce() -> V,
1753    {
1754        match self {
1755            Vacant(entry) => entry.insert(default()),
1756            Occupied(entry) => entry.into_mut(),
1757        }
1758    }
1759    pub fn or_insert_with_key<F>(self, default: F) -> &'a mut V
1760    where
1761        F: FnOnce(&K) -> V,
1762    {
1763        match self {
1764            Vacant(entry) => {
1765                let value = default(entry.key());
1766                entry.insert(value)
1767            }
1768            Occupied(entry) => entry.into_mut(),
1769        }
1770    }
1771    pub fn key(&self) -> &K {
1772        match *self {
1773            Occupied(ref entry) => entry.key(),
1774            Vacant(ref entry) => entry.key(),
1775        }
1776    }
1777    pub fn and_modify<F>(self, f: F) -> Self
1778    where
1779        F: FnOnce(&mut V),
1780    {
1781        match self {
1782            Occupied(mut entry) => {
1783                f(entry.get_mut());
1784                Occupied(entry)
1785            }
1786            Vacant(entry) => Vacant(entry),
1787        }
1788    }
1789    pub fn or_default(self) -> &'a mut V
1790    where
1791        V: Default,
1792    {
1793        match self {
1794            Occupied(entry) => entry.into_mut(),
1795            Vacant(entry) => entry.insert(Default::default()),
1796        }
1797    }
1798}
1799
1800impl<'a, K, V> OccupiedEntry<'a, K, V>
1801where
1802    K: Ord,
1803{
1804    pub fn key(&self) -> &K {
1805        &self.map.set.get_index(self.idx).unwrap().key
1806    }
1807    pub fn remove_entry(self) -> (K, V) {
1808        self.map.pop_index(self.idx)
1809    }
1810    pub fn get(&self) -> &V {
1811        self.map.get_index(self.idx).unwrap().1
1812    }
1813    pub fn get_mut(&mut self) -> &mut V {
1814        self.map.get_mut_index(self.idx).unwrap()
1815    }
1816    pub fn into_mut(self) -> &'a mut V {
1817        self.map.get_mut_index(self.idx).unwrap()
1818    }
1819    pub fn insert(&mut self, value: V) -> V {
1820        let current_value = self.map.get_mut_index(self.idx).unwrap();
1821        let mut previous_value = value;
1822        swap(&mut previous_value, current_value);
1823
1824        previous_value
1825    }
1826    pub fn remove(self) -> V {
1827        self.map.pop_index(self.idx).1
1828    }
1829}
1830
1831impl<'a, K, V> VacantEntry<'a, K, V>
1832where
1833    K: Ord,
1834{
1835    pub fn key(&self) -> &K {
1836        &self.key
1837    }
1838    pub fn into_key(self) -> K {
1839        self.key
1840    }
1841    pub fn insert(self, value: V) -> &'a mut V {
1842        let rank = self
1843            .map
1844            .set
1845            .rank_cmp(|item: &Pair<K, V>| &item.key < &self.key);
1846        self.map.insert(self.key, value);
1847
1848        self.map.get_mut_index(rank).unwrap()
1849    }
1850}
1851
1852#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1940#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
1941pub struct BTreeMap<K, V>
1942where
1943    K: Ord,
1944{
1945    set: BTreeSet<Pair<K, V>>,
1946}
1947
1948impl<K: Ord, V> Default for BTreeMap<K, V>
1949where
1950    K: Ord,
1951{
1952    fn default() -> Self {
1953        Self {
1954            set: BTreeSet::default(),
1955        }
1956    }
1957}
1958
1959impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V>
1960where
1961    K: Ord,
1962{
1963    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
1964        let mut btree = BTreeMap::new();
1965        iter.into_iter().for_each(|item| {
1966            btree.insert(item.0, item.1);
1967        });
1968
1969        btree
1970    }
1971}
1972
1973impl<K: Ord, V> BTreeMap<K, V>
1974where
1975    K: Ord,
1976{
1977    pub fn append(&mut self, other: &mut Self) {
2009        self.set.append(&mut other.set)
2010    }
2011    pub fn clear(&mut self) {
2026        self.set.clear()
2027    }
2028    pub fn contains_key<Q>(&self, key: &Q) -> bool
2046    where
2047        K: Borrow<Q> + Ord,
2048        Q: Ord + ?Sized,
2049    {
2050        self.set.contains_cmp(
2051            |item: &Pair<K, V>| item.key.borrow() < key,
2052            |item| item.key.borrow() == key,
2053        )
2054    }
2055    pub fn first_key_value(&self) -> Option<(&K, &V)> {
2072        let popping = self.set.first();
2073        if let Some(pop) = popping {
2074            return Some((&pop.key, &pop.value));
2075        }
2076
2077        None
2078    }
2079    pub fn get<Q>(&self, key: &Q) -> Option<&V>
2097    where
2098        K: Borrow<Q> + Ord,
2099        Q: Ord + ?Sized,
2100    {
2101        if let Some(key_value) = self.get_key_value(key) {
2102            return Some(key_value.1);
2103        }
2104
2105        None
2106    }
2107    pub fn get_index(&self, idx: usize) -> Option<(&K, &V)> {
2121        let ith = self.set.get_index(idx);
2122        if let Some(entry) = ith {
2123            return Some((&entry.key, &entry.value));
2124        }
2125
2126        None
2127    }
2128    pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&K, &V)>
2144    where
2145        K: Borrow<Q> + Ord,
2146        Q: Ord + ?Sized,
2147    {
2148        let (node_idx, position_within_node) = self
2149            .set
2150            .locate_value_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2151        if let Some(candidate_node) = self.set.inner.get(node_idx) {
2152            if let Some(candidate_value) = candidate_node.get(position_within_node) {
2153                if candidate_value.key.borrow() == key {
2154                    return Some((&candidate_value.key, &candidate_value.value));
2155                }
2156            }
2157        }
2158
2159        None
2160    }
2161    pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
2181    where
2182        K: Borrow<Q> + Ord,
2183        Q: Ord,
2184    {
2185        let (node_idx, position_within_node) = self
2186            .set
2187            .locate_value_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2188        if self.set.inner.get(node_idx).is_some()
2189            && self.set.inner[node_idx].get(position_within_node).is_some()
2190        {
2191            let entry = self.set.inner[node_idx].get_mut(position_within_node)?;
2192
2193            return Some(&mut entry.value);
2194        }
2195
2196        None
2197    }
2198    pub fn get_mut_index(&mut self, index: usize) -> Option<&mut V> {
2215        if let Some(entry) = self.set.get_mut_index(index) {
2216            return Some(&mut entry.value);
2217        }
2218
2219        None
2220    }
2221    pub fn insert(&mut self, key: K, value: V) -> Option<V> {
2248        if self.contains_key(&key) {
2249            let old_entry = self
2250                .set
2251                .delete_cmp(|item: &Pair<K, V>| item.key < key, |item| item.key == key)
2252                .0?;
2253
2254            self.set.insert(Pair { key, value });
2255
2256            Some(old_entry.value)
2257        } else {
2258            self.set.insert(Pair { key, value });
2259
2260            None
2261        }
2262    }
2263    pub fn into_keys(self) -> IntoKeys<K, V> {
2280        IntoKeys {
2281            inner: self.into_iter(),
2282        }
2283    }
2284    pub fn into_values(self) -> IntoValues<K, V> {
2301        IntoValues {
2302            inner: self.into_iter(),
2303        }
2304    }
2305    pub fn is_empty(&self) -> bool {
2320        self.set.is_empty()
2321    }
2322    pub fn iter(&self) -> IterMap<'_,K, V> {
2344        IterMap {
2345            inner: self.set.iter(),
2346        }
2347    }
2348    pub fn iter_mut(&mut self) -> IterMut<'_,K, V> {
2371        let last_node_idx = self.set.inner.len() - 1;
2372        let len = self.set.len();
2373        let mut inner = self.set.inner.iter_mut();
2374        let front_iter = {
2375            if let Some(node) = inner.next() {
2376                node.iter_mut()
2377            } else {
2378                [].iter_mut()
2379            }
2380        };
2381        let back_iter = {
2382            if let Some(node) = inner.next_back() {
2383                node.iter_mut()
2384            } else {
2385                [].iter_mut()
2386            }
2387        };
2388
2389        IterMut {
2390            inner,
2391            current_front_node_idx: 0,
2392            current_front_idx: 0,
2393            current_back_node_idx: last_node_idx,
2394            current_back_idx: len - 1,
2395            current_front_iterator: front_iter,
2396            current_back_iterator: back_iter,
2397        }
2398    }
2399    pub fn keys(&self) -> Keys<'_, K, V> {
2416        Keys {
2417            inner: self.set.iter(),
2418        }
2419    }
2420    pub fn last_key_value(&self) -> Option<(&K, &V)> {
2436        let popping = self.set.last();
2437        if let Some(pop) = popping {
2438            return Some((&pop.key, &pop.value));
2439        }
2440
2441        None
2442    }
2443    pub fn len(&self) -> usize {
2458        self.set.len()
2459    }
2460    pub fn new() -> Self {
2477        Self {
2478            ..Default::default()
2479        }
2480    }
2481    pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
2492        Self {
2493            set: BTreeSet::with_maximum_node_size(maximum_node_size),
2494        }
2495    }
2496    pub fn pop_first(&mut self) -> Option<(K, V)> {
2515        let popping = self.set.pop_first();
2516        if let Some(pop) = popping {
2517            return Some((pop.key, pop.value));
2518        }
2519
2520        None
2521    }
2522    pub fn pop_index(&mut self, index: usize) -> (K, V) {
2538        let popping = self.set.pop_index(index);
2539
2540        (popping.key, popping.value)
2541    }
2542    pub fn pop_last(&mut self) -> Option<(K, V)> {
2561        let popping = self.set.pop_last();
2562        if let Some(pop) = popping {
2563            return Some((pop.key, pop.value));
2564        }
2565
2566        None
2567    }
2568    pub fn range<Q, R>(&self, range: R) -> RangeMap<'_, K, V>
2598    where
2599        Q: Ord + ?Sized,
2600        K: Borrow<Q>,
2601        R: RangeBounds<Q>,
2602    {
2603        let (start_idx, end_idx) = self.range_to_idx(range);
2604
2605        RangeMap {
2606            inner: self.set.range_idx(start_idx..=end_idx),
2607        }
2608    }
2609    pub fn range_idx<R>(&self, range: R) -> RangeMap<'_, K, V>
2610    where
2611        R: RangeBounds<usize>,
2612    {
2613        RangeMap {
2614            inner: self.set.range_idx(range),
2615        }
2616    }
2617    fn range_to_idx<Q, R>(&self, range: R) -> (usize, usize)
2618    where
2619        Q: Ord + ?Sized,
2620        K: Borrow<Q>,
2621        R: RangeBounds<Q>,
2622    {
2623        let start_idx = match range.start_bound() {
2624            Bound::Included(bound) => self
2625                .set
2626                .rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2627            Bound::Excluded(bound) => {
2628                self.set
2629                    .rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound)
2630                    + 1
2631            }
2632            Bound::Unbounded => 0,
2633        };
2634        let end_idx = match range.end_bound() {
2635            Bound::Included(bound) => self
2636                .set
2637                .rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2638            Bound::Excluded(bound) => {
2639                self.set
2640                    .rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound)
2641                    - 1
2642            }
2643            Bound::Unbounded => self.len() - 1,
2644        };
2645
2646        (start_idx, end_idx)
2647    }
2648    pub fn range_mut<Q, R>(&mut self, range: R) -> RangeMut<'_, K, V>
2677    where
2678        Q: Ord + ?Sized,
2679        K: Borrow<Q>,
2680        R: RangeBounds<Q>,
2681    {
2682        let (start_idx, end_idx) = self.range_to_idx(range);
2683
2684        self.range_mut_idx(start_idx..=end_idx)
2685    }
2686    pub fn range_mut_idx<R>(&mut self, range: R) -> RangeMut<'_, K, V>
2687    where
2688        R: RangeBounds<usize>,
2689    {
2690        let (
2691            (global_front_idx, front_node_idx, front_start_idx),
2692            (global_back_idx, back_node_idx, back_start_idx),
2693        ) = self.set.resolve_range(range);
2694        let end = self.set.inner[back_node_idx].len();
2695
2696        let mut inner = self.set.inner.iter_mut();
2697
2698        let mut front_iter = {
2699            if let Some(node) = inner.nth(front_node_idx) {
2700                node.iter_mut()
2701            } else {
2702                [].iter_mut()
2703            }
2704        };
2705
2706        let mut back_iter = {
2707            if let Some(node) = inner.nth(back_node_idx - front_node_idx) {
2708                node.iter_mut()
2709            } else {
2710                [].iter_mut()
2711            }
2712        };
2713
2714        for _ in 0..front_start_idx {
2715            front_iter.next();
2716        }
2717        let offset = back_node_idx - front_node_idx;
2718        if offset > 0 {
2719            for _ in back_start_idx..end {
2720                back_iter.next_back();
2721            }
2722        } else {
2723            for _ in back_start_idx..end {
2724                front_iter.next_back();
2725            }
2726        }
2727
2728        RangeMut {
2729            inner: IterMut {
2730                inner,
2731                current_front_node_idx: front_node_idx,
2732                current_front_idx: global_front_idx,
2733                current_back_node_idx: back_node_idx,
2734                current_back_idx: global_back_idx,
2735                current_front_iterator: front_iter,
2736                current_back_iterator: back_iter,
2737            },
2738        }
2739    }
2740    pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
2759    where
2760        K: Borrow<Q> + Ord,
2761        Q: Ord + ?Sized,
2762    {
2763        let old_entry = self.set.delete_cmp(
2764            |item: &Pair<K, V>| item.key.borrow() < key,
2765            |item: &Pair<K, V>| item.key.borrow() == key,
2766        );
2767
2768        if old_entry.1 {
2769            return Some(old_entry.0?.value);
2770        }
2771
2772        None
2773    }
2774    pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
2793    where
2794        K: Borrow<Q> + Ord,
2795        Q: Ord,
2796    {
2797        let old_entry = self.set.delete_cmp(
2798            |item: &Pair<K, V>| item.key.borrow() < key,
2799            |item| item.key.borrow() == key,
2800        );
2801
2802        if old_entry.1 {
2803            let key_value = old_entry.0?;
2804            return Some((key_value.key, key_value.value));
2805        }
2806
2807        None
2808    }
2809    pub fn retain<F, Q>(&mut self, mut f: F)
2825    where
2826        K: Borrow<Q> + Ord,
2827        Q: Ord,
2828        F: FnMut(&Q, &mut V) -> bool,
2829    {
2830        let mut positions_to_delete = vec![];
2831        for (node_idx, node) in self.set.inner.iter_mut().enumerate() {
2832            for (position_within_node, item) in node.iter_mut().enumerate() {
2833                if !f(item.key.borrow(), &mut item.value) {
2834                    positions_to_delete.push((node_idx, position_within_node));
2835                }
2836            }
2837        }
2838
2839        positions_to_delete.reverse();
2840
2841        positions_to_delete
2842            .into_iter()
2843            .for_each(|(node_idx, position_within_node)| {
2844                self.set.delete_at(node_idx, position_within_node);
2845            })
2846    }
2847    pub fn split_off<Q>(&mut self, key: &Q) -> Self
2877    where
2878        K: Borrow<Q> + Ord,
2879        Q: Ord,
2880    {
2881        BTreeMap {
2882            set: self
2883                .set
2884                .split_off_cmp(|item: &Pair<K, V>| item.key.borrow() < key),
2885        }
2886    }
2887    pub fn values(&self) -> Values<'_, K, V> {
2904        Values {
2905            inner: self.set.iter(),
2906        }
2907    }
2908    pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
2930        ValuesMut {
2931            inner: self.iter_mut(),
2932        }
2933    }
2934    pub fn entry(&mut self, key: K) -> Entry<'_, K, V>
2955    where
2956        K: Ord,
2957    {
2958        if self.contains_key(&key) {
2959            let idx = self.set.rank_cmp(|item: &Pair<K, V>| item.key < key);
2960            return Occupied(OccupiedEntry { map: self, idx });
2961        }
2962
2963        Vacant(VacantEntry { map: self, key })
2964    }
2965    pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
2985    where
2986        K: Ord,
2987    {
2988        if !self.is_empty() {
2989            return Some(OccupiedEntry { map: self, idx: 0 });
2990        }
2991
2992        None
2993    }
2994    pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
3014    where
3015        K: Ord,
3016    {
3017        let len = self.len();
3018        if len > 0 {
3019            return Some(OccupiedEntry {
3020                map: self,
3021                idx: len - 1,
3022            });
3023        }
3024
3025        None
3026    }
3027    pub fn lower_bound<Q>(&self, bound: Bound<&Q>) -> CursorMap<'_, K, V>
3053    where
3054        K: Borrow<Q> + Ord,
3055        Q: Ord,
3056    {
3057        let start_idx = match bound {
3058            Bound::Included(start) => self
3059                .set
3060                .rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start),
3061            Bound::Excluded(start) => {
3062                self.set
3063                    .rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start)
3064                    + 1
3065            }
3066            Bound::Unbounded => 0,
3067        };
3068
3069        CursorMap {
3070            cursor: Cursor {
3071                set: &self.set,
3072                idx: start_idx,
3073            },
3074        }
3075    }
3076    pub fn rank<Q>(&self, value: &Q) -> usize
3095    where
3096        Q: Ord + ?Sized,
3097        K: Borrow<Q>,
3098    {
3099        self.set
3100            .rank_cmp(|item: &Pair<K, V>| item.key.borrow() < value)
3101    }
3102}
3103
3104impl<K, V, const N: usize> From<[(K, V); N]> for BTreeMap<K, V>
3105where
3106    K: Ord,
3107{
3108    fn from(value: [(K, V); N]) -> Self {
3109        let mut btree: BTreeMap<K, V> = Default::default();
3110
3111        value.into_iter().for_each(|(key, value)| {
3112            btree.insert(key, value);
3113        });
3114
3115        btree
3116    }
3117}
3118
3119impl<K, V> IntoIterator for BTreeMap<K, V>
3120where
3121    K: Ord,
3122{
3123    type Item = (K, V);
3124    type IntoIter = IntoIterMap<K, V>;
3125
3126    fn into_iter(self) -> Self::IntoIter {
3127        IntoIterMap {
3128            inner: self.set.into_iter(),
3129        }
3130    }
3131}
3132
3133impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V>
3134where
3135    K: Ord,
3136{
3137    type Item = (&'a K, &'a V);
3138
3139    type IntoIter = IterMap<'a, K, V>;
3140
3141    fn into_iter(self) -> Self::IntoIter {
3142        IterMap {
3143            inner: self.set.iter(),
3144        }
3145    }
3146}
3147
3148pub struct IterMap<'a, K, V>
3155where
3156    K: Ord,
3157{
3158    inner: Iter<'a, Pair<K, V>>,
3159}
3160
3161impl<'a, K, V> Iterator for IterMap<'a, K, V>
3162where
3163    K: Ord,
3164{
3165    type Item = (&'a K, &'a V);
3166
3167    fn next(&mut self) -> Option<Self::Item> {
3168        if let Some(entry) = self.inner.next() {
3169            return Some((&entry.key, &entry.value));
3170        }
3171
3172        None
3173    }
3174}
3175
3176impl<'a, K, V> DoubleEndedIterator for IterMap<'a, K, V>
3177where
3178    K: Ord,
3179{
3180    fn next_back(&mut self) -> Option<Self::Item> {
3181        if let Some(entry) = self.inner.next_back() {
3182            return Some((&entry.key, &entry.value));
3183        }
3184
3185        None
3186    }
3187}
3188
3189impl<'a, K, V> FusedIterator for IterMap<'a, K, V> where K: Ord {}
3190
3191pub struct IntoIterMap<K, V>
3198where
3199    K: Ord,
3200{
3201    inner: IntoIter<Pair<K, V>>,
3202}
3203
3204impl<K, V> Iterator for IntoIterMap<K, V>
3205where
3206    K: Ord,
3207{
3208    type Item = (K, V);
3209
3210    fn next(&mut self) -> Option<Self::Item> {
3211        if let Some(entry) = self.inner.next() {
3212            return Some((entry.key, entry.value));
3213        }
3214
3215        None
3216    }
3217}
3218
3219impl<K, V> DoubleEndedIterator for IntoIterMap<K, V>
3220where
3221    K: Ord,
3222{
3223    fn next_back(&mut self) -> Option<Self::Item> {
3224        if let Some(entry) = self.inner.next_back() {
3225            return Some((entry.key, entry.value));
3226        }
3227
3228        None
3229    }
3230}
3231
3232impl<K, V> FusedIterator for IntoIterMap<K, V> where K: Ord {}
3233
3234pub struct IntoKeys<K, V>
3241where
3242    K: Ord,
3243{
3244    inner: IntoIterMap<K, V>,
3245}
3246
3247impl<K, V> Iterator for IntoKeys<K, V>
3248where
3249    K: Ord,
3250{
3251    type Item = K;
3252
3253    fn next(&mut self) -> Option<Self::Item> {
3254        if let Some(entry) = self.inner.next() {
3255            return Some(entry.0);
3256        }
3257
3258        None
3259    }
3260}
3261
3262impl<K, V> DoubleEndedIterator for IntoKeys<K, V>
3263where
3264    K: Ord,
3265{
3266    fn next_back(&mut self) -> Option<Self::Item> {
3267        if let Some(entry) = self.inner.next_back() {
3268            return Some(entry.0);
3269        }
3270
3271        None
3272    }
3273}
3274
3275impl<K, V> FusedIterator for IntoKeys<K, V> where K: Ord {}
3276
3277pub struct IntoValues<K, V>
3284where
3285    K: Ord,
3286{
3287    inner: IntoIterMap<K, V>,
3288}
3289
3290impl<K, V> Iterator for IntoValues<K, V>
3291where
3292    K: Ord,
3293{
3294    type Item = V;
3295
3296    fn next(&mut self) -> Option<Self::Item> {
3297        if let Some(entry) = self.inner.next() {
3298            return Some(entry.1);
3299        }
3300
3301        None
3302    }
3303}
3304
3305impl<K, V> DoubleEndedIterator for IntoValues<K, V>
3306where
3307    K: Ord,
3308{
3309    fn next_back(&mut self) -> Option<Self::Item> {
3310        if let Some(entry) = self.inner.next_back() {
3311            return Some(entry.1);
3312        }
3313
3314        None
3315    }
3316}
3317
3318impl<K, V> FusedIterator for IntoValues<K, V> where K: Ord {}
3319
3320pub struct RangeMap<'a, K, V>
3327where
3328    K: Ord,
3329{
3330    inner: Range<'a, Pair<K, V>>,
3331}
3332
3333impl<'a, K, V> Iterator for RangeMap<'a, K, V>
3334where
3335    K: Ord,
3336{
3337    type Item = (&'a K, &'a V);
3338
3339    fn next(&mut self) -> Option<Self::Item> {
3340        if let Some(entry) = self.inner.next() {
3341            return Some((&entry.key, &entry.value));
3342        }
3343
3344        None
3345    }
3346}
3347
3348impl<'a, K, V> DoubleEndedIterator for RangeMap<'a, K, V>
3349where
3350    K: Ord,
3351{
3352    fn next_back(&mut self) -> Option<Self::Item> {
3353        if let Some(entry) = self.inner.next_back() {
3354            return Some((&entry.key, &entry.value));
3355        }
3356
3357        None
3358    }
3359}
3360
3361impl<'a, K, V> FusedIterator for RangeMap<'a, K, V> where K: Ord {}
3362
3363pub struct Values<'a, K, V>
3370where
3371    K: Ord,
3372{
3373    inner: Iter<'a, Pair<K, V>>,
3374}
3375
3376impl<'a, K, V> Iterator for Values<'a, K, V>
3377where
3378    K: Ord,
3379{
3380    type Item = &'a V;
3381
3382    fn next(&mut self) -> Option<Self::Item> {
3383        if let Some(entry) = self.inner.next() {
3384            return Some(&entry.value);
3385        }
3386
3387        None
3388    }
3389}
3390
3391impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V>
3392where
3393    K: Ord,
3394{
3395    fn next_back(&mut self) -> Option<Self::Item> {
3396        if let Some(entry) = self.inner.next_back() {
3397            return Some(&entry.value);
3398        }
3399
3400        None
3401    }
3402}
3403
3404impl<'a, K, V> FusedIterator for Values<'a, K, V> where K: Ord {}
3405
3406pub struct Keys<'a, K, V>
3413where
3414    K: Ord,
3415{
3416    inner: Iter<'a, Pair<K, V>>,
3417}
3418
3419impl<'a, K, V> Iterator for Keys<'a, K, V>
3420where
3421    K: Ord,
3422{
3423    type Item = &'a K;
3424
3425    fn next(&mut self) -> Option<Self::Item> {
3426        if let Some(entry) = self.inner.next() {
3427            return Some(&entry.key);
3428        }
3429
3430        None
3431    }
3432}
3433
3434impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V>
3435where
3436    K: Ord,
3437{
3438    fn next_back(&mut self) -> Option<Self::Item> {
3439        if let Some(entry) = self.inner.next_back() {
3440            return Some(&entry.key);
3441        }
3442
3443        None
3444    }
3445}
3446
3447impl<'a, K, V> FusedIterator for Keys<'a, K, V> where K: Ord {}
3448
3449pub struct IterMut<'a, K: 'a, V: 'a>
3456where
3457    K: Ord,
3458{
3459    inner: std::slice::IterMut<'a, Node<Pair<K, V>>>,
3460    current_front_node_idx: usize,
3461    current_front_idx: usize,
3462    current_back_node_idx: usize,
3463    current_back_idx: usize,
3464    current_front_iterator: std::slice::IterMut<'a, Pair<K, V>>,
3465    current_back_iterator: std::slice::IterMut<'a, Pair<K, V>>,
3466}
3467
3468impl<'a, K, V> Iterator for IterMut<'a, K, V>
3469where
3470    K: Ord,
3471{
3472    type Item = (&'a K, &'a mut V);
3473
3474    fn next(&mut self) -> Option<Self::Item> {
3475        if self.current_front_idx == self.current_back_idx + 1 {
3476            return None;
3477        }
3478        if let Some(entry) = self.current_front_iterator.next() {
3479            self.current_front_idx += 1;
3480            return Some((&entry.key, &mut entry.value));
3481        } else {
3482            if self.current_front_node_idx == self.inner.size_hint().0 {
3485                return None;
3486            }
3487            if self.current_front_node_idx == self.current_back_node_idx - 1 {
3488                if let Some(entry) = self.current_back_iterator.next() {
3490                    self.current_front_idx += 1;
3491                    return Some((&entry.key, &mut entry.value));
3492                }
3493            } else {
3494                self.current_front_node_idx += 1;
3496                if let Some(node) = self.inner.next() {
3497                    self.current_front_iterator = node.iter_mut();
3498                }
3499
3500                return self.next();
3501            }
3502        };
3503
3504        None
3505    }
3506}
3507
3508impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V>
3509where
3510    K: Ord,
3511{
3512    fn next_back(&mut self) -> Option<Self::Item> {
3513        if self.current_front_idx == self.current_back_idx + 1 {
3514            return None;
3515        }
3516        if let Some(entry) = self.current_back_iterator.next_back() {
3517            self.current_back_idx -= 1;
3518            return Some((&entry.key, &mut entry.value));
3519        } else {
3520            if self.current_back_node_idx == 0 {
3523                return None;
3524            }
3525            if self.current_front_node_idx == self.current_back_node_idx - 1 {
3526                if let Some(entry) = self.current_front_iterator.next_back() {
3528                    if self.current_back_idx > 0 {
3529                        self.current_back_idx -= 1;
3530                    }
3531                    return Some((&entry.key, &mut entry.value));
3532                }
3533            } else {
3534                self.current_back_node_idx -= 1;
3536                if let Some(node) = self.inner.next_back() {
3537                    self.current_back_iterator = node.iter_mut();
3538                }
3539
3540                return self.next_back();
3541            }
3542        };
3543
3544        None
3545    }
3546}
3547
3548impl<'a, K, V> FusedIterator for IterMut<'a, K, V> where K: Ord {}
3549
3550pub struct ValuesMut<'a, K: 'a, V: 'a>
3557where
3558    K: Ord,
3559{
3560    inner: IterMut<'a, K, V>,
3561}
3562
3563impl<'a, K, V> Iterator for ValuesMut<'a, K, V>
3564where
3565    K: Ord,
3566{
3567    type Item = &'a mut V;
3568
3569    fn next(&mut self) -> Option<Self::Item> {
3570        if let Some(entry) = self.inner.next() {
3571            return Some(entry.1);
3572        }
3573
3574        None
3575    }
3576}
3577
3578impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V>
3579where
3580    K: Ord,
3581{
3582    fn next_back(&mut self) -> Option<Self::Item> {
3583        if let Some(entry) = self.inner.next_back() {
3584            return Some(entry.1);
3585        }
3586
3587        None
3588    }
3589}
3590
3591impl<'a, K, V> FusedIterator for ValuesMut<'a, K, V> where K: Ord {}
3592
3593pub struct RangeMut<'a, K: 'a, V: 'a>
3600where
3601    K: Ord,
3602{
3603    inner: IterMut<'a, K, V>,
3604}
3605
3606impl<'a, K, V> Iterator for RangeMut<'a, K, V>
3607where
3608    K: Ord,
3609{
3610    type Item = (&'a K, &'a mut V);
3611
3612    fn next(&mut self) -> Option<Self::Item> {
3613        self.inner.next()
3614    }
3615}
3616
3617impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V>
3618where
3619    K: Ord,
3620{
3621    fn next_back(&mut self) -> Option<Self::Item> {
3622        self.inner.next_back()
3623    }
3624}
3625
3626impl<'a, K, V> FusedIterator for RangeMut<'a, K, V> where K: Ord {}
3627
3628impl<K, Q, V> Index<&Q> for BTreeMap<K, V>
3629where
3630    K: Borrow<Q> + Ord,
3631
3632    Q: Ord + ?Sized,
3633{
3634    type Output = V;
3635
3636    fn index(&self, index: &Q) -> &Self::Output {
3637        self.get(index).unwrap()
3638    }
3639}
3640
3641pub struct Cursor<'a, T>
3642where
3643    T: Ord,
3644{
3645    set: &'a BTreeSet<T>,
3646    idx: usize,
3647}
3648
3649impl<'a, T: Ord> Cursor<'a, T> {
3650    pub fn move_next(&mut self) {
3651        if self.idx == self.set.len() {
3652            self.idx = 0
3653        } else {
3654            self.idx += 1;
3655        }
3656    }
3657    pub fn move_index(&mut self, index: usize) {
3658        self.idx = index
3659    }
3660    pub fn move_prev(&mut self) {
3661        if self.idx == 0 {
3662            self.idx = self.set.len()
3663        } else {
3664            self.idx -= 1;
3665        }
3666    }
3667    pub fn item(&self) -> Option<&'a T> {
3668        self.set.get_index(self.idx)
3669    }
3670    pub fn peek_next(&self) -> Option<&'a T> {
3671        if self.idx == self.set.len() {
3672            return self.set.first();
3673        }
3674
3675        self.set.get_index(self.idx + 1)
3676    }
3677    pub fn peek_index(&self, index: usize) -> Option<&'a T> {
3678        self.set.get_index(index)
3679    }
3680    pub fn peek_prev(&self) -> Option<&'a T> {
3681        if self.idx == 0 {
3682            return None;
3683        }
3684
3685        self.set.get_index(self.idx - 1)
3686    }
3687}
3688
3689pub struct CursorMap<'a, K, V>
3690where
3691    K: 'a + Ord,
3692    V: 'a,
3693{
3694    cursor: Cursor<'a, Pair<K, V>>,
3695}
3696
3697impl<'a, K: Ord, V> CursorMap<'a, K, V> {
3698    pub fn move_next(&mut self) {
3699        self.cursor.move_next()
3700    }
3701    pub fn move_index(&mut self, index: usize) {
3702        self.cursor.move_index(index)
3703    }
3704    pub fn move_prev(&mut self) {
3705        self.cursor.move_prev()
3706    }
3707    pub fn key(&self) -> Option<&'a K> {
3708        if let Some(entry) = self.cursor.item() {
3709            return Some(&entry.key);
3710        }
3711
3712        None
3713    }
3714    pub fn value(&self) -> Option<&'a V> {
3715        if let Some(entry) = self.cursor.item() {
3716            return Some(&entry.value);
3717        }
3718
3719        None
3720    }
3721    pub fn key_value(&self) -> Option<(&'a K, &'a V)> {
3722        if let Some(entry) = self.cursor.item() {
3723            return Some((&entry.key, &entry.value));
3724        }
3725
3726        None
3727    }
3728    pub fn peek_next(&self) -> Option<(&'a K, &'a V)> {
3729        if let Some(entry) = self.cursor.peek_next() {
3730            return Some((&entry.key, &entry.value));
3731        }
3732
3733        None
3734    }
3735    pub fn peek_index(&self, index: usize) -> Option<(&'a K, &'a V)> {
3736        if let Some(entry) = self.cursor.peek_index(index) {
3737            return Some((&entry.key, &entry.value));
3738        }
3739
3740        None
3741    }
3742    pub fn peek_prev(&self) -> Option<(&'a K, &'a V)> {
3743        if let Some(entry) = self.cursor.peek_prev() {
3744            return Some((&entry.key, &entry.value));
3745        }
3746
3747        None
3748    }
3749}
3750
3751#[cfg(test)]
3752mod tests {
3753    use super::core::constants::*;
3754    use super::core::node::*;
3755    use crate::{BTreeMap, BTreeSet, Node};
3756    use rand::{Rng, SeedableRng};
3757    use std::collections::Bound::Included;
3758
3759    #[test]
3760    fn test_insert() {
3761        let input: Vec<isize> = vec![1, 9, 2, 7, 6, 3, 5, 4, 10, 8];
3762
3763        let expected_output: Vec<isize> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3764
3765        let actual_node =
3766            input
3767                .iter()
3768                .fold(Node::with_capacity(DEFAULT_INNER_SIZE), |mut acc, curr| {
3769                    NodeLike::insert(&mut acc, *curr);
3770                    acc
3771                });
3772
3773        let actual_output: Vec<isize> = actual_node.iter().cloned().collect();
3774
3775        assert_eq!(expected_output, actual_output);
3776        assert_eq!(*actual_node.last().unwrap(), 10);
3777    }
3778
3779    #[test]
3780    fn test_halve() {
3781        let mut input: Vec<isize> = vec![];
3782        for item in 0..DEFAULT_INNER_SIZE {
3783            input.push(item.clone() as isize);
3784        }
3785
3786        let mut former_node = Node::with_capacity(DEFAULT_INNER_SIZE);
3787        input.iter().for_each(|item| {
3788            NodeLike::insert(&mut former_node, item.clone());
3789        });
3790        let latter_node = former_node.halve();
3791
3792        let expected_former_output: Vec<isize> = input[0..DEFAULT_CUTOFF].to_vec();
3793        let expected_latter_output: Vec<isize> = input[DEFAULT_CUTOFF..].to_vec();
3794
3795        let actual_former_output: Vec<isize> = former_node.iter().cloned().collect();
3796        let actual_latter_output: Vec<isize> = latter_node.iter().cloned().collect();
3797
3798        assert_eq!(expected_former_output, actual_former_output);
3799        assert_eq!(expected_latter_output, actual_latter_output);
3800    }
3801
3802    #[test]
3803    fn test_insert_btree() {
3804        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3806        let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3807
3808        let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3809            acc.insert(curr);
3810            acc
3811        });
3812        assert!(btree.inner.len() > 1);
3813
3814        let actual_output: Vec<usize> = btree.into_iter().collect();
3815
3816        assert_eq!(expected_output, actual_output);
3817    }
3818
3819    #[test]
3820    fn test_insert_duplicates() {
3821        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1))
3822            .into_iter()
3823            .rev()
3824            .cycle()
3825            .take(DEFAULT_INNER_SIZE * 3)
3826            .collect();
3827        let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3828
3829        let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3830            acc.insert(curr);
3831            acc
3832        });
3833        assert!(btree.inner.len() > 1);
3834
3835        let actual_output: Vec<usize> = btree.into_iter().collect();
3836
3837        assert_eq!(expected_output.len(), actual_output.len());
3838        assert_eq!(expected_output, actual_output);
3839    }
3840
3841    #[test]
3842    fn test_remove() {
3843        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3844
3845        let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3846            acc.insert(curr.clone());
3847            acc
3848        });
3849
3850        input.iter().for_each(|item| {
3851            assert!(btree.remove(item));
3852        });
3853
3854        let actual_output: Vec<usize> = btree.into_iter().collect();
3855        let expected_output: Vec<usize> = vec![];
3856
3857        assert_eq!(expected_output, actual_output);
3858    }
3859
3860    #[test]
3861    fn test_take() {
3862        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3863
3864        let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3865            acc.insert(curr.clone());
3866            acc
3867        });
3868
3869        input.iter().for_each(|item| {
3870            assert_eq!(*item, btree.take(item).unwrap());
3871        });
3872
3873        let actual_output: Vec<usize> = btree.into_iter().collect();
3874        let expected_output: Vec<usize> = vec![];
3875
3876        assert_eq!(expected_output, actual_output);
3877    }
3878
3879    #[test]
3880    fn test_first_last_with_pop() {
3881        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3882
3883        let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3884            acc.insert(curr.clone());
3885            acc
3886        });
3887
3888        let mut front_spine = btree.clone();
3889        let mut back_spine = btree.clone();
3890        btree.iter().for_each(|item| {
3891            if *item < DEFAULT_INNER_SIZE {
3892                assert_eq!(front_spine.get_index(0), front_spine.first());
3893                assert_eq!(
3894                    front_spine.pop_first().unwrap() + 1,
3895                    *front_spine.first().unwrap()
3896                );
3897            } else {
3898                assert_eq!(front_spine.pop_first().unwrap(), DEFAULT_INNER_SIZE);
3899                assert_eq!(front_spine.first(), None);
3900            }
3901        });
3902
3903        input.iter().rev().for_each(|item| {
3904            if *item > 0 {
3905                assert_eq!(
3906                    back_spine.get_index(back_spine.len() - 1),
3907                    back_spine.last()
3908                );
3909                assert_eq!(
3910                    back_spine.pop_last().unwrap() - 1,
3911                    *back_spine.last().unwrap()
3912                );
3913            } else {
3914                assert_eq!(back_spine.pop_last(), Some(0));
3915                assert_eq!(back_spine.last(), None);
3916            }
3917        });
3918    }
3919
3920    #[test]
3921    fn test_map_get() {
3922        let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).map(|i| (i, i)));
3923
3924        assert_eq!(btree.len(), DEFAULT_INNER_SIZE * 10);
3925
3926        for item in 0..DEFAULT_INNER_SIZE * 10 {
3927            assert_eq!(btree.get(&item), Some(&item));
3928        }
3929    }
3930
3931    #[test]
3932    fn test_get_contains_lower_bound() {
3933        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3934        let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3935
3936        let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3937            acc.insert(curr.clone());
3938            acc
3939        });
3940
3941        expected_output.into_iter().for_each(|item| {
3942            assert_eq!(*btree.get_index(item).unwrap(), item);
3943            assert_eq!(
3944                *btree.get_index(item).unwrap(),
3945                *btree.lower_bound(&item).unwrap()
3946            );
3947            assert!(btree.contains(&item));
3948        });
3949    }
3950
3951    #[test]
3952    fn test_iter() {
3953        let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3954        assert_eq!(btree.inner.len(), 19);
3955        let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
3956        let actual_forward = Vec::from_iter(btree.iter().cloned());
3957        assert_eq!(expected_forward, actual_forward);
3958        let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3959        let actual_backward = Vec::from_iter(btree.iter().cloned().rev());
3960        assert_eq!(expected_backward, actual_backward);
3961    }
3962
3963    #[test]
3964    fn test_iter_mut() {
3965        let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
3966        assert_eq!(btree.set.inner.len(), 19);
3967        let expected_forward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate());
3968        btree
3969            .clone()
3970            .iter_mut()
3971            .zip(expected_forward)
3972            .for_each(|(lhs, rhs)| {
3973                assert_eq!(*lhs.0, rhs.0);
3974                assert_eq!(*lhs.1, rhs.1);
3975            });
3976
3977        let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
3978        btree
3979            .clone()
3980            .iter_mut()
3981            .rev()
3982            .zip(expected_backward)
3983            .for_each(|(lhs, rhs)| {
3984                assert_eq!(*lhs.0, rhs.0);
3985                assert_eq!(*lhs.1, rhs.1);
3986            });
3987    }
3988
3989    #[test]
3990    fn test_into_iter() {
3991        let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3992        assert_eq!(btree.inner.len(), 19);
3993        let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
3994        let actual_forward = Vec::from_iter(btree.clone().into_iter());
3995        assert_eq!(expected_forward, actual_forward);
3996        let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3997        let actual_backward = Vec::from_iter(btree.into_iter().rev());
3998        assert_eq!(expected_backward, actual_backward);
3999    }
4000
4001    #[test]
4002    fn test_range() {
4003        let btree = BTreeSet::from_iter(0..10);
4004        let first_to_second: Vec<usize> = (1..2).collect();
4005        let three_til_end: Vec<usize> = (3..10).collect();
4006        let start_til_four: Vec<usize> = (0..4).collect();
4007        let start_til_end: Vec<usize> = (0..10).collect();
4008        let five_til_six_included: Vec<usize> = (5..=6).collect();
4009        let start_til_seven_included: Vec<usize> = (0..=7).collect();
4010        assert_eq!(
4011            Vec::from_iter(btree.range_idx(..).cloned()),
4012            Vec::from_iter(btree.iter().cloned())
4013        );
4014        assert_eq!(
4015            Vec::from_iter(btree.range_idx(0..).cloned()),
4016            Vec::from_iter(btree.iter().cloned())
4017        );
4018        assert_eq!(
4019            Vec::from_iter(btree.range_idx(0..10).cloned()),
4020            Vec::from_iter(btree.iter().cloned())
4021        );
4022        assert_eq!(
4023            Vec::from_iter(btree.range_idx(..10).cloned()),
4024            Vec::from_iter(btree.iter().cloned())
4025        );
4026        assert_eq!(
4027            Vec::from_iter(btree.range_idx(1..2).cloned()),
4028            first_to_second
4029        );
4030        assert_eq!(
4031            Vec::from_iter(btree.range_idx(3..10).cloned()),
4032            three_til_end
4033        );
4034        assert_eq!(
4035            Vec::from_iter(btree.range_idx(0..4).cloned()),
4036            start_til_four
4037        );
4038        assert_eq!(
4039            Vec::from_iter(btree.range_idx(0..10).cloned()),
4040            start_til_end
4041        );
4042        assert_eq!(
4043            Vec::from_iter(btree.range_idx(5..=6).cloned()),
4044            five_til_six_included
4045        );
4046        assert_eq!(
4047            Vec::from_iter(btree.range_idx(0..=7).cloned()),
4048            start_til_seven_included
4049        );
4050    }
4051
4052    #[test]
4053    fn test_range_mut() {
4054        let btree = BTreeMap::from_iter((0..10).into_iter().enumerate());
4055        btree
4056            .clone()
4057            .range_mut_idx(..)
4058            .zip(btree.iter())
4059            .for_each(|(lhs, rhs)| {
4060                assert_eq!(lhs.0, rhs.0);
4061                assert_eq!(lhs.1, rhs.1);
4062            });
4063        btree
4064            .clone()
4065            .range_mut_idx(0..)
4066            .zip(btree.iter())
4067            .for_each(|(lhs, rhs)| {
4068                assert_eq!(lhs.0, rhs.0);
4069                assert_eq!(lhs.1, rhs.1);
4070            });
4071        btree
4072            .clone()
4073            .range_mut_idx(0..10)
4074            .zip(btree.iter())
4075            .for_each(|(lhs, rhs)| {
4076                assert_eq!(lhs.0, rhs.0);
4077                assert_eq!(lhs.1, rhs.1);
4078            });
4079        let first_to_second: Vec<(usize, usize)> = (1..2).map(|x| (x, x)).collect();
4080        let three_til_end: Vec<(usize, usize)> = (3..10).map(|x| (x, x)).collect();
4081        let start_til_four: Vec<(usize, usize)> = (0..4).map(|x| (x, x)).collect();
4082        let start_til_end: Vec<(usize, usize)> = (0..10).map(|x| (x, x)).collect();
4083        let five_til_six_included: Vec<(usize, usize)> = (5..=6).map(|x| (x, x)).collect();
4084        let start_til_seven_included: Vec<(usize, usize)> = (0..=7).map(|x| (x, x)).collect();
4085        btree
4086            .clone()
4087            .range_mut_idx(1..2)
4088            .zip(first_to_second)
4089            .for_each(|(lhs, rhs)| {
4090                assert_eq!(*lhs.0, rhs.0);
4091                assert_eq!(*lhs.1, rhs.1);
4092            });
4093        btree
4094            .clone()
4095            .range_mut_idx(3..10)
4096            .zip(three_til_end)
4097            .for_each(|(lhs, rhs)| {
4098                assert_eq!(*lhs.0, rhs.0);
4099                assert_eq!(*lhs.1, rhs.1);
4100            });
4101        btree
4102            .clone()
4103            .range_mut_idx(0..4)
4104            .zip(start_til_four)
4105            .for_each(|(lhs, rhs)| {
4106                assert_eq!(*lhs.0, rhs.0);
4107                assert_eq!(*lhs.1, rhs.1);
4108            });
4109        btree
4110            .clone()
4111            .range_mut_idx(0..10)
4112            .zip(start_til_end)
4113            .for_each(|(lhs, rhs)| {
4114                assert_eq!(*lhs.0, rhs.0);
4115                assert_eq!(*lhs.1, rhs.1);
4116            });
4117        btree
4118            .clone()
4119            .range_mut_idx(5..=6)
4120            .zip(five_til_six_included)
4121            .for_each(|(lhs, rhs)| {
4122                assert_eq!(*lhs.0, rhs.0);
4123                assert_eq!(*lhs.1, rhs.1);
4124            });
4125        btree
4126            .clone()
4127            .range_mut_idx(0..=7)
4128            .zip(start_til_seven_included)
4129            .for_each(|(lhs, rhs)| {
4130                assert_eq!(*lhs.0, rhs.0);
4131                assert_eq!(*lhs.1, rhs.1);
4132            });
4133    }
4134
4135    #[test]
4136    fn test_non_boolean_set_operations() {
4137        let left_spine = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4138        let right_spine = BTreeSet::from_iter(
4139            ((DEFAULT_INNER_SIZE - 1)..((DEFAULT_INNER_SIZE + 1) * 2)).into_iter(),
4140        );
4141
4142        let mut union = left_spine.clone();
4143        let mut temp_right_spine = right_spine.clone();
4144        union.append(&mut temp_right_spine);
4145
4146        assert_eq!(
4147            Vec::from_iter(union.iter().cloned()),
4148            Vec::from_iter(left_spine.union(&right_spine).cloned())
4149        );
4150        assert_eq!(
4151            Vec::from_iter(union.iter().cloned()),
4152            Vec::from_iter(right_spine.union(&left_spine).cloned()),
4153        );
4154
4155        let left_diff = Vec::from_iter(0..(DEFAULT_INNER_SIZE - 1));
4156        let right_diff = Vec::from_iter((DEFAULT_INNER_SIZE + 1)..((DEFAULT_INNER_SIZE + 1) * 2));
4157
4158        assert_eq!(
4159            left_diff,
4160            Vec::from_iter(left_spine.difference(&right_spine).cloned())
4161        );
4162        assert_eq!(
4163            right_diff,
4164            Vec::from_iter(right_spine.difference(&left_spine).cloned())
4165        );
4166
4167        let intersection = vec![DEFAULT_INNER_SIZE - 1, DEFAULT_INNER_SIZE];
4168        assert_eq!(
4169            intersection,
4170            Vec::from_iter(left_spine.intersection(&right_spine).cloned())
4171        );
4172
4173        let mut sym_diff = left_diff.clone();
4174        sym_diff.append(&mut right_diff.clone());
4175        assert_eq!(
4176            sym_diff,
4177            Vec::from_iter(left_spine.symmetric_difference(&right_spine).cloned())
4178        );
4179        assert_eq!(
4180            sym_diff,
4181            Vec::from_iter(right_spine.symmetric_difference(&left_spine).cloned())
4182        );
4183    }
4184
4185    #[test]
4186    fn test_boolean_set_operations() {
4187        let empty_set: BTreeSet<usize> = BTreeSet::new();
4188        assert!(empty_set.is_empty());
4189        let a = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4190        let b = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 2)).into_iter());
4191        let c =
4192            BTreeSet::from_iter(((DEFAULT_INNER_SIZE + 2)..(DEFAULT_INNER_SIZE + 4)).into_iter());
4193
4194        assert!(a.is_subset(&a));
4195        assert!(a.is_superset(&a));
4196        assert!(a.is_subset(&b));
4197        assert!(!b.is_subset(&a));
4198        assert!(b.is_superset(&a));
4199        assert!(c.is_disjoint(&a));
4200        assert!(c.is_disjoint(&b));
4201        assert!(!a.is_disjoint(&b));
4202        assert!(!b.is_disjoint(&a));
4203    }
4204
4205    #[test]
4206    fn test_split_off() {
4207        let btree: BTreeSet<usize> = BTreeSet::from_iter(0..(DEFAULT_INNER_SIZE * 10));
4208        for split in vec![
4209            1,
4210            (DEFAULT_INNER_SIZE * 3) - 6,
4211            DEFAULT_INNER_SIZE,
4212            DEFAULT_INNER_SIZE + 1,
4213            (DEFAULT_INNER_SIZE * 10) - 1,
4214        ] {
4215            let mut left = btree.clone();
4216            let right = left.split_off(&split);
4217            assert!(left.is_disjoint(&right));
4218            assert!(Vec::from_iter(left.intersection(&right)).is_empty());
4219            let expected_left = Vec::from_iter(0..split);
4220            let expected_right = Vec::from_iter(split..(DEFAULT_INNER_SIZE * 10));
4221
4222            assert_eq!(expected_left, Vec::from_iter(left));
4223            let actual_right = Vec::from_iter(right);
4224            assert_eq!(expected_right, actual_right)
4225        }
4226    }
4227
4228    #[test]
4229    fn test_out_of_bounds_range() {
4230        let btree: BTreeSet<usize> = BTreeSet::from_iter(0..10);
4231        assert_eq!(btree.range((Included(5), Included(10))).count(), 5);
4232        assert_eq!(btree.range((Included(5), Included(11))).count(), 5);
4233        assert_eq!(
4234            btree
4235                .range((Included(5), Included(10 + DEFAULT_INNER_SIZE)))
4236                .count(),
4237            5
4238        );
4239        assert_eq!(btree.range((Included(0), Included(11))).count(), 10);
4240    }
4241
4242    #[test]
4243    fn test_iterating_over_blocks() {
4244        let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 10)).into_iter());
4245        assert_eq!(btree.iter().count(), (0..(DEFAULT_INNER_SIZE + 10)).count());
4246        assert_eq!(
4247            btree.range(0..DEFAULT_INNER_SIZE).count(),
4248            (0..DEFAULT_INNER_SIZE).count()
4249        );
4250        assert_eq!(
4251            btree.range(0..=DEFAULT_INNER_SIZE).count(),
4252            (0..=DEFAULT_INNER_SIZE).count()
4253        );
4254        assert_eq!(
4255            btree.range(0..=DEFAULT_INNER_SIZE + 1).count(),
4256            (0..=DEFAULT_INNER_SIZE + 1).count()
4257        );
4258
4259        assert_eq!(
4260            btree.iter().rev().count(),
4261            (0..(DEFAULT_INNER_SIZE + 10)).count()
4262        );
4263        assert_eq!(
4264            btree.range(0..DEFAULT_INNER_SIZE).rev().count(),
4265            (0..DEFAULT_INNER_SIZE).count()
4266        );
4267        assert_eq!(
4268            btree.range(0..=DEFAULT_INNER_SIZE).rev().count(),
4269            (0..=DEFAULT_INNER_SIZE).count()
4270        );
4271        assert_eq!(
4272            btree.range(0..=DEFAULT_INNER_SIZE + 1).rev().count(),
4273            (0..=DEFAULT_INNER_SIZE + 1).count()
4274        );
4275    }
4276
4277    #[test]
4278    fn test_empty_set() {
4279        let btree: BTreeSet<usize> = BTreeSet::new();
4280        assert_eq!(btree.iter().count(), 0);
4281        assert_eq!(btree.range(0..0).count(), 0);
4282        assert_eq!(btree.range(0..).count(), 0);
4283        assert_eq!(btree.range(..0).count(), 0);
4284        assert_eq!(btree.range(..).count(), 0);
4285        assert_eq!(btree.range(0..=0).count(), 0);
4286        assert_eq!(btree.range(..1).count(), 0);
4287
4288        assert_eq!(btree.iter().rev().count(), 0);
4289        assert_eq!(btree.range(0..0).rev().count(), 0);
4290        assert_eq!(btree.range(..).rev().count(), 0);
4291        assert_eq!(btree.range(..1).rev().count(), 0);
4292
4293        assert_eq!(btree.range(..DEFAULT_INNER_SIZE).count(), 0);
4294        assert_eq!(
4295            btree
4296                .range(DEFAULT_INNER_SIZE..DEFAULT_INNER_SIZE * 2)
4297                .count(),
4298            0
4299        );
4300    }
4301
4302    #[test]
4303    fn test_many_fuzzy_duplicates() {
4304        let mut rng = rand::rngs::StdRng::from_seed([41u8; 32]);
4306        let mut btree = BTreeSet::new();
4307        let n = 100_000;
4308        for _ in 0..n {
4309            let value: u64 = rng.random_range(1..10000);
4310            let lower: u64 = 1650;
4311            let len_before = btree.len();
4312            if btree.insert(value.max(lower)) {
4314                assert_eq!(btree.len(), len_before + 1)
4315            } else {
4316                assert_eq!(btree.len(), len_before);
4317            }
4318        }
4319        let expected = btree.iter().cloned().collect::<Vec<_>>();
4320        assert_eq!(expected.len(), btree.len());
4321        for (i, expected_item) in expected.iter().enumerate() {
4322            if let Some(item) = btree.get_index(i) {
4323                assert_eq!(expected_item, item, "mismatch on index {i}");
4324            } else {
4325                panic!("missing index {i}")
4326            }
4327        }
4328    }
4329}