1#![cfg_attr(not(any(test, feature = "std")), no_std)]
2#[cfg(any(test, feature = "std"))]
7extern crate std;
8
9extern crate alloc;
10
11use alloc::vec;
12use alloc::vec::Vec;
13#[cfg(feature = "concurrent")]
14pub mod concurrent;
15
16#[cfg(feature = "concurrent")]
17pub mod cdc;
18
19pub mod core;
20
21use crate::Entry::{Occupied, Vacant};
22use ::core::borrow::Borrow;
23use ::core::cmp::Ordering;
24use ::core::iter::FusedIterator;
25use ::core::mem::swap;
26use ::core::ops::Bound;
27use ::core::ops::{Index, RangeBounds};
28use core::constants::DEFAULT_INNER_SIZE;
29use core::node::*;
30use core::pair::Pair;
31use ftree::FenwickTree;
32#[cfg(feature = "serde")]
33use serde::{Deserialize, Serialize};
34
35type Node<T> = Vec<T>;
36
37#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
93#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
94pub struct BTreeSet<T>
95where
96 T: Ord,
97{
98 inner: Vec<Node<T>>,
99 index: FenwickTree<usize>,
100 node_capacity: usize,
101 len: usize,
102}
103
104enum NodeEntry {
105 Exist {
106 node_idx: usize,
107 position_within_node: usize,
108 },
109 Empty {
110 node_idx: usize,
111 },
112}
113
114impl<T: Ord> BTreeSet<T> {
115 pub fn new() -> Self {
131 Self { ..Default::default() }
132 }
133 pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
144 Self {
145 inner: vec![Node::with_capacity(maximum_node_size)],
146 node_capacity: maximum_node_size,
147 ..Default::default()
148 }
149 }
150 pub fn clear(&mut self) {
163 self.inner = vec![Node::with_capacity(self.node_capacity)];
164 self.index = FenwickTree::from_iter(vec![0]);
165 self.len = 0;
166 }
167 fn locate_node<Q>(&self, value: &Q) -> usize
168 where
169 T: Borrow<Q>,
170 Q: Ord + ?Sized,
171 {
172 let mut node_idx = self.inner.partition_point(|node| {
173 if let Some(&max) = node.last().as_ref() {
174 return max.borrow() < value;
175 };
176
177 false
178 });
179
180 if self.inner.get(node_idx).is_none() {
185 node_idx = node_idx.saturating_sub(1)
186 }
187
188 node_idx
189 }
190 fn locate_node_cmp<P, Q>(&self, mut cmp: P) -> usize
191 where
192 T: Borrow<Q>,
193 Q: Ord + ?Sized,
194 P: FnMut(&Q) -> bool,
195 {
196 let mut node_idx = self.inner.partition_point(|node| {
197 if let Some(max) = node.last() {
198 return cmp(max.borrow());
199 }
200
201 true
202 });
203
204 if self.inner.get(node_idx).is_none() {
205 node_idx = node_idx.saturating_sub(1)
206 }
207
208 node_idx
209 }
210 fn locate_value<Q>(&self, value: &Q) -> (usize, usize)
211 where
212 T: Borrow<Q>,
213 Q: Ord + ?Sized,
214 {
215 let node_idx = self.locate_node(value);
216 let position_within_node = self.inner[node_idx].partition_point(|item| item.borrow() < value);
217
218 (node_idx, position_within_node)
219 }
220 fn locate_value_cmp<P, Q>(&self, mut cmp: P) -> (usize, usize)
221 where
222 T: Borrow<Q>,
223 Q: Ord + ?Sized,
224 P: FnMut(&Q) -> bool,
225 {
226 let node_idx = self.locate_node_cmp(&mut cmp);
227 let position_within_node = self.inner[node_idx].partition_point(|item| cmp(item.borrow()));
228
229 (node_idx, position_within_node)
230 }
231 fn locate_ith(&self, idx: usize) -> (usize, usize) {
232 let mut node_index = self.index.index_of(idx);
233 let mut offset = 0;
234
235 if node_index != 0 {
236 offset = self.index.prefix_sum(node_index, 0);
237 }
238
239 let mut position_within_node = idx - offset;
240 if let Some(node) = self.inner.get(node_index) {
241 if position_within_node == node.len() {
242 node_index += 1;
243 position_within_node = 0;
244 }
245 }
246
247 (node_index, position_within_node)
248 }
249 pub fn get_index(&self, idx: usize) -> Option<&T> {
266 let (node_idx, position_within_node) = self.locate_ith(idx);
267 if let Some(candidate_node) = self.inner.get(node_idx) {
268 return candidate_node.get(position_within_node);
269 }
270
271 None
272 }
273 fn get_mut_index(&mut self, index: usize) -> Option<&mut T> {
274 let (node_idx, position_within_node) = self.locate_ith(index);
275 if self.inner.get(node_idx).is_some() {
276 return self.inner[node_idx].get_mut(position_within_node);
277 }
278
279 None
280 }
281 pub fn get<Q>(&self, value: &Q) -> Option<&T>
298 where
299 T: Borrow<Q> + Ord,
300 Q: Ord + ?Sized,
301 {
302 let (node_idx, position_within_node) = self.locate_value(value);
303 if let Some(candidate_node) = self.inner.get(node_idx) {
304 return candidate_node.get(position_within_node);
305 }
306
307 None
308 }
309 pub fn lower_bound<Q>(&self, value: &Q) -> Option<&T>
326 where
327 T: Borrow<Q>,
328 Q: Ord + ?Sized,
329 {
330 let (node_idx, position_within_node) = self.locate_value(value);
331 if let Some(candidate_node) = self.inner.get(node_idx) {
332 return candidate_node.get(position_within_node);
333 }
334
335 None
336 }
337 pub fn len(&self) -> usize {
350 self.len
351 }
352 fn insert_at(&mut self, node_idx: usize, value: T) -> bool {
353 if self.inner[node_idx].len() == self.node_capacity {
354 let new_node = self.inner[node_idx].halve();
355 let mut insert_node_idx = node_idx;
356 if value >= new_node[0] {
357 insert_node_idx += 1;
358 }
359
360 self.inner.insert(node_idx + 1, new_node);
361 if NodeLike::insert(&mut self.inner[insert_node_idx], value).0 {
362 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
364 self.len += 1;
365
366 true
367 } else {
368 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
370 false
371 }
372 } else if NodeLike::insert(&mut self.inner[node_idx], value).0 {
373 self.index.add_at(node_idx, 1);
374 self.len += 1;
375
376 true
377 } else {
378 false
379 }
380 }
381 pub fn insert(&mut self, value: T) -> bool {
406 let node_idx = self.locate_node(&value);
407 self.insert_at(node_idx, value)
408 }
409
410 pub fn replace(&mut self, value: T) -> Option<T> {
427 let replaced_element = self.take(&value);
428 self.insert(value);
429
430 replaced_element
431 }
432 pub fn contains<Q>(&self, value: &Q) -> bool
448 where
449 T: Borrow<Q>,
450 Q: Ord + ?Sized,
451 {
452 let (node_idx, position_within_node) = self.locate_value(value);
453 if let Some(candidate_node) = self.inner.get(node_idx) {
454 if let Some(candidate_value) = candidate_node.get(position_within_node) {
455 return value == candidate_value.borrow();
456 }
457 }
458
459 false
460 }
461 fn contains_cmp<P, Q, R>(&self, cmp: P, mut cmp2: R) -> bool
462 where
463 T: Borrow<Q>,
464 Q: Ord + ?Sized,
465 P: FnMut(&Q) -> bool,
466 R: FnMut(&Q) -> bool,
467 {
468 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
469 if let Some(candidate_node) = self.inner.get(node_idx) {
470 if let Some(candidate_value) = candidate_node.get(position_within_node) {
471 return cmp2(candidate_value.borrow());
472 }
473 }
474
475 false
476 }
477 fn delete_at(&mut self, node_idx: usize, position_within_node: usize) -> T {
478 let removal = self.inner[node_idx].remove(position_within_node);
479
480 let mut decrease_length = false;
481 if self.inner[node_idx].is_empty() {
483 if self.inner.len() > 1 {
485 self.inner.remove(node_idx);
486 self.len -= 1;
487 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
488 } else {
489 decrease_length = true;
490 }
491 } else {
492 decrease_length = true;
493 }
494
495 if decrease_length {
496 self.index.sub_at(node_idx, 1);
497 self.len -= 1;
498 }
499
500 removal
501 }
502 fn delete<Q>(&mut self, value: &Q) -> (Option<T>, bool)
503 where
504 T: Borrow<Q>,
505 Q: Ord + ?Sized,
506 {
507 let mut removed = false;
508 let mut removal = None;
509 let (node_idx, position_within_node) = self.locate_value(value);
510 if let Some(candidate_node) = self.inner.get(node_idx) {
511 if let Some(candidate_value) = candidate_node.get(position_within_node) {
512 if value == candidate_value.borrow() {
513 removal = Some(self.delete_at(node_idx, position_within_node));
514 removed = true;
515 }
516 }
517 }
518
519 (removal, removed)
520 }
521
522 fn find_cmp<P, Q, R>(&mut self, cmp: P, mut cmp2: R) -> NodeEntry
523 where
524 T: Borrow<Q>,
525 Q: Ord + ?Sized,
526 P: FnMut(&Q) -> bool,
527 R: FnMut(&Q) -> bool,
528 {
529 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
530 self.inner
531 .get(node_idx)
532 .and_then(|candidate_node| candidate_node.get(position_within_node))
533 .filter(|&candidate_value| cmp2(candidate_value.borrow()))
534 .map(|_| NodeEntry::Exist {
535 node_idx,
536 position_within_node,
537 })
538 .unwrap_or(NodeEntry::Empty { node_idx })
539 }
540
541 fn delete_cmp<P, Q, R>(&mut self, cmp: P, cmp2: R) -> (Option<T>, bool)
542 where
543 T: Borrow<Q>,
544 Q: Ord + ?Sized,
545 P: FnMut(&Q) -> bool,
546 R: FnMut(&Q) -> bool,
547 {
548 let removal = match self.find_cmp(cmp, cmp2) {
549 NodeEntry::Exist {
550 node_idx,
551 position_within_node,
552 } => Some(self.delete_at(node_idx, position_within_node)),
553 NodeEntry::Empty { .. } => None,
554 };
555
556 let removed = removal.is_some();
557
558 (removal, removed)
559 }
560 pub fn remove<Q>(&mut self, value: &Q) -> bool
579 where
580 T: Borrow<Q>,
581 Q: Ord + ?Sized,
582 {
583 self.delete(value).1
584 }
585 pub fn take<Q>(&mut self, value: &Q) -> Option<T>
602 where
603 T: Borrow<Q>,
604 Q: Ord + ?Sized,
605 {
606 self.delete(value).0
607 }
608 pub fn first(&self) -> Option<&T> {
626 if let Some(candidate_node) = self.inner.first() {
627 return candidate_node.first();
628 }
629
630 None
631 }
632 pub fn last(&self) -> Option<&T> {
650 if let Some(candidate_node) = self.inner.last() {
651 if !candidate_node.is_empty() {
652 return candidate_node.last();
653 }
654 }
655
656 None
657 }
658 pub fn pop_first(&mut self) -> Option<T> {
675 let (first_node_idx, first_position_within_node) = (0, 0);
676 if let Some(candidate_node) = self.inner.get(first_node_idx) {
677 if candidate_node.get(first_position_within_node).is_some() {
678 return Some(self.delete_at(first_node_idx, first_position_within_node));
679 }
680 }
681
682 None
683 }
684 pub fn pop_index(&mut self, idx: usize) -> T {
700 let (node_idx, position_within_node) = self.locate_ith(idx);
701
702 self.delete_at(node_idx, position_within_node)
703 }
704 pub fn pop_last(&mut self) -> Option<T> {
721 let last_node_idx = self.inner.len() - 1;
722 let mut last_position_within_node = self.inner[last_node_idx].len();
723 last_position_within_node = last_position_within_node.saturating_sub(1);
724
725 if let Some(candidate_node) = self.inner.get(last_node_idx) {
726 if candidate_node.get(last_position_within_node).is_some() {
727 return Some(self.delete_at(last_node_idx, last_position_within_node));
728 }
729 }
730
731 None
732 }
733 pub fn is_empty(&self) -> bool {
746 self.len() == 0
747 }
748 pub fn is_subset(&self, other: &Self) -> bool {
766 if self.difference(other).next().is_some() {
767 return false;
768 }
769
770 true
771 }
772 pub fn is_superset(&self, other: &Self) -> bool {
793 if other.difference(self).next().is_some() {
794 return false;
795 }
796
797 true
798 }
799 pub fn is_disjoint(&self, other: &Self) -> bool {
817 if self.intersection(other).next().is_some() {
818 return false;
819 }
820
821 true
822 }
823 pub fn iter(&self) -> Iter<'_, T> {
852 Iter::new(self)
853 }
854 pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
873 Union {
874 merge_iter: MergeIter {
875 start: true,
876 left_iter: self.iter(),
877 current_left: None,
878 right_iter: other.iter(),
879 current_right: None,
880 },
881 }
882 }
883 pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T> {
904 Difference {
905 merge_iter: MergeIter {
906 start: true,
907 left_iter: self.iter(),
908 current_left: None,
909 right_iter: other.iter(),
910 current_right: None,
911 },
912 }
913 }
914 pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T> {
935 SymmetricDifference {
936 merge_iter: MergeIter {
937 start: true,
938 left_iter: self.iter(),
939 current_left: None,
940 right_iter: other.iter(),
941 current_right: None,
942 },
943 }
944 }
945 pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
966 Intersection {
967 merge_iter: MergeIter {
968 start: true,
969 left_iter: self.iter(),
970 current_left: None,
971 right_iter: other.iter(),
972 current_right: None,
973 },
974 }
975 }
976 pub fn retain<F, Q>(&mut self, mut f: F)
992 where
993 T: Borrow<Q>,
994 Q: Ord + ?Sized,
995 F: FnMut(&Q) -> bool,
996 {
997 let mut positions_to_delete = vec![];
998 for (node_idx, node) in self.inner.iter().enumerate() {
999 for (position_within_node, item) in node.iter().enumerate() {
1000 if !f(item.borrow()) {
1001 positions_to_delete.push((node_idx, position_within_node));
1002 }
1003 }
1004 }
1005 positions_to_delete.reverse();
1006
1007 positions_to_delete
1008 .into_iter()
1009 .for_each(|(node_idx, position_within_node)| {
1010 self.delete_at(node_idx, position_within_node);
1011 })
1012 }
1013 fn split_off_cmp<P, Q>(&mut self, cmp: P) -> Self
1014 where
1015 T: Borrow<Q>,
1016 Q: Ord + ?Sized,
1017 P: FnMut(&Q) -> bool,
1018 {
1019 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
1020 let first_node = self.inner[node_idx].split_off(position_within_node);
1021 let mut remaining_nodes = vec![];
1022 while self.inner.len() > node_idx + 1 {
1023 remaining_nodes.push(self.inner.pop().unwrap());
1024 }
1025 remaining_nodes.reverse();
1026 remaining_nodes.insert(0, first_node);
1027 let mut latter_half = BTreeSet::default();
1028 latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
1029 latter_half.inner = remaining_nodes;
1030 latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
1031
1032 if self.inner[node_idx].is_empty() && self.inner.len() > 1 {
1033 self.inner.remove(node_idx);
1034 }
1035
1036 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
1037 self.len = self.inner.iter().map(|node| node.len()).sum();
1038
1039 latter_half
1040 }
1041 pub fn split_off<Q>(&mut self, value: &Q) -> Self
1071 where
1072 T: Borrow<Q>,
1073 Q: Ord + ?Sized,
1074 {
1075 let (node_idx, position_within_node) = self.locate_value(value);
1076 let first_node = self.inner[node_idx].split_off(position_within_node);
1077 let mut remaining_nodes = vec![];
1078 while self.inner.len() > node_idx + 1 {
1079 remaining_nodes.push(self.inner.pop().unwrap());
1080 }
1081 remaining_nodes.reverse();
1082 remaining_nodes.insert(0, first_node);
1083 let mut latter_half = BTreeSet::default();
1084 latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
1085 latter_half.inner = remaining_nodes;
1086 latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
1087
1088 if self.inner[node_idx].is_empty() && self.inner.len() > 1 {
1089 self.inner.remove(node_idx);
1090 }
1091
1092 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
1093 self.len = self.inner.iter().map(|node| node.len()).sum();
1094
1095 latter_half
1096 }
1097 pub fn append(&mut self, other: &mut Self) {
1126 while let Some(value) = other.pop_first() {
1127 self.replace(value);
1128 }
1129 }
1130 fn resolve_range<R>(&self, range: R) -> ((usize, usize, usize), (usize, usize, usize))
1131 where
1132 R: RangeBounds<usize>,
1133 {
1134 let mut global_front_idx: usize = 0;
1135 let mut global_back_idx: usize = self.index.prefix_sum(self.inner.len(), 0).saturating_sub(1);
1136
1137 let start = range.start_bound();
1139 match start {
1140 Bound::Included(bound) => {
1141 global_front_idx = *bound;
1142 }
1143 Bound::Excluded(bound) => {
1144 global_front_idx = *bound + 1;
1145 }
1146 Bound::Unbounded => (),
1147 }
1148
1149 let end = range.end_bound();
1150 match end {
1151 Bound::Included(bound) => {
1152 global_back_idx = *bound;
1153 }
1154 Bound::Excluded(bound) => {
1155 global_back_idx = *bound - 1;
1156 }
1157 Bound::Unbounded => (),
1158 }
1159 let (front_node_idx, front_start_idx) = self.locate_ith(global_front_idx);
1161 let (back_node_idx, back_start_idx) = self.locate_ith(global_back_idx);
1162
1163 (
1164 (global_front_idx, front_node_idx, front_start_idx),
1165 (global_back_idx, back_node_idx, back_start_idx),
1166 )
1167 }
1168 pub fn range<R, Q>(&self, range: R) -> Range<'_, T>
1196 where
1197 Q: Ord + ?Sized,
1198 T: Borrow<Q>,
1199 R: RangeBounds<Q>,
1200 {
1201 let start_idx = match range.start_bound() {
1202 Bound::Included(bound) => self.rank(bound),
1203 Bound::Excluded(bound) => self.rank(bound) + 1,
1204 Bound::Unbounded => 0,
1205 };
1206 let end_idx = match range.end_bound() {
1207 Bound::Included(bound) => self.rank(bound),
1208 Bound::Excluded(bound) => self.rank(bound).saturating_sub(1),
1209 Bound::Unbounded => self.len().saturating_sub(1),
1210 };
1211
1212 self.range_idx(start_idx..=end_idx)
1213 }
1214 pub fn rank<Q>(&self, value: &Q) -> usize
1233 where
1234 Q: Ord + ?Sized,
1235 T: Borrow<Q>,
1236 {
1237 let (node_idx, position_within_node) = self.locate_value(value);
1238
1239 let offset = self.index.prefix_sum(node_idx, 0);
1240
1241 offset + position_within_node
1242 }
1243 fn rank_cmp<Q, P>(&self, cmp: P) -> usize
1244 where
1245 T: Borrow<Q>,
1246 Q: Ord + ?Sized,
1247 P: FnMut(&Q) -> bool,
1248 {
1249 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
1250
1251 let offset = self.index.prefix_sum(node_idx, 0);
1252
1253 offset + position_within_node
1254 }
1255 pub fn range_idx<R>(&self, range: R) -> Range<'_, T>
1256 where
1257 R: RangeBounds<usize>,
1258 {
1259 let ((global_front_idx, front_node_idx, front_start_idx), (global_back_idx, back_node_idx, back_start_idx)) =
1260 self.resolve_range(range);
1261
1262 let front_iter = if front_node_idx < self.inner.len() {
1263 Some(self.inner[front_node_idx][front_start_idx..].iter())
1264 } else {
1265 None
1266 };
1267
1268 let back_iter = if back_node_idx < self.inner.len() {
1269 Some(self.inner[back_node_idx][..=back_start_idx].iter())
1270 } else {
1271 None
1272 };
1273
1274 Range {
1275 spine_iter: Iter {
1276 btree: self,
1277 current_front_node_idx: front_node_idx,
1278 current_front_idx: global_front_idx,
1279 current_back_node_idx: back_node_idx,
1280 current_back_idx: global_back_idx + 1,
1281 current_front_iterator: front_iter,
1282 current_back_iterator: back_iter,
1283 },
1284 }
1285 }
1286}
1287
1288impl<T> FromIterator<T> for BTreeSet<T>
1289where
1290 T: Ord,
1291{
1292 fn from_iter<K: IntoIterator<Item = T>>(iter: K) -> Self {
1293 let mut btree = BTreeSet::new();
1294 iter.into_iter().for_each(|item| {
1295 btree.insert(item);
1296 });
1297
1298 btree
1299 }
1300}
1301
1302impl<T, const N: usize> From<[T; N]> for BTreeSet<T>
1303where
1304 T: Ord,
1305{
1306 fn from(value: [T; N]) -> Self {
1307 let mut btree: BTreeSet<T> = Default::default();
1308
1309 value.into_iter().for_each(|item| {
1310 btree.insert(item);
1311 });
1312
1313 btree
1314 }
1315}
1316
1317impl<T> Default for BTreeSet<T>
1318where
1319 T: Ord,
1320{
1321 fn default() -> Self {
1322 let node_capacity = DEFAULT_INNER_SIZE;
1323
1324 Self {
1325 inner: vec![Node::with_capacity(node_capacity)],
1326 index: FenwickTree::from_iter(vec![0]),
1327 node_capacity,
1328 len: 0,
1329 }
1330 }
1331}
1332
1333pub struct Iter<'a, T>
1340where
1341 T: Ord,
1342{
1343 btree: &'a BTreeSet<T>,
1344 current_front_node_idx: usize,
1345 current_front_idx: usize,
1346 current_back_node_idx: usize,
1347 current_back_idx: usize,
1348 current_front_iterator: Option<::core::slice::Iter<'a, T>>,
1349 current_back_iterator: Option<::core::slice::Iter<'a, T>>,
1350}
1351
1352impl<'a, T> Iter<'a, T>
1353where
1354 T: Ord,
1355{
1356 pub fn new(btree: &'a BTreeSet<T>) -> Self {
1357 Self {
1358 btree,
1359 current_front_node_idx: 0,
1360 current_front_idx: 0,
1361 current_back_node_idx: btree.inner.len() - 1,
1362 current_back_idx: btree.len(),
1363 current_front_iterator: Some(btree.inner[0].iter()),
1364 current_back_iterator: Some(btree.inner[btree.inner.len() - 1].iter()),
1365 }
1366 }
1367}
1368
1369impl<'a, T> Iterator for Iter<'a, T>
1370where
1371 T: Ord,
1372{
1373 type Item = &'a T;
1374
1375 fn next(&mut self) -> Option<Self::Item> {
1376 if self.current_front_idx == self.current_back_idx {
1377 return None;
1378 }
1379 if let Some(value) = self.current_front_iterator.as_mut().and_then(|i| i.next()) {
1380 self.current_front_idx += 1;
1381 Some(value)
1382 } else {
1383 self.current_front_node_idx += 1;
1384 if self.current_front_node_idx >= self.btree.inner.len() {
1385 return None;
1386 }
1387 self.current_front_iterator = Some(self.btree.inner[self.current_front_node_idx].iter());
1388
1389 self.next()
1390 }
1391 }
1392}
1393
1394impl<'a, T> DoubleEndedIterator for Iter<'a, T>
1395where
1396 T: Ord,
1397{
1398 fn next_back(&mut self) -> Option<Self::Item> {
1399 if self.current_front_idx == self.current_back_idx {
1400 return None;
1401 }
1402 if let Some(value) = self.current_back_iterator.as_mut().and_then(|i| i.next_back()) {
1403 self.current_back_idx -= 1;
1404 Some(value)
1405 } else {
1406 if self.current_back_node_idx == 0 {
1407 return None;
1408 };
1409 self.current_back_node_idx -= 1;
1410 self.current_back_iterator = Some(self.btree.inner[self.current_back_node_idx].iter());
1411
1412 self.next_back()
1413 }
1414 }
1415}
1416
1417impl<'a, T> FusedIterator for Iter<'a, T> where T: Ord {}
1418
1419impl<'a, T> IntoIterator for &'a BTreeSet<T>
1420where
1421 T: Ord,
1422{
1423 type Item = &'a T;
1424
1425 type IntoIter = Iter<'a, T>;
1426
1427 fn into_iter(self) -> Self::IntoIter {
1428 Iter::new(self)
1429 }
1430}
1431
1432pub struct IntoIter<T>
1439where
1440 T: Ord,
1441{
1442 btree: BTreeSet<T>,
1443}
1444
1445impl<T> Iterator for IntoIter<T>
1446where
1447 T: Ord,
1448{
1449 type Item = T;
1450
1451 fn next(&mut self) -> Option<Self::Item> {
1452 self.btree.pop_first()
1453 }
1454}
1455
1456impl<T> DoubleEndedIterator for IntoIter<T>
1457where
1458 T: Ord,
1459{
1460 fn next_back(&mut self) -> Option<Self::Item> {
1461 self.btree.pop_last()
1462 }
1463}
1464
1465impl<T> FusedIterator for IntoIter<T> where T: Ord {}
1466
1467impl<T> IntoIterator for BTreeSet<T>
1468where
1469 T: Ord,
1470{
1471 type Item = T;
1472
1473 type IntoIter = IntoIter<T>;
1474
1475 fn into_iter(self) -> Self::IntoIter {
1476 IntoIter { btree: self }
1478 }
1479}
1480
1481struct MergeIter<'a, T>
1482where
1483 T: Ord,
1484{
1485 start: bool,
1486 left_iter: Iter<'a, T>,
1487 current_left: Option<&'a T>,
1488 right_iter: Iter<'a, T>,
1489 current_right: Option<&'a T>,
1490}
1491
1492impl<'a, T> Iterator for MergeIter<'a, T>
1493where
1494 T: Ord,
1495{
1496 type Item = (Option<&'a T>, Option<&'a T>);
1497 fn next(&mut self) -> Option<Self::Item> {
1498 if !self.start {
1499 if let Some(left) = self.current_left {
1500 if let Some(right) = self.current_right {
1501 match left.cmp(right) {
1502 Ordering::Less => {
1503 self.current_left = self.left_iter.next();
1504 }
1505 Ordering::Equal => {
1506 self.current_left = self.left_iter.next();
1507 self.current_right = self.right_iter.next();
1508 }
1509 Ordering::Greater => {
1510 self.current_right = self.right_iter.next();
1511 }
1512 }
1513 } else {
1514 self.current_left = self.left_iter.next();
1515 }
1516 } else if self.current_right.is_some() {
1517 self.current_right = self.right_iter.next();
1518 } else {
1519 return None;
1520 }
1521 } else {
1522 self.current_left = self.left_iter.next();
1523 self.current_right = self.right_iter.next();
1524 self.start = false;
1525 }
1526
1527 Some((self.current_left, self.current_right))
1528 }
1529}
1530
1531pub struct Union<'a, T>
1538where
1539 T: Ord,
1540{
1541 merge_iter: MergeIter<'a, T>,
1542}
1543
1544impl<'a, T> Iterator for Union<'a, T>
1545where
1546 T: Ord,
1547{
1548 type Item = &'a T;
1549
1550 fn next(&mut self) -> Option<Self::Item> {
1551 if let Some((current_left, current_right)) = self.merge_iter.next() {
1552 return match (current_left, current_right) {
1553 (Some(left), Some(right)) => {
1554 if right < left {
1555 Some(right)
1556 } else {
1557 Some(left)
1558 }
1559 }
1560 (Some(left), None) => Some(left),
1561 (None, Some(right)) => Some(right),
1562 (None, None) => None,
1563 };
1564 }
1565
1566 None
1567 }
1568}
1569
1570impl<'a, T> FusedIterator for Union<'a, T> where T: Ord {}
1571
1572pub struct Difference<'a, T>
1579where
1580 T: Ord,
1581{
1582 merge_iter: MergeIter<'a, T>,
1583}
1584
1585impl<'a, T> Iterator for Difference<'a, T>
1586where
1587 T: Ord,
1588{
1589 type Item = &'a T;
1590
1591 fn next(&mut self) -> Option<Self::Item> {
1592 loop {
1593 return if let Some((current_left, current_right)) = self.merge_iter.next() {
1594 match (current_left, current_right) {
1595 (Some(left), Some(right)) => {
1596 if left < right {
1597 Some(left)
1598 } else {
1599 continue;
1600 }
1601 }
1602 (Some(left), None) => Some(left),
1603 (None, _) => None,
1604 }
1605 } else {
1606 None
1607 };
1608 }
1609 }
1610}
1611
1612impl<'a, T> FusedIterator for Difference<'a, T> where T: Ord {}
1613
1614pub struct SymmetricDifference<'a, T>
1621where
1622 T: Ord,
1623{
1624 merge_iter: MergeIter<'a, T>,
1625}
1626
1627impl<'a, T> Iterator for SymmetricDifference<'a, T>
1628where
1629 T: Ord,
1630{
1631 type Item = &'a T;
1632
1633 fn next(&mut self) -> Option<Self::Item> {
1634 loop {
1635 return if let Some((current_left, current_right)) = self.merge_iter.next() {
1636 match (current_left, current_right) {
1637 (Some(left), Some(right)) => {
1638 if left < right {
1639 Some(left)
1640 } else if right < left {
1641 Some(right)
1642 } else {
1643 continue;
1644 }
1645 }
1646 (Some(left), None) => Some(left),
1647 (None, Some(right)) => Some(right),
1648 (None, _) => None,
1649 }
1650 } else {
1651 None
1652 };
1653 }
1654 }
1655}
1656
1657impl<'a, T> FusedIterator for SymmetricDifference<'a, T> where T: Ord {}
1658
1659pub struct Intersection<'a, T>
1666where
1667 T: Ord,
1668{
1669 merge_iter: MergeIter<'a, T>,
1670}
1671
1672impl<'a, T> Iterator for Intersection<'a, T>
1673where
1674 T: Ord,
1675{
1676 type Item = &'a T;
1677
1678 fn next(&mut self) -> Option<Self::Item> {
1679 loop {
1680 if let Some((current_left, current_right)) = self.merge_iter.next() {
1681 match (current_left, current_right) {
1682 (Some(left), Some(right)) => {
1683 if left == right {
1684 return Some(left);
1685 } else {
1686 continue;
1687 }
1688 }
1689 (None, _) | (_, None) => return None,
1690 }
1691 } else {
1692 return None;
1693 }
1694 }
1695 }
1696}
1697
1698impl<'a, T> FusedIterator for Intersection<'a, T> where T: Ord {}
1699
1700pub struct Range<'a, T>
1707where
1708 T: Ord,
1709{
1710 spine_iter: Iter<'a, T>,
1711}
1712
1713impl<'a, T> Iterator for Range<'a, T>
1714where
1715 T: Ord,
1716{
1717 type Item = &'a T;
1718
1719 fn next(&mut self) -> Option<Self::Item> {
1720 self.spine_iter.next()
1721 }
1722}
1723
1724impl<'a, T> DoubleEndedIterator for Range<'a, T>
1725where
1726 T: Ord,
1727{
1728 fn next_back(&mut self) -> Option<Self::Item> {
1729 self.spine_iter.next_back()
1730 }
1731}
1732
1733impl<'a, T> FusedIterator for Range<'a, T> where T: Ord {}
1734
1735impl<T> Index<usize> for BTreeSet<T>
1736where
1737 T: Ord,
1738{
1739 type Output = T;
1740
1741 fn index(&self, index: usize) -> &Self::Output {
1742 self.get_index(index).unwrap()
1743 }
1744}
1745
1746pub struct VacantEntry<'a, K, V>
1747where
1748 K: Ord,
1749{
1750 map: &'a mut BTreeMap<K, V>,
1751 key: K,
1752}
1753
1754pub struct OccupiedEntry<'a, K, V>
1755where
1756 K: Ord,
1757{
1758 map: &'a mut BTreeMap<K, V>,
1759 idx: usize,
1760}
1761
1762pub enum Entry<'a, K, V>
1763where
1764 K: 'a + Ord,
1765 V: 'a,
1766{
1767 Vacant(VacantEntry<'a, K, V>),
1768 Occupied(OccupiedEntry<'a, K, V>),
1769}
1770
1771impl<'a, K, V> Entry<'a, K, V>
1772where
1773 K: 'a + Ord,
1774 V: 'a,
1775{
1776 pub fn or_insert(self, default: V) -> &'a mut V {
1777 match self {
1778 Vacant(entry) => entry.insert(default),
1779 Occupied(entry) => entry.into_mut(),
1780 }
1781 }
1782 pub fn or_insert_with<F>(self, default: F) -> &'a mut V
1783 where
1784 F: FnOnce() -> V,
1785 {
1786 match self {
1787 Vacant(entry) => entry.insert(default()),
1788 Occupied(entry) => entry.into_mut(),
1789 }
1790 }
1791 pub fn or_insert_with_key<F>(self, default: F) -> &'a mut V
1792 where
1793 F: FnOnce(&K) -> V,
1794 {
1795 match self {
1796 Vacant(entry) => {
1797 let value = default(entry.key());
1798 entry.insert(value)
1799 }
1800 Occupied(entry) => entry.into_mut(),
1801 }
1802 }
1803 pub fn key(&self) -> &K {
1804 match *self {
1805 Occupied(ref entry) => entry.key(),
1806 Vacant(ref entry) => entry.key(),
1807 }
1808 }
1809 pub fn and_modify<F>(self, f: F) -> Self
1810 where
1811 F: FnOnce(&mut V),
1812 {
1813 match self {
1814 Occupied(mut entry) => {
1815 f(entry.get_mut());
1816 Occupied(entry)
1817 }
1818 Vacant(entry) => Vacant(entry),
1819 }
1820 }
1821 pub fn or_default(self) -> &'a mut V
1822 where
1823 V: Default,
1824 {
1825 match self {
1826 Occupied(entry) => entry.into_mut(),
1827 Vacant(entry) => entry.insert(Default::default()),
1828 }
1829 }
1830}
1831
1832impl<'a, K, V> OccupiedEntry<'a, K, V>
1833where
1834 K: Ord,
1835{
1836 pub fn key(&self) -> &K {
1837 &self.map.set.get_index(self.idx).unwrap().key
1838 }
1839 pub fn remove_entry(self) -> (K, V) {
1840 self.map.pop_index(self.idx)
1841 }
1842 pub fn get(&self) -> &V {
1843 self.map.get_index(self.idx).unwrap().1
1844 }
1845 pub fn get_mut(&mut self) -> &mut V {
1846 self.map.get_mut_index(self.idx).unwrap()
1847 }
1848 pub fn into_mut(self) -> &'a mut V {
1849 self.map.get_mut_index(self.idx).unwrap()
1850 }
1851 pub fn insert(&mut self, value: V) -> V {
1852 let current_value = self.map.get_mut_index(self.idx).unwrap();
1853 let mut previous_value = value;
1854 swap(&mut previous_value, current_value);
1855
1856 previous_value
1857 }
1858 pub fn remove(self) -> V {
1859 self.map.pop_index(self.idx).1
1860 }
1861}
1862
1863impl<'a, K, V> VacantEntry<'a, K, V>
1864where
1865 K: Ord,
1866{
1867 pub fn key(&self) -> &K {
1868 &self.key
1869 }
1870 pub fn into_key(self) -> K {
1871 self.key
1872 }
1873 pub fn insert(self, value: V) -> &'a mut V {
1874 let rank = self.map.set.rank_cmp(|item: &Pair<K, V>| item.key < self.key);
1875 self.map.insert(self.key, value);
1876
1877 self.map.get_mut_index(rank).unwrap()
1878 }
1879}
1880
1881#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1969#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
1970pub struct BTreeMap<K, V>
1971where
1972 K: Ord,
1973{
1974 set: BTreeSet<Pair<K, V>>,
1975}
1976
1977impl<K: Ord, V> Default for BTreeMap<K, V>
1978where
1979 K: Ord,
1980{
1981 fn default() -> Self {
1982 Self {
1983 set: BTreeSet::default(),
1984 }
1985 }
1986}
1987
1988impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V>
1989where
1990 K: Ord,
1991{
1992 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
1993 let mut btree = BTreeMap::new();
1994 iter.into_iter().for_each(|item| {
1995 btree.insert(item.0, item.1);
1996 });
1997
1998 btree
1999 }
2000}
2001
2002impl<K: Ord, V> BTreeMap<K, V>
2003where
2004 K: Ord,
2005{
2006 pub fn append(&mut self, other: &mut Self) {
2038 self.set.append(&mut other.set)
2039 }
2040 pub fn clear(&mut self) {
2055 self.set.clear()
2056 }
2057 pub fn contains_key<Q>(&self, key: &Q) -> bool
2075 where
2076 K: Borrow<Q> + Ord,
2077 Q: Ord + ?Sized,
2078 {
2079 self.set.contains_cmp(
2080 |item: &Pair<K, V>| item.key.borrow() < key,
2081 |item| item.key.borrow() == key,
2082 )
2083 }
2084 pub fn first_key_value(&self) -> Option<(&K, &V)> {
2101 let popping = self.set.first();
2102 if let Some(pop) = popping {
2103 return Some((&pop.key, &pop.value));
2104 }
2105
2106 None
2107 }
2108 pub fn get<Q>(&self, key: &Q) -> Option<&V>
2126 where
2127 K: Borrow<Q> + Ord,
2128 Q: Ord + ?Sized,
2129 {
2130 if let Some(key_value) = self.get_key_value(key) {
2131 return Some(key_value.1);
2132 }
2133
2134 None
2135 }
2136 pub fn get_index(&self, idx: usize) -> Option<(&K, &V)> {
2150 let ith = self.set.get_index(idx);
2151 if let Some(entry) = ith {
2152 return Some((&entry.key, &entry.value));
2153 }
2154
2155 None
2156 }
2157 pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&K, &V)>
2173 where
2174 K: Borrow<Q> + Ord,
2175 Q: Ord + ?Sized,
2176 {
2177 let node_idx = self.set.locate_node_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2178 let candidate_node = self.set.inner.get(node_idx)?;
2179 let position = crate::core::node::search_by(candidate_node, |candidate| {
2180 <K as Borrow<Q>>::borrow(&candidate.key).cmp(key)
2181 })
2182 .ok()?;
2183 let candidate = &candidate_node[position];
2184 Some((&candidate.key, &candidate.value))
2185 }
2186 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
2206 where
2207 K: Borrow<Q> + Ord,
2208 Q: Ord,
2209 {
2210 let (node_idx, position_within_node) = self.set.locate_value_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2211 if self.set.inner.get(node_idx).is_some() && self.set.inner[node_idx].get(position_within_node).is_some() {
2212 let entry = self.set.inner[node_idx].get_mut(position_within_node)?;
2213 if key == entry.key.borrow() {
2214 return Some(&mut entry.value);
2215 }
2216 }
2217
2218 None
2219 }
2220 pub fn get_mut_index(&mut self, index: usize) -> Option<&mut V> {
2237 if let Some(entry) = self.set.get_mut_index(index) {
2238 return Some(&mut entry.value);
2239 }
2240
2241 None
2242 }
2243 pub fn insert(&mut self, key: K, mut value: V) -> Option<V> {
2270 let cmp = |item: &Pair<K, V>| item.key < key;
2271 let cmp2 = |item: &Pair<K, V>| item.key == key;
2272
2273 match self.set.find_cmp(cmp, cmp2) {
2274 NodeEntry::Exist {
2275 node_idx,
2276 position_within_node,
2277 } => {
2278 ::core::mem::swap(&mut self.set.inner[node_idx][position_within_node].value, &mut value);
2279 Some(value)
2280 }
2281 NodeEntry::Empty { node_idx } => {
2282 self.set.insert_at(node_idx, Pair { key, value });
2283 None
2284 }
2285 }
2286 }
2287 pub fn into_keys(self) -> IntoKeys<K, V> {
2304 IntoKeys {
2305 inner: self.into_iter(),
2306 }
2307 }
2308 pub fn into_values(self) -> IntoValues<K, V> {
2325 IntoValues {
2326 inner: self.into_iter(),
2327 }
2328 }
2329 pub fn is_empty(&self) -> bool {
2344 self.set.is_empty()
2345 }
2346 pub fn iter(&self) -> IterMap<'_, K, V> {
2368 IterMap { inner: self.set.iter() }
2369 }
2370 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
2393 let last_node_idx = self.set.inner.len() - 1;
2394 let len = self.set.len();
2395
2396 if self.set.inner.len() == 1 {
2398 let mut inner = self.set.inner.iter_mut();
2401 let node = inner.next().unwrap();
2402 let front_iter = node.iter_mut();
2403 let back_iter = [].iter_mut();
2406
2407 return IterMut {
2408 inner,
2409 current_front_node_idx: 0,
2410 current_front_idx: 0,
2411 current_back_node_idx: 0, current_back_idx: len.wrapping_sub(1),
2413 current_front_iterator: front_iter,
2414 current_back_iterator: back_iter,
2415 };
2416 }
2417
2418 let mut inner = self.set.inner.iter_mut();
2420 let front_iter = if let Some(node) = inner.next() {
2421 node.iter_mut()
2422 } else {
2423 [].iter_mut()
2424 };
2425 let back_iter = if let Some(node) = inner.next_back() {
2426 node.iter_mut()
2427 } else {
2428 [].iter_mut()
2429 };
2430
2431 IterMut {
2432 inner,
2433 current_front_node_idx: 0,
2434 current_front_idx: 0,
2435 current_back_node_idx: last_node_idx,
2436 current_back_idx: len.wrapping_sub(1),
2437 current_front_iterator: front_iter,
2438 current_back_iterator: back_iter,
2439 }
2440 }
2441 pub fn keys(&self) -> Keys<'_, K, V> {
2458 Keys { inner: self.set.iter() }
2459 }
2460 pub fn last_key_value(&self) -> Option<(&K, &V)> {
2476 let popping = self.set.last();
2477 if let Some(pop) = popping {
2478 return Some((&pop.key, &pop.value));
2479 }
2480
2481 None
2482 }
2483 pub fn len(&self) -> usize {
2498 self.set.len()
2499 }
2500 pub fn new() -> Self {
2517 Self { ..Default::default() }
2518 }
2519 pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
2530 Self {
2531 set: BTreeSet::with_maximum_node_size(maximum_node_size),
2532 }
2533 }
2534 pub fn pop_first(&mut self) -> Option<(K, V)> {
2553 let popping = self.set.pop_first();
2554 if let Some(pop) = popping {
2555 return Some((pop.key, pop.value));
2556 }
2557
2558 None
2559 }
2560 pub fn pop_index(&mut self, index: usize) -> (K, V) {
2576 let popping = self.set.pop_index(index);
2577
2578 (popping.key, popping.value)
2579 }
2580 pub fn pop_last(&mut self) -> Option<(K, V)> {
2599 let popping = self.set.pop_last();
2600 if let Some(pop) = popping {
2601 return Some((pop.key, pop.value));
2602 }
2603
2604 None
2605 }
2606 pub fn range<Q, R>(&self, range: R) -> RangeMap<'_, K, V>
2636 where
2637 Q: Ord + ?Sized,
2638 K: Borrow<Q>,
2639 R: RangeBounds<Q>,
2640 {
2641 let (start_idx, end_idx) = self.range_to_idx(range);
2642
2643 RangeMap {
2644 inner: self.set.range_idx(start_idx..=end_idx),
2645 }
2646 }
2647 pub fn range_idx<R>(&self, range: R) -> RangeMap<'_, K, V>
2648 where
2649 R: RangeBounds<usize>,
2650 {
2651 RangeMap {
2652 inner: self.set.range_idx(range),
2653 }
2654 }
2655 fn range_to_idx<Q, R>(&self, range: R) -> (usize, usize)
2656 where
2657 Q: Ord + ?Sized,
2658 K: Borrow<Q>,
2659 R: RangeBounds<Q>,
2660 {
2661 let start_idx = match range.start_bound() {
2662 Bound::Included(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2663 Bound::Excluded(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() <= bound),
2664 Bound::Unbounded => 0,
2665 };
2666 let end_idx = match range.end_bound() {
2667 Bound::Included(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2668 Bound::Excluded(bound) => {
2669 let rank = self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound);
2670 if rank == 0 {
2671 return (1, 0);
2673 }
2674 rank - 1
2675 }
2676 Bound::Unbounded => {
2677 if self.is_empty() {
2678 return (1, 0);
2680 }
2681 self.len() - 1
2682 }
2683 };
2684
2685 (start_idx, end_idx)
2686 }
2687 pub fn range_mut<Q, R>(&mut self, range: R) -> RangeMut<'_, K, V>
2716 where
2717 Q: Ord + ?Sized,
2718 K: Borrow<Q>,
2719 R: RangeBounds<Q>,
2720 {
2721 let (start_idx, end_idx) = self.range_to_idx(range);
2722
2723 self.range_mut_idx(start_idx..=end_idx)
2724 }
2725 pub fn range_mut_idx<R>(&mut self, range: R) -> RangeMut<'_, K, V>
2726 where
2727 R: RangeBounds<usize>,
2728 {
2729 let ((global_front_idx, front_node_idx, front_start_idx), (global_back_idx, back_node_idx, back_start_idx)) =
2730 self.set.resolve_range(range);
2731 let end = self.set.inner[back_node_idx].len();
2732
2733 let mut inner = self.set.inner.iter_mut();
2734
2735 let mut front_iter = {
2736 if let Some(node) = inner.nth(front_node_idx) {
2737 node.iter_mut()
2738 } else {
2739 [].iter_mut()
2740 }
2741 };
2742
2743 let mut back_iter = {
2744 if let Some(node) = inner.nth(back_node_idx - front_node_idx) {
2745 node.iter_mut()
2746 } else {
2747 [].iter_mut()
2748 }
2749 };
2750
2751 for _ in 0..front_start_idx {
2752 front_iter.next();
2753 }
2754 let offset = back_node_idx - front_node_idx;
2755 if offset > 0 {
2756 for _ in back_start_idx..end {
2757 back_iter.next_back();
2758 }
2759 } else {
2760 for _ in back_start_idx..end {
2761 front_iter.next_back();
2762 }
2763 }
2764
2765 RangeMut {
2766 inner: IterMut {
2767 inner,
2768 current_front_node_idx: front_node_idx,
2769 current_front_idx: global_front_idx,
2770 current_back_node_idx: back_node_idx,
2771 current_back_idx: global_back_idx,
2772 current_front_iterator: front_iter,
2773 current_back_iterator: back_iter,
2774 },
2775 }
2776 }
2777 pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
2796 where
2797 K: Borrow<Q> + Ord,
2798 Q: Ord + ?Sized,
2799 {
2800 let old_entry = self.set.delete_cmp(
2801 |item: &Pair<K, V>| item.key.borrow() < key,
2802 |item: &Pair<K, V>| item.key.borrow() == key,
2803 );
2804
2805 if old_entry.1 {
2806 return Some(old_entry.0?.value);
2807 }
2808
2809 None
2810 }
2811 pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
2830 where
2831 K: Borrow<Q> + Ord,
2832 Q: Ord,
2833 {
2834 let old_entry = self.set.delete_cmp(
2835 |item: &Pair<K, V>| item.key.borrow() < key,
2836 |item| item.key.borrow() == key,
2837 );
2838
2839 if old_entry.1 {
2840 let key_value = old_entry.0?;
2841 return Some((key_value.key, key_value.value));
2842 }
2843
2844 None
2845 }
2846 pub fn retain<F, Q>(&mut self, mut f: F)
2862 where
2863 K: Borrow<Q> + Ord,
2864 Q: Ord,
2865 F: FnMut(&Q, &mut V) -> bool,
2866 {
2867 let mut positions_to_delete = vec![];
2868 for (node_idx, node) in self.set.inner.iter_mut().enumerate() {
2869 for (position_within_node, item) in node.iter_mut().enumerate() {
2870 if !f(item.key.borrow(), &mut item.value) {
2871 positions_to_delete.push((node_idx, position_within_node));
2872 }
2873 }
2874 }
2875
2876 positions_to_delete.reverse();
2877
2878 positions_to_delete
2879 .into_iter()
2880 .for_each(|(node_idx, position_within_node)| {
2881 self.set.delete_at(node_idx, position_within_node);
2882 })
2883 }
2884 pub fn split_off<Q>(&mut self, key: &Q) -> Self
2914 where
2915 K: Borrow<Q> + Ord,
2916 Q: Ord,
2917 {
2918 BTreeMap {
2919 set: self.set.split_off_cmp(|item: &Pair<K, V>| item.key.borrow() < key),
2920 }
2921 }
2922 pub fn values(&self) -> Values<'_, K, V> {
2939 Values { inner: self.set.iter() }
2940 }
2941 pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
2963 ValuesMut { inner: self.iter_mut() }
2964 }
2965 pub fn entry(&mut self, key: K) -> Entry<'_, K, V>
2986 where
2987 K: Ord,
2988 {
2989 if self.contains_key(&key) {
2990 let idx = self.set.rank_cmp(|item: &Pair<K, V>| item.key < key);
2991 return Occupied(OccupiedEntry { map: self, idx });
2992 }
2993
2994 Vacant(VacantEntry { map: self, key })
2995 }
2996 pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
3016 where
3017 K: Ord,
3018 {
3019 if !self.is_empty() {
3020 return Some(OccupiedEntry { map: self, idx: 0 });
3021 }
3022
3023 None
3024 }
3025 pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
3045 where
3046 K: Ord,
3047 {
3048 let len = self.len();
3049 if len > 0 {
3050 return Some(OccupiedEntry {
3051 map: self,
3052 idx: len - 1,
3053 });
3054 }
3055
3056 None
3057 }
3058 pub fn lower_bound<Q>(&self, bound: Bound<&Q>) -> CursorMap<'_, K, V>
3084 where
3085 K: Borrow<Q> + Ord,
3086 Q: Ord,
3087 {
3088 let start_idx = match bound {
3089 Bound::Included(start) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start),
3090 Bound::Excluded(start) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start) + 1,
3091 Bound::Unbounded => 0,
3092 };
3093
3094 CursorMap {
3095 cursor: Cursor {
3096 set: &self.set,
3097 idx: start_idx,
3098 },
3099 }
3100 }
3101 pub fn rank<Q>(&self, value: &Q) -> usize
3120 where
3121 Q: Ord + ?Sized,
3122 K: Borrow<Q>,
3123 {
3124 self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < value)
3125 }
3126}
3127
3128impl<K, V, const N: usize> From<[(K, V); N]> for BTreeMap<K, V>
3129where
3130 K: Ord,
3131{
3132 fn from(value: [(K, V); N]) -> Self {
3133 let mut btree: BTreeMap<K, V> = Default::default();
3134
3135 value.into_iter().for_each(|(key, value)| {
3136 btree.insert(key, value);
3137 });
3138
3139 btree
3140 }
3141}
3142
3143impl<K, V> IntoIterator for BTreeMap<K, V>
3144where
3145 K: Ord,
3146{
3147 type Item = (K, V);
3148 type IntoIter = IntoIterMap<K, V>;
3149
3150 fn into_iter(self) -> Self::IntoIter {
3151 IntoIterMap {
3152 inner: self.set.into_iter(),
3153 }
3154 }
3155}
3156
3157impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V>
3158where
3159 K: Ord,
3160{
3161 type Item = (&'a K, &'a V);
3162
3163 type IntoIter = IterMap<'a, K, V>;
3164
3165 fn into_iter(self) -> Self::IntoIter {
3166 IterMap { inner: self.set.iter() }
3167 }
3168}
3169
3170pub struct IterMap<'a, K, V>
3177where
3178 K: Ord,
3179{
3180 inner: Iter<'a, Pair<K, V>>,
3181}
3182
3183impl<'a, K, V> Iterator for IterMap<'a, K, V>
3184where
3185 K: Ord,
3186{
3187 type Item = (&'a K, &'a V);
3188
3189 fn next(&mut self) -> Option<Self::Item> {
3190 if let Some(entry) = self.inner.next() {
3191 return Some((&entry.key, &entry.value));
3192 }
3193
3194 None
3195 }
3196}
3197
3198impl<'a, K, V> DoubleEndedIterator for IterMap<'a, K, V>
3199where
3200 K: Ord,
3201{
3202 fn next_back(&mut self) -> Option<Self::Item> {
3203 if let Some(entry) = self.inner.next_back() {
3204 return Some((&entry.key, &entry.value));
3205 }
3206
3207 None
3208 }
3209}
3210
3211impl<'a, K, V> FusedIterator for IterMap<'a, K, V> where K: Ord {}
3212
3213pub struct IntoIterMap<K, V>
3220where
3221 K: Ord,
3222{
3223 inner: IntoIter<Pair<K, V>>,
3224}
3225
3226impl<K, V> Iterator for IntoIterMap<K, V>
3227where
3228 K: Ord,
3229{
3230 type Item = (K, V);
3231
3232 fn next(&mut self) -> Option<Self::Item> {
3233 if let Some(entry) = self.inner.next() {
3234 return Some((entry.key, entry.value));
3235 }
3236
3237 None
3238 }
3239}
3240
3241impl<K, V> DoubleEndedIterator for IntoIterMap<K, V>
3242where
3243 K: Ord,
3244{
3245 fn next_back(&mut self) -> Option<Self::Item> {
3246 if let Some(entry) = self.inner.next_back() {
3247 return Some((entry.key, entry.value));
3248 }
3249
3250 None
3251 }
3252}
3253
3254impl<K, V> FusedIterator for IntoIterMap<K, V> where K: Ord {}
3255
3256pub struct IntoKeys<K, V>
3263where
3264 K: Ord,
3265{
3266 inner: IntoIterMap<K, V>,
3267}
3268
3269impl<K, V> Iterator for IntoKeys<K, V>
3270where
3271 K: Ord,
3272{
3273 type Item = K;
3274
3275 fn next(&mut self) -> Option<Self::Item> {
3276 if let Some(entry) = self.inner.next() {
3277 return Some(entry.0);
3278 }
3279
3280 None
3281 }
3282}
3283
3284impl<K, V> DoubleEndedIterator for IntoKeys<K, V>
3285where
3286 K: Ord,
3287{
3288 fn next_back(&mut self) -> Option<Self::Item> {
3289 if let Some(entry) = self.inner.next_back() {
3290 return Some(entry.0);
3291 }
3292
3293 None
3294 }
3295}
3296
3297impl<K, V> FusedIterator for IntoKeys<K, V> where K: Ord {}
3298
3299pub struct IntoValues<K, V>
3306where
3307 K: Ord,
3308{
3309 inner: IntoIterMap<K, V>,
3310}
3311
3312impl<K, V> Iterator for IntoValues<K, V>
3313where
3314 K: Ord,
3315{
3316 type Item = V;
3317
3318 fn next(&mut self) -> Option<Self::Item> {
3319 if let Some(entry) = self.inner.next() {
3320 return Some(entry.1);
3321 }
3322
3323 None
3324 }
3325}
3326
3327impl<K, V> DoubleEndedIterator for IntoValues<K, V>
3328where
3329 K: Ord,
3330{
3331 fn next_back(&mut self) -> Option<Self::Item> {
3332 if let Some(entry) = self.inner.next_back() {
3333 return Some(entry.1);
3334 }
3335
3336 None
3337 }
3338}
3339
3340impl<K, V> FusedIterator for IntoValues<K, V> where K: Ord {}
3341
3342pub struct RangeMap<'a, K, V>
3349where
3350 K: Ord,
3351{
3352 inner: Range<'a, Pair<K, V>>,
3353}
3354
3355impl<'a, K, V> Iterator for RangeMap<'a, K, V>
3356where
3357 K: Ord,
3358{
3359 type Item = (&'a K, &'a V);
3360
3361 fn next(&mut self) -> Option<Self::Item> {
3362 if let Some(entry) = self.inner.next() {
3363 return Some((&entry.key, &entry.value));
3364 }
3365
3366 None
3367 }
3368}
3369
3370impl<'a, K, V> DoubleEndedIterator for RangeMap<'a, K, V>
3371where
3372 K: Ord,
3373{
3374 fn next_back(&mut self) -> Option<Self::Item> {
3375 if let Some(entry) = self.inner.next_back() {
3376 return Some((&entry.key, &entry.value));
3377 }
3378
3379 None
3380 }
3381}
3382
3383impl<'a, K, V> FusedIterator for RangeMap<'a, K, V> where K: Ord {}
3384
3385pub struct Values<'a, K, V>
3392where
3393 K: Ord,
3394{
3395 inner: Iter<'a, Pair<K, V>>,
3396}
3397
3398impl<'a, K, V> Iterator for Values<'a, K, V>
3399where
3400 K: Ord,
3401{
3402 type Item = &'a V;
3403
3404 fn next(&mut self) -> Option<Self::Item> {
3405 if let Some(entry) = self.inner.next() {
3406 return Some(&entry.value);
3407 }
3408
3409 None
3410 }
3411}
3412
3413impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V>
3414where
3415 K: Ord,
3416{
3417 fn next_back(&mut self) -> Option<Self::Item> {
3418 if let Some(entry) = self.inner.next_back() {
3419 return Some(&entry.value);
3420 }
3421
3422 None
3423 }
3424}
3425
3426impl<'a, K, V> FusedIterator for Values<'a, K, V> where K: Ord {}
3427
3428pub struct Keys<'a, K, V>
3435where
3436 K: Ord,
3437{
3438 inner: Iter<'a, Pair<K, V>>,
3439}
3440
3441impl<'a, K, V> Iterator for Keys<'a, K, V>
3442where
3443 K: Ord,
3444{
3445 type Item = &'a K;
3446
3447 fn next(&mut self) -> Option<Self::Item> {
3448 if let Some(entry) = self.inner.next() {
3449 return Some(&entry.key);
3450 }
3451
3452 None
3453 }
3454}
3455
3456impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V>
3457where
3458 K: Ord,
3459{
3460 fn next_back(&mut self) -> Option<Self::Item> {
3461 if let Some(entry) = self.inner.next_back() {
3462 return Some(&entry.key);
3463 }
3464
3465 None
3466 }
3467}
3468
3469impl<'a, K, V> FusedIterator for Keys<'a, K, V> where K: Ord {}
3470
3471pub struct IterMut<'a, K: 'a, V: 'a>
3478where
3479 K: Ord,
3480{
3481 inner: ::core::slice::IterMut<'a, Node<Pair<K, V>>>,
3482 current_front_node_idx: usize,
3483 current_front_idx: usize,
3484 current_back_node_idx: usize,
3485 current_back_idx: usize,
3486 current_front_iterator: ::core::slice::IterMut<'a, Pair<K, V>>,
3487 current_back_iterator: ::core::slice::IterMut<'a, Pair<K, V>>,
3488}
3489
3490impl<'a, K, V> Iterator for IterMut<'a, K, V>
3491where
3492 K: Ord,
3493{
3494 type Item = (&'a K, &'a mut V);
3495
3496 fn next(&mut self) -> Option<Self::Item> {
3497 if self.current_front_idx == self.current_back_idx.wrapping_add(1) {
3498 return None;
3499 }
3500 if let Some(entry) = self.current_front_iterator.next() {
3501 self.current_front_idx += 1;
3502 return Some((&entry.key, &mut entry.value));
3503 } else {
3504 if self.current_front_node_idx == self.inner.size_hint().0 {
3507 return None;
3508 }
3509 if self.current_front_node_idx == self.current_back_node_idx - 1 {
3510 if let Some(entry) = self.current_back_iterator.next() {
3512 self.current_front_idx += 1;
3513 return Some((&entry.key, &mut entry.value));
3514 }
3515 } else {
3516 self.current_front_node_idx += 1;
3518 if let Some(node) = self.inner.next() {
3519 self.current_front_iterator = node.iter_mut();
3520 }
3521
3522 return self.next();
3523 }
3524 };
3525
3526 None
3527 }
3528}
3529
3530impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V>
3531where
3532 K: Ord,
3533{
3534 fn next_back(&mut self) -> Option<Self::Item> {
3535 if self.current_front_idx == self.current_back_idx.wrapping_add(1) {
3536 return None;
3537 }
3538 if let Some(entry) = self.current_back_iterator.next_back() {
3539 self.current_back_idx -= 1;
3540 return Some((&entry.key, &mut entry.value));
3541 } else {
3542 if self.current_back_node_idx == 0 && self.current_front_node_idx != 0 {
3545 return None;
3546 }
3547 if self.current_front_node_idx == self.current_back_node_idx
3549 || self.current_front_node_idx == self.current_back_node_idx - 1
3550 {
3551 if let Some(entry) = self.current_front_iterator.next_back() {
3553 if self.current_back_idx > 0 {
3554 self.current_back_idx -= 1;
3555 }
3556 return Some((&entry.key, &mut entry.value));
3557 }
3558 } else {
3559 self.current_back_node_idx -= 1;
3561 if let Some(node) = self.inner.next_back() {
3562 self.current_back_iterator = node.iter_mut();
3563 }
3564
3565 return self.next_back();
3566 }
3567 };
3568
3569 None
3570 }
3571}
3572
3573impl<'a, K, V> FusedIterator for IterMut<'a, K, V> where K: Ord {}
3574
3575pub struct ValuesMut<'a, K: 'a, V: 'a>
3582where
3583 K: Ord,
3584{
3585 inner: IterMut<'a, K, V>,
3586}
3587
3588impl<'a, K, V> Iterator for ValuesMut<'a, K, V>
3589where
3590 K: Ord,
3591{
3592 type Item = &'a mut V;
3593
3594 fn next(&mut self) -> Option<Self::Item> {
3595 if let Some(entry) = self.inner.next() {
3596 return Some(entry.1);
3597 }
3598
3599 None
3600 }
3601}
3602
3603impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V>
3604where
3605 K: Ord,
3606{
3607 fn next_back(&mut self) -> Option<Self::Item> {
3608 if let Some(entry) = self.inner.next_back() {
3609 return Some(entry.1);
3610 }
3611
3612 None
3613 }
3614}
3615
3616impl<'a, K, V> FusedIterator for ValuesMut<'a, K, V> where K: Ord {}
3617
3618pub struct RangeMut<'a, K: 'a, V: 'a>
3625where
3626 K: Ord,
3627{
3628 inner: IterMut<'a, K, V>,
3629}
3630
3631impl<'a, K, V> Iterator for RangeMut<'a, K, V>
3632where
3633 K: Ord,
3634{
3635 type Item = (&'a K, &'a mut V);
3636
3637 fn next(&mut self) -> Option<Self::Item> {
3638 self.inner.next()
3639 }
3640}
3641
3642impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V>
3643where
3644 K: Ord,
3645{
3646 fn next_back(&mut self) -> Option<Self::Item> {
3647 self.inner.next_back()
3648 }
3649}
3650
3651impl<'a, K, V> FusedIterator for RangeMut<'a, K, V> where K: Ord {}
3652
3653impl<K, Q, V> Index<&Q> for BTreeMap<K, V>
3654where
3655 K: Borrow<Q> + Ord,
3656
3657 Q: Ord + ?Sized,
3658{
3659 type Output = V;
3660
3661 fn index(&self, index: &Q) -> &Self::Output {
3662 self.get(index).unwrap()
3663 }
3664}
3665
3666pub struct Cursor<'a, T>
3667where
3668 T: Ord,
3669{
3670 set: &'a BTreeSet<T>,
3671 idx: usize,
3672}
3673
3674impl<'a, T: Ord> Cursor<'a, T> {
3675 pub fn move_next(&mut self) {
3676 if self.idx == self.set.len() {
3677 self.idx = 0
3678 } else {
3679 self.idx += 1;
3680 }
3681 }
3682 pub fn move_index(&mut self, index: usize) {
3683 self.idx = index
3684 }
3685 pub fn move_prev(&mut self) {
3686 if self.idx == 0 {
3687 self.idx = self.set.len()
3688 } else {
3689 self.idx -= 1;
3690 }
3691 }
3692 pub fn item(&self) -> Option<&'a T> {
3693 self.set.get_index(self.idx)
3694 }
3695 pub fn peek_next(&self) -> Option<&'a T> {
3696 if self.idx == self.set.len() {
3697 return self.set.first();
3698 }
3699
3700 self.set.get_index(self.idx + 1)
3701 }
3702 pub fn peek_index(&self, index: usize) -> Option<&'a T> {
3703 self.set.get_index(index)
3704 }
3705 pub fn peek_prev(&self) -> Option<&'a T> {
3706 if self.idx == 0 {
3707 return None;
3708 }
3709
3710 self.set.get_index(self.idx - 1)
3711 }
3712}
3713
3714pub struct CursorMap<'a, K, V>
3715where
3716 K: 'a + Ord,
3717 V: 'a,
3718{
3719 cursor: Cursor<'a, Pair<K, V>>,
3720}
3721
3722impl<'a, K: Ord, V> CursorMap<'a, K, V> {
3723 pub fn move_next(&mut self) {
3724 self.cursor.move_next()
3725 }
3726 pub fn move_index(&mut self, index: usize) {
3727 self.cursor.move_index(index)
3728 }
3729 pub fn move_prev(&mut self) {
3730 self.cursor.move_prev()
3731 }
3732 pub fn key(&self) -> Option<&'a K> {
3733 if let Some(entry) = self.cursor.item() {
3734 return Some(&entry.key);
3735 }
3736
3737 None
3738 }
3739 pub fn value(&self) -> Option<&'a V> {
3740 if let Some(entry) = self.cursor.item() {
3741 return Some(&entry.value);
3742 }
3743
3744 None
3745 }
3746 pub fn key_value(&self) -> Option<(&'a K, &'a V)> {
3747 if let Some(entry) = self.cursor.item() {
3748 return Some((&entry.key, &entry.value));
3749 }
3750
3751 None
3752 }
3753 pub fn peek_next(&self) -> Option<(&'a K, &'a V)> {
3754 if let Some(entry) = self.cursor.peek_next() {
3755 return Some((&entry.key, &entry.value));
3756 }
3757
3758 None
3759 }
3760 pub fn peek_index(&self, index: usize) -> Option<(&'a K, &'a V)> {
3761 if let Some(entry) = self.cursor.peek_index(index) {
3762 return Some((&entry.key, &entry.value));
3763 }
3764
3765 None
3766 }
3767 pub fn peek_prev(&self) -> Option<(&'a K, &'a V)> {
3768 if let Some(entry) = self.cursor.peek_prev() {
3769 return Some((&entry.key, &entry.value));
3770 }
3771
3772 None
3773 }
3774}
3775
3776#[cfg(test)]
3777mod tests {
3778 use super::core::constants::*;
3779 use super::core::node::*;
3780 use crate::{BTreeMap, BTreeSet, Node};
3781 use rand::{Rng, SeedableRng};
3782 use std::collections::Bound::Included;
3783
3784 #[test]
3785 fn test_insert() {
3786 let input: Vec<isize> = vec![1, 9, 2, 7, 6, 3, 5, 4, 10, 8];
3787
3788 let expected_output: Vec<isize> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3789
3790 let actual_node = input
3791 .iter()
3792 .fold(Node::with_capacity(DEFAULT_INNER_SIZE), |mut acc, curr| {
3793 NodeLike::insert(&mut acc, *curr);
3794 acc
3795 });
3796
3797 let actual_output: Vec<isize> = actual_node.iter().cloned().collect();
3798
3799 assert_eq!(expected_output, actual_output);
3800 assert_eq!(*actual_node.last().unwrap(), 10);
3801 }
3802
3803 #[test]
3804 fn test_halve() {
3805 let mut input: Vec<isize> = vec![];
3806 for item in 0..DEFAULT_INNER_SIZE {
3807 input.push(item.clone() as isize);
3808 }
3809
3810 let mut former_node = Node::with_capacity(DEFAULT_INNER_SIZE);
3811 input.iter().for_each(|item| {
3812 NodeLike::insert(&mut former_node, item.clone());
3813 });
3814 let latter_node = former_node.halve();
3815
3816 let expected_former_output: Vec<isize> = input[0..DEFAULT_CUTOFF].to_vec();
3817 let expected_latter_output: Vec<isize> = input[DEFAULT_CUTOFF..].to_vec();
3818
3819 let actual_former_output: Vec<isize> = former_node.iter().cloned().collect();
3820 let actual_latter_output: Vec<isize> = latter_node.iter().cloned().collect();
3821
3822 assert_eq!(expected_former_output, actual_former_output);
3823 assert_eq!(expected_latter_output, actual_latter_output);
3824 }
3825
3826 #[test]
3827 fn test_insert_btree() {
3828 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3830 let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3831
3832 let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3833 acc.insert(curr);
3834 acc
3835 });
3836 assert!(btree.inner.len() > 1);
3837
3838 let actual_output: Vec<usize> = btree.into_iter().collect();
3839
3840 assert_eq!(expected_output, actual_output);
3841 }
3842
3843 #[test]
3845 fn test_node_size_two_preserves_all_u64_values() {
3846 let mut set = BTreeSet::with_maximum_node_size(2);
3847
3848 for value in 0..10_u64 {
3849 set.insert(value);
3850 }
3851
3852 assert_eq!(set.into_iter().collect::<Vec<_>>(), (0..10).collect::<Vec<_>>());
3853 }
3854
3855 #[test]
3857 fn test_node_size_three_preserves_all_u8_values() {
3858 let mut set = BTreeSet::with_maximum_node_size(3);
3859
3860 for value in 0..20_u8 {
3861 set.insert(value);
3862 }
3863
3864 assert_eq!(set.into_iter().collect::<Vec<_>>(), (0..20).collect::<Vec<_>>());
3865 }
3866
3867 #[test]
3868 fn test_insert_duplicates() {
3869 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1))
3870 .into_iter()
3871 .rev()
3872 .cycle()
3873 .take(DEFAULT_INNER_SIZE * 3)
3874 .collect();
3875 let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3876
3877 let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3878 acc.insert(curr);
3879 acc
3880 });
3881 assert!(btree.inner.len() > 1);
3882
3883 let actual_output: Vec<usize> = btree.into_iter().collect();
3884
3885 assert_eq!(expected_output.len(), actual_output.len());
3886 assert_eq!(expected_output, actual_output);
3887 }
3888
3889 #[test]
3890 fn test_remove() {
3891 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3892
3893 let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3894 acc.insert(curr.clone());
3895 acc
3896 });
3897
3898 input.iter().for_each(|item| {
3899 assert!(btree.remove(item));
3900 });
3901
3902 let actual_output: Vec<usize> = btree.into_iter().collect();
3903 let expected_output: Vec<usize> = vec![];
3904
3905 assert_eq!(expected_output, actual_output);
3906 }
3907
3908 #[test]
3909 fn test_take() {
3910 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3911
3912 let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3913 acc.insert(curr.clone());
3914 acc
3915 });
3916
3917 input.iter().for_each(|item| {
3918 assert_eq!(*item, btree.take(item).unwrap());
3919 });
3920
3921 let actual_output: Vec<usize> = btree.into_iter().collect();
3922 let expected_output: Vec<usize> = vec![];
3923
3924 assert_eq!(expected_output, actual_output);
3925 }
3926
3927 #[test]
3928 fn test_first_last_with_pop() {
3929 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3930
3931 let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3932 acc.insert(curr.clone());
3933 acc
3934 });
3935
3936 let mut front_spine = btree.clone();
3937 let mut back_spine = btree.clone();
3938 btree.iter().for_each(|item| {
3939 if *item < DEFAULT_INNER_SIZE {
3940 assert_eq!(front_spine.get_index(0), front_spine.first());
3941 assert_eq!(front_spine.pop_first().unwrap() + 1, *front_spine.first().unwrap());
3942 } else {
3943 assert_eq!(front_spine.pop_first().unwrap(), DEFAULT_INNER_SIZE);
3944 assert_eq!(front_spine.first(), None);
3945 }
3946 });
3947
3948 input.iter().rev().for_each(|item| {
3949 if *item > 0 {
3950 assert_eq!(back_spine.get_index(back_spine.len() - 1), back_spine.last());
3951 assert_eq!(back_spine.pop_last().unwrap() - 1, *back_spine.last().unwrap());
3952 } else {
3953 assert_eq!(back_spine.pop_last(), Some(0));
3954 assert_eq!(back_spine.last(), None);
3955 }
3956 });
3957 }
3958
3959 #[test]
3960 fn test_map_get() {
3961 let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).map(|i| (i, i)));
3962
3963 assert_eq!(btree.len(), DEFAULT_INNER_SIZE * 10);
3964
3965 for item in 0..DEFAULT_INNER_SIZE * 10 {
3966 assert_eq!(btree.get(&item), Some(&item));
3967 }
3968 }
3969
3970 #[test]
3971 fn test_get_contains_lower_bound() {
3972 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3973 let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3974
3975 let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3976 acc.insert(curr.clone());
3977 acc
3978 });
3979
3980 expected_output.into_iter().for_each(|item| {
3981 assert_eq!(*btree.get_index(item).unwrap(), item);
3982 assert_eq!(*btree.get_index(item).unwrap(), *btree.lower_bound(&item).unwrap());
3983 assert!(btree.contains(&item));
3984 });
3985 }
3986
3987 #[test]
3988 fn test_iter() {
3989 let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3990 assert_eq!(btree.inner.len(), 19);
3991 let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
3992 let actual_forward = Vec::from_iter(btree.iter().cloned());
3993 assert_eq!(expected_forward, actual_forward);
3994 let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3995 let actual_backward = Vec::from_iter(btree.iter().cloned().rev());
3996 assert_eq!(expected_backward, actual_backward);
3997 }
3998
3999 #[test]
4000 fn test_iter_mut() {
4001 let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
4002 assert_eq!(btree.set.inner.len(), 19);
4003 let expected_forward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate());
4004 btree.clone().iter_mut().zip(expected_forward).for_each(|(lhs, rhs)| {
4005 assert_eq!(*lhs.0, rhs.0);
4006 assert_eq!(*lhs.1, rhs.1);
4007 });
4008
4009 let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
4010 btree
4011 .clone()
4012 .iter_mut()
4013 .rev()
4014 .zip(expected_backward)
4015 .for_each(|(lhs, rhs)| {
4016 assert_eq!(*lhs.0, rhs.0);
4017 assert_eq!(*lhs.1, rhs.1);
4018 });
4019 }
4020
4021 #[test]
4022 fn test_into_iter() {
4023 let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
4024 assert_eq!(btree.inner.len(), 19);
4025 let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
4026 let actual_forward = Vec::from_iter(btree.clone().into_iter());
4027 assert_eq!(expected_forward, actual_forward);
4028 let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
4029 let actual_backward = Vec::from_iter(btree.into_iter().rev());
4030 assert_eq!(expected_backward, actual_backward);
4031 }
4032
4033 #[test]
4034 fn test_range() {
4035 let btree = BTreeSet::from_iter(0..10);
4036 let first_to_second: Vec<usize> = (1..2).collect();
4037 let three_til_end: Vec<usize> = (3..10).collect();
4038 let start_til_four: Vec<usize> = (0..4).collect();
4039 let start_til_end: Vec<usize> = (0..10).collect();
4040 let five_til_six_included: Vec<usize> = (5..=6).collect();
4041 let start_til_seven_included: Vec<usize> = (0..=7).collect();
4042 assert_eq!(
4043 Vec::from_iter(btree.range_idx(..).cloned()),
4044 Vec::from_iter(btree.iter().cloned())
4045 );
4046 assert_eq!(
4047 Vec::from_iter(btree.range_idx(0..).cloned()),
4048 Vec::from_iter(btree.iter().cloned())
4049 );
4050 assert_eq!(
4051 Vec::from_iter(btree.range_idx(0..10).cloned()),
4052 Vec::from_iter(btree.iter().cloned())
4053 );
4054 assert_eq!(
4055 Vec::from_iter(btree.range_idx(..10).cloned()),
4056 Vec::from_iter(btree.iter().cloned())
4057 );
4058 assert_eq!(Vec::from_iter(btree.range_idx(1..2).cloned()), first_to_second);
4059 assert_eq!(Vec::from_iter(btree.range_idx(3..10).cloned()), three_til_end);
4060 assert_eq!(Vec::from_iter(btree.range_idx(0..4).cloned()), start_til_four);
4061 assert_eq!(Vec::from_iter(btree.range_idx(0..10).cloned()), start_til_end);
4062 assert_eq!(Vec::from_iter(btree.range_idx(5..=6).cloned()), five_til_six_included);
4063 assert_eq!(
4064 Vec::from_iter(btree.range_idx(0..=7).cloned()),
4065 start_til_seven_included
4066 );
4067 }
4068
4069 #[test]
4070 fn test_range_mut() {
4071 let btree = BTreeMap::from_iter((0..10).into_iter().enumerate());
4072 btree
4073 .clone()
4074 .range_mut_idx(..)
4075 .zip(btree.iter())
4076 .for_each(|(lhs, rhs)| {
4077 assert_eq!(lhs.0, rhs.0);
4078 assert_eq!(lhs.1, rhs.1);
4079 });
4080 btree
4081 .clone()
4082 .range_mut_idx(0..)
4083 .zip(btree.iter())
4084 .for_each(|(lhs, rhs)| {
4085 assert_eq!(lhs.0, rhs.0);
4086 assert_eq!(lhs.1, rhs.1);
4087 });
4088 btree
4089 .clone()
4090 .range_mut_idx(0..10)
4091 .zip(btree.iter())
4092 .for_each(|(lhs, rhs)| {
4093 assert_eq!(lhs.0, rhs.0);
4094 assert_eq!(lhs.1, rhs.1);
4095 });
4096 let first_to_second: Vec<(usize, usize)> = (1..2).map(|x| (x, x)).collect();
4097 let three_til_end: Vec<(usize, usize)> = (3..10).map(|x| (x, x)).collect();
4098 let start_til_four: Vec<(usize, usize)> = (0..4).map(|x| (x, x)).collect();
4099 let start_til_end: Vec<(usize, usize)> = (0..10).map(|x| (x, x)).collect();
4100 let five_til_six_included: Vec<(usize, usize)> = (5..=6).map(|x| (x, x)).collect();
4101 let start_til_seven_included: Vec<(usize, usize)> = (0..=7).map(|x| (x, x)).collect();
4102 btree
4103 .clone()
4104 .range_mut_idx(1..2)
4105 .zip(first_to_second)
4106 .for_each(|(lhs, rhs)| {
4107 assert_eq!(*lhs.0, rhs.0);
4108 assert_eq!(*lhs.1, rhs.1);
4109 });
4110 btree
4111 .clone()
4112 .range_mut_idx(3..10)
4113 .zip(three_til_end)
4114 .for_each(|(lhs, rhs)| {
4115 assert_eq!(*lhs.0, rhs.0);
4116 assert_eq!(*lhs.1, rhs.1);
4117 });
4118 btree
4119 .clone()
4120 .range_mut_idx(0..4)
4121 .zip(start_til_four)
4122 .for_each(|(lhs, rhs)| {
4123 assert_eq!(*lhs.0, rhs.0);
4124 assert_eq!(*lhs.1, rhs.1);
4125 });
4126 btree
4127 .clone()
4128 .range_mut_idx(0..10)
4129 .zip(start_til_end)
4130 .for_each(|(lhs, rhs)| {
4131 assert_eq!(*lhs.0, rhs.0);
4132 assert_eq!(*lhs.1, rhs.1);
4133 });
4134 btree
4135 .clone()
4136 .range_mut_idx(5..=6)
4137 .zip(five_til_six_included)
4138 .for_each(|(lhs, rhs)| {
4139 assert_eq!(*lhs.0, rhs.0);
4140 assert_eq!(*lhs.1, rhs.1);
4141 });
4142 btree
4143 .clone()
4144 .range_mut_idx(0..=7)
4145 .zip(start_til_seven_included)
4146 .for_each(|(lhs, rhs)| {
4147 assert_eq!(*lhs.0, rhs.0);
4148 assert_eq!(*lhs.1, rhs.1);
4149 });
4150 }
4151
4152 #[test]
4153 fn test_non_boolean_set_operations() {
4154 let left_spine = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4155 let right_spine = BTreeSet::from_iter(((DEFAULT_INNER_SIZE - 1)..((DEFAULT_INNER_SIZE + 1) * 2)).into_iter());
4156
4157 let mut union = left_spine.clone();
4158 let mut temp_right_spine = right_spine.clone();
4159 union.append(&mut temp_right_spine);
4160
4161 assert_eq!(
4162 Vec::from_iter(union.iter().cloned()),
4163 Vec::from_iter(left_spine.union(&right_spine).cloned())
4164 );
4165 assert_eq!(
4166 Vec::from_iter(union.iter().cloned()),
4167 Vec::from_iter(right_spine.union(&left_spine).cloned()),
4168 );
4169
4170 let left_diff = Vec::from_iter(0..(DEFAULT_INNER_SIZE - 1));
4171 let right_diff = Vec::from_iter((DEFAULT_INNER_SIZE + 1)..((DEFAULT_INNER_SIZE + 1) * 2));
4172
4173 assert_eq!(left_diff, Vec::from_iter(left_spine.difference(&right_spine).cloned()));
4174 assert_eq!(right_diff, Vec::from_iter(right_spine.difference(&left_spine).cloned()));
4175
4176 let intersection = vec![DEFAULT_INNER_SIZE - 1, DEFAULT_INNER_SIZE];
4177 assert_eq!(
4178 intersection,
4179 Vec::from_iter(left_spine.intersection(&right_spine).cloned())
4180 );
4181
4182 let mut sym_diff = left_diff.clone();
4183 sym_diff.append(&mut right_diff.clone());
4184 assert_eq!(
4185 sym_diff,
4186 Vec::from_iter(left_spine.symmetric_difference(&right_spine).cloned())
4187 );
4188 assert_eq!(
4189 sym_diff,
4190 Vec::from_iter(right_spine.symmetric_difference(&left_spine).cloned())
4191 );
4192 }
4193
4194 #[test]
4195 fn test_boolean_set_operations() {
4196 let empty_set: BTreeSet<usize> = BTreeSet::new();
4197 assert!(empty_set.is_empty());
4198 let a = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4199 let b = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 2)).into_iter());
4200 let c = BTreeSet::from_iter(((DEFAULT_INNER_SIZE + 2)..(DEFAULT_INNER_SIZE + 4)).into_iter());
4201
4202 assert!(a.is_subset(&a));
4203 assert!(a.is_superset(&a));
4204 assert!(a.is_subset(&b));
4205 assert!(!b.is_subset(&a));
4206 assert!(b.is_superset(&a));
4207 assert!(c.is_disjoint(&a));
4208 assert!(c.is_disjoint(&b));
4209 assert!(!a.is_disjoint(&b));
4210 assert!(!b.is_disjoint(&a));
4211 }
4212
4213 #[test]
4214 fn test_split_off() {
4215 let btree: BTreeSet<usize> = BTreeSet::from_iter(0..(DEFAULT_INNER_SIZE * 10));
4216 for split in vec![
4217 1,
4218 (DEFAULT_INNER_SIZE * 3) - 6,
4219 DEFAULT_INNER_SIZE,
4220 DEFAULT_INNER_SIZE + 1,
4221 (DEFAULT_INNER_SIZE * 10) - 1,
4222 ] {
4223 let mut left = btree.clone();
4224 let right = left.split_off(&split);
4225 assert!(left.is_disjoint(&right));
4226 assert!(Vec::from_iter(left.intersection(&right)).is_empty());
4227 let expected_left = Vec::from_iter(0..split);
4228 let expected_right = Vec::from_iter(split..(DEFAULT_INNER_SIZE * 10));
4229
4230 assert_eq!(expected_left, Vec::from_iter(left));
4231 let actual_right = Vec::from_iter(right);
4232 assert_eq!(expected_right, actual_right)
4233 }
4234 }
4235
4236 #[test]
4237 fn test_out_of_bounds_range() {
4238 let btree: BTreeSet<usize> = BTreeSet::from_iter(0..10);
4239 assert_eq!(btree.range((Included(5), Included(10))).count(), 5);
4240 assert_eq!(btree.range((Included(5), Included(11))).count(), 5);
4241 assert_eq!(btree.range((Included(5), Included(10 + DEFAULT_INNER_SIZE))).count(), 5);
4242 assert_eq!(btree.range((Included(0), Included(11))).count(), 10);
4243 }
4244
4245 #[test]
4246 fn test_iterating_over_blocks() {
4247 let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 10)).into_iter());
4248 assert_eq!(btree.iter().count(), (0..(DEFAULT_INNER_SIZE + 10)).count());
4249 assert_eq!(
4250 btree.range(0..DEFAULT_INNER_SIZE).count(),
4251 (0..DEFAULT_INNER_SIZE).count()
4252 );
4253 assert_eq!(
4254 btree.range(0..=DEFAULT_INNER_SIZE).count(),
4255 (0..=DEFAULT_INNER_SIZE).count()
4256 );
4257 assert_eq!(
4258 btree.range(0..=DEFAULT_INNER_SIZE + 1).count(),
4259 (0..=DEFAULT_INNER_SIZE + 1).count()
4260 );
4261
4262 assert_eq!(btree.iter().rev().count(), (0..(DEFAULT_INNER_SIZE + 10)).count());
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!(btree.range(DEFAULT_INNER_SIZE..DEFAULT_INNER_SIZE * 2).count(), 0);
4295 }
4296
4297 #[test]
4298 fn test_map() {
4299 let mut btree: BTreeMap<usize, usize> = BTreeMap::new();
4300 assert_eq!(btree.iter().count(), 0);
4301 assert_eq!(btree.iter_mut().count(), 0);
4302
4303 btree.insert(123, 456);
4304 assert_eq!(btree.iter().count(), 1);
4305 assert_eq!(btree.iter_mut().count(), 1);
4306
4307 btree.insert(7, 8);
4308 assert_eq!(btree.iter().count(), 2);
4309 assert_eq!(btree.iter_mut().count(), 2);
4310 }
4311
4312 #[test]
4313 fn test_many_fuzzy_duplicates() {
4314 let mut rng = rand::rngs::StdRng::from_seed([41u8; 32]);
4316 let mut btree = BTreeSet::new();
4317 let n = 100_000;
4318 for _ in 0..n {
4319 let value: u64 = rng.random_range(1..10000);
4320 let lower: u64 = 1650;
4321 let len_before = btree.len();
4322 if btree.insert(value.max(lower)) {
4324 assert_eq!(btree.len(), len_before + 1)
4325 } else {
4326 assert_eq!(btree.len(), len_before);
4327 }
4328 }
4329 let expected = btree.iter().cloned().collect::<Vec<_>>();
4330 assert_eq!(expected.len(), btree.len());
4331 for (i, expected_item) in expected.iter().enumerate() {
4332 if let Some(item) = btree.get_index(i) {
4333 assert_eq!(expected_item, item, "mismatch on index {i}");
4334 } else {
4335 panic!("missing index {i}")
4336 }
4337 }
4338 }
4339
4340 #[test]
4341 fn test_iter_mut_rev() {
4342 let mut map = BTreeMap::<i64, i64>::new();
4343 map.insert(1, 10);
4344 map.insert(2, 20);
4345 map.insert(3, 30);
4346
4347 let expected_forward = vec![(1, 10), (2, 20), (3, 30)];
4348 for (i, (k, v)) in map.iter_mut().enumerate() {
4349 assert_eq!(*k, expected_forward[i].0);
4350 assert_eq!(*v, expected_forward[i].1);
4351 }
4352
4353 let expected_backward = vec![(3, 30), (2, 20), (1, 10)];
4354 for (i, (k, v)) in map.iter_mut().rev().enumerate() {
4355 assert_eq!(*k, expected_backward[i].0);
4356 assert_eq!(*v, expected_backward[i].1);
4357 }
4358 }
4359
4360 #[test] fn test_indexset_btreemap_overflow_bug() {
4362 let mut map = BTreeMap::new();
4366
4367 map.insert(vec![1, 2, 3, 4], 1);
4369 map.insert(vec![1, 2, 3, 7], 2);
4370 map.insert(vec![1, 2, 4, 5], 3);
4371 let end_key = vec![1, 2, 3, 4];
4372
4373 let mut range_iter = map.range(..end_key).rev();
4374
4375 let result = range_iter.next();
4376
4377 assert!(result.is_none(), "Expected None when ranging before first key");
4380 }
4381
4382 use std::collections::Bound;
4383 use std::ops::RangeBounds;
4384
4385 pub struct RangeFromExcluding<'a, T> {
4386 pub(crate) from: &'a T,
4387 }
4388
4389 impl<T> RangeBounds<T> for RangeFromExcluding<'_, T> {
4390 fn start_bound(&self) -> Bound<&T> {
4391 Bound::Excluded(self.from)
4392 }
4393
4394 fn end_bound(&self) -> Bound<&T> {
4395 Bound::Unbounded
4396 }
4397 }
4398
4399 #[test]
4400 fn test_range_from_excluding_bug() {
4401 let mut map = BTreeMap::new();
4402 map.insert(vec![1, 2, 3, 4], 1);
4403 map.insert(vec![1, 2, 3, 7], 2);
4404 map.insert(vec![1, 2, 4, 5], 3);
4405
4406 let non_existing_key = vec![1, 2, 3, 6];
4409 let range = RangeFromExcluding {
4410 from: &non_existing_key,
4411 };
4412 let result = map.range(range).next().unwrap();
4413
4414 assert_eq!(
4415 result.0,
4416 &vec![1, 2, 3, 7],
4417 "RangeFromExcluding skips entries incorrectly"
4418 );
4419 assert_eq!(*result.1, 2);
4420 }
4421
4422 #[test]
4423 fn uuid_key_test() {
4424 let mut map = BTreeMap::new();
4425
4426 map.insert(uuid::uuid!("019c34bf-47c0-7df1-9d46-522cec0dd95f"), 1);
4427
4428 let out = map.get_mut(&uuid::uuid!("019c34bf-47c0-7df1-9d46-52013234139b"));
4429 assert!(out.is_none());
4430 }
4431}