Skip to main content

indexset/
lib.rs

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/// An ordered set based on a B-Tree.
26///
27/// See [`BTreeMap`]'s documentation for a detailed discussion of this collection's performance
28/// benefits and drawbacks.
29///
30/// It is a logic error for an item to be modified in such a way that the item's ordering relative
31/// to any other item, as determined by the [`Ord`] trait, changes while it is in the set. This is
32/// normally only possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code.
33/// The behavior resulting from such a logic error is not specified, but will be encapsulated to the
34/// `BTreeSet` that observed the logic error and not result in undefined behavior. This could
35/// include panics, incorrect results, aborts, memory leaks, and non-termination.
36///
37/// Iterators returned by [`BTreeSet::iter`] produce their items in order, and take worst-case
38/// logarithmic and amortized constant time per item returned.
39///
40/// [`Cell`]: core::cell::Cell
41/// [`RefCell`]: core::cell::RefCell
42///
43/// # Examples
44///
45/// ```
46/// use indexset::BTreeSet;
47///
48/// // Type inference lets us omit an explicit type signature (which
49/// // would be `BTreeSet<&str>` in this example).
50/// let mut books = BTreeSet::new();
51///
52/// // Add some books.
53/// books.insert("A Dance With Dragons");
54/// books.insert("To Kill a Mockingbird");
55/// books.insert("The Odyssey");
56/// books.insert("The Great Gatsby");
57///
58/// // Check for a specific one.
59/// if !books.contains("The Winds of Winter") {
60///     println!("We have {} books, but The Winds of Winter ain't one.",
61///              books.len());
62/// }
63///
64/// // Remove a book.
65/// books.remove("The Odyssey");
66///
67/// // Iterate over everything.
68/// for book in &books {
69///     println!("{book}");
70/// }
71/// ```
72///
73/// A `BTreeSet` with a known list of items can be initialized from an array:
74///
75/// ```
76/// use indexset::BTreeSet;
77///
78/// let set = BTreeSet::from_iter([1, 2, 3]);
79/// ```
80#[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    /// Makes a new, empty `BTreeSet` with maximum node size 1024. Allocates one vec of capacity 1024.
104    ///
105    /// Note that this does not mean that the maximum number of items is 1024.
106    ///
107    /// In case you would like to make a tree with a different maximum node size, use the
108    /// `with_maximum_node_size` method.
109    ///
110    /// # Examples
111    ///
112    /// ```
113    /// # #![allow(unused_mut)]
114    /// use indexset::BTreeSet;
115    ///
116    /// let mut set: BTreeSet<i32> = BTreeSet::new();
117    /// ```
118    pub fn new() -> Self {
119        Self { ..Default::default() }
120    }
121    /// Makes a new, empty `BTreeSet` with the given maximum node size. Allocates one vec with
122    /// the capacity set to be the specified node size.
123    ///
124    /// # Examples
125    ///
126    /// ```
127    /// # #![allow(unused_mut)]
128    /// use indexset::BTreeSet;
129    ///
130    /// let mut set: BTreeSet<i32> = BTreeSet::with_maximum_node_size(128);
131    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    /// Clears the set, removing all elements.
139    ///
140    /// # Examples
141    ///
142    /// ```
143    /// use indexset::BTreeSet;
144    ///
145    /// let mut v = BTreeSet::new();
146    /// v.insert(1);
147    /// v.clear();
148    /// assert!(v.is_empty());
149    /// ```
150    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        // When value is greater than all elements inside inner[node_idx], then len
169        // of inner[node_idx], which is not a valid place for insertion, is returned. It will
170        // never return less than 0, so it is only necessary to check whether it is out of bounds
171        // from the right
172        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    /// Returns a reference to the element in the i-th position of the set, if any.
238    ///
239    /// The value may be any borrowed form of the set's element type,
240    /// but the ordering on the borrowed form *must* match the
241    /// ordering on the element type.
242    ///
243    /// # Examples
244    ///
245    /// ```
246    /// use indexset::BTreeSet;
247    ///
248    /// let set = BTreeSet::from_iter([1, 2, 3]);
249    /// assert_eq!(set.get_index(0), Some(&1));
250    /// assert_eq!(set.get_index(2), Some(&3));
251    /// assert_eq!(set.get_index(4), None);
252    /// ```
253    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    /// Returns a reference to the element in the set, if any, that is equal to
270    /// the value.
271    ///
272    /// The value may be any borrowed form of the set's element type,
273    /// but the ordering on the borrowed form *must* match the
274    /// ordering on the element type.
275    ///
276    /// # Examples
277    ///
278    /// ```
279    /// use indexset::BTreeSet;
280    ///
281    /// let set = BTreeSet::from([1, 2, 3]);
282    /// assert_eq!(set.get(&2), Some(&2));
283    /// assert_eq!(set.get(&4), None);
284    /// ```
285    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    /// Returns a reference to the first element in the set, if any, that is not less than the
298    /// input.
299    ///
300    /// The value may be any borrowed form of the set's element type,
301    /// but the ordering on the borrowed form *must* match the
302    /// ordering on the element type.
303    ///
304    /// # Examples
305    ///
306    /// ```
307    /// use indexset::BTreeSet;
308    ///
309    /// let set = BTreeSet::from_iter([1, 2, 3, 5]);
310    /// assert_eq!(set.lower_bound(&2), Some(&2));
311    /// assert_eq!(set.lower_bound(&4), Some(&5));
312    /// ```
313    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    /// Returns the number of elements in the set.
326    ///
327    /// # Examples
328    ///
329    /// ```
330    /// use indexset::BTreeSet;
331    ///
332    /// let mut v = BTreeSet::new();
333    /// assert_eq!(v.len(), 0);
334    /// v.insert(1);
335    /// assert_eq!(v.len(), 1);
336    /// ```
337    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                // Reconstruct the index after the new node and inner value inserts.
351                self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
352                self.len += 1;
353
354                true
355            } else {
356                // Reconstruct the index after the new node insert even if the new value wasn't added.
357                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    /// Adds a value to the set.
370    ///
371    /// Returns whether the value was newly inserted. That is:
372    ///
373    /// - If the set did not previously contain an equal value, `true` is
374    ///   returned.
375    /// - If the set already contained an equal value, `false` is returned, and
376    ///   the entry is not updated.
377    ///
378    /// See the [module-level documentation] for more.
379    ///
380    /// [module-level documentation]: index.html#insert-and-complex-keys
381    ///
382    /// # Examples
383    ///
384    /// ```
385    /// use indexset::BTreeSet;
386    ///
387    /// let mut set = BTreeSet::new();
388    ///
389    /// assert_eq!(set.insert(2), true);
390    /// assert_eq!(set.insert(2), false);
391    /// assert_eq!(set.len(), 1);
392    /// ```
393    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    /// Adds a value to the set, replacing the existing element, if any, that is
399    /// equal to the value. Returns the replaced element.
400    ///
401    /// # Examples
402    ///
403    /// ```
404    /// use indexset::BTreeSet;
405    ///
406    /// let mut set = BTreeSet::new();
407    /// set.insert(Vec::<i32>::new());
408    ///
409    /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 0);
410    /// println!("{}", set.replace(Vec::with_capacity(10)).unwrap().capacity());
411    /// println!("{}", set.get(&[][..]).unwrap().capacity());
412    /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 10);
413    /// ```
414    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    /// Returns `true` if the set contains an element equal to the value.
421    ///
422    /// The value may be any borrowed form of the set's element type,
423    /// but the ordering on the borrowed form *must* match the
424    /// ordering on the element type.
425    ///
426    /// # Examples
427    ///
428    /// ```
429    /// use indexset::BTreeSet;
430    ///
431    /// let set = BTreeSet::from_iter([1, 2, 3]);
432    /// assert_eq!(set.contains(&1), true);
433    /// assert_eq!(set.contains(&4), false);
434    /// ```
435    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        // check whether the node has to be deleted
470        if self.inner[node_idx].is_empty() {
471            // delete it as long as it is not the last remaining node
472            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    /// If the set contains an element equal to the value, removes it from the
549    /// set and drops it. Returns whether such an element was present.
550    ///
551    /// The value may be any borrowed form of the set's element type,
552    /// but the ordering on the borrowed form *must* match the
553    /// ordering on the element type.
554    ///
555    /// # Examples
556    ///
557    /// ```
558    /// use indexset::BTreeSet;
559    ///
560    /// let mut set = BTreeSet::new();
561    ///
562    /// set.insert(2);
563    /// assert_eq!(set.remove(&2), true);
564    /// assert_eq!(set.remove(&2), false);
565    /// ```
566    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    /// Removes and returns the element in the set, if any, that is equal to
574    /// the value.
575    ///
576    /// The value may be any borrowed form of the set's element type,
577    /// but the ordering on the borrowed form *must* match the
578    /// ordering on the element type.
579    ///
580    /// # Examples
581    ///
582    /// ```
583    /// use indexset::BTreeSet;
584    ///
585    /// let mut set = BTreeSet::from_iter([1, 2, 3]);
586    /// assert_eq!(set.take(&2), Some(2));
587    /// assert_eq!(set.take(&2), None);
588    /// ```
589    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    /// Returns a reference to the first element in the set, if any.
597    /// This element is always the minimum of all elements in the set.
598    ///
599    /// # Examples
600    ///
601    /// Basic usage:
602    ///
603    /// ```
604    /// use indexset::BTreeSet;
605    ///
606    /// let mut set = BTreeSet::new();
607    /// assert_eq!(set.first(), None);
608    /// set.insert(1);
609    /// assert_eq!(set.first(), Some(&1));
610    /// set.insert(2);
611    /// assert_eq!(set.first(), Some(&1));
612    /// ```
613    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    /// Returns a reference to the last element in the set, if any.
621    /// This element is always the maximum of all elements in the set.
622    ///
623    /// # Examples
624    ///
625    /// Basic usage:
626    ///
627    /// ```
628    /// use indexset::BTreeSet;
629    ///
630    /// let mut set = BTreeSet::new();
631    /// assert_eq!(set.last(), None);
632    /// set.insert(1);
633    /// assert_eq!(set.last(), Some(&1));
634    /// set.insert(2);
635    /// assert_eq!(set.last(), Some(&2));
636    /// ```
637    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    /// Removes the first element from the set and returns it, if any.
647    /// The first element is always the minimum element in the set.
648    ///
649    /// # Examples
650    ///
651    /// ```
652    /// use indexset::BTreeSet;
653    ///
654    /// let mut set = BTreeSet::new();
655    ///
656    /// set.insert(1);
657    /// while let Some(n) = set.pop_first() {
658    ///     assert_eq!(n, 1);
659    /// }
660    /// assert!(set.is_empty());
661    /// ```
662    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    /// Removes the i-th element from the set and returns it, if any.
673    ///
674    /// # Examples
675    ///
676    /// ```
677    /// use indexset::BTreeSet;
678    ///
679    /// let mut set = BTreeSet::new();
680    ///
681    /// set.insert(1);
682    /// set.insert(2);
683    /// assert_eq!(set.pop_index(0), 1);
684    /// assert_eq!(set.pop_index(0), 2);
685    /// assert!(set.is_empty());
686    /// ```
687    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    /// Removes the last element from the set and returns it, if any.
693    /// The last element is always the maximum element in the set.
694    ///
695    /// # Examples
696    ///
697    /// ```
698    /// use indexset::BTreeSet;
699    ///
700    /// let mut set = BTreeSet::new();
701    ///
702    /// set.insert(1);
703    /// while let Some(n) = set.pop_last() {
704    ///     assert_eq!(n, 1);
705    /// }
706    /// assert!(set.is_empty());
707    /// ```
708    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    /// Returns `true` if the set contains no elements.
722    ///
723    /// # Examples
724    ///
725    /// ```
726    /// use indexset::BTreeSet;
727    ///
728    /// let mut v = BTreeSet::new();
729    /// assert!(v.is_empty());
730    /// v.insert(1);
731    /// assert!(!v.is_empty());
732    /// ```
733    pub fn is_empty(&self) -> bool {
734        self.len() == 0
735    }
736    /// Returns `true` if the set is a subset of another,
737    /// i.e., `other` contains at least all the elements in `self`.
738    ///
739    /// # Examples
740    ///
741    /// ```
742    /// use indexset::BTreeSet;
743    ///
744    /// let sup = BTreeSet::from_iter([1, 2, 3]);
745    /// let mut set = BTreeSet::new();
746    ///
747    /// assert_eq!(set.is_subset(&sup), true);
748    /// set.insert(2);
749    /// assert_eq!(set.is_subset(&sup), true);
750    /// set.insert(4);
751    /// assert_eq!(set.is_subset(&sup), false);
752    /// ```
753    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    /// Returns `true` if the set is a superset of another,
761    /// i.e., `self` contains at least all the elements in `other`.
762    ///
763    /// # Examples
764    ///
765    /// ```
766    /// use indexset::BTreeSet;
767    ///
768    /// let sub = BTreeSet::from_iter([1, 2]);
769    /// let mut set = BTreeSet::new();
770    ///
771    /// assert_eq!(set.is_superset(&sub), false);
772    ///
773    /// set.insert(0);
774    /// set.insert(1);
775    /// assert_eq!(set.is_superset(&sub), false);
776    ///
777    /// set.insert(2);
778    /// assert_eq!(set.is_superset(&sub), true);
779    /// ```
780    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    /// Returns `true` if `self` has no elements in common with `other`.
788    /// This is equivalent to checking for an empty intersection.
789    ///
790    /// # Examples
791    ///
792    /// ```
793    /// use indexset::BTreeSet;
794    ///
795    /// let a = BTreeSet::from_iter([1, 2, 3]);
796    /// let mut b = BTreeSet::new();
797    ///
798    /// assert_eq!(a.is_disjoint(&b), true);
799    /// b.insert(4);
800    /// assert_eq!(a.is_disjoint(&b), true);
801    /// b.insert(1);
802    /// assert_eq!(a.is_disjoint(&b), false);
803    /// ```
804    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    /// Gets an iterator that visits the elements in the `BTreeSet` in ascending
812    /// order.
813    ///
814    /// # Examples
815    ///
816    /// ```
817    /// use indexset::BTreeSet;
818    ///
819    /// let set = BTreeSet::from_iter([1, 2, 3]);
820    /// let mut set_iter = set.iter();
821    /// assert_eq!(set_iter.next(), Some(&1));
822    /// assert_eq!(set_iter.next(), Some(&2));
823    /// assert_eq!(set_iter.next(), Some(&3));
824    /// assert_eq!(set_iter.next(), None);
825    /// ```
826    ///
827    /// Values returned by the iterator are returned in ascending order:
828    ///
829    /// ```
830    /// use indexset::BTreeSet;
831    ///
832    /// let set = BTreeSet::from_iter([3, 1, 2]);
833    /// let mut set_iter = set.iter();
834    /// assert_eq!(set_iter.next(), Some(&1));
835    /// assert_eq!(set_iter.next(), Some(&2));
836    /// assert_eq!(set_iter.next(), Some(&3));
837    /// assert_eq!(set_iter.next(), None);
838    /// ```
839    pub fn iter(&self) -> Iter<'_, T> {
840        Iter::new(self)
841    }
842    /// Visits the elements representing the union,
843    /// i.e., all the elements in `self` or `other`, without duplicates,
844    /// in ascending order.
845    ///
846    /// # Examples
847    ///
848    /// ```
849    /// use indexset::BTreeSet;
850    ///
851    /// let mut a = BTreeSet::new();
852    /// a.insert(1);
853    ///
854    /// let mut b = BTreeSet::new();
855    /// b.insert(2);
856    ///
857    /// let union: Vec<_> = a.union(&b).cloned().collect();
858    /// assert_eq!(union, [1, 2]);
859    /// ```
860    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    /// Visits the elements representing the difference,
872    /// i.e., the elements that are in `self` but not in `other`,
873    /// in ascending order.
874    ///
875    /// # Examples
876    ///
877    /// ```
878    /// use indexset::BTreeSet;
879    ///
880    /// let mut a = BTreeSet::new();
881    /// a.insert(1);
882    /// a.insert(2);
883    ///
884    /// let mut b = BTreeSet::new();
885    /// b.insert(2);
886    /// b.insert(3);
887    ///
888    /// let diff: Vec<_> = a.difference(&b).cloned().collect();
889    /// assert_eq!(diff, [1]);
890    /// ```
891    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    /// Visits the elements representing the symmetric difference,
903    /// i.e., the elements that are in `self` or in `other` but not in both,
904    /// in ascending order.
905    ///
906    /// # Examples
907    ///
908    /// ```
909    /// use indexset::BTreeSet;
910    ///
911    /// let mut a = BTreeSet::new();
912    /// a.insert(1);
913    /// a.insert(2);
914    ///
915    /// let mut b = BTreeSet::new();
916    /// b.insert(2);
917    /// b.insert(3);
918    ///
919    /// let sym_diff: Vec<_> = a.symmetric_difference(&b).cloned().collect();
920    /// assert_eq!(sym_diff, [1, 3]);
921    /// ```
922    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    /// Visits the elements representing the intersection,
934    /// i.e., the elements that are both in `self` and `other`,
935    /// in ascending order.
936    ///
937    /// # Examples
938    ///
939    /// ```
940    /// use indexset::BTreeSet;
941    ///
942    /// let mut a = BTreeSet::new();
943    /// a.insert(1);
944    /// a.insert(2);
945    ///
946    /// let mut b = BTreeSet::new();
947    /// b.insert(2);
948    /// b.insert(3);
949    ///
950    /// let intersection: Vec<_> = a.intersection(&b).cloned().collect();
951    /// assert_eq!(intersection, [2]);
952    /// ```
953    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    /// Retains only the elements specified by the predicate.
965    ///
966    /// In other words, remove all elements `e` for which `f(&e)` returns `false`.
967    /// The elements are visited in ascending order.
968    ///
969    /// # Examples
970    ///
971    /// ```
972    /// use indexset::BTreeSet;
973    ///
974    /// let mut set = BTreeSet::from_iter([1, 2, 3, 4, 5, 6]);
975    /// // Keep only the even numbers.
976    /// set.retain(|&k| k % 2 == 0);
977    /// assert!(set.iter().eq([2, 4, 6].iter()));
978    /// ```
979    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    /// Splits the collection into two at the value. Returns a new collection
1030    /// with all elements greater than or equal to the value.
1031    ///
1032    /// # Examples
1033    ///
1034    /// Basic usage:
1035    ///
1036    /// ```
1037    /// use indexset::BTreeSet;
1038    ///
1039    /// let mut a = BTreeSet::new();
1040    /// a.insert(1);
1041    /// a.insert(2);
1042    /// a.insert(3);
1043    /// a.insert(17);
1044    /// a.insert(41);
1045    ///
1046    /// let b = a.split_off(&3);
1047    ///
1048    /// assert_eq!(a.len(), 2);
1049    /// assert_eq!(b.len(), 3);
1050    ///
1051    /// assert!(a.contains(&1));
1052    /// assert!(a.contains(&2));
1053    ///
1054    /// assert!(b.contains(&3));
1055    /// assert!(b.contains(&17));
1056    /// assert!(b.contains(&41));
1057    /// ```
1058    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    /// Moves all elements from `other` into `self`, leaving `other` empty.
1086    ///
1087    /// # Examples
1088    ///
1089    /// ```
1090    /// use indexset::BTreeSet;
1091    ///
1092    /// let mut a = BTreeSet::new();
1093    /// a.insert(1);
1094    /// a.insert(2);
1095    /// a.insert(3);
1096    ///
1097    /// let mut b = BTreeSet::new();
1098    /// b.insert(3);
1099    /// b.insert(4);
1100    /// b.insert(5);
1101    ///
1102    /// a.append(&mut b);
1103    ///
1104    /// assert_eq!(a.len(), 5);
1105    /// assert_eq!(b.len(), 0);
1106    ///
1107    /// assert!(a.contains(&1));
1108    /// assert!(a.contains(&2));
1109    /// assert!(a.contains(&3));
1110    /// assert!(a.contains(&4));
1111    /// assert!(a.contains(&5));
1112    /// ```
1113    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        // Solving global indexes
1126        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        // Figuring out nodes
1148        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    /// Constructs a double-ended iterator over a sub-range of elements in the set.
1157    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
1158    /// yield elements from min (inclusive) to max (exclusive).
1159    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
1160    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
1161    /// range from 4 to 10.
1162    ///
1163    /// # Panics
1164    ///
1165    /// Panics if range `start > end`.
1166    /// Panics if range `start == end` and both bounds are `Excluded`.
1167    ///
1168    /// # Examples
1169    ///
1170    /// ```
1171    /// use indexset::BTreeSet;
1172    /// use std::ops::Bound::Included;
1173    ///
1174    /// let mut set = BTreeSet::new();
1175    /// set.insert(3);
1176    /// set.insert(5);
1177    /// set.insert(8);
1178    /// for &elem in set.range((Included(&4), Included(&8))) {
1179    ///     println!("{elem}");
1180    /// }
1181    /// assert_eq!(Some(&5), set.range(4..).next());
1182    /// ```
1183    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    /// Returns the position in which the given element would fall in the already-existing sorted
1203    /// order.
1204    ///
1205    /// The value may be any borrowed form of the set's element type,
1206    /// but the ordering on the borrowed form *must* match the
1207    /// ordering on the element type.
1208    ///
1209    /// # Examples
1210    ///
1211    /// ```
1212    /// use indexset::BTreeSet;
1213    ///
1214    /// let set = BTreeSet::from_iter([1, 2, 3]);
1215    /// assert_eq!(set.rank(&1), 0);
1216    /// assert_eq!(set.rank(&3), 2);
1217    /// assert_eq!(set.rank(&4), 3);
1218    /// assert_eq!(set.rank(&100), 3);
1219    /// ```
1220    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
1321/// An iterator over the items of a `BTreeSet`.
1322///
1323/// This `struct` is created by the [`iter`] method on [`BTreeSet`].
1324/// See its documentation for more.
1325///
1326/// [`iter`]: BTreeSet::iter
1327pub 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
1420/// An owning iterator over the items of a `BTreeSet`.
1421///
1422/// This `struct` is created by the [`into_iter`] method on [`BTreeSet`]
1423/// (provided by the [`IntoIterator`] trait). See its documentation for more.
1424///
1425/// [`into_iter`]: BTreeSet#method.into_iter
1426pub 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        // This will never panic, since there always is at least one node in the btree
1465        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
1519/// A lazy iterator producing elements in the union of `BTreeSet`s.
1520///
1521/// This `struct` is created by the [`union`] method on [`BTreeSet`].
1522/// See its documentation for more.
1523///
1524/// [`union`]: BTreeSet::union
1525pub 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
1560/// A lazy iterator producing elements in the difference of `BTreeSet`s.
1561///
1562/// This `struct` is created by the [`difference`] method on [`BTreeSet`].
1563/// See its documentation for more.
1564///
1565/// [`difference`]: BTreeSet::difference
1566pub 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
1602/// A lazy iterator producing elements in the symmetric difference of `BTreeSet`s.
1603///
1604/// This `struct` is created by the [`symmetric_difference`] method on
1605/// [`BTreeSet`]. See its documentation for more.
1606///
1607/// [`symmetric_difference`]: BTreeSet::symmetric_difference
1608pub 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
1647/// A lazy iterator producing elements in the intersection of `BTreeSet`s.
1648///
1649/// This `struct` is created by the [`intersection`] method on [`BTreeSet`].
1650/// See its documentation for more.
1651///
1652/// [`intersection`]: BTreeSet::intersection
1653pub 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
1688/// An iterator over a sub-range of items in a `BTreeSet`.
1689///
1690/// This `struct` is created by the [`range`] method on [`BTreeSet`].
1691/// See its documentation for more.
1692///
1693/// [`range`]: BTreeSet::range
1694pub 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/// An ordered map based on a two-level [B-Tree].
1870///
1871/// B-Trees represent a fundamental compromise between cache-efficiency and actually minimizing
1872/// the amount of work performed in a search. In theory, a binary search tree (BST) is the optimal
1873/// choice for a sorted map, as a perfectly balanced BST performs the theoretical minimum amount of
1874/// comparisons necessary to find an element (log<sub>2</sub>n). However, in practice the way this
1875/// is done is *very* inefficient for modern computer architectures. In particular, every element
1876/// is stored in its own individually heap-allocated node. This means that every single insertion
1877/// triggers a heap-allocation, and every single comparison should be a cache-miss. Since these
1878/// are both notably expensive things to do in practice, we are forced to, at the very least,
1879/// reconsider the BST strategy.
1880///
1881/// However, B-Trees are not as performant as they could be, since there still is a significant
1882/// amount of pointer indirection, and, in Rust's case, a linear search on the node level.
1883///
1884/// Our implementation restricts a B-Tree to only have two levels, and have zero pointer indirection,
1885/// with data residing only in the second level. The first level is an array, sorted by each node's
1886/// maximum element. The second is where all the data is at, being a sorted array of sorted arrays of
1887/// fixed size, 1024. Lookups are done in two steps, one binary search over the first level, and one
1888/// over the second. This is significantly simpler than a regular B-Tree. The main tradeoff, is that
1889/// insertion and deletion relies on always having to sort an array of size 1024. In practice, this
1890/// is barely noticable, but still presents itself as a drawback significant enough to warrant considering
1891/// not using this crate. Please, read the Readme in order to see benchmarking results.
1892///
1893/// Furthermore, it has a very efficient get-the-ith-element implementation, that is thousands(literally)
1894/// of times faster than what is currently available in stdlib.
1895///
1896/// Iterators obtained from functions such as [`BTreeMap::iter`], [`BTreeMap::values`], or
1897/// [`BTreeMap::keys`] produce their items in order by key, and directly leverage Rust's own
1898/// slice iterators, therefore being as fast as possible.
1899///
1900/// [B-Tree]: https://en.wikipedia.org/wiki/B-tree
1901///
1902/// # Examples
1903///
1904/// ```
1905/// use indexset::BTreeMap;
1906///
1907/// // type inference lets us omit an explicit type signature (which
1908/// // would be `BTreeMap<&str, &str>` in this example).
1909/// let mut movie_reviews = BTreeMap::new();
1910///
1911/// // review some movies.
1912/// movie_reviews.insert("Office Space",       "Deals with real issues in the workplace.");
1913/// movie_reviews.insert("Pulp Fiction",       "Masterpiece.");
1914/// movie_reviews.insert("The Godfather",      "Very enjoyable.");
1915/// movie_reviews.insert("The Blues Brothers", "Eye lyked it a lot.");
1916///
1917/// // check for a specific one.
1918/// if !movie_reviews.contains_key("Les Misérables") {
1919///     println!("We've got {} reviews, but Les Misérables ain't one.",
1920///              movie_reviews.len());
1921/// }
1922///
1923/// // oops, this review has a lot of spelling mistakes, let's delete it.
1924/// movie_reviews.remove("The Blues Brothers");
1925///
1926/// // look up the values associated with some keys.
1927/// let to_find = ["Up!", "Office Space"];
1928/// for movie in &to_find {
1929///     match movie_reviews.get(movie) {
1930///        Some(review) => println!("{movie}: {review}"),
1931///        None => println!("{movie} is unreviewed.")
1932///     }
1933/// }
1934///
1935/// // Look up the value for a key (will panic if the key is not found).
1936/// println!("Movie review: {}", movie_reviews["Office Space"]);
1937///
1938/// // iterate over everything.
1939/// for (movie, review) in &movie_reviews {
1940///     println!("{movie}: \"{review}\"");
1941/// }
1942/// ```
1943///
1944/// A `BTreeMap` with a known list of items can be initialized from an array:
1945///
1946/// ```
1947/// use indexset::BTreeMap;
1948///
1949/// let solar_distance = BTreeMap::from_iter([
1950///     ("Mercury", 0.4),
1951///     ("Venus", 0.7),
1952///     ("Earth", 1.0),
1953///     ("Mars", 1.5),
1954/// ]);
1955/// ```
1956#[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    /// Moves all elements from `other` into `self`, leaving `other` empty.
1995    ///
1996    /// If a key from `other` is already present in `self`, the respective
1997    /// value from `self` will be overwritten with the respective value from `other`.
1998    ///
1999    /// # Examples
2000    ///
2001    /// ```
2002    /// use indexset::BTreeMap;
2003    ///
2004    /// let mut a = BTreeMap::new();
2005    /// a.insert(1, "a");
2006    /// a.insert(2, "b");
2007    /// a.insert(3, "c"); // Note: Key (3) also present in b.
2008    ///
2009    /// let mut b = BTreeMap::new();
2010    /// b.insert(3, "d"); // Note: Key (3) also present in a.
2011    /// b.insert(4, "e");
2012    /// b.insert(5, "f");
2013    ///
2014    /// a.append(&mut b);
2015    ///
2016    /// assert_eq!(a.len(), 5);
2017    /// assert_eq!(b.len(), 0);
2018    ///
2019    /// assert_eq!(a[&1], "a");
2020    /// assert_eq!(a[&2], "b");
2021    /// assert_eq!(a[&3], "d"); // Note: "c" has been overwritten.
2022    /// assert_eq!(a[&4], "e");
2023    /// assert_eq!(a[&5], "f");
2024    /// ```
2025    pub fn append(&mut self, other: &mut Self) {
2026        self.set.append(&mut other.set)
2027    }
2028    /// Clears the map, removing all elements.
2029    ///
2030    /// # Examples
2031    ///
2032    /// Basic usage:
2033    ///
2034    /// ```
2035    /// use indexset::BTreeMap;
2036    ///
2037    /// let mut a = BTreeMap::new();
2038    /// a.insert(1, "a");
2039    /// a.clear();
2040    /// assert!(a.is_empty());
2041    /// ```
2042    pub fn clear(&mut self) {
2043        self.set.clear()
2044    }
2045    /// Returns `true` if the map contains a value for the specified key.
2046    ///
2047    /// The key may be any borrowed form of the map's key type, but the ordering
2048    /// on the borrowed form *must* match the ordering on the key type.
2049    ///
2050    /// # Examples
2051    ///
2052    /// Basic usage:
2053    ///
2054    /// ```
2055    /// use indexset::BTreeMap;
2056    ///
2057    /// let mut map = BTreeMap::new();
2058    /// map.insert(1, "a");
2059    /// assert_eq!(map.contains_key(&1), true);
2060    /// assert_eq!(map.contains_key(&2), false);
2061    /// ```
2062    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    /// Returns the first key-value pair in the map.
2073    /// The key in this pair is the minimum key in the map.
2074    ///
2075    /// # Examples
2076    ///
2077    /// Basic usage:
2078    ///
2079    /// ```
2080    /// use indexset::BTreeMap;
2081    ///
2082    /// let mut map = BTreeMap::new();
2083    /// assert_eq!(map.first_key_value(), None);
2084    /// map.insert(1, "b");
2085    /// map.insert(2, "a");
2086    /// assert_eq!(map.first_key_value(), Some((&1, &"b")));
2087    /// ```
2088    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    /// Returns a reference to the value corresponding to the key.
2097    ///
2098    /// The key may be any borrowed form of the map's key type, but the ordering
2099    /// on the borrowed form *must* match the ordering on the key type.
2100    ///
2101    /// # Examples
2102    ///
2103    /// Basic usage:
2104    ///
2105    /// ```
2106    /// use indexset::BTreeMap;
2107    ///
2108    /// let mut map = BTreeMap::new();
2109    /// map.insert(1, "a");
2110    /// assert_eq!(map.get(&1), Some(&"a"));
2111    /// assert_eq!(map.get(&2), None);
2112    /// ```
2113    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    /// Returns the key-value pair currently residing at the given position.
2125    ///
2126    ///
2127    /// # Examples
2128    ///
2129    /// ```
2130    /// use indexset::BTreeMap;
2131    ///
2132    /// let mut map = BTreeMap::new();
2133    /// map.insert(1, "a");
2134    /// assert_eq!(map.get_index(0), Some((&1, &"a")));
2135    /// assert_eq!(map.get_index(1), None);
2136    /// ```
2137    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    /// Returns the key-value pair corresponding to the supplied key.
2146    ///
2147    /// The supplied key may be any borrowed form of the map's key type, but the ordering
2148    /// on the borrowed form *must* match the ordering on the key type.
2149    ///
2150    /// # Examples
2151    ///
2152    /// ```
2153    /// use indexset::BTreeMap;
2154    ///
2155    /// let mut map = BTreeMap::new();
2156    /// map.insert(1, "a");
2157    /// assert_eq!(map.get_key_value(&1), Some((&1, &"a")));
2158    /// assert_eq!(map.get_key_value(&2), None);
2159    /// ```
2160    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    /// Returns a mutable reference to the value corresponding to the key.
2175    ///
2176    /// The key may be any borrowed form of the map's key type, but the ordering
2177    /// on the borrowed form *must* match the ordering on the key type.
2178    ///
2179    /// # Examples
2180    ///
2181    /// Basic usage:
2182    ///
2183    /// ```
2184    /// use indexset::BTreeMap;
2185    ///
2186    /// let mut map = BTreeMap::new();
2187    /// map.insert(1, "a");
2188    /// if let Some(x) = map.get_mut(&1) {
2189    ///     *x = "b";
2190    /// }
2191    /// assert_eq!(map[&1], "b");
2192    /// ```
2193    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    /// Returns a mutable reference to the value at the designated index
2209    ///
2210    /// # Examples
2211    ///
2212    /// Basic usage:
2213    ///
2214    /// ```
2215    /// use indexset::BTreeMap;
2216    ///
2217    /// let mut map = BTreeMap::new();
2218    /// map.insert(1, "a");
2219    /// if let Some(x) = map.get_mut_index(0) {
2220    ///     *x = "b";
2221    /// }
2222    /// assert_eq!(map[&1], "b");
2223    /// ```
2224    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    /// Inserts a key-value pair into the map.
2232    ///
2233    /// If the map did not have this key present, `None` is returned.
2234    ///
2235    /// If the map did have this key present, the value is updated, and the old
2236    /// value is returned. The key is not updated, though; this matters for
2237    /// types that can be `==` without being identical. See the [module-level
2238    /// documentation] for more.
2239    ///
2240    /// [module-level documentation]: index.html#insert-and-complex-keys
2241    ///
2242    /// # Examples
2243    ///
2244    /// Basic usage:
2245    ///
2246    /// ```
2247    /// use indexset::BTreeMap;
2248    ///
2249    /// let mut map = BTreeMap::new();
2250    /// assert_eq!(map.insert(37, "a"), None);
2251    /// assert_eq!(map.is_empty(), false);
2252    ///
2253    /// map.insert(37, "b");
2254    /// assert_eq!(map.insert(37, "c"), Some("b"));
2255    /// assert_eq!(map[&37], "c");
2256    /// ```
2257    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    /// Creates a consuming iterator visiting all the keys, in sorted order.
2276    /// The map cannot be used after calling this.
2277    /// The iterator element type is `K`.
2278    ///
2279    /// # Examples
2280    ///
2281    /// ```
2282    /// use indexset::BTreeMap;
2283    ///
2284    /// let mut a = BTreeMap::new();
2285    /// a.insert(2, "b");
2286    /// a.insert(1, "a");
2287    ///
2288    /// let keys: Vec<i32> = a.into_keys().collect();
2289    /// assert_eq!(keys, [1, 2]);
2290    /// ```
2291    pub fn into_keys(self) -> IntoKeys<K, V> {
2292        IntoKeys {
2293            inner: self.into_iter(),
2294        }
2295    }
2296    /// Creates a consuming iterator visiting all the values, in order by key.
2297    /// The map cannot be used after calling this.
2298    /// The iterator element type is `V`.
2299    ///
2300    /// # Examples
2301    ///
2302    /// ```
2303    /// use indexset::BTreeMap;
2304    ///
2305    /// let mut a = BTreeMap::new();
2306    /// a.insert(1, "hello");
2307    /// a.insert(2, "goodbye");
2308    ///
2309    /// let values: Vec<&str> = a.into_values().collect();
2310    /// assert_eq!(values, ["hello", "goodbye"]);
2311    /// ```
2312    pub fn into_values(self) -> IntoValues<K, V> {
2313        IntoValues {
2314            inner: self.into_iter(),
2315        }
2316    }
2317    /// Returns `true` if the map contains no elements.
2318    ///
2319    /// # Examples
2320    ///
2321    /// Basic usage:
2322    ///
2323    /// ```
2324    /// use indexset::BTreeMap;
2325    ///
2326    /// let mut a = BTreeMap::new();
2327    /// assert!(a.is_empty());
2328    /// a.insert(1, "a");
2329    /// assert!(!a.is_empty());
2330    /// ```
2331    pub fn is_empty(&self) -> bool {
2332        self.set.is_empty()
2333    }
2334    /// Gets an iterator over the entries of the map, sorted by key.
2335    ///
2336    /// # Examples
2337    ///
2338    /// Basic usage:
2339    ///
2340    /// ```
2341    /// use indexset::BTreeMap;
2342    ///
2343    /// let mut map = BTreeMap::new();
2344    /// map.insert(3, "c");
2345    /// map.insert(2, "b");
2346    /// map.insert(1, "a");
2347    ///
2348    /// for (key, value) in map.iter() {
2349    ///     println!("{key}: {value}");
2350    /// }
2351    ///
2352    /// let (first_key, first_value) = map.iter().next().unwrap();
2353    /// assert_eq!((*first_key, *first_value), (1, "a"));
2354    /// ```
2355    pub fn iter(&self) -> IterMap<'_, K, V> {
2356        IterMap { inner: self.set.iter() }
2357    }
2358    /// Gets a mutable iterator over the entries of the map, sorted by key.
2359    ///
2360    /// # Examples
2361    ///
2362    /// Basic usage:
2363    ///
2364    /// ```
2365    /// use indexset::BTreeMap;
2366    ///
2367    /// let mut map = BTreeMap::from_iter([
2368    ///    ("a", 1),
2369    ///    ("b", 2),
2370    ///    ("c", 3),
2371    /// ]);
2372    ///
2373    /// // add 10 to the value if the key isn't "a"
2374    /// for (key, value) in map.iter_mut() {
2375    ///     if key != &"a" {
2376    ///         *value += 10;
2377    ///     }
2378    /// }
2379    /// ```
2380    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        // Special handling for single node case
2385        if self.set.inner.len() == 1 {
2386            // Don't consume the node from inner iterator
2387            // Both front and back should start from the same node
2388            let mut inner = self.set.inner.iter_mut();
2389            let node = inner.next().unwrap();
2390            let front_iter = node.iter_mut();
2391            // For single node, back_iter should be empty initially
2392            // The iterator logic will handle switching to it when needed
2393            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, // Same as front for single node
2400                current_back_idx: len.wrapping_sub(1),
2401                current_front_iterator: front_iter,
2402                current_back_iterator: back_iter,
2403            };
2404        }
2405
2406        // For multiple nodes, handle normally
2407        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    /// Gets an iterator over the keys of the map, in sorted order.
2430    ///
2431    /// # Examples
2432    ///
2433    /// Basic usage:
2434    ///
2435    /// ```
2436    /// use indexset::BTreeMap;
2437    ///
2438    /// let mut a = BTreeMap::new();
2439    /// a.insert(2, "b");
2440    /// a.insert(1, "a");
2441    ///
2442    /// let keys: Vec<_> = a.keys().cloned().collect();
2443    /// assert_eq!(keys, [1, 2]);
2444    /// ```
2445    pub fn keys(&self) -> Keys<'_, K, V> {
2446        Keys { inner: self.set.iter() }
2447    }
2448    /// Returns the last key-value pair in the map.
2449    /// The key in this pair is the maximum key in the map.
2450    ///
2451    /// # Examples
2452    ///
2453    /// Basic usage:
2454    ///
2455    /// ```
2456    /// use indexset::BTreeMap;
2457    ///
2458    /// let mut map = BTreeMap::new();
2459    /// map.insert(1, "b");
2460    /// map.insert(2, "a");
2461    /// assert_eq!(map.last_key_value(), Some((&2, &"a")));
2462    /// ```
2463    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    /// Returns the number of elements in the map.
2472    ///
2473    /// # Examples
2474    ///
2475    /// Basic usage:
2476    ///
2477    /// ```
2478    /// use indexset::BTreeMap;
2479    ///
2480    /// let mut a = BTreeMap::new();
2481    /// assert_eq!(a.len(), 0);
2482    /// a.insert(1, "a");
2483    /// assert_eq!(a.len(), 1);
2484    /// ```
2485    pub fn len(&self) -> usize {
2486        self.set.len()
2487    }
2488    /// Makes a new, empty `BTreeMap`.
2489    ///
2490    /// Allocates a vec of capacity 1024.
2491    ///
2492    /// # Examples
2493    ///
2494    /// Basic usage:
2495    ///
2496    /// ```
2497    /// use indexset::BTreeMap;
2498    ///
2499    /// let mut map = BTreeMap::new();
2500    ///
2501    /// // entries can now be inserted into the empty map
2502    /// map.insert(1, "a");
2503    /// ```
2504    pub fn new() -> Self {
2505        Self { ..Default::default() }
2506    }
2507    /// Makes a new, empty `BTreeSet` with the given maximum node size. Allocates one vec with
2508    /// the capacity set to be the specified node size.
2509    ///
2510    /// # Examples
2511    ///
2512    /// ```
2513    /// # #![allow(unused_mut)]
2514    /// use indexset::BTreeMap;
2515    ///
2516    /// let mut set: BTreeMap<usize, usize> = BTreeMap::with_maximum_node_size(128);
2517    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    /// Removes and returns the first element in the map.
2523    /// The key of this element is the minimum key that was in the map.
2524    ///
2525    /// # Examples
2526    ///
2527    /// Draining elements in ascending order, while keeping a usable map each iteration.
2528    ///
2529    /// ```
2530    /// use indexset::BTreeMap;
2531    ///
2532    /// let mut map = BTreeMap::new();
2533    /// map.insert(1, "a");
2534    /// map.insert(2, "b");
2535    /// while let Some((key, _val)) = map.pop_first() {
2536    ///     assert!(map.iter().all(|(k, _v)| *k > key));
2537    /// }
2538    /// assert!(map.is_empty());
2539    /// ```
2540    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    /// Removes the i-th element from the map and returns it, if any.
2549    ///
2550    /// # Examples
2551    ///
2552    /// ```
2553    /// use indexset::{BTreeMap};
2554    ///
2555    /// let mut map = BTreeMap::new();
2556    ///
2557    /// map.insert(1,"a");
2558    /// map.insert(2, "b");
2559    /// assert_eq!(map.pop_index(0), (1, "a"));
2560    /// assert_eq!(map.pop_index(0), (2, "b"));
2561    /// assert!(map.is_empty());
2562    /// ```
2563    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    /// Removes and returns the last element in the map.
2569    /// The key of this element is the maximum key that was in the map.
2570    ///
2571    /// # Examples
2572    ///
2573    /// Draining elements in descending order, while keeping a usable map each iteration.
2574    ///
2575    /// ```
2576    /// use indexset::BTreeMap;
2577    ///
2578    /// let mut map = BTreeMap::new();
2579    /// map.insert(1, "a");
2580    /// map.insert(2, "b");
2581    /// while let Some((key, _val)) = map.pop_last() {
2582    ///     assert!(map.iter().all(|(k, _v)| *k < key));
2583    /// }
2584    /// assert!(map.is_empty());
2585    /// ```
2586    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    /// Constructs a double-ended iterator over a sub-range of elements in the map.
2595    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
2596    /// yield elements from min (inclusive) to max (exclusive).
2597    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
2598    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
2599    /// range from 4 to 10.
2600    ///
2601    /// # Panics
2602    ///
2603    /// Panics if range `start > end`.
2604    /// Panics if range `start == end` and both bounds are `Excluded`.
2605    ///
2606    /// # Examples
2607    ///
2608    /// Basic usage:
2609    ///
2610    /// ```
2611    /// use indexset::BTreeMap;
2612    /// use std::ops::Bound::Included;
2613    ///
2614    /// let mut map = BTreeMap::new();
2615    /// map.insert(3, "a");
2616    /// map.insert(5, "b");
2617    /// map.insert(8, "c");
2618    /// for (&key, &value) in map.range((Included(&4), Included(&8))) {
2619    ///     println!("{key}: {value}");
2620    /// }
2621    /// assert_eq!(Some((&5, &"b")), map.range(4..).next());
2622    /// ```
2623    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                    // No elements before this bound, return empty range
2660                    return (1, 0);
2661                }
2662                rank - 1
2663            }
2664            Bound::Unbounded => {
2665                if self.is_empty() {
2666                    // Empty map, return empty range
2667                    return (1, 0);
2668                }
2669                self.len() - 1
2670            }
2671        };
2672
2673        (start_idx, end_idx)
2674    }
2675    /// Constructs a mutable double-ended iterator over a sub-range of elements in the map.
2676    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
2677    /// yield elements from min (inclusive) to max (exclusive).
2678    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
2679    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
2680    /// range from 4 to 10.
2681    ///
2682    /// # Panics
2683    ///
2684    /// Panics if range `start > end`.
2685    /// Panics if range `start == end` and both bounds are `Excluded`.
2686    ///
2687    /// # Examples
2688    ///
2689    /// Basic usage:
2690    ///
2691    /// ```
2692    /// use indexset::BTreeMap;
2693    ///
2694    /// let mut map: BTreeMap<&str, i32> =
2695    ///     [("Alice", 0), ("Bob", 0), ("Carol", 0), ("Cheryl", 0)].into();
2696    /// for (_, balance) in map.range_mut("B".."Cheryl") {
2697    ///     *balance += 100;
2698    /// }
2699    /// for (name, balance) in &map {
2700    ///     println!("{name} => {balance}");
2701    /// }
2702    /// ```
2703    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    /// Removes a key from the map, returning the value at the key if the key
2766    /// was previously in the map.
2767    ///
2768    /// The key may be any borrowed form of the map's key type, but the ordering
2769    /// on the borrowed form *must* match the ordering on the key type.
2770    ///
2771    /// # Examples
2772    ///
2773    /// Basic usage:
2774    ///
2775    /// ```
2776    /// use indexset::BTreeMap;
2777    ///
2778    /// let mut map = BTreeMap::new();
2779    /// map.insert(1, "a");
2780    /// assert_eq!(map.remove(&1), Some("a"));
2781    /// assert_eq!(map.remove(&1), None);
2782    /// ```
2783    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    /// Removes a key from the map, returning the stored key and value if the key
2800    /// was previously in the map.
2801    ///
2802    /// The key may be any borrowed form of the map's key type, but the ordering
2803    /// on the borrowed form *must* match the ordering on the key type.
2804    ///
2805    /// # Examples
2806    ///
2807    /// Basic usage:
2808    ///
2809    /// ```
2810    /// use indexset::BTreeMap;
2811    ///
2812    /// let mut map = BTreeMap::new();
2813    /// map.insert(1, "a");
2814    /// assert_eq!(map.remove_entry(&1), Some((1, "a")));
2815    /// assert_eq!(map.remove_entry(&1), None);
2816    /// ```
2817    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    /// Retains only the elements specified by the predicate.
2835    ///
2836    /// In other words, remove all pairs `(k, v)` for which `f(&k, &mut v)` returns `false`.
2837    /// The elements are visited in ascending key order.
2838    ///
2839    /// # Examples
2840    ///
2841    /// ```
2842    /// use indexset::BTreeMap;
2843    ///
2844    /// let mut map: BTreeMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();
2845    /// // Keep only the elements with even-numbered keys.
2846    /// map.retain(|&k, _| k % 2 == 0);
2847    /// assert!(map.into_iter().eq(vec![(0, 0), (2, 20), (4, 40), (6, 60)]));
2848    /// ```
2849    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    /// Splits the collection into two at the given key. Returns everything after the given key,
2873    /// including the key.
2874    ///
2875    /// # Examples
2876    ///
2877    /// Basic usage:
2878    ///
2879    /// ```
2880    /// use indexset::BTreeMap;
2881    ///
2882    /// let mut a = BTreeMap::new();
2883    /// a.insert(1, "a");
2884    /// a.insert(2, "b");
2885    /// a.insert(3, "c");
2886    /// a.insert(17, "d");
2887    /// a.insert(41, "e");
2888    ///
2889    /// let b = a.split_off(&3);
2890    ///
2891    /// assert_eq!(a.len(), 2);
2892    /// assert_eq!(b.len(), 3);
2893    ///
2894    /// assert_eq!(a[&1], "a");
2895    /// assert_eq!(a[&2], "b");
2896    ///
2897    /// assert_eq!(b[&3], "c");
2898    /// assert_eq!(b[&17], "d");
2899    /// assert_eq!(b[&41], "e");
2900    /// ```
2901    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    /// Gets an iterator over the values of the map, in order by key.
2911    ///
2912    /// # Examples
2913    ///
2914    /// Basic usage:
2915    ///
2916    /// ```
2917    /// use indexset::BTreeMap;
2918    ///
2919    /// let mut a = BTreeMap::new();
2920    /// a.insert(1, "hello");
2921    /// a.insert(2, "goodbye");
2922    ///
2923    /// let values: Vec<&str> = a.values().cloned().collect();
2924    /// assert_eq!(values, ["hello", "goodbye"]);
2925    /// ```
2926    pub fn values(&self) -> Values<'_, K, V> {
2927        Values { inner: self.set.iter() }
2928    }
2929    /// Gets a mutable iterator over the values of the map, in order by key.
2930    ///
2931    /// # Examples
2932    ///
2933    /// Basic usage:
2934    ///
2935    /// ```
2936    /// use indexset::BTreeMap;
2937    ///
2938    /// let mut a = BTreeMap::new();
2939    /// a.insert(1, String::from("hello"));
2940    /// a.insert(2, String::from("goodbye"));
2941    ///
2942    /// for value in a.values_mut() {
2943    ///     value.push_str("!");
2944    /// }
2945    ///
2946    /// let values: Vec<String> = a.values().cloned().collect();
2947    /// assert_eq!(values, [String::from("hello!"),
2948    ///                     String::from("goodbye!")]);
2949    /// ```
2950    pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
2951        ValuesMut { inner: self.iter_mut() }
2952    }
2953    /// Gets the given key's corresponding entry in the map for in-place manipulation.
2954    ///
2955    /// # Examples
2956    ///
2957    /// Basic usage:
2958    ///
2959    /// ```
2960    /// use std::collections::BTreeMap;
2961    ///
2962    /// let mut count: BTreeMap<&str, usize> = BTreeMap::new();
2963    ///
2964    /// // count the number of occurrences of letters in the vec
2965    /// for x in ["a", "b", "a", "c", "a", "b"] {
2966    ///     count.entry(x).and_modify(|curr| *curr += 1).or_insert(1);
2967    /// }
2968    ///
2969    /// assert_eq!(count["a"], 3);
2970    /// assert_eq!(count["b"], 2);
2971    /// assert_eq!(count["c"], 1);
2972    /// ```
2973    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    /// Returns the first entry in the map for in-place manipulation.
2985    /// The key of this entry is the minimum key in the map.
2986    ///
2987    /// # Examples
2988    ///
2989    /// ```
2990    /// use std::collections::BTreeMap;
2991    ///
2992    /// let mut map = BTreeMap::new();
2993    /// map.insert(1, "a");
2994    /// map.insert(2, "b");
2995    /// if let Some(mut entry) = map.first_entry() {
2996    ///     if *entry.key() > 0 {
2997    ///         entry.insert("first");
2998    ///     }
2999    /// }
3000    /// assert_eq!(*map.get(&1).unwrap(), "first");
3001    /// assert_eq!(*map.get(&2).unwrap(), "b");
3002    /// ```
3003    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    /// Returns the last entry in the map for in-place manipulation.
3014    /// The key of this entry is the maximum key in the map.
3015    ///
3016    /// # Examples
3017    ///
3018    /// ```
3019    /// use std::collections::BTreeMap;
3020    ///
3021    /// let mut map = BTreeMap::new();
3022    /// map.insert(1, "a");
3023    /// map.insert(2, "b");
3024    /// if let Some(mut entry) = map.last_entry() {
3025    ///     if *entry.key() > 0 {
3026    ///         entry.insert("last");
3027    ///     }
3028    /// }
3029    /// assert_eq!(*map.get(&1).unwrap(), "a");
3030    /// assert_eq!(*map.get(&2).unwrap(), "last");
3031    /// ```
3032    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    /// Returns a [`Cursor`] pointing at the first element that is above the
3047    /// given bound.
3048    ///
3049    /// If no such element exists then a cursor pointing at the "ghost"
3050    /// non-element is returned.
3051    ///
3052    /// Passing [`Bound::Unbounded`] will return a cursor pointing at the first
3053    /// element of the map.
3054    ///
3055    /// # Examples
3056    ///
3057    /// Basic usage:
3058    ///
3059    /// ```
3060    /// use indexset::BTreeMap;
3061    /// use std::ops::Bound;
3062    ///
3063    /// let mut a = BTreeMap::new();
3064    /// a.insert(1, "a");
3065    /// a.insert(2, "b");
3066    /// a.insert(3, "c");
3067    /// a.insert(4, "c");
3068    /// let cursor = a.lower_bound(Bound::Excluded(&2));
3069    /// assert_eq!(cursor.key(), Some(&3));
3070    /// ```
3071    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    /// Returns the position in which the given element would fall in the already-existing sorted
3090    /// order.
3091    ///
3092    /// The value may be any borrowed form of the set's element type,
3093    /// but the ordering on the borrowed form *must* match the
3094    /// ordering on the element type.
3095    ///
3096    /// # Examples
3097    ///
3098    /// ```
3099    /// use indexset::BTreeMap;
3100    ///
3101    /// let set = BTreeMap::from_iter([(1, "a"), (2, "b"), (3, "c")]);
3102    /// assert_eq!(set.rank(&1), 0);
3103    /// assert_eq!(set.rank(&3), 2);
3104    /// assert_eq!(set.rank(&4), 3);
3105    /// assert_eq!(set.rank(&100), 3);
3106    /// ```
3107    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
3158/// An iterator over the entries of a `BTreeMap`.
3159///
3160/// This `struct` is created by the [`iter`] method on [`BTreeMap`]. See its
3161/// documentation for more.
3162///
3163/// [`iter`]: BTreeMap::iter
3164pub 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
3201/// An owning iterator over the entries of a `BTreeMap`.
3202///
3203/// This `struct` is created by the [`into_iter`] method on [`BTreeMap`]
3204/// (provided by the [`IntoIterator`] trait). See its documentation for more.
3205///
3206/// [`into_iter`]: IntoIterator::into_iter
3207pub 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
3244/// An owning iterator over the keys of a `BTreeMap`.
3245///
3246/// This `struct` is created by the [`into_keys`] method on [`BTreeMap`].
3247/// See its documentation for more.
3248///
3249/// [`into_keys`]: BTreeMap::into_keys
3250pub 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
3287/// An owning iterator over the values of a `BTreeMap`.
3288///
3289/// This `struct` is created by the [`into_values`] method on [`BTreeMap`].
3290/// See its documentation for more.
3291///
3292/// [`into_values`]: BTreeMap::into_values
3293pub 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
3330/// An iterator over a sub-range of entries in a `BTreeMap`.
3331///
3332/// This `struct` is created by the [`range`] method on [`BTreeMap`]. See its
3333/// documentation for more.
3334///
3335/// [`range`]: BTreeMap::range
3336pub 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
3373/// An iterator over the values of a `BTreeMap`.
3374///
3375/// This `struct` is created by the [`values`] method on [`BTreeMap`]. See its
3376/// documentation for more.
3377///
3378/// [`values`]: BTreeMap::values
3379pub 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
3416/// An iterator over the keys of a `BTreeMap`.
3417///
3418/// This `struct` is created by the [`keys`] method on [`BTreeMap`]. See its
3419/// documentation for more.
3420///
3421/// [`keys`]: BTreeMap::keys
3422pub 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
3459/// A mutable iterator over the entries of a `BTreeMap`.
3460///
3461/// This `struct` is created by the [`iter_mut`] method on [`BTreeMap`]. See its
3462/// documentation for more.
3463///
3464/// [`iter_mut`]: BTreeMap::iter_mut
3465pub 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 the current iterator has been exhausted, we have to check whether there are any
3493            // iterators left
3494            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                // take from the current back iter
3499                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                // advance front
3505                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 the current iterator has been exhausted, we have to check whether there are any
3531            // iterators left
3532            if self.current_back_node_idx == 0 && self.current_front_node_idx != 0 {
3533                return None;
3534            }
3535            // Handle single node case or adjacent nodes
3536            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                // take from the current front iter
3540                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                // advance back
3548                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
3563/// A mutable iterator over the values of a `BTreeMap`.
3564///
3565/// This `struct` is created by the [`values_mut`] method on [`BTreeMap`]. See its
3566/// documentation for more.
3567///
3568/// [`values_mut`]: BTreeMap::values_mut
3569pub 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
3606/// A mutable iterator over a sub-range of entries in a `BTreeMap`.
3607///
3608/// This `struct` is created by the [`range_mut`] method on [`BTreeMap`]. See its
3609/// documentation for more.
3610///
3611/// [`range_mut`]: BTreeMap::range_mut
3612pub 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        // This will cause the btree to have at least more than one node
3817        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    // Regression for https://github.com/lucidarium-systems/indexset/issues/57.
3832    #[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    // Regression for https://github.com/lucidarium-systems/indexset/issues/57.
3844    #[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        // The below seed reproduces a previous bug
4303        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            // Use max to increase the number of duplicates
4311            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] // this test pass with std::collection::BTreeMap
4349    fn test_indexset_btreemap_overflow_bug() {
4350        // This test reproduces the "attempt to subtract with overflow" panic
4351        // that occurs in indexset::BTreeMap::range_to_idx at line 2639
4352
4353        let mut map = BTreeMap::new();
4354
4355        // Insert the same keys as in the failing test
4356        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        // In a working implementation, this should return None
4366        // since there are no keys before [1,2,3,4]
4367        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        // RangeFromExcluding with non-existing key [1,2,3,6]
4395        // Should return [1,2,3,7] but returns [1,2,4,5]
4396        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}