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
92enum NodeEntry {
93 Exist {
94 node_idx: usize,
95 position_within_node: usize,
96 },
97 Empty {
98 node_idx: usize,
99 },
100}
101
102impl<T: Ord> BTreeSet<T> {
103 pub fn new() -> Self {
119 Self { ..Default::default() }
120 }
121 pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
132 Self {
133 inner: vec![Node::with_capacity(maximum_node_size)],
134 node_capacity: maximum_node_size,
135 ..Default::default()
136 }
137 }
138 pub fn clear(&mut self) {
151 self.inner = vec![Node::with_capacity(self.node_capacity)];
152 self.index = FenwickTree::from_iter(vec![0]);
153 self.len = 0;
154 }
155 fn locate_node<Q>(&self, value: &Q) -> usize
156 where
157 T: Borrow<Q>,
158 Q: Ord + ?Sized,
159 {
160 let mut node_idx = self.inner.partition_point(|node| {
161 if let Some(&max) = node.last().as_ref() {
162 return max.borrow() < value;
163 };
164
165 false
166 });
167
168 if self.inner.get(node_idx).is_none() {
173 node_idx = node_idx.saturating_sub(1)
174 }
175
176 node_idx
177 }
178 fn locate_node_cmp<P, Q>(&self, mut cmp: P) -> usize
179 where
180 T: Borrow<Q>,
181 Q: Ord + ?Sized,
182 P: FnMut(&Q) -> bool,
183 {
184 let mut node_idx = self.inner.partition_point(|node| {
185 if let Some(max) = node.last() {
186 return cmp(max.borrow());
187 }
188
189 true
190 });
191
192 if self.inner.get(node_idx).is_none() {
193 node_idx = node_idx.saturating_sub(1)
194 }
195
196 node_idx
197 }
198 fn locate_value<Q>(&self, value: &Q) -> (usize, usize)
199 where
200 T: Borrow<Q>,
201 Q: Ord + ?Sized,
202 {
203 let node_idx = self.locate_node(value);
204 let position_within_node = self.inner[node_idx].partition_point(|item| item.borrow() < value);
205
206 (node_idx, position_within_node)
207 }
208 fn locate_value_cmp<P, Q>(&self, mut cmp: P) -> (usize, usize)
209 where
210 T: Borrow<Q>,
211 Q: Ord + ?Sized,
212 P: FnMut(&Q) -> bool,
213 {
214 let node_idx = self.locate_node_cmp(&mut cmp);
215 let position_within_node = self.inner[node_idx].partition_point(|item| cmp(item.borrow()));
216
217 (node_idx, position_within_node)
218 }
219 fn locate_ith(&self, idx: usize) -> (usize, usize) {
220 let mut node_index = self.index.index_of(idx);
221 let mut offset = 0;
222
223 if node_index != 0 {
224 offset = self.index.prefix_sum(node_index, 0);
225 }
226
227 let mut position_within_node = idx - offset;
228 if let Some(node) = self.inner.get(node_index) {
229 if position_within_node == node.len() {
230 node_index += 1;
231 position_within_node = 0;
232 }
233 }
234
235 (node_index, position_within_node)
236 }
237 pub fn get_index(&self, idx: usize) -> Option<&T> {
254 let (node_idx, position_within_node) = self.locate_ith(idx);
255 if let Some(candidate_node) = self.inner.get(node_idx) {
256 return candidate_node.get(position_within_node);
257 }
258
259 None
260 }
261 fn get_mut_index(&mut self, index: usize) -> Option<&mut T> {
262 let (node_idx, position_within_node) = self.locate_ith(index);
263 if self.inner.get(node_idx).is_some() {
264 return self.inner[node_idx].get_mut(position_within_node);
265 }
266
267 None
268 }
269 pub fn get<Q>(&self, value: &Q) -> Option<&T>
286 where
287 T: Borrow<Q> + Ord,
288 Q: Ord + ?Sized,
289 {
290 let (node_idx, position_within_node) = self.locate_value(value);
291 if let Some(candidate_node) = self.inner.get(node_idx) {
292 return candidate_node.get(position_within_node);
293 }
294
295 None
296 }
297 pub fn lower_bound<Q>(&self, value: &Q) -> Option<&T>
314 where
315 T: Borrow<Q>,
316 Q: Ord + ?Sized,
317 {
318 let (node_idx, position_within_node) = self.locate_value(value);
319 if let Some(candidate_node) = self.inner.get(node_idx) {
320 return candidate_node.get(position_within_node);
321 }
322
323 None
324 }
325 pub fn len(&self) -> usize {
338 self.len
339 }
340 fn insert_at(&mut self, node_idx: usize, value: T) -> bool {
341 if self.inner[node_idx].len() == self.node_capacity {
342 let new_node = self.inner[node_idx].halve();
343 let mut insert_node_idx = node_idx;
344 if value >= new_node[0] {
345 insert_node_idx += 1;
346 }
347
348 self.inner.insert(node_idx + 1, new_node);
349 if NodeLike::insert(&mut self.inner[insert_node_idx], value).0 {
350 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
352 self.len += 1;
353
354 true
355 } else {
356 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
358 false
359 }
360 } else if NodeLike::insert(&mut self.inner[node_idx], value).0 {
361 self.index.add_at(node_idx, 1);
362 self.len += 1;
363
364 true
365 } else {
366 false
367 }
368 }
369 pub fn insert(&mut self, value: T) -> bool {
394 let node_idx = self.locate_node(&value);
395 self.insert_at(node_idx, value)
396 }
397
398 pub fn replace(&mut self, value: T) -> Option<T> {
415 let replaced_element = self.take(&value);
416 self.insert(value);
417
418 replaced_element
419 }
420 pub fn contains<Q>(&self, value: &Q) -> bool
436 where
437 T: Borrow<Q>,
438 Q: Ord + ?Sized,
439 {
440 let (node_idx, position_within_node) = self.locate_value(value);
441 if let Some(candidate_node) = self.inner.get(node_idx) {
442 if let Some(candidate_value) = candidate_node.get(position_within_node) {
443 return value == candidate_value.borrow();
444 }
445 }
446
447 false
448 }
449 fn contains_cmp<P, Q, R>(&self, cmp: P, mut cmp2: R) -> bool
450 where
451 T: Borrow<Q>,
452 Q: Ord + ?Sized,
453 P: FnMut(&Q) -> bool,
454 R: FnMut(&Q) -> bool,
455 {
456 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
457 if let Some(candidate_node) = self.inner.get(node_idx) {
458 if let Some(candidate_value) = candidate_node.get(position_within_node) {
459 return cmp2(candidate_value.borrow());
460 }
461 }
462
463 false
464 }
465 fn delete_at(&mut self, node_idx: usize, position_within_node: usize) -> T {
466 let removal = self.inner[node_idx].remove(position_within_node);
467
468 let mut decrease_length = false;
469 if self.inner[node_idx].is_empty() {
471 if self.inner.len() > 1 {
473 self.inner.remove(node_idx);
474 self.len -= 1;
475 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
476 } else {
477 decrease_length = true;
478 }
479 } else {
480 decrease_length = true;
481 }
482
483 if decrease_length {
484 self.index.sub_at(node_idx, 1);
485 self.len -= 1;
486 }
487
488 removal
489 }
490 fn delete<Q>(&mut self, value: &Q) -> (Option<T>, bool)
491 where
492 T: Borrow<Q>,
493 Q: Ord + ?Sized,
494 {
495 let mut removed = false;
496 let mut removal = None;
497 let (node_idx, position_within_node) = self.locate_value(value);
498 if let Some(candidate_node) = self.inner.get(node_idx) {
499 if let Some(candidate_value) = candidate_node.get(position_within_node) {
500 if value == candidate_value.borrow() {
501 removal = Some(self.delete_at(node_idx, position_within_node));
502 removed = true;
503 }
504 }
505 }
506
507 (removal, removed)
508 }
509
510 fn find_cmp<P, Q, R>(&mut self, cmp: P, mut cmp2: R) -> NodeEntry
511 where
512 T: Borrow<Q>,
513 Q: Ord + ?Sized,
514 P: FnMut(&Q) -> bool,
515 R: FnMut(&Q) -> bool,
516 {
517 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
518 self.inner
519 .get(node_idx)
520 .and_then(|candidate_node| candidate_node.get(position_within_node))
521 .filter(|&candidate_value| cmp2(candidate_value.borrow()))
522 .map(|_| NodeEntry::Exist {
523 node_idx,
524 position_within_node,
525 })
526 .unwrap_or(NodeEntry::Empty { node_idx })
527 }
528
529 fn delete_cmp<P, Q, R>(&mut self, cmp: P, cmp2: R) -> (Option<T>, bool)
530 where
531 T: Borrow<Q>,
532 Q: Ord + ?Sized,
533 P: FnMut(&Q) -> bool,
534 R: FnMut(&Q) -> bool,
535 {
536 let removal = match self.find_cmp(cmp, cmp2) {
537 NodeEntry::Exist {
538 node_idx,
539 position_within_node,
540 } => Some(self.delete_at(node_idx, position_within_node)),
541 NodeEntry::Empty { .. } => None,
542 };
543
544 let removed = removal.is_some();
545
546 (removal, removed)
547 }
548 pub fn remove<Q>(&mut self, value: &Q) -> bool
567 where
568 T: Borrow<Q>,
569 Q: Ord + ?Sized,
570 {
571 self.delete(value).1
572 }
573 pub fn take<Q>(&mut self, value: &Q) -> Option<T>
590 where
591 T: Borrow<Q>,
592 Q: Ord + ?Sized,
593 {
594 self.delete(value).0
595 }
596 pub fn first(&self) -> Option<&T> {
614 if let Some(candidate_node) = self.inner.first() {
615 return candidate_node.first();
616 }
617
618 None
619 }
620 pub fn last(&self) -> Option<&T> {
638 if let Some(candidate_node) = self.inner.last() {
639 if !candidate_node.is_empty() {
640 return candidate_node.last();
641 }
642 }
643
644 None
645 }
646 pub fn pop_first(&mut self) -> Option<T> {
663 let (first_node_idx, first_position_within_node) = (0, 0);
664 if let Some(candidate_node) = self.inner.get(first_node_idx) {
665 if candidate_node.get(first_position_within_node).is_some() {
666 return Some(self.delete_at(first_node_idx, first_position_within_node));
667 }
668 }
669
670 None
671 }
672 pub fn pop_index(&mut self, idx: usize) -> T {
688 let (node_idx, position_within_node) = self.locate_ith(idx);
689
690 self.delete_at(node_idx, position_within_node)
691 }
692 pub fn pop_last(&mut self) -> Option<T> {
709 let last_node_idx = self.inner.len() - 1;
710 let mut last_position_within_node = self.inner[last_node_idx].len();
711 last_position_within_node = last_position_within_node.saturating_sub(1);
712
713 if let Some(candidate_node) = self.inner.get(last_node_idx) {
714 if candidate_node.get(last_position_within_node).is_some() {
715 return Some(self.delete_at(last_node_idx, last_position_within_node));
716 }
717 }
718
719 None
720 }
721 pub fn is_empty(&self) -> bool {
734 self.len() == 0
735 }
736 pub fn is_subset(&self, other: &Self) -> bool {
754 if self.difference(other).next().is_some() {
755 return false;
756 }
757
758 true
759 }
760 pub fn is_superset(&self, other: &Self) -> bool {
781 if other.difference(self).next().is_some() {
782 return false;
783 }
784
785 true
786 }
787 pub fn is_disjoint(&self, other: &Self) -> bool {
805 if self.intersection(other).next().is_some() {
806 return false;
807 }
808
809 true
810 }
811 pub fn iter(&self) -> Iter<'_, T> {
840 Iter::new(self)
841 }
842 pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
861 Union {
862 merge_iter: MergeIter {
863 start: true,
864 left_iter: self.iter(),
865 current_left: None,
866 right_iter: other.iter(),
867 current_right: None,
868 },
869 }
870 }
871 pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T> {
892 Difference {
893 merge_iter: MergeIter {
894 start: true,
895 left_iter: self.iter(),
896 current_left: None,
897 right_iter: other.iter(),
898 current_right: None,
899 },
900 }
901 }
902 pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T> {
923 SymmetricDifference {
924 merge_iter: MergeIter {
925 start: true,
926 left_iter: self.iter(),
927 current_left: None,
928 right_iter: other.iter(),
929 current_right: None,
930 },
931 }
932 }
933 pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
954 Intersection {
955 merge_iter: MergeIter {
956 start: true,
957 left_iter: self.iter(),
958 current_left: None,
959 right_iter: other.iter(),
960 current_right: None,
961 },
962 }
963 }
964 pub fn retain<F, Q>(&mut self, mut f: F)
980 where
981 T: Borrow<Q>,
982 Q: Ord + ?Sized,
983 F: FnMut(&Q) -> bool,
984 {
985 let mut positions_to_delete = vec![];
986 for (node_idx, node) in self.inner.iter().enumerate() {
987 for (position_within_node, item) in node.iter().enumerate() {
988 if !f(item.borrow()) {
989 positions_to_delete.push((node_idx, position_within_node));
990 }
991 }
992 }
993 positions_to_delete.reverse();
994
995 positions_to_delete
996 .into_iter()
997 .for_each(|(node_idx, position_within_node)| {
998 self.delete_at(node_idx, position_within_node);
999 })
1000 }
1001 fn split_off_cmp<P, Q>(&mut self, cmp: P) -> Self
1002 where
1003 T: Borrow<Q>,
1004 Q: Ord + ?Sized,
1005 P: FnMut(&Q) -> bool,
1006 {
1007 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
1008 let first_node = self.inner[node_idx].split_off(position_within_node);
1009 let mut remaining_nodes = vec![];
1010 while self.inner.len() > node_idx + 1 {
1011 remaining_nodes.push(self.inner.pop().unwrap());
1012 }
1013 remaining_nodes.reverse();
1014 remaining_nodes.insert(0, first_node);
1015 let mut latter_half = BTreeSet::default();
1016 latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
1017 latter_half.inner = remaining_nodes;
1018 latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
1019
1020 if self.inner[node_idx].is_empty() && self.inner.len() > 1 {
1021 self.inner.remove(node_idx);
1022 }
1023
1024 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
1025 self.len = self.inner.iter().map(|node| node.len()).sum();
1026
1027 latter_half
1028 }
1029 pub fn split_off<Q>(&mut self, value: &Q) -> Self
1059 where
1060 T: Borrow<Q>,
1061 Q: Ord + ?Sized,
1062 {
1063 let (node_idx, position_within_node) = self.locate_value(value);
1064 let first_node = self.inner[node_idx].split_off(position_within_node);
1065 let mut remaining_nodes = vec![];
1066 while self.inner.len() > node_idx + 1 {
1067 remaining_nodes.push(self.inner.pop().unwrap());
1068 }
1069 remaining_nodes.reverse();
1070 remaining_nodes.insert(0, first_node);
1071 let mut latter_half = BTreeSet::default();
1072 latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
1073 latter_half.inner = remaining_nodes;
1074 latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
1075
1076 if self.inner[node_idx].is_empty() && self.inner.len() > 1 {
1077 self.inner.remove(node_idx);
1078 }
1079
1080 self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
1081 self.len = self.inner.iter().map(|node| node.len()).sum();
1082
1083 latter_half
1084 }
1085 pub fn append(&mut self, other: &mut Self) {
1114 while let Some(value) = other.pop_first() {
1115 self.replace(value);
1116 }
1117 }
1118 fn resolve_range<R>(&self, range: R) -> ((usize, usize, usize), (usize, usize, usize))
1119 where
1120 R: RangeBounds<usize>,
1121 {
1122 let mut global_front_idx: usize = 0;
1123 let mut global_back_idx: usize = self.index.prefix_sum(self.inner.len(), 0).saturating_sub(1);
1124
1125 let start = range.start_bound();
1127 match start {
1128 Bound::Included(bound) => {
1129 global_front_idx = *bound;
1130 }
1131 Bound::Excluded(bound) => {
1132 global_front_idx = *bound + 1;
1133 }
1134 Bound::Unbounded => (),
1135 }
1136
1137 let end = range.end_bound();
1138 match end {
1139 Bound::Included(bound) => {
1140 global_back_idx = *bound;
1141 }
1142 Bound::Excluded(bound) => {
1143 global_back_idx = *bound - 1;
1144 }
1145 Bound::Unbounded => (),
1146 }
1147 let (front_node_idx, front_start_idx) = self.locate_ith(global_front_idx);
1149 let (back_node_idx, back_start_idx) = self.locate_ith(global_back_idx);
1150
1151 (
1152 (global_front_idx, front_node_idx, front_start_idx),
1153 (global_back_idx, back_node_idx, back_start_idx),
1154 )
1155 }
1156 pub fn range<R, Q>(&self, range: R) -> Range<'_, T>
1184 where
1185 Q: Ord + ?Sized,
1186 T: Borrow<Q>,
1187 R: RangeBounds<Q>,
1188 {
1189 let start_idx = match range.start_bound() {
1190 Bound::Included(bound) => self.rank(bound),
1191 Bound::Excluded(bound) => self.rank(bound) + 1,
1192 Bound::Unbounded => 0,
1193 };
1194 let end_idx = match range.end_bound() {
1195 Bound::Included(bound) => self.rank(bound),
1196 Bound::Excluded(bound) => self.rank(bound).saturating_sub(1),
1197 Bound::Unbounded => self.len().saturating_sub(1),
1198 };
1199
1200 self.range_idx(start_idx..=end_idx)
1201 }
1202 pub fn rank<Q>(&self, value: &Q) -> usize
1221 where
1222 Q: Ord + ?Sized,
1223 T: Borrow<Q>,
1224 {
1225 let (node_idx, position_within_node) = self.locate_value(value);
1226
1227 let offset = self.index.prefix_sum(node_idx, 0);
1228
1229 offset + position_within_node
1230 }
1231 fn rank_cmp<Q, P>(&self, cmp: P) -> usize
1232 where
1233 T: Borrow<Q>,
1234 Q: Ord + ?Sized,
1235 P: FnMut(&Q) -> bool,
1236 {
1237 let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
1238
1239 let offset = self.index.prefix_sum(node_idx, 0);
1240
1241 offset + position_within_node
1242 }
1243 pub fn range_idx<R>(&self, range: R) -> Range<'_, T>
1244 where
1245 R: RangeBounds<usize>,
1246 {
1247 let ((global_front_idx, front_node_idx, front_start_idx), (global_back_idx, back_node_idx, back_start_idx)) =
1248 self.resolve_range(range);
1249
1250 let front_iter = if front_node_idx < self.inner.len() {
1251 Some(self.inner[front_node_idx][front_start_idx..].iter())
1252 } else {
1253 None
1254 };
1255
1256 let back_iter = if back_node_idx < self.inner.len() {
1257 Some(self.inner[back_node_idx][..=back_start_idx].iter())
1258 } else {
1259 None
1260 };
1261
1262 Range {
1263 spine_iter: Iter {
1264 btree: self,
1265 current_front_node_idx: front_node_idx,
1266 current_front_idx: global_front_idx,
1267 current_back_node_idx: back_node_idx,
1268 current_back_idx: global_back_idx + 1,
1269 current_front_iterator: front_iter,
1270 current_back_iterator: back_iter,
1271 },
1272 }
1273 }
1274}
1275
1276impl<T> FromIterator<T> for BTreeSet<T>
1277where
1278 T: Ord,
1279{
1280 fn from_iter<K: IntoIterator<Item = T>>(iter: K) -> Self {
1281 let mut btree = BTreeSet::new();
1282 iter.into_iter().for_each(|item| {
1283 btree.insert(item);
1284 });
1285
1286 btree
1287 }
1288}
1289
1290impl<T, const N: usize> From<[T; N]> for BTreeSet<T>
1291where
1292 T: Ord,
1293{
1294 fn from(value: [T; N]) -> Self {
1295 let mut btree: BTreeSet<T> = Default::default();
1296
1297 value.into_iter().for_each(|item| {
1298 btree.insert(item);
1299 });
1300
1301 btree
1302 }
1303}
1304
1305impl<T> Default for BTreeSet<T>
1306where
1307 T: Ord,
1308{
1309 fn default() -> Self {
1310 let node_capacity = DEFAULT_INNER_SIZE;
1311
1312 Self {
1313 inner: vec![Node::with_capacity(node_capacity)],
1314 index: FenwickTree::from_iter(vec![0]),
1315 node_capacity,
1316 len: 0,
1317 }
1318 }
1319}
1320
1321pub struct Iter<'a, T>
1328where
1329 T: Ord,
1330{
1331 btree: &'a BTreeSet<T>,
1332 current_front_node_idx: usize,
1333 current_front_idx: usize,
1334 current_back_node_idx: usize,
1335 current_back_idx: usize,
1336 current_front_iterator: Option<std::slice::Iter<'a, T>>,
1337 current_back_iterator: Option<std::slice::Iter<'a, T>>,
1338}
1339
1340impl<'a, T> Iter<'a, T>
1341where
1342 T: Ord,
1343{
1344 pub fn new(btree: &'a BTreeSet<T>) -> Self {
1345 Self {
1346 btree,
1347 current_front_node_idx: 0,
1348 current_front_idx: 0,
1349 current_back_node_idx: btree.inner.len() - 1,
1350 current_back_idx: btree.len(),
1351 current_front_iterator: Some(btree.inner[0].iter()),
1352 current_back_iterator: Some(btree.inner[btree.inner.len() - 1].iter()),
1353 }
1354 }
1355}
1356
1357impl<'a, T> Iterator for Iter<'a, T>
1358where
1359 T: Ord,
1360{
1361 type Item = &'a T;
1362
1363 fn next(&mut self) -> Option<Self::Item> {
1364 if self.current_front_idx == self.current_back_idx {
1365 return None;
1366 }
1367 if let Some(value) = self.current_front_iterator.as_mut().and_then(|i| i.next()) {
1368 self.current_front_idx += 1;
1369 Some(value)
1370 } else {
1371 self.current_front_node_idx += 1;
1372 if self.current_front_node_idx >= self.btree.inner.len() {
1373 return None;
1374 }
1375 self.current_front_iterator = Some(self.btree.inner[self.current_front_node_idx].iter());
1376
1377 self.next()
1378 }
1379 }
1380}
1381
1382impl<'a, T> DoubleEndedIterator for Iter<'a, T>
1383where
1384 T: Ord,
1385{
1386 fn next_back(&mut self) -> Option<Self::Item> {
1387 if self.current_front_idx == self.current_back_idx {
1388 return None;
1389 }
1390 if let Some(value) = self.current_back_iterator.as_mut().and_then(|i| i.next_back()) {
1391 self.current_back_idx -= 1;
1392 Some(value)
1393 } else {
1394 if self.current_back_node_idx == 0 {
1395 return None;
1396 };
1397 self.current_back_node_idx -= 1;
1398 self.current_back_iterator = Some(self.btree.inner[self.current_back_node_idx].iter());
1399
1400 self.next_back()
1401 }
1402 }
1403}
1404
1405impl<'a, T> FusedIterator for Iter<'a, T> where T: Ord {}
1406
1407impl<'a, T> IntoIterator for &'a BTreeSet<T>
1408where
1409 T: Ord,
1410{
1411 type Item = &'a T;
1412
1413 type IntoIter = Iter<'a, T>;
1414
1415 fn into_iter(self) -> Self::IntoIter {
1416 Iter::new(self)
1417 }
1418}
1419
1420pub struct IntoIter<T>
1427where
1428 T: Ord,
1429{
1430 btree: BTreeSet<T>,
1431}
1432
1433impl<T> Iterator for IntoIter<T>
1434where
1435 T: Ord,
1436{
1437 type Item = T;
1438
1439 fn next(&mut self) -> Option<Self::Item> {
1440 self.btree.pop_first()
1441 }
1442}
1443
1444impl<T> DoubleEndedIterator for IntoIter<T>
1445where
1446 T: Ord,
1447{
1448 fn next_back(&mut self) -> Option<Self::Item> {
1449 self.btree.pop_last()
1450 }
1451}
1452
1453impl<T> FusedIterator for IntoIter<T> where T: Ord {}
1454
1455impl<T> IntoIterator for BTreeSet<T>
1456where
1457 T: Ord,
1458{
1459 type Item = T;
1460
1461 type IntoIter = IntoIter<T>;
1462
1463 fn into_iter(self) -> Self::IntoIter {
1464 IntoIter { btree: self }
1466 }
1467}
1468
1469struct MergeIter<'a, T>
1470where
1471 T: Ord,
1472{
1473 start: bool,
1474 left_iter: Iter<'a, T>,
1475 current_left: Option<&'a T>,
1476 right_iter: Iter<'a, T>,
1477 current_right: Option<&'a T>,
1478}
1479
1480impl<'a, T> Iterator for MergeIter<'a, T>
1481where
1482 T: Ord,
1483{
1484 type Item = (Option<&'a T>, Option<&'a T>);
1485 fn next(&mut self) -> Option<Self::Item> {
1486 if !self.start {
1487 if let Some(left) = self.current_left {
1488 if let Some(right) = self.current_right {
1489 match left.cmp(right) {
1490 Ordering::Less => {
1491 self.current_left = self.left_iter.next();
1492 }
1493 Ordering::Equal => {
1494 self.current_left = self.left_iter.next();
1495 self.current_right = self.right_iter.next();
1496 }
1497 Ordering::Greater => {
1498 self.current_right = self.right_iter.next();
1499 }
1500 }
1501 } else {
1502 self.current_left = self.left_iter.next();
1503 }
1504 } else if self.current_right.is_some() {
1505 self.current_right = self.right_iter.next();
1506 } else {
1507 return None;
1508 }
1509 } else {
1510 self.current_left = self.left_iter.next();
1511 self.current_right = self.right_iter.next();
1512 self.start = false;
1513 }
1514
1515 Some((self.current_left, self.current_right))
1516 }
1517}
1518
1519pub struct Union<'a, T>
1526where
1527 T: Ord,
1528{
1529 merge_iter: MergeIter<'a, T>,
1530}
1531
1532impl<'a, T> Iterator for Union<'a, T>
1533where
1534 T: Ord,
1535{
1536 type Item = &'a T;
1537
1538 fn next(&mut self) -> Option<Self::Item> {
1539 if let Some((current_left, current_right)) = self.merge_iter.next() {
1540 return match (current_left, current_right) {
1541 (Some(left), Some(right)) => {
1542 if right < left {
1543 Some(right)
1544 } else {
1545 Some(left)
1546 }
1547 }
1548 (Some(left), None) => Some(left),
1549 (None, Some(right)) => Some(right),
1550 (None, None) => None,
1551 };
1552 }
1553
1554 None
1555 }
1556}
1557
1558impl<'a, T> FusedIterator for Union<'a, T> where T: Ord {}
1559
1560pub struct Difference<'a, T>
1567where
1568 T: Ord,
1569{
1570 merge_iter: MergeIter<'a, T>,
1571}
1572
1573impl<'a, T> Iterator for Difference<'a, T>
1574where
1575 T: Ord,
1576{
1577 type Item = &'a T;
1578
1579 fn next(&mut self) -> Option<Self::Item> {
1580 loop {
1581 return if let Some((current_left, current_right)) = self.merge_iter.next() {
1582 match (current_left, current_right) {
1583 (Some(left), Some(right)) => {
1584 if left < right {
1585 Some(left)
1586 } else {
1587 continue;
1588 }
1589 }
1590 (Some(left), None) => Some(left),
1591 (None, _) => None,
1592 }
1593 } else {
1594 None
1595 };
1596 }
1597 }
1598}
1599
1600impl<'a, T> FusedIterator for Difference<'a, T> where T: Ord {}
1601
1602pub struct SymmetricDifference<'a, T>
1609where
1610 T: Ord,
1611{
1612 merge_iter: MergeIter<'a, T>,
1613}
1614
1615impl<'a, T> Iterator for SymmetricDifference<'a, T>
1616where
1617 T: Ord,
1618{
1619 type Item = &'a T;
1620
1621 fn next(&mut self) -> Option<Self::Item> {
1622 loop {
1623 return if let Some((current_left, current_right)) = self.merge_iter.next() {
1624 match (current_left, current_right) {
1625 (Some(left), Some(right)) => {
1626 if left < right {
1627 Some(left)
1628 } else if right < left {
1629 Some(right)
1630 } else {
1631 continue;
1632 }
1633 }
1634 (Some(left), None) => Some(left),
1635 (None, Some(right)) => Some(right),
1636 (None, _) => None,
1637 }
1638 } else {
1639 None
1640 };
1641 }
1642 }
1643}
1644
1645impl<'a, T> FusedIterator for SymmetricDifference<'a, T> where T: Ord {}
1646
1647pub struct Intersection<'a, T>
1654where
1655 T: Ord,
1656{
1657 merge_iter: MergeIter<'a, T>,
1658}
1659
1660impl<'a, T> Iterator for Intersection<'a, T>
1661where
1662 T: Ord,
1663{
1664 type Item = &'a T;
1665
1666 fn next(&mut self) -> Option<Self::Item> {
1667 loop {
1668 if let Some((current_left, current_right)) = self.merge_iter.next() {
1669 match (current_left, current_right) {
1670 (Some(left), Some(right)) => {
1671 if left == right {
1672 return Some(left);
1673 } else {
1674 continue;
1675 }
1676 }
1677 (None, _) | (_, None) => return None,
1678 }
1679 } else {
1680 return None;
1681 }
1682 }
1683 }
1684}
1685
1686impl<'a, T> FusedIterator for Intersection<'a, T> where T: Ord {}
1687
1688pub struct Range<'a, T>
1695where
1696 T: Ord,
1697{
1698 spine_iter: Iter<'a, T>,
1699}
1700
1701impl<'a, T> Iterator for Range<'a, T>
1702where
1703 T: Ord,
1704{
1705 type Item = &'a T;
1706
1707 fn next(&mut self) -> Option<Self::Item> {
1708 self.spine_iter.next()
1709 }
1710}
1711
1712impl<'a, T> DoubleEndedIterator for Range<'a, T>
1713where
1714 T: Ord,
1715{
1716 fn next_back(&mut self) -> Option<Self::Item> {
1717 self.spine_iter.next_back()
1718 }
1719}
1720
1721impl<'a, T> FusedIterator for Range<'a, T> where T: Ord {}
1722
1723impl<T> Index<usize> for BTreeSet<T>
1724where
1725 T: Ord,
1726{
1727 type Output = T;
1728
1729 fn index(&self, index: usize) -> &Self::Output {
1730 self.get_index(index).unwrap()
1731 }
1732}
1733
1734pub struct VacantEntry<'a, K, V>
1735where
1736 K: Ord,
1737{
1738 map: &'a mut BTreeMap<K, V>,
1739 key: K,
1740}
1741
1742pub struct OccupiedEntry<'a, K, V>
1743where
1744 K: Ord,
1745{
1746 map: &'a mut BTreeMap<K, V>,
1747 idx: usize,
1748}
1749
1750pub enum Entry<'a, K, V>
1751where
1752 K: 'a + Ord,
1753 V: 'a,
1754{
1755 Vacant(VacantEntry<'a, K, V>),
1756 Occupied(OccupiedEntry<'a, K, V>),
1757}
1758
1759impl<'a, K, V> Entry<'a, K, V>
1760where
1761 K: 'a + Ord,
1762 V: 'a,
1763{
1764 pub fn or_insert(self, default: V) -> &'a mut V {
1765 match self {
1766 Vacant(entry) => entry.insert(default),
1767 Occupied(entry) => entry.into_mut(),
1768 }
1769 }
1770 pub fn or_insert_with<F>(self, default: F) -> &'a mut V
1771 where
1772 F: FnOnce() -> V,
1773 {
1774 match self {
1775 Vacant(entry) => entry.insert(default()),
1776 Occupied(entry) => entry.into_mut(),
1777 }
1778 }
1779 pub fn or_insert_with_key<F>(self, default: F) -> &'a mut V
1780 where
1781 F: FnOnce(&K) -> V,
1782 {
1783 match self {
1784 Vacant(entry) => {
1785 let value = default(entry.key());
1786 entry.insert(value)
1787 }
1788 Occupied(entry) => entry.into_mut(),
1789 }
1790 }
1791 pub fn key(&self) -> &K {
1792 match *self {
1793 Occupied(ref entry) => entry.key(),
1794 Vacant(ref entry) => entry.key(),
1795 }
1796 }
1797 pub fn and_modify<F>(self, f: F) -> Self
1798 where
1799 F: FnOnce(&mut V),
1800 {
1801 match self {
1802 Occupied(mut entry) => {
1803 f(entry.get_mut());
1804 Occupied(entry)
1805 }
1806 Vacant(entry) => Vacant(entry),
1807 }
1808 }
1809 pub fn or_default(self) -> &'a mut V
1810 where
1811 V: Default,
1812 {
1813 match self {
1814 Occupied(entry) => entry.into_mut(),
1815 Vacant(entry) => entry.insert(Default::default()),
1816 }
1817 }
1818}
1819
1820impl<'a, K, V> OccupiedEntry<'a, K, V>
1821where
1822 K: Ord,
1823{
1824 pub fn key(&self) -> &K {
1825 &self.map.set.get_index(self.idx).unwrap().key
1826 }
1827 pub fn remove_entry(self) -> (K, V) {
1828 self.map.pop_index(self.idx)
1829 }
1830 pub fn get(&self) -> &V {
1831 self.map.get_index(self.idx).unwrap().1
1832 }
1833 pub fn get_mut(&mut self) -> &mut V {
1834 self.map.get_mut_index(self.idx).unwrap()
1835 }
1836 pub fn into_mut(self) -> &'a mut V {
1837 self.map.get_mut_index(self.idx).unwrap()
1838 }
1839 pub fn insert(&mut self, value: V) -> V {
1840 let current_value = self.map.get_mut_index(self.idx).unwrap();
1841 let mut previous_value = value;
1842 swap(&mut previous_value, current_value);
1843
1844 previous_value
1845 }
1846 pub fn remove(self) -> V {
1847 self.map.pop_index(self.idx).1
1848 }
1849}
1850
1851impl<'a, K, V> VacantEntry<'a, K, V>
1852where
1853 K: Ord,
1854{
1855 pub fn key(&self) -> &K {
1856 &self.key
1857 }
1858 pub fn into_key(self) -> K {
1859 self.key
1860 }
1861 pub fn insert(self, value: V) -> &'a mut V {
1862 let rank = self.map.set.rank_cmp(|item: &Pair<K, V>| item.key < self.key);
1863 self.map.insert(self.key, value);
1864
1865 self.map.get_mut_index(rank).unwrap()
1866 }
1867}
1868
1869#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1957#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
1958pub struct BTreeMap<K, V>
1959where
1960 K: Ord,
1961{
1962 set: BTreeSet<Pair<K, V>>,
1963}
1964
1965impl<K: Ord, V> Default for BTreeMap<K, V>
1966where
1967 K: Ord,
1968{
1969 fn default() -> Self {
1970 Self {
1971 set: BTreeSet::default(),
1972 }
1973 }
1974}
1975
1976impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V>
1977where
1978 K: Ord,
1979{
1980 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
1981 let mut btree = BTreeMap::new();
1982 iter.into_iter().for_each(|item| {
1983 btree.insert(item.0, item.1);
1984 });
1985
1986 btree
1987 }
1988}
1989
1990impl<K: Ord, V> BTreeMap<K, V>
1991where
1992 K: Ord,
1993{
1994 pub fn append(&mut self, other: &mut Self) {
2026 self.set.append(&mut other.set)
2027 }
2028 pub fn clear(&mut self) {
2043 self.set.clear()
2044 }
2045 pub fn contains_key<Q>(&self, key: &Q) -> bool
2063 where
2064 K: Borrow<Q> + Ord,
2065 Q: Ord + ?Sized,
2066 {
2067 self.set.contains_cmp(
2068 |item: &Pair<K, V>| item.key.borrow() < key,
2069 |item| item.key.borrow() == key,
2070 )
2071 }
2072 pub fn first_key_value(&self) -> Option<(&K, &V)> {
2089 let popping = self.set.first();
2090 if let Some(pop) = popping {
2091 return Some((&pop.key, &pop.value));
2092 }
2093
2094 None
2095 }
2096 pub fn get<Q>(&self, key: &Q) -> Option<&V>
2114 where
2115 K: Borrow<Q> + Ord,
2116 Q: Ord + ?Sized,
2117 {
2118 if let Some(key_value) = self.get_key_value(key) {
2119 return Some(key_value.1);
2120 }
2121
2122 None
2123 }
2124 pub fn get_index(&self, idx: usize) -> Option<(&K, &V)> {
2138 let ith = self.set.get_index(idx);
2139 if let Some(entry) = ith {
2140 return Some((&entry.key, &entry.value));
2141 }
2142
2143 None
2144 }
2145 pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&K, &V)>
2161 where
2162 K: Borrow<Q> + Ord,
2163 Q: Ord + ?Sized,
2164 {
2165 let node_idx = self.set.locate_node_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2166 let candidate_node = self.set.inner.get(node_idx)?;
2167 let position = crate::core::node::search_by(candidate_node, |candidate| {
2168 <K as Borrow<Q>>::borrow(&candidate.key).cmp(key)
2169 })
2170 .ok()?;
2171 let candidate = &candidate_node[position];
2172 Some((&candidate.key, &candidate.value))
2173 }
2174 pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
2194 where
2195 K: Borrow<Q> + Ord,
2196 Q: Ord,
2197 {
2198 let (node_idx, position_within_node) = self.set.locate_value_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2199 if self.set.inner.get(node_idx).is_some() && self.set.inner[node_idx].get(position_within_node).is_some() {
2200 let entry = self.set.inner[node_idx].get_mut(position_within_node)?;
2201 if key == entry.key.borrow() {
2202 return Some(&mut entry.value);
2203 }
2204 }
2205
2206 None
2207 }
2208 pub fn get_mut_index(&mut self, index: usize) -> Option<&mut V> {
2225 if let Some(entry) = self.set.get_mut_index(index) {
2226 return Some(&mut entry.value);
2227 }
2228
2229 None
2230 }
2231 pub fn insert(&mut self, key: K, mut value: V) -> Option<V> {
2258 let cmp = |item: &Pair<K, V>| item.key < key;
2259 let cmp2 = |item: &Pair<K, V>| item.key == key;
2260
2261 match self.set.find_cmp(cmp, cmp2) {
2262 NodeEntry::Exist {
2263 node_idx,
2264 position_within_node,
2265 } => {
2266 std::mem::swap(&mut self.set.inner[node_idx][position_within_node].value, &mut value);
2267 Some(value)
2268 }
2269 NodeEntry::Empty { node_idx } => {
2270 self.set.insert_at(node_idx, Pair { key, value });
2271 None
2272 }
2273 }
2274 }
2275 pub fn into_keys(self) -> IntoKeys<K, V> {
2292 IntoKeys {
2293 inner: self.into_iter(),
2294 }
2295 }
2296 pub fn into_values(self) -> IntoValues<K, V> {
2313 IntoValues {
2314 inner: self.into_iter(),
2315 }
2316 }
2317 pub fn is_empty(&self) -> bool {
2332 self.set.is_empty()
2333 }
2334 pub fn iter(&self) -> IterMap<'_, K, V> {
2356 IterMap { inner: self.set.iter() }
2357 }
2358 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
2381 let last_node_idx = self.set.inner.len() - 1;
2382 let len = self.set.len();
2383
2384 if self.set.inner.len() == 1 {
2386 let mut inner = self.set.inner.iter_mut();
2389 let node = inner.next().unwrap();
2390 let front_iter = node.iter_mut();
2391 let back_iter = [].iter_mut();
2394
2395 return IterMut {
2396 inner,
2397 current_front_node_idx: 0,
2398 current_front_idx: 0,
2399 current_back_node_idx: 0, current_back_idx: len.wrapping_sub(1),
2401 current_front_iterator: front_iter,
2402 current_back_iterator: back_iter,
2403 };
2404 }
2405
2406 let mut inner = self.set.inner.iter_mut();
2408 let front_iter = if let Some(node) = inner.next() {
2409 node.iter_mut()
2410 } else {
2411 [].iter_mut()
2412 };
2413 let back_iter = if let Some(node) = inner.next_back() {
2414 node.iter_mut()
2415 } else {
2416 [].iter_mut()
2417 };
2418
2419 IterMut {
2420 inner,
2421 current_front_node_idx: 0,
2422 current_front_idx: 0,
2423 current_back_node_idx: last_node_idx,
2424 current_back_idx: len.wrapping_sub(1),
2425 current_front_iterator: front_iter,
2426 current_back_iterator: back_iter,
2427 }
2428 }
2429 pub fn keys(&self) -> Keys<'_, K, V> {
2446 Keys { inner: self.set.iter() }
2447 }
2448 pub fn last_key_value(&self) -> Option<(&K, &V)> {
2464 let popping = self.set.last();
2465 if let Some(pop) = popping {
2466 return Some((&pop.key, &pop.value));
2467 }
2468
2469 None
2470 }
2471 pub fn len(&self) -> usize {
2486 self.set.len()
2487 }
2488 pub fn new() -> Self {
2505 Self { ..Default::default() }
2506 }
2507 pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
2518 Self {
2519 set: BTreeSet::with_maximum_node_size(maximum_node_size),
2520 }
2521 }
2522 pub fn pop_first(&mut self) -> Option<(K, V)> {
2541 let popping = self.set.pop_first();
2542 if let Some(pop) = popping {
2543 return Some((pop.key, pop.value));
2544 }
2545
2546 None
2547 }
2548 pub fn pop_index(&mut self, index: usize) -> (K, V) {
2564 let popping = self.set.pop_index(index);
2565
2566 (popping.key, popping.value)
2567 }
2568 pub fn pop_last(&mut self) -> Option<(K, V)> {
2587 let popping = self.set.pop_last();
2588 if let Some(pop) = popping {
2589 return Some((pop.key, pop.value));
2590 }
2591
2592 None
2593 }
2594 pub fn range<Q, R>(&self, range: R) -> RangeMap<'_, K, V>
2624 where
2625 Q: Ord + ?Sized,
2626 K: Borrow<Q>,
2627 R: RangeBounds<Q>,
2628 {
2629 let (start_idx, end_idx) = self.range_to_idx(range);
2630
2631 RangeMap {
2632 inner: self.set.range_idx(start_idx..=end_idx),
2633 }
2634 }
2635 pub fn range_idx<R>(&self, range: R) -> RangeMap<'_, K, V>
2636 where
2637 R: RangeBounds<usize>,
2638 {
2639 RangeMap {
2640 inner: self.set.range_idx(range),
2641 }
2642 }
2643 fn range_to_idx<Q, R>(&self, range: R) -> (usize, usize)
2644 where
2645 Q: Ord + ?Sized,
2646 K: Borrow<Q>,
2647 R: RangeBounds<Q>,
2648 {
2649 let start_idx = match range.start_bound() {
2650 Bound::Included(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2651 Bound::Excluded(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() <= bound),
2652 Bound::Unbounded => 0,
2653 };
2654 let end_idx = match range.end_bound() {
2655 Bound::Included(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2656 Bound::Excluded(bound) => {
2657 let rank = self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound);
2658 if rank == 0 {
2659 return (1, 0);
2661 }
2662 rank - 1
2663 }
2664 Bound::Unbounded => {
2665 if self.is_empty() {
2666 return (1, 0);
2668 }
2669 self.len() - 1
2670 }
2671 };
2672
2673 (start_idx, end_idx)
2674 }
2675 pub fn range_mut<Q, R>(&mut self, range: R) -> RangeMut<'_, K, V>
2704 where
2705 Q: Ord + ?Sized,
2706 K: Borrow<Q>,
2707 R: RangeBounds<Q>,
2708 {
2709 let (start_idx, end_idx) = self.range_to_idx(range);
2710
2711 self.range_mut_idx(start_idx..=end_idx)
2712 }
2713 pub fn range_mut_idx<R>(&mut self, range: R) -> RangeMut<'_, K, V>
2714 where
2715 R: RangeBounds<usize>,
2716 {
2717 let ((global_front_idx, front_node_idx, front_start_idx), (global_back_idx, back_node_idx, back_start_idx)) =
2718 self.set.resolve_range(range);
2719 let end = self.set.inner[back_node_idx].len();
2720
2721 let mut inner = self.set.inner.iter_mut();
2722
2723 let mut front_iter = {
2724 if let Some(node) = inner.nth(front_node_idx) {
2725 node.iter_mut()
2726 } else {
2727 [].iter_mut()
2728 }
2729 };
2730
2731 let mut back_iter = {
2732 if let Some(node) = inner.nth(back_node_idx - front_node_idx) {
2733 node.iter_mut()
2734 } else {
2735 [].iter_mut()
2736 }
2737 };
2738
2739 for _ in 0..front_start_idx {
2740 front_iter.next();
2741 }
2742 let offset = back_node_idx - front_node_idx;
2743 if offset > 0 {
2744 for _ in back_start_idx..end {
2745 back_iter.next_back();
2746 }
2747 } else {
2748 for _ in back_start_idx..end {
2749 front_iter.next_back();
2750 }
2751 }
2752
2753 RangeMut {
2754 inner: IterMut {
2755 inner,
2756 current_front_node_idx: front_node_idx,
2757 current_front_idx: global_front_idx,
2758 current_back_node_idx: back_node_idx,
2759 current_back_idx: global_back_idx,
2760 current_front_iterator: front_iter,
2761 current_back_iterator: back_iter,
2762 },
2763 }
2764 }
2765 pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
2784 where
2785 K: Borrow<Q> + Ord,
2786 Q: Ord + ?Sized,
2787 {
2788 let old_entry = self.set.delete_cmp(
2789 |item: &Pair<K, V>| item.key.borrow() < key,
2790 |item: &Pair<K, V>| item.key.borrow() == key,
2791 );
2792
2793 if old_entry.1 {
2794 return Some(old_entry.0?.value);
2795 }
2796
2797 None
2798 }
2799 pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
2818 where
2819 K: Borrow<Q> + Ord,
2820 Q: Ord,
2821 {
2822 let old_entry = self.set.delete_cmp(
2823 |item: &Pair<K, V>| item.key.borrow() < key,
2824 |item| item.key.borrow() == key,
2825 );
2826
2827 if old_entry.1 {
2828 let key_value = old_entry.0?;
2829 return Some((key_value.key, key_value.value));
2830 }
2831
2832 None
2833 }
2834 pub fn retain<F, Q>(&mut self, mut f: F)
2850 where
2851 K: Borrow<Q> + Ord,
2852 Q: Ord,
2853 F: FnMut(&Q, &mut V) -> bool,
2854 {
2855 let mut positions_to_delete = vec![];
2856 for (node_idx, node) in self.set.inner.iter_mut().enumerate() {
2857 for (position_within_node, item) in node.iter_mut().enumerate() {
2858 if !f(item.key.borrow(), &mut item.value) {
2859 positions_to_delete.push((node_idx, position_within_node));
2860 }
2861 }
2862 }
2863
2864 positions_to_delete.reverse();
2865
2866 positions_to_delete
2867 .into_iter()
2868 .for_each(|(node_idx, position_within_node)| {
2869 self.set.delete_at(node_idx, position_within_node);
2870 })
2871 }
2872 pub fn split_off<Q>(&mut self, key: &Q) -> Self
2902 where
2903 K: Borrow<Q> + Ord,
2904 Q: Ord,
2905 {
2906 BTreeMap {
2907 set: self.set.split_off_cmp(|item: &Pair<K, V>| item.key.borrow() < key),
2908 }
2909 }
2910 pub fn values(&self) -> Values<'_, K, V> {
2927 Values { inner: self.set.iter() }
2928 }
2929 pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
2951 ValuesMut { inner: self.iter_mut() }
2952 }
2953 pub fn entry(&mut self, key: K) -> Entry<'_, K, V>
2974 where
2975 K: Ord,
2976 {
2977 if self.contains_key(&key) {
2978 let idx = self.set.rank_cmp(|item: &Pair<K, V>| item.key < key);
2979 return Occupied(OccupiedEntry { map: self, idx });
2980 }
2981
2982 Vacant(VacantEntry { map: self, key })
2983 }
2984 pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
3004 where
3005 K: Ord,
3006 {
3007 if !self.is_empty() {
3008 return Some(OccupiedEntry { map: self, idx: 0 });
3009 }
3010
3011 None
3012 }
3013 pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
3033 where
3034 K: Ord,
3035 {
3036 let len = self.len();
3037 if len > 0 {
3038 return Some(OccupiedEntry {
3039 map: self,
3040 idx: len - 1,
3041 });
3042 }
3043
3044 None
3045 }
3046 pub fn lower_bound<Q>(&self, bound: Bound<&Q>) -> CursorMap<'_, K, V>
3072 where
3073 K: Borrow<Q> + Ord,
3074 Q: Ord,
3075 {
3076 let start_idx = match bound {
3077 Bound::Included(start) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start),
3078 Bound::Excluded(start) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start) + 1,
3079 Bound::Unbounded => 0,
3080 };
3081
3082 CursorMap {
3083 cursor: Cursor {
3084 set: &self.set,
3085 idx: start_idx,
3086 },
3087 }
3088 }
3089 pub fn rank<Q>(&self, value: &Q) -> usize
3108 where
3109 Q: Ord + ?Sized,
3110 K: Borrow<Q>,
3111 {
3112 self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < value)
3113 }
3114}
3115
3116impl<K, V, const N: usize> From<[(K, V); N]> for BTreeMap<K, V>
3117where
3118 K: Ord,
3119{
3120 fn from(value: [(K, V); N]) -> Self {
3121 let mut btree: BTreeMap<K, V> = Default::default();
3122
3123 value.into_iter().for_each(|(key, value)| {
3124 btree.insert(key, value);
3125 });
3126
3127 btree
3128 }
3129}
3130
3131impl<K, V> IntoIterator for BTreeMap<K, V>
3132where
3133 K: Ord,
3134{
3135 type Item = (K, V);
3136 type IntoIter = IntoIterMap<K, V>;
3137
3138 fn into_iter(self) -> Self::IntoIter {
3139 IntoIterMap {
3140 inner: self.set.into_iter(),
3141 }
3142 }
3143}
3144
3145impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V>
3146where
3147 K: Ord,
3148{
3149 type Item = (&'a K, &'a V);
3150
3151 type IntoIter = IterMap<'a, K, V>;
3152
3153 fn into_iter(self) -> Self::IntoIter {
3154 IterMap { inner: self.set.iter() }
3155 }
3156}
3157
3158pub struct IterMap<'a, K, V>
3165where
3166 K: Ord,
3167{
3168 inner: Iter<'a, Pair<K, V>>,
3169}
3170
3171impl<'a, K, V> Iterator for IterMap<'a, K, V>
3172where
3173 K: Ord,
3174{
3175 type Item = (&'a K, &'a V);
3176
3177 fn next(&mut self) -> Option<Self::Item> {
3178 if let Some(entry) = self.inner.next() {
3179 return Some((&entry.key, &entry.value));
3180 }
3181
3182 None
3183 }
3184}
3185
3186impl<'a, K, V> DoubleEndedIterator for IterMap<'a, K, V>
3187where
3188 K: Ord,
3189{
3190 fn next_back(&mut self) -> Option<Self::Item> {
3191 if let Some(entry) = self.inner.next_back() {
3192 return Some((&entry.key, &entry.value));
3193 }
3194
3195 None
3196 }
3197}
3198
3199impl<'a, K, V> FusedIterator for IterMap<'a, K, V> where K: Ord {}
3200
3201pub struct IntoIterMap<K, V>
3208where
3209 K: Ord,
3210{
3211 inner: IntoIter<Pair<K, V>>,
3212}
3213
3214impl<K, V> Iterator for IntoIterMap<K, V>
3215where
3216 K: Ord,
3217{
3218 type Item = (K, V);
3219
3220 fn next(&mut self) -> Option<Self::Item> {
3221 if let Some(entry) = self.inner.next() {
3222 return Some((entry.key, entry.value));
3223 }
3224
3225 None
3226 }
3227}
3228
3229impl<K, V> DoubleEndedIterator for IntoIterMap<K, V>
3230where
3231 K: Ord,
3232{
3233 fn next_back(&mut self) -> Option<Self::Item> {
3234 if let Some(entry) = self.inner.next_back() {
3235 return Some((entry.key, entry.value));
3236 }
3237
3238 None
3239 }
3240}
3241
3242impl<K, V> FusedIterator for IntoIterMap<K, V> where K: Ord {}
3243
3244pub struct IntoKeys<K, V>
3251where
3252 K: Ord,
3253{
3254 inner: IntoIterMap<K, V>,
3255}
3256
3257impl<K, V> Iterator for IntoKeys<K, V>
3258where
3259 K: Ord,
3260{
3261 type Item = K;
3262
3263 fn next(&mut self) -> Option<Self::Item> {
3264 if let Some(entry) = self.inner.next() {
3265 return Some(entry.0);
3266 }
3267
3268 None
3269 }
3270}
3271
3272impl<K, V> DoubleEndedIterator for IntoKeys<K, V>
3273where
3274 K: Ord,
3275{
3276 fn next_back(&mut self) -> Option<Self::Item> {
3277 if let Some(entry) = self.inner.next_back() {
3278 return Some(entry.0);
3279 }
3280
3281 None
3282 }
3283}
3284
3285impl<K, V> FusedIterator for IntoKeys<K, V> where K: Ord {}
3286
3287pub struct IntoValues<K, V>
3294where
3295 K: Ord,
3296{
3297 inner: IntoIterMap<K, V>,
3298}
3299
3300impl<K, V> Iterator for IntoValues<K, V>
3301where
3302 K: Ord,
3303{
3304 type Item = V;
3305
3306 fn next(&mut self) -> Option<Self::Item> {
3307 if let Some(entry) = self.inner.next() {
3308 return Some(entry.1);
3309 }
3310
3311 None
3312 }
3313}
3314
3315impl<K, V> DoubleEndedIterator for IntoValues<K, V>
3316where
3317 K: Ord,
3318{
3319 fn next_back(&mut self) -> Option<Self::Item> {
3320 if let Some(entry) = self.inner.next_back() {
3321 return Some(entry.1);
3322 }
3323
3324 None
3325 }
3326}
3327
3328impl<K, V> FusedIterator for IntoValues<K, V> where K: Ord {}
3329
3330pub struct RangeMap<'a, K, V>
3337where
3338 K: Ord,
3339{
3340 inner: Range<'a, Pair<K, V>>,
3341}
3342
3343impl<'a, K, V> Iterator for RangeMap<'a, K, V>
3344where
3345 K: Ord,
3346{
3347 type Item = (&'a K, &'a V);
3348
3349 fn next(&mut self) -> Option<Self::Item> {
3350 if let Some(entry) = self.inner.next() {
3351 return Some((&entry.key, &entry.value));
3352 }
3353
3354 None
3355 }
3356}
3357
3358impl<'a, K, V> DoubleEndedIterator for RangeMap<'a, K, V>
3359where
3360 K: Ord,
3361{
3362 fn next_back(&mut self) -> Option<Self::Item> {
3363 if let Some(entry) = self.inner.next_back() {
3364 return Some((&entry.key, &entry.value));
3365 }
3366
3367 None
3368 }
3369}
3370
3371impl<'a, K, V> FusedIterator for RangeMap<'a, K, V> where K: Ord {}
3372
3373pub struct Values<'a, K, V>
3380where
3381 K: Ord,
3382{
3383 inner: Iter<'a, Pair<K, V>>,
3384}
3385
3386impl<'a, K, V> Iterator for Values<'a, K, V>
3387where
3388 K: Ord,
3389{
3390 type Item = &'a V;
3391
3392 fn next(&mut self) -> Option<Self::Item> {
3393 if let Some(entry) = self.inner.next() {
3394 return Some(&entry.value);
3395 }
3396
3397 None
3398 }
3399}
3400
3401impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V>
3402where
3403 K: Ord,
3404{
3405 fn next_back(&mut self) -> Option<Self::Item> {
3406 if let Some(entry) = self.inner.next_back() {
3407 return Some(&entry.value);
3408 }
3409
3410 None
3411 }
3412}
3413
3414impl<'a, K, V> FusedIterator for Values<'a, K, V> where K: Ord {}
3415
3416pub struct Keys<'a, K, V>
3423where
3424 K: Ord,
3425{
3426 inner: Iter<'a, Pair<K, V>>,
3427}
3428
3429impl<'a, K, V> Iterator for Keys<'a, K, V>
3430where
3431 K: Ord,
3432{
3433 type Item = &'a K;
3434
3435 fn next(&mut self) -> Option<Self::Item> {
3436 if let Some(entry) = self.inner.next() {
3437 return Some(&entry.key);
3438 }
3439
3440 None
3441 }
3442}
3443
3444impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V>
3445where
3446 K: Ord,
3447{
3448 fn next_back(&mut self) -> Option<Self::Item> {
3449 if let Some(entry) = self.inner.next_back() {
3450 return Some(&entry.key);
3451 }
3452
3453 None
3454 }
3455}
3456
3457impl<'a, K, V> FusedIterator for Keys<'a, K, V> where K: Ord {}
3458
3459pub struct IterMut<'a, K: 'a, V: 'a>
3466where
3467 K: Ord,
3468{
3469 inner: std::slice::IterMut<'a, Node<Pair<K, V>>>,
3470 current_front_node_idx: usize,
3471 current_front_idx: usize,
3472 current_back_node_idx: usize,
3473 current_back_idx: usize,
3474 current_front_iterator: std::slice::IterMut<'a, Pair<K, V>>,
3475 current_back_iterator: std::slice::IterMut<'a, Pair<K, V>>,
3476}
3477
3478impl<'a, K, V> Iterator for IterMut<'a, K, V>
3479where
3480 K: Ord,
3481{
3482 type Item = (&'a K, &'a mut V);
3483
3484 fn next(&mut self) -> Option<Self::Item> {
3485 if self.current_front_idx == self.current_back_idx.wrapping_add(1) {
3486 return None;
3487 }
3488 if let Some(entry) = self.current_front_iterator.next() {
3489 self.current_front_idx += 1;
3490 return Some((&entry.key, &mut entry.value));
3491 } else {
3492 if self.current_front_node_idx == self.inner.size_hint().0 {
3495 return None;
3496 }
3497 if self.current_front_node_idx == self.current_back_node_idx - 1 {
3498 if let Some(entry) = self.current_back_iterator.next() {
3500 self.current_front_idx += 1;
3501 return Some((&entry.key, &mut entry.value));
3502 }
3503 } else {
3504 self.current_front_node_idx += 1;
3506 if let Some(node) = self.inner.next() {
3507 self.current_front_iterator = node.iter_mut();
3508 }
3509
3510 return self.next();
3511 }
3512 };
3513
3514 None
3515 }
3516}
3517
3518impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V>
3519where
3520 K: Ord,
3521{
3522 fn next_back(&mut self) -> Option<Self::Item> {
3523 if self.current_front_idx == self.current_back_idx.wrapping_add(1) {
3524 return None;
3525 }
3526 if let Some(entry) = self.current_back_iterator.next_back() {
3527 self.current_back_idx -= 1;
3528 return Some((&entry.key, &mut entry.value));
3529 } else {
3530 if self.current_back_node_idx == 0 && self.current_front_node_idx != 0 {
3533 return None;
3534 }
3535 if self.current_front_node_idx == self.current_back_node_idx
3537 || self.current_front_node_idx == self.current_back_node_idx - 1
3538 {
3539 if let Some(entry) = self.current_front_iterator.next_back() {
3541 if self.current_back_idx > 0 {
3542 self.current_back_idx -= 1;
3543 }
3544 return Some((&entry.key, &mut entry.value));
3545 }
3546 } else {
3547 self.current_back_node_idx -= 1;
3549 if let Some(node) = self.inner.next_back() {
3550 self.current_back_iterator = node.iter_mut();
3551 }
3552
3553 return self.next_back();
3554 }
3555 };
3556
3557 None
3558 }
3559}
3560
3561impl<'a, K, V> FusedIterator for IterMut<'a, K, V> where K: Ord {}
3562
3563pub struct ValuesMut<'a, K: 'a, V: 'a>
3570where
3571 K: Ord,
3572{
3573 inner: IterMut<'a, K, V>,
3574}
3575
3576impl<'a, K, V> Iterator for ValuesMut<'a, K, V>
3577where
3578 K: Ord,
3579{
3580 type Item = &'a mut V;
3581
3582 fn next(&mut self) -> Option<Self::Item> {
3583 if let Some(entry) = self.inner.next() {
3584 return Some(entry.1);
3585 }
3586
3587 None
3588 }
3589}
3590
3591impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V>
3592where
3593 K: Ord,
3594{
3595 fn next_back(&mut self) -> Option<Self::Item> {
3596 if let Some(entry) = self.inner.next_back() {
3597 return Some(entry.1);
3598 }
3599
3600 None
3601 }
3602}
3603
3604impl<'a, K, V> FusedIterator for ValuesMut<'a, K, V> where K: Ord {}
3605
3606pub struct RangeMut<'a, K: 'a, V: 'a>
3613where
3614 K: Ord,
3615{
3616 inner: IterMut<'a, K, V>,
3617}
3618
3619impl<'a, K, V> Iterator for RangeMut<'a, K, V>
3620where
3621 K: Ord,
3622{
3623 type Item = (&'a K, &'a mut V);
3624
3625 fn next(&mut self) -> Option<Self::Item> {
3626 self.inner.next()
3627 }
3628}
3629
3630impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V>
3631where
3632 K: Ord,
3633{
3634 fn next_back(&mut self) -> Option<Self::Item> {
3635 self.inner.next_back()
3636 }
3637}
3638
3639impl<'a, K, V> FusedIterator for RangeMut<'a, K, V> where K: Ord {}
3640
3641impl<K, Q, V> Index<&Q> for BTreeMap<K, V>
3642where
3643 K: Borrow<Q> + Ord,
3644
3645 Q: Ord + ?Sized,
3646{
3647 type Output = V;
3648
3649 fn index(&self, index: &Q) -> &Self::Output {
3650 self.get(index).unwrap()
3651 }
3652}
3653
3654pub struct Cursor<'a, T>
3655where
3656 T: Ord,
3657{
3658 set: &'a BTreeSet<T>,
3659 idx: usize,
3660}
3661
3662impl<'a, T: Ord> Cursor<'a, T> {
3663 pub fn move_next(&mut self) {
3664 if self.idx == self.set.len() {
3665 self.idx = 0
3666 } else {
3667 self.idx += 1;
3668 }
3669 }
3670 pub fn move_index(&mut self, index: usize) {
3671 self.idx = index
3672 }
3673 pub fn move_prev(&mut self) {
3674 if self.idx == 0 {
3675 self.idx = self.set.len()
3676 } else {
3677 self.idx -= 1;
3678 }
3679 }
3680 pub fn item(&self) -> Option<&'a T> {
3681 self.set.get_index(self.idx)
3682 }
3683 pub fn peek_next(&self) -> Option<&'a T> {
3684 if self.idx == self.set.len() {
3685 return self.set.first();
3686 }
3687
3688 self.set.get_index(self.idx + 1)
3689 }
3690 pub fn peek_index(&self, index: usize) -> Option<&'a T> {
3691 self.set.get_index(index)
3692 }
3693 pub fn peek_prev(&self) -> Option<&'a T> {
3694 if self.idx == 0 {
3695 return None;
3696 }
3697
3698 self.set.get_index(self.idx - 1)
3699 }
3700}
3701
3702pub struct CursorMap<'a, K, V>
3703where
3704 K: 'a + Ord,
3705 V: 'a,
3706{
3707 cursor: Cursor<'a, Pair<K, V>>,
3708}
3709
3710impl<'a, K: Ord, V> CursorMap<'a, K, V> {
3711 pub fn move_next(&mut self) {
3712 self.cursor.move_next()
3713 }
3714 pub fn move_index(&mut self, index: usize) {
3715 self.cursor.move_index(index)
3716 }
3717 pub fn move_prev(&mut self) {
3718 self.cursor.move_prev()
3719 }
3720 pub fn key(&self) -> Option<&'a K> {
3721 if let Some(entry) = self.cursor.item() {
3722 return Some(&entry.key);
3723 }
3724
3725 None
3726 }
3727 pub fn value(&self) -> Option<&'a V> {
3728 if let Some(entry) = self.cursor.item() {
3729 return Some(&entry.value);
3730 }
3731
3732 None
3733 }
3734 pub fn key_value(&self) -> Option<(&'a K, &'a V)> {
3735 if let Some(entry) = self.cursor.item() {
3736 return Some((&entry.key, &entry.value));
3737 }
3738
3739 None
3740 }
3741 pub fn peek_next(&self) -> Option<(&'a K, &'a V)> {
3742 if let Some(entry) = self.cursor.peek_next() {
3743 return Some((&entry.key, &entry.value));
3744 }
3745
3746 None
3747 }
3748 pub fn peek_index(&self, index: usize) -> Option<(&'a K, &'a V)> {
3749 if let Some(entry) = self.cursor.peek_index(index) {
3750 return Some((&entry.key, &entry.value));
3751 }
3752
3753 None
3754 }
3755 pub fn peek_prev(&self) -> Option<(&'a K, &'a V)> {
3756 if let Some(entry) = self.cursor.peek_prev() {
3757 return Some((&entry.key, &entry.value));
3758 }
3759
3760 None
3761 }
3762}
3763
3764#[cfg(test)]
3765mod tests {
3766 use super::core::constants::*;
3767 use super::core::node::*;
3768 use crate::{BTreeMap, BTreeSet, Node};
3769 use rand::{Rng, SeedableRng};
3770 use std::collections::Bound::Included;
3771
3772 #[test]
3773 fn test_insert() {
3774 let input: Vec<isize> = vec![1, 9, 2, 7, 6, 3, 5, 4, 10, 8];
3775
3776 let expected_output: Vec<isize> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3777
3778 let actual_node = input
3779 .iter()
3780 .fold(Node::with_capacity(DEFAULT_INNER_SIZE), |mut acc, curr| {
3781 NodeLike::insert(&mut acc, *curr);
3782 acc
3783 });
3784
3785 let actual_output: Vec<isize> = actual_node.iter().cloned().collect();
3786
3787 assert_eq!(expected_output, actual_output);
3788 assert_eq!(*actual_node.last().unwrap(), 10);
3789 }
3790
3791 #[test]
3792 fn test_halve() {
3793 let mut input: Vec<isize> = vec![];
3794 for item in 0..DEFAULT_INNER_SIZE {
3795 input.push(item.clone() as isize);
3796 }
3797
3798 let mut former_node = Node::with_capacity(DEFAULT_INNER_SIZE);
3799 input.iter().for_each(|item| {
3800 NodeLike::insert(&mut former_node, item.clone());
3801 });
3802 let latter_node = former_node.halve();
3803
3804 let expected_former_output: Vec<isize> = input[0..DEFAULT_CUTOFF].to_vec();
3805 let expected_latter_output: Vec<isize> = input[DEFAULT_CUTOFF..].to_vec();
3806
3807 let actual_former_output: Vec<isize> = former_node.iter().cloned().collect();
3808 let actual_latter_output: Vec<isize> = latter_node.iter().cloned().collect();
3809
3810 assert_eq!(expected_former_output, actual_former_output);
3811 assert_eq!(expected_latter_output, actual_latter_output);
3812 }
3813
3814 #[test]
3815 fn test_insert_btree() {
3816 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3818 let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3819
3820 let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3821 acc.insert(curr);
3822 acc
3823 });
3824 assert!(btree.inner.len() > 1);
3825
3826 let actual_output: Vec<usize> = btree.into_iter().collect();
3827
3828 assert_eq!(expected_output, actual_output);
3829 }
3830
3831 #[test]
3833 fn test_node_size_two_preserves_all_u64_values() {
3834 let mut set = BTreeSet::with_maximum_node_size(2);
3835
3836 for value in 0..10_u64 {
3837 set.insert(value);
3838 }
3839
3840 assert_eq!(set.into_iter().collect::<Vec<_>>(), (0..10).collect::<Vec<_>>());
3841 }
3842
3843 #[test]
3845 fn test_node_size_three_preserves_all_u8_values() {
3846 let mut set = BTreeSet::with_maximum_node_size(3);
3847
3848 for value in 0..20_u8 {
3849 set.insert(value);
3850 }
3851
3852 assert_eq!(set.into_iter().collect::<Vec<_>>(), (0..20).collect::<Vec<_>>());
3853 }
3854
3855 #[test]
3856 fn test_insert_duplicates() {
3857 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1))
3858 .into_iter()
3859 .rev()
3860 .cycle()
3861 .take(DEFAULT_INNER_SIZE * 3)
3862 .collect();
3863 let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3864
3865 let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3866 acc.insert(curr);
3867 acc
3868 });
3869 assert!(btree.inner.len() > 1);
3870
3871 let actual_output: Vec<usize> = btree.into_iter().collect();
3872
3873 assert_eq!(expected_output.len(), actual_output.len());
3874 assert_eq!(expected_output, actual_output);
3875 }
3876
3877 #[test]
3878 fn test_remove() {
3879 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3880
3881 let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3882 acc.insert(curr.clone());
3883 acc
3884 });
3885
3886 input.iter().for_each(|item| {
3887 assert!(btree.remove(item));
3888 });
3889
3890 let actual_output: Vec<usize> = btree.into_iter().collect();
3891 let expected_output: Vec<usize> = vec![];
3892
3893 assert_eq!(expected_output, actual_output);
3894 }
3895
3896 #[test]
3897 fn test_take() {
3898 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3899
3900 let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3901 acc.insert(curr.clone());
3902 acc
3903 });
3904
3905 input.iter().for_each(|item| {
3906 assert_eq!(*item, btree.take(item).unwrap());
3907 });
3908
3909 let actual_output: Vec<usize> = btree.into_iter().collect();
3910 let expected_output: Vec<usize> = vec![];
3911
3912 assert_eq!(expected_output, actual_output);
3913 }
3914
3915 #[test]
3916 fn test_first_last_with_pop() {
3917 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3918
3919 let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3920 acc.insert(curr.clone());
3921 acc
3922 });
3923
3924 let mut front_spine = btree.clone();
3925 let mut back_spine = btree.clone();
3926 btree.iter().for_each(|item| {
3927 if *item < DEFAULT_INNER_SIZE {
3928 assert_eq!(front_spine.get_index(0), front_spine.first());
3929 assert_eq!(front_spine.pop_first().unwrap() + 1, *front_spine.first().unwrap());
3930 } else {
3931 assert_eq!(front_spine.pop_first().unwrap(), DEFAULT_INNER_SIZE);
3932 assert_eq!(front_spine.first(), None);
3933 }
3934 });
3935
3936 input.iter().rev().for_each(|item| {
3937 if *item > 0 {
3938 assert_eq!(back_spine.get_index(back_spine.len() - 1), back_spine.last());
3939 assert_eq!(back_spine.pop_last().unwrap() - 1, *back_spine.last().unwrap());
3940 } else {
3941 assert_eq!(back_spine.pop_last(), Some(0));
3942 assert_eq!(back_spine.last(), None);
3943 }
3944 });
3945 }
3946
3947 #[test]
3948 fn test_map_get() {
3949 let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).map(|i| (i, i)));
3950
3951 assert_eq!(btree.len(), DEFAULT_INNER_SIZE * 10);
3952
3953 for item in 0..DEFAULT_INNER_SIZE * 10 {
3954 assert_eq!(btree.get(&item), Some(&item));
3955 }
3956 }
3957
3958 #[test]
3959 fn test_get_contains_lower_bound() {
3960 let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3961 let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3962
3963 let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3964 acc.insert(curr.clone());
3965 acc
3966 });
3967
3968 expected_output.into_iter().for_each(|item| {
3969 assert_eq!(*btree.get_index(item).unwrap(), item);
3970 assert_eq!(*btree.get_index(item).unwrap(), *btree.lower_bound(&item).unwrap());
3971 assert!(btree.contains(&item));
3972 });
3973 }
3974
3975 #[test]
3976 fn test_iter() {
3977 let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3978 assert_eq!(btree.inner.len(), 19);
3979 let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
3980 let actual_forward = Vec::from_iter(btree.iter().cloned());
3981 assert_eq!(expected_forward, actual_forward);
3982 let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3983 let actual_backward = Vec::from_iter(btree.iter().cloned().rev());
3984 assert_eq!(expected_backward, actual_backward);
3985 }
3986
3987 #[test]
3988 fn test_iter_mut() {
3989 let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
3990 assert_eq!(btree.set.inner.len(), 19);
3991 let expected_forward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate());
3992 btree.clone().iter_mut().zip(expected_forward).for_each(|(lhs, rhs)| {
3993 assert_eq!(*lhs.0, rhs.0);
3994 assert_eq!(*lhs.1, rhs.1);
3995 });
3996
3997 let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
3998 btree
3999 .clone()
4000 .iter_mut()
4001 .rev()
4002 .zip(expected_backward)
4003 .for_each(|(lhs, rhs)| {
4004 assert_eq!(*lhs.0, rhs.0);
4005 assert_eq!(*lhs.1, rhs.1);
4006 });
4007 }
4008
4009 #[test]
4010 fn test_into_iter() {
4011 let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
4012 assert_eq!(btree.inner.len(), 19);
4013 let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
4014 let actual_forward = Vec::from_iter(btree.clone().into_iter());
4015 assert_eq!(expected_forward, actual_forward);
4016 let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
4017 let actual_backward = Vec::from_iter(btree.into_iter().rev());
4018 assert_eq!(expected_backward, actual_backward);
4019 }
4020
4021 #[test]
4022 fn test_range() {
4023 let btree = BTreeSet::from_iter(0..10);
4024 let first_to_second: Vec<usize> = (1..2).collect();
4025 let three_til_end: Vec<usize> = (3..10).collect();
4026 let start_til_four: Vec<usize> = (0..4).collect();
4027 let start_til_end: Vec<usize> = (0..10).collect();
4028 let five_til_six_included: Vec<usize> = (5..=6).collect();
4029 let start_til_seven_included: Vec<usize> = (0..=7).collect();
4030 assert_eq!(
4031 Vec::from_iter(btree.range_idx(..).cloned()),
4032 Vec::from_iter(btree.iter().cloned())
4033 );
4034 assert_eq!(
4035 Vec::from_iter(btree.range_idx(0..).cloned()),
4036 Vec::from_iter(btree.iter().cloned())
4037 );
4038 assert_eq!(
4039 Vec::from_iter(btree.range_idx(0..10).cloned()),
4040 Vec::from_iter(btree.iter().cloned())
4041 );
4042 assert_eq!(
4043 Vec::from_iter(btree.range_idx(..10).cloned()),
4044 Vec::from_iter(btree.iter().cloned())
4045 );
4046 assert_eq!(Vec::from_iter(btree.range_idx(1..2).cloned()), first_to_second);
4047 assert_eq!(Vec::from_iter(btree.range_idx(3..10).cloned()), three_til_end);
4048 assert_eq!(Vec::from_iter(btree.range_idx(0..4).cloned()), start_til_four);
4049 assert_eq!(Vec::from_iter(btree.range_idx(0..10).cloned()), start_til_end);
4050 assert_eq!(Vec::from_iter(btree.range_idx(5..=6).cloned()), five_til_six_included);
4051 assert_eq!(
4052 Vec::from_iter(btree.range_idx(0..=7).cloned()),
4053 start_til_seven_included
4054 );
4055 }
4056
4057 #[test]
4058 fn test_range_mut() {
4059 let btree = BTreeMap::from_iter((0..10).into_iter().enumerate());
4060 btree
4061 .clone()
4062 .range_mut_idx(..)
4063 .zip(btree.iter())
4064 .for_each(|(lhs, rhs)| {
4065 assert_eq!(lhs.0, rhs.0);
4066 assert_eq!(lhs.1, rhs.1);
4067 });
4068 btree
4069 .clone()
4070 .range_mut_idx(0..)
4071 .zip(btree.iter())
4072 .for_each(|(lhs, rhs)| {
4073 assert_eq!(lhs.0, rhs.0);
4074 assert_eq!(lhs.1, rhs.1);
4075 });
4076 btree
4077 .clone()
4078 .range_mut_idx(0..10)
4079 .zip(btree.iter())
4080 .for_each(|(lhs, rhs)| {
4081 assert_eq!(lhs.0, rhs.0);
4082 assert_eq!(lhs.1, rhs.1);
4083 });
4084 let first_to_second: Vec<(usize, usize)> = (1..2).map(|x| (x, x)).collect();
4085 let three_til_end: Vec<(usize, usize)> = (3..10).map(|x| (x, x)).collect();
4086 let start_til_four: Vec<(usize, usize)> = (0..4).map(|x| (x, x)).collect();
4087 let start_til_end: Vec<(usize, usize)> = (0..10).map(|x| (x, x)).collect();
4088 let five_til_six_included: Vec<(usize, usize)> = (5..=6).map(|x| (x, x)).collect();
4089 let start_til_seven_included: Vec<(usize, usize)> = (0..=7).map(|x| (x, x)).collect();
4090 btree
4091 .clone()
4092 .range_mut_idx(1..2)
4093 .zip(first_to_second)
4094 .for_each(|(lhs, rhs)| {
4095 assert_eq!(*lhs.0, rhs.0);
4096 assert_eq!(*lhs.1, rhs.1);
4097 });
4098 btree
4099 .clone()
4100 .range_mut_idx(3..10)
4101 .zip(three_til_end)
4102 .for_each(|(lhs, rhs)| {
4103 assert_eq!(*lhs.0, rhs.0);
4104 assert_eq!(*lhs.1, rhs.1);
4105 });
4106 btree
4107 .clone()
4108 .range_mut_idx(0..4)
4109 .zip(start_til_four)
4110 .for_each(|(lhs, rhs)| {
4111 assert_eq!(*lhs.0, rhs.0);
4112 assert_eq!(*lhs.1, rhs.1);
4113 });
4114 btree
4115 .clone()
4116 .range_mut_idx(0..10)
4117 .zip(start_til_end)
4118 .for_each(|(lhs, rhs)| {
4119 assert_eq!(*lhs.0, rhs.0);
4120 assert_eq!(*lhs.1, rhs.1);
4121 });
4122 btree
4123 .clone()
4124 .range_mut_idx(5..=6)
4125 .zip(five_til_six_included)
4126 .for_each(|(lhs, rhs)| {
4127 assert_eq!(*lhs.0, rhs.0);
4128 assert_eq!(*lhs.1, rhs.1);
4129 });
4130 btree
4131 .clone()
4132 .range_mut_idx(0..=7)
4133 .zip(start_til_seven_included)
4134 .for_each(|(lhs, rhs)| {
4135 assert_eq!(*lhs.0, rhs.0);
4136 assert_eq!(*lhs.1, rhs.1);
4137 });
4138 }
4139
4140 #[test]
4141 fn test_non_boolean_set_operations() {
4142 let left_spine = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4143 let right_spine = BTreeSet::from_iter(((DEFAULT_INNER_SIZE - 1)..((DEFAULT_INNER_SIZE + 1) * 2)).into_iter());
4144
4145 let mut union = left_spine.clone();
4146 let mut temp_right_spine = right_spine.clone();
4147 union.append(&mut temp_right_spine);
4148
4149 assert_eq!(
4150 Vec::from_iter(union.iter().cloned()),
4151 Vec::from_iter(left_spine.union(&right_spine).cloned())
4152 );
4153 assert_eq!(
4154 Vec::from_iter(union.iter().cloned()),
4155 Vec::from_iter(right_spine.union(&left_spine).cloned()),
4156 );
4157
4158 let left_diff = Vec::from_iter(0..(DEFAULT_INNER_SIZE - 1));
4159 let right_diff = Vec::from_iter((DEFAULT_INNER_SIZE + 1)..((DEFAULT_INNER_SIZE + 1) * 2));
4160
4161 assert_eq!(left_diff, Vec::from_iter(left_spine.difference(&right_spine).cloned()));
4162 assert_eq!(right_diff, Vec::from_iter(right_spine.difference(&left_spine).cloned()));
4163
4164 let intersection = vec![DEFAULT_INNER_SIZE - 1, DEFAULT_INNER_SIZE];
4165 assert_eq!(
4166 intersection,
4167 Vec::from_iter(left_spine.intersection(&right_spine).cloned())
4168 );
4169
4170 let mut sym_diff = left_diff.clone();
4171 sym_diff.append(&mut right_diff.clone());
4172 assert_eq!(
4173 sym_diff,
4174 Vec::from_iter(left_spine.symmetric_difference(&right_spine).cloned())
4175 );
4176 assert_eq!(
4177 sym_diff,
4178 Vec::from_iter(right_spine.symmetric_difference(&left_spine).cloned())
4179 );
4180 }
4181
4182 #[test]
4183 fn test_boolean_set_operations() {
4184 let empty_set: BTreeSet<usize> = BTreeSet::new();
4185 assert!(empty_set.is_empty());
4186 let a = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4187 let b = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 2)).into_iter());
4188 let c = BTreeSet::from_iter(((DEFAULT_INNER_SIZE + 2)..(DEFAULT_INNER_SIZE + 4)).into_iter());
4189
4190 assert!(a.is_subset(&a));
4191 assert!(a.is_superset(&a));
4192 assert!(a.is_subset(&b));
4193 assert!(!b.is_subset(&a));
4194 assert!(b.is_superset(&a));
4195 assert!(c.is_disjoint(&a));
4196 assert!(c.is_disjoint(&b));
4197 assert!(!a.is_disjoint(&b));
4198 assert!(!b.is_disjoint(&a));
4199 }
4200
4201 #[test]
4202 fn test_split_off() {
4203 let btree: BTreeSet<usize> = BTreeSet::from_iter(0..(DEFAULT_INNER_SIZE * 10));
4204 for split in vec![
4205 1,
4206 (DEFAULT_INNER_SIZE * 3) - 6,
4207 DEFAULT_INNER_SIZE,
4208 DEFAULT_INNER_SIZE + 1,
4209 (DEFAULT_INNER_SIZE * 10) - 1,
4210 ] {
4211 let mut left = btree.clone();
4212 let right = left.split_off(&split);
4213 assert!(left.is_disjoint(&right));
4214 assert!(Vec::from_iter(left.intersection(&right)).is_empty());
4215 let expected_left = Vec::from_iter(0..split);
4216 let expected_right = Vec::from_iter(split..(DEFAULT_INNER_SIZE * 10));
4217
4218 assert_eq!(expected_left, Vec::from_iter(left));
4219 let actual_right = Vec::from_iter(right);
4220 assert_eq!(expected_right, actual_right)
4221 }
4222 }
4223
4224 #[test]
4225 fn test_out_of_bounds_range() {
4226 let btree: BTreeSet<usize> = BTreeSet::from_iter(0..10);
4227 assert_eq!(btree.range((Included(5), Included(10))).count(), 5);
4228 assert_eq!(btree.range((Included(5), Included(11))).count(), 5);
4229 assert_eq!(btree.range((Included(5), Included(10 + DEFAULT_INNER_SIZE))).count(), 5);
4230 assert_eq!(btree.range((Included(0), Included(11))).count(), 10);
4231 }
4232
4233 #[test]
4234 fn test_iterating_over_blocks() {
4235 let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 10)).into_iter());
4236 assert_eq!(btree.iter().count(), (0..(DEFAULT_INNER_SIZE + 10)).count());
4237 assert_eq!(
4238 btree.range(0..DEFAULT_INNER_SIZE).count(),
4239 (0..DEFAULT_INNER_SIZE).count()
4240 );
4241 assert_eq!(
4242 btree.range(0..=DEFAULT_INNER_SIZE).count(),
4243 (0..=DEFAULT_INNER_SIZE).count()
4244 );
4245 assert_eq!(
4246 btree.range(0..=DEFAULT_INNER_SIZE + 1).count(),
4247 (0..=DEFAULT_INNER_SIZE + 1).count()
4248 );
4249
4250 assert_eq!(btree.iter().rev().count(), (0..(DEFAULT_INNER_SIZE + 10)).count());
4251 assert_eq!(
4252 btree.range(0..DEFAULT_INNER_SIZE).rev().count(),
4253 (0..DEFAULT_INNER_SIZE).count()
4254 );
4255 assert_eq!(
4256 btree.range(0..=DEFAULT_INNER_SIZE).rev().count(),
4257 (0..=DEFAULT_INNER_SIZE).count()
4258 );
4259 assert_eq!(
4260 btree.range(0..=DEFAULT_INNER_SIZE + 1).rev().count(),
4261 (0..=DEFAULT_INNER_SIZE + 1).count()
4262 );
4263 }
4264
4265 #[test]
4266 fn test_empty_set() {
4267 let btree: BTreeSet<usize> = BTreeSet::new();
4268 assert_eq!(btree.iter().count(), 0);
4269 assert_eq!(btree.range(0..0).count(), 0);
4270 assert_eq!(btree.range(0..).count(), 0);
4271 assert_eq!(btree.range(..0).count(), 0);
4272 assert_eq!(btree.range(..).count(), 0);
4273 assert_eq!(btree.range(0..=0).count(), 0);
4274 assert_eq!(btree.range(..1).count(), 0);
4275
4276 assert_eq!(btree.iter().rev().count(), 0);
4277 assert_eq!(btree.range(0..0).rev().count(), 0);
4278 assert_eq!(btree.range(..).rev().count(), 0);
4279 assert_eq!(btree.range(..1).rev().count(), 0);
4280
4281 assert_eq!(btree.range(..DEFAULT_INNER_SIZE).count(), 0);
4282 assert_eq!(btree.range(DEFAULT_INNER_SIZE..DEFAULT_INNER_SIZE * 2).count(), 0);
4283 }
4284
4285 #[test]
4286 fn test_map() {
4287 let mut btree: BTreeMap<usize, usize> = BTreeMap::new();
4288 assert_eq!(btree.iter().count(), 0);
4289 assert_eq!(btree.iter_mut().count(), 0);
4290
4291 btree.insert(123, 456);
4292 assert_eq!(btree.iter().count(), 1);
4293 assert_eq!(btree.iter_mut().count(), 1);
4294
4295 btree.insert(7, 8);
4296 assert_eq!(btree.iter().count(), 2);
4297 assert_eq!(btree.iter_mut().count(), 2);
4298 }
4299
4300 #[test]
4301 fn test_many_fuzzy_duplicates() {
4302 let mut rng = rand::rngs::StdRng::from_seed([41u8; 32]);
4304 let mut btree = BTreeSet::new();
4305 let n = 100_000;
4306 for _ in 0..n {
4307 let value: u64 = rng.random_range(1..10000);
4308 let lower: u64 = 1650;
4309 let len_before = btree.len();
4310 if btree.insert(value.max(lower)) {
4312 assert_eq!(btree.len(), len_before + 1)
4313 } else {
4314 assert_eq!(btree.len(), len_before);
4315 }
4316 }
4317 let expected = btree.iter().cloned().collect::<Vec<_>>();
4318 assert_eq!(expected.len(), btree.len());
4319 for (i, expected_item) in expected.iter().enumerate() {
4320 if let Some(item) = btree.get_index(i) {
4321 assert_eq!(expected_item, item, "mismatch on index {i}");
4322 } else {
4323 panic!("missing index {i}")
4324 }
4325 }
4326 }
4327
4328 #[test]
4329 fn test_iter_mut_rev() {
4330 let mut map = BTreeMap::<i64, i64>::new();
4331 map.insert(1, 10);
4332 map.insert(2, 20);
4333 map.insert(3, 30);
4334
4335 let expected_forward = vec![(1, 10), (2, 20), (3, 30)];
4336 for (i, (k, v)) in map.iter_mut().enumerate() {
4337 assert_eq!(*k, expected_forward[i].0);
4338 assert_eq!(*v, expected_forward[i].1);
4339 }
4340
4341 let expected_backward = vec![(3, 30), (2, 20), (1, 10)];
4342 for (i, (k, v)) in map.iter_mut().rev().enumerate() {
4343 assert_eq!(*k, expected_backward[i].0);
4344 assert_eq!(*v, expected_backward[i].1);
4345 }
4346 }
4347
4348 #[test] fn test_indexset_btreemap_overflow_bug() {
4350 let mut map = BTreeMap::new();
4354
4355 map.insert(vec![1, 2, 3, 4], 1);
4357 map.insert(vec![1, 2, 3, 7], 2);
4358 map.insert(vec![1, 2, 4, 5], 3);
4359 let end_key = vec![1, 2, 3, 4];
4360
4361 let mut range_iter = map.range(..end_key).rev();
4362
4363 let result = range_iter.next();
4364
4365 assert!(result.is_none(), "Expected None when ranging before first key");
4368 }
4369
4370 use std::collections::Bound;
4371 use std::ops::RangeBounds;
4372
4373 pub struct RangeFromExcluding<'a, T> {
4374 pub(crate) from: &'a T,
4375 }
4376
4377 impl<T> RangeBounds<T> for RangeFromExcluding<'_, T> {
4378 fn start_bound(&self) -> Bound<&T> {
4379 Bound::Excluded(self.from)
4380 }
4381
4382 fn end_bound(&self) -> Bound<&T> {
4383 Bound::Unbounded
4384 }
4385 }
4386
4387 #[test]
4388 fn test_range_from_excluding_bug() {
4389 let mut map = BTreeMap::new();
4390 map.insert(vec![1, 2, 3, 4], 1);
4391 map.insert(vec![1, 2, 3, 7], 2);
4392 map.insert(vec![1, 2, 4, 5], 3);
4393
4394 let non_existing_key = vec![1, 2, 3, 6];
4397 let range = RangeFromExcluding {
4398 from: &non_existing_key,
4399 };
4400 let result = map.range(range).next().unwrap();
4401
4402 assert_eq!(
4403 result.0,
4404 &vec![1, 2, 3, 7],
4405 "RangeFromExcluding skips entries incorrectly"
4406 );
4407 assert_eq!(*result.1, 2);
4408 }
4409
4410 #[test]
4411 fn uuid_key_test() {
4412 let mut map = BTreeMap::new();
4413
4414 map.insert(uuid::uuid!("019c34bf-47c0-7df1-9d46-522cec0dd95f"), 1);
4415
4416 let out = map.get_mut(&uuid::uuid!("019c34bf-47c0-7df1-9d46-52013234139b"));
4417 assert!(out.is_none());
4418 }
4419}