Skip to main content

indexset/
lib.rs

1#![cfg_attr(not(any(test, feature = "std")), no_std)]
2// The crate does not link `std` unless asked. Tests always do, because a
3// concurrency test is made of threads and clocks; with the `std` feature on,
4// the library links it too, and the only thing it takes from it is
5// `thread::yield_now`.
6#[cfg(any(test, feature = "std"))]
7extern crate std;
8
9extern crate alloc;
10
11use alloc::vec;
12use alloc::vec::Vec;
13#[cfg(feature = "concurrent")]
14pub mod concurrent;
15
16#[cfg(feature = "concurrent")]
17pub mod cdc;
18
19pub mod core;
20
21use crate::Entry::{Occupied, Vacant};
22use ::core::borrow::Borrow;
23use ::core::cmp::Ordering;
24use ::core::iter::FusedIterator;
25use ::core::mem::swap;
26use ::core::ops::Bound;
27use ::core::ops::{Index, RangeBounds};
28use core::constants::DEFAULT_INNER_SIZE;
29use core::node::*;
30use core::pair::Pair;
31use ftree::FenwickTree;
32#[cfg(feature = "serde")]
33use serde::{Deserialize, Serialize};
34
35type Node<T> = Vec<T>;
36
37/// An ordered set based on a B-Tree.
38///
39/// See [`BTreeMap`]'s documentation for a detailed discussion of this collection's performance
40/// benefits and drawbacks.
41///
42/// It is a logic error for an item to be modified in such a way that the item's ordering relative
43/// to any other item, as determined by the [`Ord`] trait, changes while it is in the set. This is
44/// normally only possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code.
45/// The behavior resulting from such a logic error is not specified, but will be encapsulated to the
46/// `BTreeSet` that observed the logic error and not result in undefined behavior. This could
47/// include panics, incorrect results, aborts, memory leaks, and non-termination.
48///
49/// Iterators returned by [`BTreeSet::iter`] produce their items in order, and take worst-case
50/// logarithmic and amortized constant time per item returned.
51///
52/// [`Cell`]: core::cell::Cell
53/// [`RefCell`]: core::cell::RefCell
54///
55/// # Examples
56///
57/// ```
58/// use indexset::BTreeSet;
59///
60/// // Type inference lets us omit an explicit type signature (which
61/// // would be `BTreeSet<&str>` in this example).
62/// let mut books = BTreeSet::new();
63///
64/// // Add some books.
65/// books.insert("A Dance With Dragons");
66/// books.insert("To Kill a Mockingbird");
67/// books.insert("The Odyssey");
68/// books.insert("The Great Gatsby");
69///
70/// // Check for a specific one.
71/// if !books.contains("The Winds of Winter") {
72///     println!("We have {} books, but The Winds of Winter ain't one.",
73///              books.len());
74/// }
75///
76/// // Remove a book.
77/// books.remove("The Odyssey");
78///
79/// // Iterate over everything.
80/// for book in &books {
81///     println!("{book}");
82/// }
83/// ```
84///
85/// A `BTreeSet` with a known list of items can be initialized from an array:
86///
87/// ```
88/// use indexset::BTreeSet;
89///
90/// let set = BTreeSet::from_iter([1, 2, 3]);
91/// ```
92#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
93#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
94pub struct BTreeSet<T>
95where
96    T: Ord,
97{
98    inner: Vec<Node<T>>,
99    index: FenwickTree<usize>,
100    node_capacity: usize,
101    len: usize,
102}
103
104enum NodeEntry {
105    Exist {
106        node_idx: usize,
107        position_within_node: usize,
108    },
109    Empty {
110        node_idx: usize,
111    },
112}
113
114impl<T: Ord> BTreeSet<T> {
115    /// Makes a new, empty `BTreeSet` with maximum node size 1024. Allocates one vec of capacity 1024.
116    ///
117    /// Note that this does not mean that the maximum number of items is 1024.
118    ///
119    /// In case you would like to make a tree with a different maximum node size, use the
120    /// `with_maximum_node_size` method.
121    ///
122    /// # Examples
123    ///
124    /// ```
125    /// # #![allow(unused_mut)]
126    /// use indexset::BTreeSet;
127    ///
128    /// let mut set: BTreeSet<i32> = BTreeSet::new();
129    /// ```
130    pub fn new() -> Self {
131        Self { ..Default::default() }
132    }
133    /// Makes a new, empty `BTreeSet` with the given maximum node size. Allocates one vec with
134    /// the capacity set to be the specified node size.
135    ///
136    /// # Examples
137    ///
138    /// ```
139    /// # #![allow(unused_mut)]
140    /// use indexset::BTreeSet;
141    ///
142    /// let mut set: BTreeSet<i32> = BTreeSet::with_maximum_node_size(128);
143    pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
144        Self {
145            inner: vec![Node::with_capacity(maximum_node_size)],
146            node_capacity: maximum_node_size,
147            ..Default::default()
148        }
149    }
150    /// Clears the set, removing all elements.
151    ///
152    /// # Examples
153    ///
154    /// ```
155    /// use indexset::BTreeSet;
156    ///
157    /// let mut v = BTreeSet::new();
158    /// v.insert(1);
159    /// v.clear();
160    /// assert!(v.is_empty());
161    /// ```
162    pub fn clear(&mut self) {
163        self.inner = vec![Node::with_capacity(self.node_capacity)];
164        self.index = FenwickTree::from_iter(vec![0]);
165        self.len = 0;
166    }
167    fn locate_node<Q>(&self, value: &Q) -> usize
168    where
169        T: Borrow<Q>,
170        Q: Ord + ?Sized,
171    {
172        let mut node_idx = self.inner.partition_point(|node| {
173            if let Some(&max) = node.last().as_ref() {
174                return max.borrow() < value;
175            };
176
177            false
178        });
179
180        // When value is greater than all elements inside inner[node_idx], then len
181        // of inner[node_idx], which is not a valid place for insertion, is returned. It will
182        // never return less than 0, so it is only necessary to check whether it is out of bounds
183        // from the right
184        if self.inner.get(node_idx).is_none() {
185            node_idx = node_idx.saturating_sub(1)
186        }
187
188        node_idx
189    }
190    fn locate_node_cmp<P, Q>(&self, mut cmp: P) -> usize
191    where
192        T: Borrow<Q>,
193        Q: Ord + ?Sized,
194        P: FnMut(&Q) -> bool,
195    {
196        let mut node_idx = self.inner.partition_point(|node| {
197            if let Some(max) = node.last() {
198                return cmp(max.borrow());
199            }
200
201            true
202        });
203
204        if self.inner.get(node_idx).is_none() {
205            node_idx = node_idx.saturating_sub(1)
206        }
207
208        node_idx
209    }
210    fn locate_value<Q>(&self, value: &Q) -> (usize, usize)
211    where
212        T: Borrow<Q>,
213        Q: Ord + ?Sized,
214    {
215        let node_idx = self.locate_node(value);
216        let position_within_node = self.inner[node_idx].partition_point(|item| item.borrow() < value);
217
218        (node_idx, position_within_node)
219    }
220    fn locate_value_cmp<P, Q>(&self, mut cmp: P) -> (usize, usize)
221    where
222        T: Borrow<Q>,
223        Q: Ord + ?Sized,
224        P: FnMut(&Q) -> bool,
225    {
226        let node_idx = self.locate_node_cmp(&mut cmp);
227        let position_within_node = self.inner[node_idx].partition_point(|item| cmp(item.borrow()));
228
229        (node_idx, position_within_node)
230    }
231    fn locate_ith(&self, idx: usize) -> (usize, usize) {
232        let mut node_index = self.index.index_of(idx);
233        let mut offset = 0;
234
235        if node_index != 0 {
236            offset = self.index.prefix_sum(node_index, 0);
237        }
238
239        let mut position_within_node = idx - offset;
240        if let Some(node) = self.inner.get(node_index) {
241            if position_within_node == node.len() {
242                node_index += 1;
243                position_within_node = 0;
244            }
245        }
246
247        (node_index, position_within_node)
248    }
249    /// Returns a reference to the element in the i-th position of the set, if any.
250    ///
251    /// The value may be any borrowed form of the set's element type,
252    /// but the ordering on the borrowed form *must* match the
253    /// ordering on the element type.
254    ///
255    /// # Examples
256    ///
257    /// ```
258    /// use indexset::BTreeSet;
259    ///
260    /// let set = BTreeSet::from_iter([1, 2, 3]);
261    /// assert_eq!(set.get_index(0), Some(&1));
262    /// assert_eq!(set.get_index(2), Some(&3));
263    /// assert_eq!(set.get_index(4), None);
264    /// ```
265    pub fn get_index(&self, idx: usize) -> Option<&T> {
266        let (node_idx, position_within_node) = self.locate_ith(idx);
267        if let Some(candidate_node) = self.inner.get(node_idx) {
268            return candidate_node.get(position_within_node);
269        }
270
271        None
272    }
273    fn get_mut_index(&mut self, index: usize) -> Option<&mut T> {
274        let (node_idx, position_within_node) = self.locate_ith(index);
275        if self.inner.get(node_idx).is_some() {
276            return self.inner[node_idx].get_mut(position_within_node);
277        }
278
279        None
280    }
281    /// Returns a reference to the element in the set, if any, that is equal to
282    /// the value.
283    ///
284    /// The value may be any borrowed form of the set's element type,
285    /// but the ordering on the borrowed form *must* match the
286    /// ordering on the element type.
287    ///
288    /// # Examples
289    ///
290    /// ```
291    /// use indexset::BTreeSet;
292    ///
293    /// let set = BTreeSet::from([1, 2, 3]);
294    /// assert_eq!(set.get(&2), Some(&2));
295    /// assert_eq!(set.get(&4), None);
296    /// ```
297    pub fn get<Q>(&self, value: &Q) -> Option<&T>
298    where
299        T: Borrow<Q> + Ord,
300        Q: Ord + ?Sized,
301    {
302        let (node_idx, position_within_node) = self.locate_value(value);
303        if let Some(candidate_node) = self.inner.get(node_idx) {
304            return candidate_node.get(position_within_node);
305        }
306
307        None
308    }
309    /// Returns a reference to the first element in the set, if any, that is not less than the
310    /// input.
311    ///
312    /// The value may be any borrowed form of the set's element type,
313    /// but the ordering on the borrowed form *must* match the
314    /// ordering on the element type.
315    ///
316    /// # Examples
317    ///
318    /// ```
319    /// use indexset::BTreeSet;
320    ///
321    /// let set = BTreeSet::from_iter([1, 2, 3, 5]);
322    /// assert_eq!(set.lower_bound(&2), Some(&2));
323    /// assert_eq!(set.lower_bound(&4), Some(&5));
324    /// ```
325    pub fn lower_bound<Q>(&self, value: &Q) -> Option<&T>
326    where
327        T: Borrow<Q>,
328        Q: Ord + ?Sized,
329    {
330        let (node_idx, position_within_node) = self.locate_value(value);
331        if let Some(candidate_node) = self.inner.get(node_idx) {
332            return candidate_node.get(position_within_node);
333        }
334
335        None
336    }
337    /// Returns the number of elements in the set.
338    ///
339    /// # Examples
340    ///
341    /// ```
342    /// use indexset::BTreeSet;
343    ///
344    /// let mut v = BTreeSet::new();
345    /// assert_eq!(v.len(), 0);
346    /// v.insert(1);
347    /// assert_eq!(v.len(), 1);
348    /// ```
349    pub fn len(&self) -> usize {
350        self.len
351    }
352    fn insert_at(&mut self, node_idx: usize, value: T) -> bool {
353        if self.inner[node_idx].len() == self.node_capacity {
354            let new_node = self.inner[node_idx].halve();
355            let mut insert_node_idx = node_idx;
356            if value >= new_node[0] {
357                insert_node_idx += 1;
358            }
359
360            self.inner.insert(node_idx + 1, new_node);
361            if NodeLike::insert(&mut self.inner[insert_node_idx], value).0 {
362                // Reconstruct the index after the new node and inner value inserts.
363                self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
364                self.len += 1;
365
366                true
367            } else {
368                // Reconstruct the index after the new node insert even if the new value wasn't added.
369                self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
370                false
371            }
372        } else if NodeLike::insert(&mut self.inner[node_idx], value).0 {
373            self.index.add_at(node_idx, 1);
374            self.len += 1;
375
376            true
377        } else {
378            false
379        }
380    }
381    /// Adds a value to the set.
382    ///
383    /// Returns whether the value was newly inserted. That is:
384    ///
385    /// - If the set did not previously contain an equal value, `true` is
386    ///   returned.
387    /// - If the set already contained an equal value, `false` is returned, and
388    ///   the entry is not updated.
389    ///
390    /// See the [module-level documentation] for more.
391    ///
392    /// [module-level documentation]: index.html#insert-and-complex-keys
393    ///
394    /// # Examples
395    ///
396    /// ```
397    /// use indexset::BTreeSet;
398    ///
399    /// let mut set = BTreeSet::new();
400    ///
401    /// assert_eq!(set.insert(2), true);
402    /// assert_eq!(set.insert(2), false);
403    /// assert_eq!(set.len(), 1);
404    /// ```
405    pub fn insert(&mut self, value: T) -> bool {
406        let node_idx = self.locate_node(&value);
407        self.insert_at(node_idx, value)
408    }
409
410    /// Adds a value to the set, replacing the existing element, if any, that is
411    /// equal to the value. Returns the replaced element.
412    ///
413    /// # Examples
414    ///
415    /// ```
416    /// use indexset::BTreeSet;
417    ///
418    /// let mut set = BTreeSet::new();
419    /// set.insert(Vec::<i32>::new());
420    ///
421    /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 0);
422    /// println!("{}", set.replace(Vec::with_capacity(10)).unwrap().capacity());
423    /// println!("{}", set.get(&[][..]).unwrap().capacity());
424    /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 10);
425    /// ```
426    pub fn replace(&mut self, value: T) -> Option<T> {
427        let replaced_element = self.take(&value);
428        self.insert(value);
429
430        replaced_element
431    }
432    /// Returns `true` if the set contains an element equal to the value.
433    ///
434    /// The value may be any borrowed form of the set's element type,
435    /// but the ordering on the borrowed form *must* match the
436    /// ordering on the element type.
437    ///
438    /// # Examples
439    ///
440    /// ```
441    /// use indexset::BTreeSet;
442    ///
443    /// let set = BTreeSet::from_iter([1, 2, 3]);
444    /// assert_eq!(set.contains(&1), true);
445    /// assert_eq!(set.contains(&4), false);
446    /// ```
447    pub fn contains<Q>(&self, value: &Q) -> bool
448    where
449        T: Borrow<Q>,
450        Q: Ord + ?Sized,
451    {
452        let (node_idx, position_within_node) = self.locate_value(value);
453        if let Some(candidate_node) = self.inner.get(node_idx) {
454            if let Some(candidate_value) = candidate_node.get(position_within_node) {
455                return value == candidate_value.borrow();
456            }
457        }
458
459        false
460    }
461    fn contains_cmp<P, Q, R>(&self, cmp: P, mut cmp2: R) -> bool
462    where
463        T: Borrow<Q>,
464        Q: Ord + ?Sized,
465        P: FnMut(&Q) -> bool,
466        R: FnMut(&Q) -> bool,
467    {
468        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
469        if let Some(candidate_node) = self.inner.get(node_idx) {
470            if let Some(candidate_value) = candidate_node.get(position_within_node) {
471                return cmp2(candidate_value.borrow());
472            }
473        }
474
475        false
476    }
477    fn delete_at(&mut self, node_idx: usize, position_within_node: usize) -> T {
478        let removal = self.inner[node_idx].remove(position_within_node);
479
480        let mut decrease_length = false;
481        // check whether the node has to be deleted
482        if self.inner[node_idx].is_empty() {
483            // delete it as long as it is not the last remaining node
484            if self.inner.len() > 1 {
485                self.inner.remove(node_idx);
486                self.len -= 1;
487                self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
488            } else {
489                decrease_length = true;
490            }
491        } else {
492            decrease_length = true;
493        }
494
495        if decrease_length {
496            self.index.sub_at(node_idx, 1);
497            self.len -= 1;
498        }
499
500        removal
501    }
502    fn delete<Q>(&mut self, value: &Q) -> (Option<T>, bool)
503    where
504        T: Borrow<Q>,
505        Q: Ord + ?Sized,
506    {
507        let mut removed = false;
508        let mut removal = None;
509        let (node_idx, position_within_node) = self.locate_value(value);
510        if let Some(candidate_node) = self.inner.get(node_idx) {
511            if let Some(candidate_value) = candidate_node.get(position_within_node) {
512                if value == candidate_value.borrow() {
513                    removal = Some(self.delete_at(node_idx, position_within_node));
514                    removed = true;
515                }
516            }
517        }
518
519        (removal, removed)
520    }
521
522    fn find_cmp<P, Q, R>(&mut self, cmp: P, mut cmp2: R) -> NodeEntry
523    where
524        T: Borrow<Q>,
525        Q: Ord + ?Sized,
526        P: FnMut(&Q) -> bool,
527        R: FnMut(&Q) -> bool,
528    {
529        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
530        self.inner
531            .get(node_idx)
532            .and_then(|candidate_node| candidate_node.get(position_within_node))
533            .filter(|&candidate_value| cmp2(candidate_value.borrow()))
534            .map(|_| NodeEntry::Exist {
535                node_idx,
536                position_within_node,
537            })
538            .unwrap_or(NodeEntry::Empty { node_idx })
539    }
540
541    fn delete_cmp<P, Q, R>(&mut self, cmp: P, cmp2: R) -> (Option<T>, bool)
542    where
543        T: Borrow<Q>,
544        Q: Ord + ?Sized,
545        P: FnMut(&Q) -> bool,
546        R: FnMut(&Q) -> bool,
547    {
548        let removal = match self.find_cmp(cmp, cmp2) {
549            NodeEntry::Exist {
550                node_idx,
551                position_within_node,
552            } => Some(self.delete_at(node_idx, position_within_node)),
553            NodeEntry::Empty { .. } => None,
554        };
555
556        let removed = removal.is_some();
557
558        (removal, removed)
559    }
560    /// If the set contains an element equal to the value, removes it from the
561    /// set and drops it. Returns whether such an element was present.
562    ///
563    /// The value may be any borrowed form of the set's element type,
564    /// but the ordering on the borrowed form *must* match the
565    /// ordering on the element type.
566    ///
567    /// # Examples
568    ///
569    /// ```
570    /// use indexset::BTreeSet;
571    ///
572    /// let mut set = BTreeSet::new();
573    ///
574    /// set.insert(2);
575    /// assert_eq!(set.remove(&2), true);
576    /// assert_eq!(set.remove(&2), false);
577    /// ```
578    pub fn remove<Q>(&mut self, value: &Q) -> bool
579    where
580        T: Borrow<Q>,
581        Q: Ord + ?Sized,
582    {
583        self.delete(value).1
584    }
585    /// Removes and returns the element in the set, if any, that is equal to
586    /// the value.
587    ///
588    /// The value may be any borrowed form of the set's element type,
589    /// but the ordering on the borrowed form *must* match the
590    /// ordering on the element type.
591    ///
592    /// # Examples
593    ///
594    /// ```
595    /// use indexset::BTreeSet;
596    ///
597    /// let mut set = BTreeSet::from_iter([1, 2, 3]);
598    /// assert_eq!(set.take(&2), Some(2));
599    /// assert_eq!(set.take(&2), None);
600    /// ```
601    pub fn take<Q>(&mut self, value: &Q) -> Option<T>
602    where
603        T: Borrow<Q>,
604        Q: Ord + ?Sized,
605    {
606        self.delete(value).0
607    }
608    /// Returns a reference to the first element in the set, if any.
609    /// This element is always the minimum of all elements in the set.
610    ///
611    /// # Examples
612    ///
613    /// Basic usage:
614    ///
615    /// ```
616    /// use indexset::BTreeSet;
617    ///
618    /// let mut set = BTreeSet::new();
619    /// assert_eq!(set.first(), None);
620    /// set.insert(1);
621    /// assert_eq!(set.first(), Some(&1));
622    /// set.insert(2);
623    /// assert_eq!(set.first(), Some(&1));
624    /// ```
625    pub fn first(&self) -> Option<&T> {
626        if let Some(candidate_node) = self.inner.first() {
627            return candidate_node.first();
628        }
629
630        None
631    }
632    /// Returns a reference to the last element in the set, if any.
633    /// This element is always the maximum of all elements in the set.
634    ///
635    /// # Examples
636    ///
637    /// Basic usage:
638    ///
639    /// ```
640    /// use indexset::BTreeSet;
641    ///
642    /// let mut set = BTreeSet::new();
643    /// assert_eq!(set.last(), None);
644    /// set.insert(1);
645    /// assert_eq!(set.last(), Some(&1));
646    /// set.insert(2);
647    /// assert_eq!(set.last(), Some(&2));
648    /// ```
649    pub fn last(&self) -> Option<&T> {
650        if let Some(candidate_node) = self.inner.last() {
651            if !candidate_node.is_empty() {
652                return candidate_node.last();
653            }
654        }
655
656        None
657    }
658    /// Removes the first element from the set and returns it, if any.
659    /// The first element is always the minimum element in the set.
660    ///
661    /// # Examples
662    ///
663    /// ```
664    /// use indexset::BTreeSet;
665    ///
666    /// let mut set = BTreeSet::new();
667    ///
668    /// set.insert(1);
669    /// while let Some(n) = set.pop_first() {
670    ///     assert_eq!(n, 1);
671    /// }
672    /// assert!(set.is_empty());
673    /// ```
674    pub fn pop_first(&mut self) -> Option<T> {
675        let (first_node_idx, first_position_within_node) = (0, 0);
676        if let Some(candidate_node) = self.inner.get(first_node_idx) {
677            if candidate_node.get(first_position_within_node).is_some() {
678                return Some(self.delete_at(first_node_idx, first_position_within_node));
679            }
680        }
681
682        None
683    }
684    /// Removes the i-th element from the set and returns it, if any.
685    ///
686    /// # Examples
687    ///
688    /// ```
689    /// use indexset::BTreeSet;
690    ///
691    /// let mut set = BTreeSet::new();
692    ///
693    /// set.insert(1);
694    /// set.insert(2);
695    /// assert_eq!(set.pop_index(0), 1);
696    /// assert_eq!(set.pop_index(0), 2);
697    /// assert!(set.is_empty());
698    /// ```
699    pub fn pop_index(&mut self, idx: usize) -> T {
700        let (node_idx, position_within_node) = self.locate_ith(idx);
701
702        self.delete_at(node_idx, position_within_node)
703    }
704    /// Removes the last element from the set and returns it, if any.
705    /// The last element is always the maximum element in the set.
706    ///
707    /// # Examples
708    ///
709    /// ```
710    /// use indexset::BTreeSet;
711    ///
712    /// let mut set = BTreeSet::new();
713    ///
714    /// set.insert(1);
715    /// while let Some(n) = set.pop_last() {
716    ///     assert_eq!(n, 1);
717    /// }
718    /// assert!(set.is_empty());
719    /// ```
720    pub fn pop_last(&mut self) -> Option<T> {
721        let last_node_idx = self.inner.len() - 1;
722        let mut last_position_within_node = self.inner[last_node_idx].len();
723        last_position_within_node = last_position_within_node.saturating_sub(1);
724
725        if let Some(candidate_node) = self.inner.get(last_node_idx) {
726            if candidate_node.get(last_position_within_node).is_some() {
727                return Some(self.delete_at(last_node_idx, last_position_within_node));
728            }
729        }
730
731        None
732    }
733    /// Returns `true` if the set contains no elements.
734    ///
735    /// # Examples
736    ///
737    /// ```
738    /// use indexset::BTreeSet;
739    ///
740    /// let mut v = BTreeSet::new();
741    /// assert!(v.is_empty());
742    /// v.insert(1);
743    /// assert!(!v.is_empty());
744    /// ```
745    pub fn is_empty(&self) -> bool {
746        self.len() == 0
747    }
748    /// Returns `true` if the set is a subset of another,
749    /// i.e., `other` contains at least all the elements in `self`.
750    ///
751    /// # Examples
752    ///
753    /// ```
754    /// use indexset::BTreeSet;
755    ///
756    /// let sup = BTreeSet::from_iter([1, 2, 3]);
757    /// let mut set = BTreeSet::new();
758    ///
759    /// assert_eq!(set.is_subset(&sup), true);
760    /// set.insert(2);
761    /// assert_eq!(set.is_subset(&sup), true);
762    /// set.insert(4);
763    /// assert_eq!(set.is_subset(&sup), false);
764    /// ```
765    pub fn is_subset(&self, other: &Self) -> bool {
766        if self.difference(other).next().is_some() {
767            return false;
768        }
769
770        true
771    }
772    /// Returns `true` if the set is a superset of another,
773    /// i.e., `self` contains at least all the elements in `other`.
774    ///
775    /// # Examples
776    ///
777    /// ```
778    /// use indexset::BTreeSet;
779    ///
780    /// let sub = BTreeSet::from_iter([1, 2]);
781    /// let mut set = BTreeSet::new();
782    ///
783    /// assert_eq!(set.is_superset(&sub), false);
784    ///
785    /// set.insert(0);
786    /// set.insert(1);
787    /// assert_eq!(set.is_superset(&sub), false);
788    ///
789    /// set.insert(2);
790    /// assert_eq!(set.is_superset(&sub), true);
791    /// ```
792    pub fn is_superset(&self, other: &Self) -> bool {
793        if other.difference(self).next().is_some() {
794            return false;
795        }
796
797        true
798    }
799    /// Returns `true` if `self` has no elements in common with `other`.
800    /// This is equivalent to checking for an empty intersection.
801    ///
802    /// # Examples
803    ///
804    /// ```
805    /// use indexset::BTreeSet;
806    ///
807    /// let a = BTreeSet::from_iter([1, 2, 3]);
808    /// let mut b = BTreeSet::new();
809    ///
810    /// assert_eq!(a.is_disjoint(&b), true);
811    /// b.insert(4);
812    /// assert_eq!(a.is_disjoint(&b), true);
813    /// b.insert(1);
814    /// assert_eq!(a.is_disjoint(&b), false);
815    /// ```
816    pub fn is_disjoint(&self, other: &Self) -> bool {
817        if self.intersection(other).next().is_some() {
818            return false;
819        }
820
821        true
822    }
823    /// Gets an iterator that visits the elements in the `BTreeSet` in ascending
824    /// order.
825    ///
826    /// # Examples
827    ///
828    /// ```
829    /// use indexset::BTreeSet;
830    ///
831    /// let set = BTreeSet::from_iter([1, 2, 3]);
832    /// let mut set_iter = set.iter();
833    /// assert_eq!(set_iter.next(), Some(&1));
834    /// assert_eq!(set_iter.next(), Some(&2));
835    /// assert_eq!(set_iter.next(), Some(&3));
836    /// assert_eq!(set_iter.next(), None);
837    /// ```
838    ///
839    /// Values returned by the iterator are returned in ascending order:
840    ///
841    /// ```
842    /// use indexset::BTreeSet;
843    ///
844    /// let set = BTreeSet::from_iter([3, 1, 2]);
845    /// let mut set_iter = set.iter();
846    /// assert_eq!(set_iter.next(), Some(&1));
847    /// assert_eq!(set_iter.next(), Some(&2));
848    /// assert_eq!(set_iter.next(), Some(&3));
849    /// assert_eq!(set_iter.next(), None);
850    /// ```
851    pub fn iter(&self) -> Iter<'_, T> {
852        Iter::new(self)
853    }
854    /// Visits the elements representing the union,
855    /// i.e., all the elements in `self` or `other`, without duplicates,
856    /// in ascending order.
857    ///
858    /// # Examples
859    ///
860    /// ```
861    /// use indexset::BTreeSet;
862    ///
863    /// let mut a = BTreeSet::new();
864    /// a.insert(1);
865    ///
866    /// let mut b = BTreeSet::new();
867    /// b.insert(2);
868    ///
869    /// let union: Vec<_> = a.union(&b).cloned().collect();
870    /// assert_eq!(union, [1, 2]);
871    /// ```
872    pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T> {
873        Union {
874            merge_iter: MergeIter {
875                start: true,
876                left_iter: self.iter(),
877                current_left: None,
878                right_iter: other.iter(),
879                current_right: None,
880            },
881        }
882    }
883    /// Visits the elements representing the difference,
884    /// i.e., the elements that are in `self` but not in `other`,
885    /// in ascending order.
886    ///
887    /// # Examples
888    ///
889    /// ```
890    /// use indexset::BTreeSet;
891    ///
892    /// let mut a = BTreeSet::new();
893    /// a.insert(1);
894    /// a.insert(2);
895    ///
896    /// let mut b = BTreeSet::new();
897    /// b.insert(2);
898    /// b.insert(3);
899    ///
900    /// let diff: Vec<_> = a.difference(&b).cloned().collect();
901    /// assert_eq!(diff, [1]);
902    /// ```
903    pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T> {
904        Difference {
905            merge_iter: MergeIter {
906                start: true,
907                left_iter: self.iter(),
908                current_left: None,
909                right_iter: other.iter(),
910                current_right: None,
911            },
912        }
913    }
914    /// Visits the elements representing the symmetric difference,
915    /// i.e., the elements that are in `self` or in `other` but not in both,
916    /// in ascending order.
917    ///
918    /// # Examples
919    ///
920    /// ```
921    /// use indexset::BTreeSet;
922    ///
923    /// let mut a = BTreeSet::new();
924    /// a.insert(1);
925    /// a.insert(2);
926    ///
927    /// let mut b = BTreeSet::new();
928    /// b.insert(2);
929    /// b.insert(3);
930    ///
931    /// let sym_diff: Vec<_> = a.symmetric_difference(&b).cloned().collect();
932    /// assert_eq!(sym_diff, [1, 3]);
933    /// ```
934    pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T> {
935        SymmetricDifference {
936            merge_iter: MergeIter {
937                start: true,
938                left_iter: self.iter(),
939                current_left: None,
940                right_iter: other.iter(),
941                current_right: None,
942            },
943        }
944    }
945    /// Visits the elements representing the intersection,
946    /// i.e., the elements that are both in `self` and `other`,
947    /// in ascending order.
948    ///
949    /// # Examples
950    ///
951    /// ```
952    /// use indexset::BTreeSet;
953    ///
954    /// let mut a = BTreeSet::new();
955    /// a.insert(1);
956    /// a.insert(2);
957    ///
958    /// let mut b = BTreeSet::new();
959    /// b.insert(2);
960    /// b.insert(3);
961    ///
962    /// let intersection: Vec<_> = a.intersection(&b).cloned().collect();
963    /// assert_eq!(intersection, [2]);
964    /// ```
965    pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T> {
966        Intersection {
967            merge_iter: MergeIter {
968                start: true,
969                left_iter: self.iter(),
970                current_left: None,
971                right_iter: other.iter(),
972                current_right: None,
973            },
974        }
975    }
976    /// Retains only the elements specified by the predicate.
977    ///
978    /// In other words, remove all elements `e` for which `f(&e)` returns `false`.
979    /// The elements are visited in ascending order.
980    ///
981    /// # Examples
982    ///
983    /// ```
984    /// use indexset::BTreeSet;
985    ///
986    /// let mut set = BTreeSet::from_iter([1, 2, 3, 4, 5, 6]);
987    /// // Keep only the even numbers.
988    /// set.retain(|&k| k % 2 == 0);
989    /// assert!(set.iter().eq([2, 4, 6].iter()));
990    /// ```
991    pub fn retain<F, Q>(&mut self, mut f: F)
992    where
993        T: Borrow<Q>,
994        Q: Ord + ?Sized,
995        F: FnMut(&Q) -> bool,
996    {
997        let mut positions_to_delete = vec![];
998        for (node_idx, node) in self.inner.iter().enumerate() {
999            for (position_within_node, item) in node.iter().enumerate() {
1000                if !f(item.borrow()) {
1001                    positions_to_delete.push((node_idx, position_within_node));
1002                }
1003            }
1004        }
1005        positions_to_delete.reverse();
1006
1007        positions_to_delete
1008            .into_iter()
1009            .for_each(|(node_idx, position_within_node)| {
1010                self.delete_at(node_idx, position_within_node);
1011            })
1012    }
1013    fn split_off_cmp<P, Q>(&mut self, cmp: P) -> Self
1014    where
1015        T: Borrow<Q>,
1016        Q: Ord + ?Sized,
1017        P: FnMut(&Q) -> bool,
1018    {
1019        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
1020        let first_node = self.inner[node_idx].split_off(position_within_node);
1021        let mut remaining_nodes = vec![];
1022        while self.inner.len() > node_idx + 1 {
1023            remaining_nodes.push(self.inner.pop().unwrap());
1024        }
1025        remaining_nodes.reverse();
1026        remaining_nodes.insert(0, first_node);
1027        let mut latter_half = BTreeSet::default();
1028        latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
1029        latter_half.inner = remaining_nodes;
1030        latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
1031
1032        if self.inner[node_idx].is_empty() && self.inner.len() > 1 {
1033            self.inner.remove(node_idx);
1034        }
1035
1036        self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
1037        self.len = self.inner.iter().map(|node| node.len()).sum();
1038
1039        latter_half
1040    }
1041    /// Splits the collection into two at the value. Returns a new collection
1042    /// with all elements greater than or equal to the value.
1043    ///
1044    /// # Examples
1045    ///
1046    /// Basic usage:
1047    ///
1048    /// ```
1049    /// use indexset::BTreeSet;
1050    ///
1051    /// let mut a = BTreeSet::new();
1052    /// a.insert(1);
1053    /// a.insert(2);
1054    /// a.insert(3);
1055    /// a.insert(17);
1056    /// a.insert(41);
1057    ///
1058    /// let b = a.split_off(&3);
1059    ///
1060    /// assert_eq!(a.len(), 2);
1061    /// assert_eq!(b.len(), 3);
1062    ///
1063    /// assert!(a.contains(&1));
1064    /// assert!(a.contains(&2));
1065    ///
1066    /// assert!(b.contains(&3));
1067    /// assert!(b.contains(&17));
1068    /// assert!(b.contains(&41));
1069    /// ```
1070    pub fn split_off<Q>(&mut self, value: &Q) -> Self
1071    where
1072        T: Borrow<Q>,
1073        Q: Ord + ?Sized,
1074    {
1075        let (node_idx, position_within_node) = self.locate_value(value);
1076        let first_node = self.inner[node_idx].split_off(position_within_node);
1077        let mut remaining_nodes = vec![];
1078        while self.inner.len() > node_idx + 1 {
1079            remaining_nodes.push(self.inner.pop().unwrap());
1080        }
1081        remaining_nodes.reverse();
1082        remaining_nodes.insert(0, first_node);
1083        let mut latter_half = BTreeSet::default();
1084        latter_half.len = remaining_nodes.iter().map(|node| node.len()).sum();
1085        latter_half.inner = remaining_nodes;
1086        latter_half.index = FenwickTree::from_iter(latter_half.inner.iter().map(|node| node.len()));
1087
1088        if self.inner[node_idx].is_empty() && self.inner.len() > 1 {
1089            self.inner.remove(node_idx);
1090        }
1091
1092        self.index = FenwickTree::from_iter(self.inner.iter().map(|node| node.len()));
1093        self.len = self.inner.iter().map(|node| node.len()).sum();
1094
1095        latter_half
1096    }
1097    /// Moves all elements from `other` into `self`, leaving `other` empty.
1098    ///
1099    /// # Examples
1100    ///
1101    /// ```
1102    /// use indexset::BTreeSet;
1103    ///
1104    /// let mut a = BTreeSet::new();
1105    /// a.insert(1);
1106    /// a.insert(2);
1107    /// a.insert(3);
1108    ///
1109    /// let mut b = BTreeSet::new();
1110    /// b.insert(3);
1111    /// b.insert(4);
1112    /// b.insert(5);
1113    ///
1114    /// a.append(&mut b);
1115    ///
1116    /// assert_eq!(a.len(), 5);
1117    /// assert_eq!(b.len(), 0);
1118    ///
1119    /// assert!(a.contains(&1));
1120    /// assert!(a.contains(&2));
1121    /// assert!(a.contains(&3));
1122    /// assert!(a.contains(&4));
1123    /// assert!(a.contains(&5));
1124    /// ```
1125    pub fn append(&mut self, other: &mut Self) {
1126        while let Some(value) = other.pop_first() {
1127            self.replace(value);
1128        }
1129    }
1130    fn resolve_range<R>(&self, range: R) -> ((usize, usize, usize), (usize, usize, usize))
1131    where
1132        R: RangeBounds<usize>,
1133    {
1134        let mut global_front_idx: usize = 0;
1135        let mut global_back_idx: usize = self.index.prefix_sum(self.inner.len(), 0).saturating_sub(1);
1136
1137        // Solving global indexes
1138        let start = range.start_bound();
1139        match start {
1140            Bound::Included(bound) => {
1141                global_front_idx = *bound;
1142            }
1143            Bound::Excluded(bound) => {
1144                global_front_idx = *bound + 1;
1145            }
1146            Bound::Unbounded => (),
1147        }
1148
1149        let end = range.end_bound();
1150        match end {
1151            Bound::Included(bound) => {
1152                global_back_idx = *bound;
1153            }
1154            Bound::Excluded(bound) => {
1155                global_back_idx = *bound - 1;
1156            }
1157            Bound::Unbounded => (),
1158        }
1159        // Figuring out nodes
1160        let (front_node_idx, front_start_idx) = self.locate_ith(global_front_idx);
1161        let (back_node_idx, back_start_idx) = self.locate_ith(global_back_idx);
1162
1163        (
1164            (global_front_idx, front_node_idx, front_start_idx),
1165            (global_back_idx, back_node_idx, back_start_idx),
1166        )
1167    }
1168    /// Constructs a double-ended iterator over a sub-range of elements in the set.
1169    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
1170    /// yield elements from min (inclusive) to max (exclusive).
1171    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
1172    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
1173    /// range from 4 to 10.
1174    ///
1175    /// # Panics
1176    ///
1177    /// Panics if range `start > end`.
1178    /// Panics if range `start == end` and both bounds are `Excluded`.
1179    ///
1180    /// # Examples
1181    ///
1182    /// ```
1183    /// use indexset::BTreeSet;
1184    /// use std::ops::Bound::Included;
1185    ///
1186    /// let mut set = BTreeSet::new();
1187    /// set.insert(3);
1188    /// set.insert(5);
1189    /// set.insert(8);
1190    /// for &elem in set.range((Included(&4), Included(&8))) {
1191    ///     println!("{elem}");
1192    /// }
1193    /// assert_eq!(Some(&5), set.range(4..).next());
1194    /// ```
1195    pub fn range<R, Q>(&self, range: R) -> Range<'_, T>
1196    where
1197        Q: Ord + ?Sized,
1198        T: Borrow<Q>,
1199        R: RangeBounds<Q>,
1200    {
1201        let start_idx = match range.start_bound() {
1202            Bound::Included(bound) => self.rank(bound),
1203            Bound::Excluded(bound) => self.rank(bound) + 1,
1204            Bound::Unbounded => 0,
1205        };
1206        let end_idx = match range.end_bound() {
1207            Bound::Included(bound) => self.rank(bound),
1208            Bound::Excluded(bound) => self.rank(bound).saturating_sub(1),
1209            Bound::Unbounded => self.len().saturating_sub(1),
1210        };
1211
1212        self.range_idx(start_idx..=end_idx)
1213    }
1214    /// Returns the position in which the given element would fall in the already-existing sorted
1215    /// order.
1216    ///
1217    /// The value may be any borrowed form of the set's element type,
1218    /// but the ordering on the borrowed form *must* match the
1219    /// ordering on the element type.
1220    ///
1221    /// # Examples
1222    ///
1223    /// ```
1224    /// use indexset::BTreeSet;
1225    ///
1226    /// let set = BTreeSet::from_iter([1, 2, 3]);
1227    /// assert_eq!(set.rank(&1), 0);
1228    /// assert_eq!(set.rank(&3), 2);
1229    /// assert_eq!(set.rank(&4), 3);
1230    /// assert_eq!(set.rank(&100), 3);
1231    /// ```
1232    pub fn rank<Q>(&self, value: &Q) -> usize
1233    where
1234        Q: Ord + ?Sized,
1235        T: Borrow<Q>,
1236    {
1237        let (node_idx, position_within_node) = self.locate_value(value);
1238
1239        let offset = self.index.prefix_sum(node_idx, 0);
1240
1241        offset + position_within_node
1242    }
1243    fn rank_cmp<Q, P>(&self, cmp: P) -> usize
1244    where
1245        T: Borrow<Q>,
1246        Q: Ord + ?Sized,
1247        P: FnMut(&Q) -> bool,
1248    {
1249        let (node_idx, position_within_node) = self.locate_value_cmp(cmp);
1250
1251        let offset = self.index.prefix_sum(node_idx, 0);
1252
1253        offset + position_within_node
1254    }
1255    pub fn range_idx<R>(&self, range: R) -> Range<'_, T>
1256    where
1257        R: RangeBounds<usize>,
1258    {
1259        let ((global_front_idx, front_node_idx, front_start_idx), (global_back_idx, back_node_idx, back_start_idx)) =
1260            self.resolve_range(range);
1261
1262        let front_iter = if front_node_idx < self.inner.len() {
1263            Some(self.inner[front_node_idx][front_start_idx..].iter())
1264        } else {
1265            None
1266        };
1267
1268        let back_iter = if back_node_idx < self.inner.len() {
1269            Some(self.inner[back_node_idx][..=back_start_idx].iter())
1270        } else {
1271            None
1272        };
1273
1274        Range {
1275            spine_iter: Iter {
1276                btree: self,
1277                current_front_node_idx: front_node_idx,
1278                current_front_idx: global_front_idx,
1279                current_back_node_idx: back_node_idx,
1280                current_back_idx: global_back_idx + 1,
1281                current_front_iterator: front_iter,
1282                current_back_iterator: back_iter,
1283            },
1284        }
1285    }
1286}
1287
1288impl<T> FromIterator<T> for BTreeSet<T>
1289where
1290    T: Ord,
1291{
1292    fn from_iter<K: IntoIterator<Item = T>>(iter: K) -> Self {
1293        let mut btree = BTreeSet::new();
1294        iter.into_iter().for_each(|item| {
1295            btree.insert(item);
1296        });
1297
1298        btree
1299    }
1300}
1301
1302impl<T, const N: usize> From<[T; N]> for BTreeSet<T>
1303where
1304    T: Ord,
1305{
1306    fn from(value: [T; N]) -> Self {
1307        let mut btree: BTreeSet<T> = Default::default();
1308
1309        value.into_iter().for_each(|item| {
1310            btree.insert(item);
1311        });
1312
1313        btree
1314    }
1315}
1316
1317impl<T> Default for BTreeSet<T>
1318where
1319    T: Ord,
1320{
1321    fn default() -> Self {
1322        let node_capacity = DEFAULT_INNER_SIZE;
1323
1324        Self {
1325            inner: vec![Node::with_capacity(node_capacity)],
1326            index: FenwickTree::from_iter(vec![0]),
1327            node_capacity,
1328            len: 0,
1329        }
1330    }
1331}
1332
1333/// An iterator over the items of a `BTreeSet`.
1334///
1335/// This `struct` is created by the [`iter`] method on [`BTreeSet`].
1336/// See its documentation for more.
1337///
1338/// [`iter`]: BTreeSet::iter
1339pub struct Iter<'a, T>
1340where
1341    T: Ord,
1342{
1343    btree: &'a BTreeSet<T>,
1344    current_front_node_idx: usize,
1345    current_front_idx: usize,
1346    current_back_node_idx: usize,
1347    current_back_idx: usize,
1348    current_front_iterator: Option<::core::slice::Iter<'a, T>>,
1349    current_back_iterator: Option<::core::slice::Iter<'a, T>>,
1350}
1351
1352impl<'a, T> Iter<'a, T>
1353where
1354    T: Ord,
1355{
1356    pub fn new(btree: &'a BTreeSet<T>) -> Self {
1357        Self {
1358            btree,
1359            current_front_node_idx: 0,
1360            current_front_idx: 0,
1361            current_back_node_idx: btree.inner.len() - 1,
1362            current_back_idx: btree.len(),
1363            current_front_iterator: Some(btree.inner[0].iter()),
1364            current_back_iterator: Some(btree.inner[btree.inner.len() - 1].iter()),
1365        }
1366    }
1367}
1368
1369impl<'a, T> Iterator for Iter<'a, T>
1370where
1371    T: Ord,
1372{
1373    type Item = &'a T;
1374
1375    fn next(&mut self) -> Option<Self::Item> {
1376        if self.current_front_idx == self.current_back_idx {
1377            return None;
1378        }
1379        if let Some(value) = self.current_front_iterator.as_mut().and_then(|i| i.next()) {
1380            self.current_front_idx += 1;
1381            Some(value)
1382        } else {
1383            self.current_front_node_idx += 1;
1384            if self.current_front_node_idx >= self.btree.inner.len() {
1385                return None;
1386            }
1387            self.current_front_iterator = Some(self.btree.inner[self.current_front_node_idx].iter());
1388
1389            self.next()
1390        }
1391    }
1392}
1393
1394impl<'a, T> DoubleEndedIterator for Iter<'a, T>
1395where
1396    T: Ord,
1397{
1398    fn next_back(&mut self) -> Option<Self::Item> {
1399        if self.current_front_idx == self.current_back_idx {
1400            return None;
1401        }
1402        if let Some(value) = self.current_back_iterator.as_mut().and_then(|i| i.next_back()) {
1403            self.current_back_idx -= 1;
1404            Some(value)
1405        } else {
1406            if self.current_back_node_idx == 0 {
1407                return None;
1408            };
1409            self.current_back_node_idx -= 1;
1410            self.current_back_iterator = Some(self.btree.inner[self.current_back_node_idx].iter());
1411
1412            self.next_back()
1413        }
1414    }
1415}
1416
1417impl<'a, T> FusedIterator for Iter<'a, T> where T: Ord {}
1418
1419impl<'a, T> IntoIterator for &'a BTreeSet<T>
1420where
1421    T: Ord,
1422{
1423    type Item = &'a T;
1424
1425    type IntoIter = Iter<'a, T>;
1426
1427    fn into_iter(self) -> Self::IntoIter {
1428        Iter::new(self)
1429    }
1430}
1431
1432/// An owning iterator over the items of a `BTreeSet`.
1433///
1434/// This `struct` is created by the [`into_iter`] method on [`BTreeSet`]
1435/// (provided by the [`IntoIterator`] trait). See its documentation for more.
1436///
1437/// [`into_iter`]: BTreeSet#method.into_iter
1438pub struct IntoIter<T>
1439where
1440    T: Ord,
1441{
1442    btree: BTreeSet<T>,
1443}
1444
1445impl<T> Iterator for IntoIter<T>
1446where
1447    T: Ord,
1448{
1449    type Item = T;
1450
1451    fn next(&mut self) -> Option<Self::Item> {
1452        self.btree.pop_first()
1453    }
1454}
1455
1456impl<T> DoubleEndedIterator for IntoIter<T>
1457where
1458    T: Ord,
1459{
1460    fn next_back(&mut self) -> Option<Self::Item> {
1461        self.btree.pop_last()
1462    }
1463}
1464
1465impl<T> FusedIterator for IntoIter<T> where T: Ord {}
1466
1467impl<T> IntoIterator for BTreeSet<T>
1468where
1469    T: Ord,
1470{
1471    type Item = T;
1472
1473    type IntoIter = IntoIter<T>;
1474
1475    fn into_iter(self) -> Self::IntoIter {
1476        // This will never panic, since there always is at least one node in the btree
1477        IntoIter { btree: self }
1478    }
1479}
1480
1481struct MergeIter<'a, T>
1482where
1483    T: Ord,
1484{
1485    start: bool,
1486    left_iter: Iter<'a, T>,
1487    current_left: Option<&'a T>,
1488    right_iter: Iter<'a, T>,
1489    current_right: Option<&'a T>,
1490}
1491
1492impl<'a, T> Iterator for MergeIter<'a, T>
1493where
1494    T: Ord,
1495{
1496    type Item = (Option<&'a T>, Option<&'a T>);
1497    fn next(&mut self) -> Option<Self::Item> {
1498        if !self.start {
1499            if let Some(left) = self.current_left {
1500                if let Some(right) = self.current_right {
1501                    match left.cmp(right) {
1502                        Ordering::Less => {
1503                            self.current_left = self.left_iter.next();
1504                        }
1505                        Ordering::Equal => {
1506                            self.current_left = self.left_iter.next();
1507                            self.current_right = self.right_iter.next();
1508                        }
1509                        Ordering::Greater => {
1510                            self.current_right = self.right_iter.next();
1511                        }
1512                    }
1513                } else {
1514                    self.current_left = self.left_iter.next();
1515                }
1516            } else if self.current_right.is_some() {
1517                self.current_right = self.right_iter.next();
1518            } else {
1519                return None;
1520            }
1521        } else {
1522            self.current_left = self.left_iter.next();
1523            self.current_right = self.right_iter.next();
1524            self.start = false;
1525        }
1526
1527        Some((self.current_left, self.current_right))
1528    }
1529}
1530
1531/// A lazy iterator producing elements in the union of `BTreeSet`s.
1532///
1533/// This `struct` is created by the [`union`] method on [`BTreeSet`].
1534/// See its documentation for more.
1535///
1536/// [`union`]: BTreeSet::union
1537pub struct Union<'a, T>
1538where
1539    T: Ord,
1540{
1541    merge_iter: MergeIter<'a, T>,
1542}
1543
1544impl<'a, T> Iterator for Union<'a, T>
1545where
1546    T: Ord,
1547{
1548    type Item = &'a T;
1549
1550    fn next(&mut self) -> Option<Self::Item> {
1551        if let Some((current_left, current_right)) = self.merge_iter.next() {
1552            return match (current_left, current_right) {
1553                (Some(left), Some(right)) => {
1554                    if right < left {
1555                        Some(right)
1556                    } else {
1557                        Some(left)
1558                    }
1559                }
1560                (Some(left), None) => Some(left),
1561                (None, Some(right)) => Some(right),
1562                (None, None) => None,
1563            };
1564        }
1565
1566        None
1567    }
1568}
1569
1570impl<'a, T> FusedIterator for Union<'a, T> where T: Ord {}
1571
1572/// A lazy iterator producing elements in the difference of `BTreeSet`s.
1573///
1574/// This `struct` is created by the [`difference`] method on [`BTreeSet`].
1575/// See its documentation for more.
1576///
1577/// [`difference`]: BTreeSet::difference
1578pub struct Difference<'a, T>
1579where
1580    T: Ord,
1581{
1582    merge_iter: MergeIter<'a, T>,
1583}
1584
1585impl<'a, T> Iterator for Difference<'a, T>
1586where
1587    T: Ord,
1588{
1589    type Item = &'a T;
1590
1591    fn next(&mut self) -> Option<Self::Item> {
1592        loop {
1593            return if let Some((current_left, current_right)) = self.merge_iter.next() {
1594                match (current_left, current_right) {
1595                    (Some(left), Some(right)) => {
1596                        if left < right {
1597                            Some(left)
1598                        } else {
1599                            continue;
1600                        }
1601                    }
1602                    (Some(left), None) => Some(left),
1603                    (None, _) => None,
1604                }
1605            } else {
1606                None
1607            };
1608        }
1609    }
1610}
1611
1612impl<'a, T> FusedIterator for Difference<'a, T> where T: Ord {}
1613
1614/// A lazy iterator producing elements in the symmetric difference of `BTreeSet`s.
1615///
1616/// This `struct` is created by the [`symmetric_difference`] method on
1617/// [`BTreeSet`]. See its documentation for more.
1618///
1619/// [`symmetric_difference`]: BTreeSet::symmetric_difference
1620pub struct SymmetricDifference<'a, T>
1621where
1622    T: Ord,
1623{
1624    merge_iter: MergeIter<'a, T>,
1625}
1626
1627impl<'a, T> Iterator for SymmetricDifference<'a, T>
1628where
1629    T: Ord,
1630{
1631    type Item = &'a T;
1632
1633    fn next(&mut self) -> Option<Self::Item> {
1634        loop {
1635            return if let Some((current_left, current_right)) = self.merge_iter.next() {
1636                match (current_left, current_right) {
1637                    (Some(left), Some(right)) => {
1638                        if left < right {
1639                            Some(left)
1640                        } else if right < left {
1641                            Some(right)
1642                        } else {
1643                            continue;
1644                        }
1645                    }
1646                    (Some(left), None) => Some(left),
1647                    (None, Some(right)) => Some(right),
1648                    (None, _) => None,
1649                }
1650            } else {
1651                None
1652            };
1653        }
1654    }
1655}
1656
1657impl<'a, T> FusedIterator for SymmetricDifference<'a, T> where T: Ord {}
1658
1659/// A lazy iterator producing elements in the intersection of `BTreeSet`s.
1660///
1661/// This `struct` is created by the [`intersection`] method on [`BTreeSet`].
1662/// See its documentation for more.
1663///
1664/// [`intersection`]: BTreeSet::intersection
1665pub struct Intersection<'a, T>
1666where
1667    T: Ord,
1668{
1669    merge_iter: MergeIter<'a, T>,
1670}
1671
1672impl<'a, T> Iterator for Intersection<'a, T>
1673where
1674    T: Ord,
1675{
1676    type Item = &'a T;
1677
1678    fn next(&mut self) -> Option<Self::Item> {
1679        loop {
1680            if let Some((current_left, current_right)) = self.merge_iter.next() {
1681                match (current_left, current_right) {
1682                    (Some(left), Some(right)) => {
1683                        if left == right {
1684                            return Some(left);
1685                        } else {
1686                            continue;
1687                        }
1688                    }
1689                    (None, _) | (_, None) => return None,
1690                }
1691            } else {
1692                return None;
1693            }
1694        }
1695    }
1696}
1697
1698impl<'a, T> FusedIterator for Intersection<'a, T> where T: Ord {}
1699
1700/// An iterator over a sub-range of items in a `BTreeSet`.
1701///
1702/// This `struct` is created by the [`range`] method on [`BTreeSet`].
1703/// See its documentation for more.
1704///
1705/// [`range`]: BTreeSet::range
1706pub struct Range<'a, T>
1707where
1708    T: Ord,
1709{
1710    spine_iter: Iter<'a, T>,
1711}
1712
1713impl<'a, T> Iterator for Range<'a, T>
1714where
1715    T: Ord,
1716{
1717    type Item = &'a T;
1718
1719    fn next(&mut self) -> Option<Self::Item> {
1720        self.spine_iter.next()
1721    }
1722}
1723
1724impl<'a, T> DoubleEndedIterator for Range<'a, T>
1725where
1726    T: Ord,
1727{
1728    fn next_back(&mut self) -> Option<Self::Item> {
1729        self.spine_iter.next_back()
1730    }
1731}
1732
1733impl<'a, T> FusedIterator for Range<'a, T> where T: Ord {}
1734
1735impl<T> Index<usize> for BTreeSet<T>
1736where
1737    T: Ord,
1738{
1739    type Output = T;
1740
1741    fn index(&self, index: usize) -> &Self::Output {
1742        self.get_index(index).unwrap()
1743    }
1744}
1745
1746pub struct VacantEntry<'a, K, V>
1747where
1748    K: Ord,
1749{
1750    map: &'a mut BTreeMap<K, V>,
1751    key: K,
1752}
1753
1754pub struct OccupiedEntry<'a, K, V>
1755where
1756    K: Ord,
1757{
1758    map: &'a mut BTreeMap<K, V>,
1759    idx: usize,
1760}
1761
1762pub enum Entry<'a, K, V>
1763where
1764    K: 'a + Ord,
1765    V: 'a,
1766{
1767    Vacant(VacantEntry<'a, K, V>),
1768    Occupied(OccupiedEntry<'a, K, V>),
1769}
1770
1771impl<'a, K, V> Entry<'a, K, V>
1772where
1773    K: 'a + Ord,
1774    V: 'a,
1775{
1776    pub fn or_insert(self, default: V) -> &'a mut V {
1777        match self {
1778            Vacant(entry) => entry.insert(default),
1779            Occupied(entry) => entry.into_mut(),
1780        }
1781    }
1782    pub fn or_insert_with<F>(self, default: F) -> &'a mut V
1783    where
1784        F: FnOnce() -> V,
1785    {
1786        match self {
1787            Vacant(entry) => entry.insert(default()),
1788            Occupied(entry) => entry.into_mut(),
1789        }
1790    }
1791    pub fn or_insert_with_key<F>(self, default: F) -> &'a mut V
1792    where
1793        F: FnOnce(&K) -> V,
1794    {
1795        match self {
1796            Vacant(entry) => {
1797                let value = default(entry.key());
1798                entry.insert(value)
1799            }
1800            Occupied(entry) => entry.into_mut(),
1801        }
1802    }
1803    pub fn key(&self) -> &K {
1804        match *self {
1805            Occupied(ref entry) => entry.key(),
1806            Vacant(ref entry) => entry.key(),
1807        }
1808    }
1809    pub fn and_modify<F>(self, f: F) -> Self
1810    where
1811        F: FnOnce(&mut V),
1812    {
1813        match self {
1814            Occupied(mut entry) => {
1815                f(entry.get_mut());
1816                Occupied(entry)
1817            }
1818            Vacant(entry) => Vacant(entry),
1819        }
1820    }
1821    pub fn or_default(self) -> &'a mut V
1822    where
1823        V: Default,
1824    {
1825        match self {
1826            Occupied(entry) => entry.into_mut(),
1827            Vacant(entry) => entry.insert(Default::default()),
1828        }
1829    }
1830}
1831
1832impl<'a, K, V> OccupiedEntry<'a, K, V>
1833where
1834    K: Ord,
1835{
1836    pub fn key(&self) -> &K {
1837        &self.map.set.get_index(self.idx).unwrap().key
1838    }
1839    pub fn remove_entry(self) -> (K, V) {
1840        self.map.pop_index(self.idx)
1841    }
1842    pub fn get(&self) -> &V {
1843        self.map.get_index(self.idx).unwrap().1
1844    }
1845    pub fn get_mut(&mut self) -> &mut V {
1846        self.map.get_mut_index(self.idx).unwrap()
1847    }
1848    pub fn into_mut(self) -> &'a mut V {
1849        self.map.get_mut_index(self.idx).unwrap()
1850    }
1851    pub fn insert(&mut self, value: V) -> V {
1852        let current_value = self.map.get_mut_index(self.idx).unwrap();
1853        let mut previous_value = value;
1854        swap(&mut previous_value, current_value);
1855
1856        previous_value
1857    }
1858    pub fn remove(self) -> V {
1859        self.map.pop_index(self.idx).1
1860    }
1861}
1862
1863impl<'a, K, V> VacantEntry<'a, K, V>
1864where
1865    K: Ord,
1866{
1867    pub fn key(&self) -> &K {
1868        &self.key
1869    }
1870    pub fn into_key(self) -> K {
1871        self.key
1872    }
1873    pub fn insert(self, value: V) -> &'a mut V {
1874        let rank = self.map.set.rank_cmp(|item: &Pair<K, V>| item.key < self.key);
1875        self.map.insert(self.key, value);
1876
1877        self.map.get_mut_index(rank).unwrap()
1878    }
1879}
1880
1881/// An ordered map based on a two-level [B-Tree].
1882///
1883/// B-Trees represent a fundamental compromise between cache-efficiency and actually minimizing
1884/// the amount of work performed in a search. In theory, a binary search tree (BST) is the optimal
1885/// choice for a sorted map, as a perfectly balanced BST performs the theoretical minimum amount of
1886/// comparisons necessary to find an element (log<sub>2</sub>n). However, in practice the way this
1887/// is done is *very* inefficient for modern computer architectures. In particular, every element
1888/// is stored in its own individually heap-allocated node. This means that every single insertion
1889/// triggers a heap-allocation, and every single comparison should be a cache-miss. Since these
1890/// are both notably expensive things to do in practice, we are forced to, at the very least,
1891/// reconsider the BST strategy.
1892///
1893/// However, B-Trees are not as performant as they could be, since there still is a significant
1894/// amount of pointer indirection, and, in Rust's case, a linear search on the node level.
1895///
1896/// Our implementation restricts a B-Tree to only have two levels, and have zero pointer indirection,
1897/// with data residing only in the second level. The first level is an array, sorted by each node's
1898/// maximum element. The second is where all the data is at, being a sorted array of sorted arrays of
1899/// fixed size, 1024. Lookups are done in two steps, one binary search over the first level, and one
1900/// over the second. This is significantly simpler than a regular B-Tree. The main tradeoff, is that
1901/// insertion and deletion relies on always having to sort an array of size 1024. In practice, this
1902/// is barely noticable, but still presents itself as a drawback significant enough to warrant considering
1903/// not using this crate. Please, read the Readme in order to see benchmarking results.
1904///
1905/// Furthermore, it has a very efficient get-the-ith-element implementation, that is thousands(literally)
1906/// of times faster than what is currently available in stdlib.
1907///
1908/// Iterators obtained from functions such as [`BTreeMap::iter`], [`BTreeMap::values`], or
1909/// [`BTreeMap::keys`] produce their items in order by key, and directly leverage Rust's own
1910/// slice iterators, therefore being as fast as possible.
1911///
1912/// [B-Tree]: https://en.wikipedia.org/wiki/B-tree
1913///
1914/// # Examples
1915///
1916/// ```
1917/// use indexset::BTreeMap;
1918///
1919/// // type inference lets us omit an explicit type signature (which
1920/// // would be `BTreeMap<&str, &str>` in this example).
1921/// let mut movie_reviews = BTreeMap::new();
1922///
1923/// // review some movies.
1924/// movie_reviews.insert("Office Space",       "Deals with real issues in the workplace.");
1925/// movie_reviews.insert("Pulp Fiction",       "Masterpiece.");
1926/// movie_reviews.insert("The Godfather",      "Very enjoyable.");
1927/// movie_reviews.insert("The Blues Brothers", "Eye lyked it a lot.");
1928///
1929/// // check for a specific one.
1930/// if !movie_reviews.contains_key("Les Misérables") {
1931///     println!("We've got {} reviews, but Les Misérables ain't one.",
1932///              movie_reviews.len());
1933/// }
1934///
1935/// // oops, this review has a lot of spelling mistakes, let's delete it.
1936/// movie_reviews.remove("The Blues Brothers");
1937///
1938/// // look up the values associated with some keys.
1939/// let to_find = ["Up!", "Office Space"];
1940/// for movie in &to_find {
1941///     match movie_reviews.get(movie) {
1942///        Some(review) => println!("{movie}: {review}"),
1943///        None => println!("{movie} is unreviewed.")
1944///     }
1945/// }
1946///
1947/// // Look up the value for a key (will panic if the key is not found).
1948/// println!("Movie review: {}", movie_reviews["Office Space"]);
1949///
1950/// // iterate over everything.
1951/// for (movie, review) in &movie_reviews {
1952///     println!("{movie}: \"{review}\"");
1953/// }
1954/// ```
1955///
1956/// A `BTreeMap` with a known list of items can be initialized from an array:
1957///
1958/// ```
1959/// use indexset::BTreeMap;
1960///
1961/// let solar_distance = BTreeMap::from_iter([
1962///     ("Mercury", 0.4),
1963///     ("Venus", 0.7),
1964///     ("Earth", 1.0),
1965///     ("Mars", 1.5),
1966/// ]);
1967/// ```
1968#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
1969#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
1970pub struct BTreeMap<K, V>
1971where
1972    K: Ord,
1973{
1974    set: BTreeSet<Pair<K, V>>,
1975}
1976
1977impl<K: Ord, V> Default for BTreeMap<K, V>
1978where
1979    K: Ord,
1980{
1981    fn default() -> Self {
1982        Self {
1983            set: BTreeSet::default(),
1984        }
1985    }
1986}
1987
1988impl<K, V> FromIterator<(K, V)> for BTreeMap<K, V>
1989where
1990    K: Ord,
1991{
1992    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {
1993        let mut btree = BTreeMap::new();
1994        iter.into_iter().for_each(|item| {
1995            btree.insert(item.0, item.1);
1996        });
1997
1998        btree
1999    }
2000}
2001
2002impl<K: Ord, V> BTreeMap<K, V>
2003where
2004    K: Ord,
2005{
2006    /// Moves all elements from `other` into `self`, leaving `other` empty.
2007    ///
2008    /// If a key from `other` is already present in `self`, the respective
2009    /// value from `self` will be overwritten with the respective value from `other`.
2010    ///
2011    /// # Examples
2012    ///
2013    /// ```
2014    /// use indexset::BTreeMap;
2015    ///
2016    /// let mut a = BTreeMap::new();
2017    /// a.insert(1, "a");
2018    /// a.insert(2, "b");
2019    /// a.insert(3, "c"); // Note: Key (3) also present in b.
2020    ///
2021    /// let mut b = BTreeMap::new();
2022    /// b.insert(3, "d"); // Note: Key (3) also present in a.
2023    /// b.insert(4, "e");
2024    /// b.insert(5, "f");
2025    ///
2026    /// a.append(&mut b);
2027    ///
2028    /// assert_eq!(a.len(), 5);
2029    /// assert_eq!(b.len(), 0);
2030    ///
2031    /// assert_eq!(a[&1], "a");
2032    /// assert_eq!(a[&2], "b");
2033    /// assert_eq!(a[&3], "d"); // Note: "c" has been overwritten.
2034    /// assert_eq!(a[&4], "e");
2035    /// assert_eq!(a[&5], "f");
2036    /// ```
2037    pub fn append(&mut self, other: &mut Self) {
2038        self.set.append(&mut other.set)
2039    }
2040    /// Clears the map, removing all elements.
2041    ///
2042    /// # Examples
2043    ///
2044    /// Basic usage:
2045    ///
2046    /// ```
2047    /// use indexset::BTreeMap;
2048    ///
2049    /// let mut a = BTreeMap::new();
2050    /// a.insert(1, "a");
2051    /// a.clear();
2052    /// assert!(a.is_empty());
2053    /// ```
2054    pub fn clear(&mut self) {
2055        self.set.clear()
2056    }
2057    /// Returns `true` if the map contains a value for the specified key.
2058    ///
2059    /// The key may be any borrowed form of the map's key type, but the ordering
2060    /// on the borrowed form *must* match the ordering on the key type.
2061    ///
2062    /// # Examples
2063    ///
2064    /// Basic usage:
2065    ///
2066    /// ```
2067    /// use indexset::BTreeMap;
2068    ///
2069    /// let mut map = BTreeMap::new();
2070    /// map.insert(1, "a");
2071    /// assert_eq!(map.contains_key(&1), true);
2072    /// assert_eq!(map.contains_key(&2), false);
2073    /// ```
2074    pub fn contains_key<Q>(&self, key: &Q) -> bool
2075    where
2076        K: Borrow<Q> + Ord,
2077        Q: Ord + ?Sized,
2078    {
2079        self.set.contains_cmp(
2080            |item: &Pair<K, V>| item.key.borrow() < key,
2081            |item| item.key.borrow() == key,
2082        )
2083    }
2084    /// Returns the first key-value pair in the map.
2085    /// The key in this pair is the minimum key in the map.
2086    ///
2087    /// # Examples
2088    ///
2089    /// Basic usage:
2090    ///
2091    /// ```
2092    /// use indexset::BTreeMap;
2093    ///
2094    /// let mut map = BTreeMap::new();
2095    /// assert_eq!(map.first_key_value(), None);
2096    /// map.insert(1, "b");
2097    /// map.insert(2, "a");
2098    /// assert_eq!(map.first_key_value(), Some((&1, &"b")));
2099    /// ```
2100    pub fn first_key_value(&self) -> Option<(&K, &V)> {
2101        let popping = self.set.first();
2102        if let Some(pop) = popping {
2103            return Some((&pop.key, &pop.value));
2104        }
2105
2106        None
2107    }
2108    /// Returns a reference to the value corresponding to the key.
2109    ///
2110    /// The key may be any borrowed form of the map's key type, but the ordering
2111    /// on the borrowed form *must* match the ordering on the key type.
2112    ///
2113    /// # Examples
2114    ///
2115    /// Basic usage:
2116    ///
2117    /// ```
2118    /// use indexset::BTreeMap;
2119    ///
2120    /// let mut map = BTreeMap::new();
2121    /// map.insert(1, "a");
2122    /// assert_eq!(map.get(&1), Some(&"a"));
2123    /// assert_eq!(map.get(&2), None);
2124    /// ```
2125    pub fn get<Q>(&self, key: &Q) -> Option<&V>
2126    where
2127        K: Borrow<Q> + Ord,
2128        Q: Ord + ?Sized,
2129    {
2130        if let Some(key_value) = self.get_key_value(key) {
2131            return Some(key_value.1);
2132        }
2133
2134        None
2135    }
2136    /// Returns the key-value pair currently residing at the given position.
2137    ///
2138    ///
2139    /// # Examples
2140    ///
2141    /// ```
2142    /// use indexset::BTreeMap;
2143    ///
2144    /// let mut map = BTreeMap::new();
2145    /// map.insert(1, "a");
2146    /// assert_eq!(map.get_index(0), Some((&1, &"a")));
2147    /// assert_eq!(map.get_index(1), None);
2148    /// ```
2149    pub fn get_index(&self, idx: usize) -> Option<(&K, &V)> {
2150        let ith = self.set.get_index(idx);
2151        if let Some(entry) = ith {
2152            return Some((&entry.key, &entry.value));
2153        }
2154
2155        None
2156    }
2157    /// Returns the key-value pair corresponding to the supplied key.
2158    ///
2159    /// The supplied key may be any borrowed form of the map's key type, but the ordering
2160    /// on the borrowed form *must* match the ordering on the key type.
2161    ///
2162    /// # Examples
2163    ///
2164    /// ```
2165    /// use indexset::BTreeMap;
2166    ///
2167    /// let mut map = BTreeMap::new();
2168    /// map.insert(1, "a");
2169    /// assert_eq!(map.get_key_value(&1), Some((&1, &"a")));
2170    /// assert_eq!(map.get_key_value(&2), None);
2171    /// ```
2172    pub fn get_key_value<Q>(&self, key: &Q) -> Option<(&K, &V)>
2173    where
2174        K: Borrow<Q> + Ord,
2175        Q: Ord + ?Sized,
2176    {
2177        let node_idx = self.set.locate_node_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2178        let candidate_node = self.set.inner.get(node_idx)?;
2179        let position = crate::core::node::search_by(candidate_node, |candidate| {
2180            <K as Borrow<Q>>::borrow(&candidate.key).cmp(key)
2181        })
2182        .ok()?;
2183        let candidate = &candidate_node[position];
2184        Some((&candidate.key, &candidate.value))
2185    }
2186    /// Returns a mutable reference to the value corresponding to the key.
2187    ///
2188    /// The key may be any borrowed form of the map's key type, but the ordering
2189    /// on the borrowed form *must* match the ordering on the key type.
2190    ///
2191    /// # Examples
2192    ///
2193    /// Basic usage:
2194    ///
2195    /// ```
2196    /// use indexset::BTreeMap;
2197    ///
2198    /// let mut map = BTreeMap::new();
2199    /// map.insert(1, "a");
2200    /// if let Some(x) = map.get_mut(&1) {
2201    ///     *x = "b";
2202    /// }
2203    /// assert_eq!(map[&1], "b");
2204    /// ```
2205    pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
2206    where
2207        K: Borrow<Q> + Ord,
2208        Q: Ord,
2209    {
2210        let (node_idx, position_within_node) = self.set.locate_value_cmp(|item: &Pair<K, V>| item.key.borrow() < key);
2211        if self.set.inner.get(node_idx).is_some() && self.set.inner[node_idx].get(position_within_node).is_some() {
2212            let entry = self.set.inner[node_idx].get_mut(position_within_node)?;
2213            if key == entry.key.borrow() {
2214                return Some(&mut entry.value);
2215            }
2216        }
2217
2218        None
2219    }
2220    /// Returns a mutable reference to the value at the designated index
2221    ///
2222    /// # Examples
2223    ///
2224    /// Basic usage:
2225    ///
2226    /// ```
2227    /// use indexset::BTreeMap;
2228    ///
2229    /// let mut map = BTreeMap::new();
2230    /// map.insert(1, "a");
2231    /// if let Some(x) = map.get_mut_index(0) {
2232    ///     *x = "b";
2233    /// }
2234    /// assert_eq!(map[&1], "b");
2235    /// ```
2236    pub fn get_mut_index(&mut self, index: usize) -> Option<&mut V> {
2237        if let Some(entry) = self.set.get_mut_index(index) {
2238            return Some(&mut entry.value);
2239        }
2240
2241        None
2242    }
2243    /// Inserts a key-value pair into the map.
2244    ///
2245    /// If the map did not have this key present, `None` is returned.
2246    ///
2247    /// If the map did have this key present, the value is updated, and the old
2248    /// value is returned. The key is not updated, though; this matters for
2249    /// types that can be `==` without being identical. See the [module-level
2250    /// documentation] for more.
2251    ///
2252    /// [module-level documentation]: index.html#insert-and-complex-keys
2253    ///
2254    /// # Examples
2255    ///
2256    /// Basic usage:
2257    ///
2258    /// ```
2259    /// use indexset::BTreeMap;
2260    ///
2261    /// let mut map = BTreeMap::new();
2262    /// assert_eq!(map.insert(37, "a"), None);
2263    /// assert_eq!(map.is_empty(), false);
2264    ///
2265    /// map.insert(37, "b");
2266    /// assert_eq!(map.insert(37, "c"), Some("b"));
2267    /// assert_eq!(map[&37], "c");
2268    /// ```
2269    pub fn insert(&mut self, key: K, mut value: V) -> Option<V> {
2270        let cmp = |item: &Pair<K, V>| item.key < key;
2271        let cmp2 = |item: &Pair<K, V>| item.key == key;
2272
2273        match self.set.find_cmp(cmp, cmp2) {
2274            NodeEntry::Exist {
2275                node_idx,
2276                position_within_node,
2277            } => {
2278                ::core::mem::swap(&mut self.set.inner[node_idx][position_within_node].value, &mut value);
2279                Some(value)
2280            }
2281            NodeEntry::Empty { node_idx } => {
2282                self.set.insert_at(node_idx, Pair { key, value });
2283                None
2284            }
2285        }
2286    }
2287    /// Creates a consuming iterator visiting all the keys, in sorted order.
2288    /// The map cannot be used after calling this.
2289    /// The iterator element type is `K`.
2290    ///
2291    /// # Examples
2292    ///
2293    /// ```
2294    /// use indexset::BTreeMap;
2295    ///
2296    /// let mut a = BTreeMap::new();
2297    /// a.insert(2, "b");
2298    /// a.insert(1, "a");
2299    ///
2300    /// let keys: Vec<i32> = a.into_keys().collect();
2301    /// assert_eq!(keys, [1, 2]);
2302    /// ```
2303    pub fn into_keys(self) -> IntoKeys<K, V> {
2304        IntoKeys {
2305            inner: self.into_iter(),
2306        }
2307    }
2308    /// Creates a consuming iterator visiting all the values, in order by key.
2309    /// The map cannot be used after calling this.
2310    /// The iterator element type is `V`.
2311    ///
2312    /// # Examples
2313    ///
2314    /// ```
2315    /// use indexset::BTreeMap;
2316    ///
2317    /// let mut a = BTreeMap::new();
2318    /// a.insert(1, "hello");
2319    /// a.insert(2, "goodbye");
2320    ///
2321    /// let values: Vec<&str> = a.into_values().collect();
2322    /// assert_eq!(values, ["hello", "goodbye"]);
2323    /// ```
2324    pub fn into_values(self) -> IntoValues<K, V> {
2325        IntoValues {
2326            inner: self.into_iter(),
2327        }
2328    }
2329    /// Returns `true` if the map contains no elements.
2330    ///
2331    /// # Examples
2332    ///
2333    /// Basic usage:
2334    ///
2335    /// ```
2336    /// use indexset::BTreeMap;
2337    ///
2338    /// let mut a = BTreeMap::new();
2339    /// assert!(a.is_empty());
2340    /// a.insert(1, "a");
2341    /// assert!(!a.is_empty());
2342    /// ```
2343    pub fn is_empty(&self) -> bool {
2344        self.set.is_empty()
2345    }
2346    /// Gets an iterator over the entries of the map, sorted by key.
2347    ///
2348    /// # Examples
2349    ///
2350    /// Basic usage:
2351    ///
2352    /// ```
2353    /// use indexset::BTreeMap;
2354    ///
2355    /// let mut map = BTreeMap::new();
2356    /// map.insert(3, "c");
2357    /// map.insert(2, "b");
2358    /// map.insert(1, "a");
2359    ///
2360    /// for (key, value) in map.iter() {
2361    ///     println!("{key}: {value}");
2362    /// }
2363    ///
2364    /// let (first_key, first_value) = map.iter().next().unwrap();
2365    /// assert_eq!((*first_key, *first_value), (1, "a"));
2366    /// ```
2367    pub fn iter(&self) -> IterMap<'_, K, V> {
2368        IterMap { inner: self.set.iter() }
2369    }
2370    /// Gets a mutable iterator over the entries of the map, sorted by key.
2371    ///
2372    /// # Examples
2373    ///
2374    /// Basic usage:
2375    ///
2376    /// ```
2377    /// use indexset::BTreeMap;
2378    ///
2379    /// let mut map = BTreeMap::from_iter([
2380    ///    ("a", 1),
2381    ///    ("b", 2),
2382    ///    ("c", 3),
2383    /// ]);
2384    ///
2385    /// // add 10 to the value if the key isn't "a"
2386    /// for (key, value) in map.iter_mut() {
2387    ///     if key != &"a" {
2388    ///         *value += 10;
2389    ///     }
2390    /// }
2391    /// ```
2392    pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
2393        let last_node_idx = self.set.inner.len() - 1;
2394        let len = self.set.len();
2395
2396        // Special handling for single node case
2397        if self.set.inner.len() == 1 {
2398            // Don't consume the node from inner iterator
2399            // Both front and back should start from the same node
2400            let mut inner = self.set.inner.iter_mut();
2401            let node = inner.next().unwrap();
2402            let front_iter = node.iter_mut();
2403            // For single node, back_iter should be empty initially
2404            // The iterator logic will handle switching to it when needed
2405            let back_iter = [].iter_mut();
2406
2407            return IterMut {
2408                inner,
2409                current_front_node_idx: 0,
2410                current_front_idx: 0,
2411                current_back_node_idx: 0, // Same as front for single node
2412                current_back_idx: len.wrapping_sub(1),
2413                current_front_iterator: front_iter,
2414                current_back_iterator: back_iter,
2415            };
2416        }
2417
2418        // For multiple nodes, handle normally
2419        let mut inner = self.set.inner.iter_mut();
2420        let front_iter = if let Some(node) = inner.next() {
2421            node.iter_mut()
2422        } else {
2423            [].iter_mut()
2424        };
2425        let back_iter = if let Some(node) = inner.next_back() {
2426            node.iter_mut()
2427        } else {
2428            [].iter_mut()
2429        };
2430
2431        IterMut {
2432            inner,
2433            current_front_node_idx: 0,
2434            current_front_idx: 0,
2435            current_back_node_idx: last_node_idx,
2436            current_back_idx: len.wrapping_sub(1),
2437            current_front_iterator: front_iter,
2438            current_back_iterator: back_iter,
2439        }
2440    }
2441    /// Gets an iterator over the keys of the map, in sorted order.
2442    ///
2443    /// # Examples
2444    ///
2445    /// Basic usage:
2446    ///
2447    /// ```
2448    /// use indexset::BTreeMap;
2449    ///
2450    /// let mut a = BTreeMap::new();
2451    /// a.insert(2, "b");
2452    /// a.insert(1, "a");
2453    ///
2454    /// let keys: Vec<_> = a.keys().cloned().collect();
2455    /// assert_eq!(keys, [1, 2]);
2456    /// ```
2457    pub fn keys(&self) -> Keys<'_, K, V> {
2458        Keys { inner: self.set.iter() }
2459    }
2460    /// Returns the last key-value pair in the map.
2461    /// The key in this pair is the maximum key in the map.
2462    ///
2463    /// # Examples
2464    ///
2465    /// Basic usage:
2466    ///
2467    /// ```
2468    /// use indexset::BTreeMap;
2469    ///
2470    /// let mut map = BTreeMap::new();
2471    /// map.insert(1, "b");
2472    /// map.insert(2, "a");
2473    /// assert_eq!(map.last_key_value(), Some((&2, &"a")));
2474    /// ```
2475    pub fn last_key_value(&self) -> Option<(&K, &V)> {
2476        let popping = self.set.last();
2477        if let Some(pop) = popping {
2478            return Some((&pop.key, &pop.value));
2479        }
2480
2481        None
2482    }
2483    /// Returns the number of elements in the map.
2484    ///
2485    /// # Examples
2486    ///
2487    /// Basic usage:
2488    ///
2489    /// ```
2490    /// use indexset::BTreeMap;
2491    ///
2492    /// let mut a = BTreeMap::new();
2493    /// assert_eq!(a.len(), 0);
2494    /// a.insert(1, "a");
2495    /// assert_eq!(a.len(), 1);
2496    /// ```
2497    pub fn len(&self) -> usize {
2498        self.set.len()
2499    }
2500    /// Makes a new, empty `BTreeMap`.
2501    ///
2502    /// Allocates a vec of capacity 1024.
2503    ///
2504    /// # Examples
2505    ///
2506    /// Basic usage:
2507    ///
2508    /// ```
2509    /// use indexset::BTreeMap;
2510    ///
2511    /// let mut map = BTreeMap::new();
2512    ///
2513    /// // entries can now be inserted into the empty map
2514    /// map.insert(1, "a");
2515    /// ```
2516    pub fn new() -> Self {
2517        Self { ..Default::default() }
2518    }
2519    /// Makes a new, empty `BTreeSet` with the given maximum node size. Allocates one vec with
2520    /// the capacity set to be the specified node size.
2521    ///
2522    /// # Examples
2523    ///
2524    /// ```
2525    /// # #![allow(unused_mut)]
2526    /// use indexset::BTreeMap;
2527    ///
2528    /// let mut set: BTreeMap<usize, usize> = BTreeMap::with_maximum_node_size(128);
2529    pub fn with_maximum_node_size(maximum_node_size: usize) -> Self {
2530        Self {
2531            set: BTreeSet::with_maximum_node_size(maximum_node_size),
2532        }
2533    }
2534    /// Removes and returns the first element in the map.
2535    /// The key of this element is the minimum key that was in the map.
2536    ///
2537    /// # Examples
2538    ///
2539    /// Draining elements in ascending order, while keeping a usable map each iteration.
2540    ///
2541    /// ```
2542    /// use indexset::BTreeMap;
2543    ///
2544    /// let mut map = BTreeMap::new();
2545    /// map.insert(1, "a");
2546    /// map.insert(2, "b");
2547    /// while let Some((key, _val)) = map.pop_first() {
2548    ///     assert!(map.iter().all(|(k, _v)| *k > key));
2549    /// }
2550    /// assert!(map.is_empty());
2551    /// ```
2552    pub fn pop_first(&mut self) -> Option<(K, V)> {
2553        let popping = self.set.pop_first();
2554        if let Some(pop) = popping {
2555            return Some((pop.key, pop.value));
2556        }
2557
2558        None
2559    }
2560    /// Removes the i-th element from the map and returns it, if any.
2561    ///
2562    /// # Examples
2563    ///
2564    /// ```
2565    /// use indexset::{BTreeMap};
2566    ///
2567    /// let mut map = BTreeMap::new();
2568    ///
2569    /// map.insert(1,"a");
2570    /// map.insert(2, "b");
2571    /// assert_eq!(map.pop_index(0), (1, "a"));
2572    /// assert_eq!(map.pop_index(0), (2, "b"));
2573    /// assert!(map.is_empty());
2574    /// ```
2575    pub fn pop_index(&mut self, index: usize) -> (K, V) {
2576        let popping = self.set.pop_index(index);
2577
2578        (popping.key, popping.value)
2579    }
2580    /// Removes and returns the last element in the map.
2581    /// The key of this element is the maximum key that was in the map.
2582    ///
2583    /// # Examples
2584    ///
2585    /// Draining elements in descending order, while keeping a usable map each iteration.
2586    ///
2587    /// ```
2588    /// use indexset::BTreeMap;
2589    ///
2590    /// let mut map = BTreeMap::new();
2591    /// map.insert(1, "a");
2592    /// map.insert(2, "b");
2593    /// while let Some((key, _val)) = map.pop_last() {
2594    ///     assert!(map.iter().all(|(k, _v)| *k < key));
2595    /// }
2596    /// assert!(map.is_empty());
2597    /// ```
2598    pub fn pop_last(&mut self) -> Option<(K, V)> {
2599        let popping = self.set.pop_last();
2600        if let Some(pop) = popping {
2601            return Some((pop.key, pop.value));
2602        }
2603
2604        None
2605    }
2606    /// Constructs a double-ended iterator over a sub-range of elements in the map.
2607    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
2608    /// yield elements from min (inclusive) to max (exclusive).
2609    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
2610    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
2611    /// range from 4 to 10.
2612    ///
2613    /// # Panics
2614    ///
2615    /// Panics if range `start > end`.
2616    /// Panics if range `start == end` and both bounds are `Excluded`.
2617    ///
2618    /// # Examples
2619    ///
2620    /// Basic usage:
2621    ///
2622    /// ```
2623    /// use indexset::BTreeMap;
2624    /// use std::ops::Bound::Included;
2625    ///
2626    /// let mut map = BTreeMap::new();
2627    /// map.insert(3, "a");
2628    /// map.insert(5, "b");
2629    /// map.insert(8, "c");
2630    /// for (&key, &value) in map.range((Included(&4), Included(&8))) {
2631    ///     println!("{key}: {value}");
2632    /// }
2633    /// assert_eq!(Some((&5, &"b")), map.range(4..).next());
2634    /// ```
2635    pub fn range<Q, R>(&self, range: R) -> RangeMap<'_, K, V>
2636    where
2637        Q: Ord + ?Sized,
2638        K: Borrow<Q>,
2639        R: RangeBounds<Q>,
2640    {
2641        let (start_idx, end_idx) = self.range_to_idx(range);
2642
2643        RangeMap {
2644            inner: self.set.range_idx(start_idx..=end_idx),
2645        }
2646    }
2647    pub fn range_idx<R>(&self, range: R) -> RangeMap<'_, K, V>
2648    where
2649        R: RangeBounds<usize>,
2650    {
2651        RangeMap {
2652            inner: self.set.range_idx(range),
2653        }
2654    }
2655    fn range_to_idx<Q, R>(&self, range: R) -> (usize, usize)
2656    where
2657        Q: Ord + ?Sized,
2658        K: Borrow<Q>,
2659        R: RangeBounds<Q>,
2660    {
2661        let start_idx = match range.start_bound() {
2662            Bound::Included(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2663            Bound::Excluded(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() <= bound),
2664            Bound::Unbounded => 0,
2665        };
2666        let end_idx = match range.end_bound() {
2667            Bound::Included(bound) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound),
2668            Bound::Excluded(bound) => {
2669                let rank = self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < bound);
2670                if rank == 0 {
2671                    // No elements before this bound, return empty range
2672                    return (1, 0);
2673                }
2674                rank - 1
2675            }
2676            Bound::Unbounded => {
2677                if self.is_empty() {
2678                    // Empty map, return empty range
2679                    return (1, 0);
2680                }
2681                self.len() - 1
2682            }
2683        };
2684
2685        (start_idx, end_idx)
2686    }
2687    /// Constructs a mutable double-ended iterator over a sub-range of elements in the map.
2688    /// The simplest way is to use the range syntax `min..max`, thus `range(min..max)` will
2689    /// yield elements from min (inclusive) to max (exclusive).
2690    /// The range may also be entered as `(Bound<T>, Bound<T>)`, so for example
2691    /// `range((Excluded(4), Included(10)))` will yield a left-exclusive, right-inclusive
2692    /// range from 4 to 10.
2693    ///
2694    /// # Panics
2695    ///
2696    /// Panics if range `start > end`.
2697    /// Panics if range `start == end` and both bounds are `Excluded`.
2698    ///
2699    /// # Examples
2700    ///
2701    /// Basic usage:
2702    ///
2703    /// ```
2704    /// use indexset::BTreeMap;
2705    ///
2706    /// let mut map: BTreeMap<&str, i32> =
2707    ///     [("Alice", 0), ("Bob", 0), ("Carol", 0), ("Cheryl", 0)].into();
2708    /// for (_, balance) in map.range_mut("B".."Cheryl") {
2709    ///     *balance += 100;
2710    /// }
2711    /// for (name, balance) in &map {
2712    ///     println!("{name} => {balance}");
2713    /// }
2714    /// ```
2715    pub fn range_mut<Q, R>(&mut self, range: R) -> RangeMut<'_, K, V>
2716    where
2717        Q: Ord + ?Sized,
2718        K: Borrow<Q>,
2719        R: RangeBounds<Q>,
2720    {
2721        let (start_idx, end_idx) = self.range_to_idx(range);
2722
2723        self.range_mut_idx(start_idx..=end_idx)
2724    }
2725    pub fn range_mut_idx<R>(&mut self, range: R) -> RangeMut<'_, K, V>
2726    where
2727        R: RangeBounds<usize>,
2728    {
2729        let ((global_front_idx, front_node_idx, front_start_idx), (global_back_idx, back_node_idx, back_start_idx)) =
2730            self.set.resolve_range(range);
2731        let end = self.set.inner[back_node_idx].len();
2732
2733        let mut inner = self.set.inner.iter_mut();
2734
2735        let mut front_iter = {
2736            if let Some(node) = inner.nth(front_node_idx) {
2737                node.iter_mut()
2738            } else {
2739                [].iter_mut()
2740            }
2741        };
2742
2743        let mut back_iter = {
2744            if let Some(node) = inner.nth(back_node_idx - front_node_idx) {
2745                node.iter_mut()
2746            } else {
2747                [].iter_mut()
2748            }
2749        };
2750
2751        for _ in 0..front_start_idx {
2752            front_iter.next();
2753        }
2754        let offset = back_node_idx - front_node_idx;
2755        if offset > 0 {
2756            for _ in back_start_idx..end {
2757                back_iter.next_back();
2758            }
2759        } else {
2760            for _ in back_start_idx..end {
2761                front_iter.next_back();
2762            }
2763        }
2764
2765        RangeMut {
2766            inner: IterMut {
2767                inner,
2768                current_front_node_idx: front_node_idx,
2769                current_front_idx: global_front_idx,
2770                current_back_node_idx: back_node_idx,
2771                current_back_idx: global_back_idx,
2772                current_front_iterator: front_iter,
2773                current_back_iterator: back_iter,
2774            },
2775        }
2776    }
2777    /// Removes a key from the map, returning the value at the key if the key
2778    /// was previously in the map.
2779    ///
2780    /// The key may be any borrowed form of the map's key type, but the ordering
2781    /// on the borrowed form *must* match the ordering on the key type.
2782    ///
2783    /// # Examples
2784    ///
2785    /// Basic usage:
2786    ///
2787    /// ```
2788    /// use indexset::BTreeMap;
2789    ///
2790    /// let mut map = BTreeMap::new();
2791    /// map.insert(1, "a");
2792    /// assert_eq!(map.remove(&1), Some("a"));
2793    /// assert_eq!(map.remove(&1), None);
2794    /// ```
2795    pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
2796    where
2797        K: Borrow<Q> + Ord,
2798        Q: Ord + ?Sized,
2799    {
2800        let old_entry = self.set.delete_cmp(
2801            |item: &Pair<K, V>| item.key.borrow() < key,
2802            |item: &Pair<K, V>| item.key.borrow() == key,
2803        );
2804
2805        if old_entry.1 {
2806            return Some(old_entry.0?.value);
2807        }
2808
2809        None
2810    }
2811    /// Removes a key from the map, returning the stored key and value if the key
2812    /// was previously in the map.
2813    ///
2814    /// The key may be any borrowed form of the map's key type, but the ordering
2815    /// on the borrowed form *must* match the ordering on the key type.
2816    ///
2817    /// # Examples
2818    ///
2819    /// Basic usage:
2820    ///
2821    /// ```
2822    /// use indexset::BTreeMap;
2823    ///
2824    /// let mut map = BTreeMap::new();
2825    /// map.insert(1, "a");
2826    /// assert_eq!(map.remove_entry(&1), Some((1, "a")));
2827    /// assert_eq!(map.remove_entry(&1), None);
2828    /// ```
2829    pub fn remove_entry<Q>(&mut self, key: &Q) -> Option<(K, V)>
2830    where
2831        K: Borrow<Q> + Ord,
2832        Q: Ord,
2833    {
2834        let old_entry = self.set.delete_cmp(
2835            |item: &Pair<K, V>| item.key.borrow() < key,
2836            |item| item.key.borrow() == key,
2837        );
2838
2839        if old_entry.1 {
2840            let key_value = old_entry.0?;
2841            return Some((key_value.key, key_value.value));
2842        }
2843
2844        None
2845    }
2846    /// Retains only the elements specified by the predicate.
2847    ///
2848    /// In other words, remove all pairs `(k, v)` for which `f(&k, &mut v)` returns `false`.
2849    /// The elements are visited in ascending key order.
2850    ///
2851    /// # Examples
2852    ///
2853    /// ```
2854    /// use indexset::BTreeMap;
2855    ///
2856    /// let mut map: BTreeMap<i32, i32> = (0..8).map(|x| (x, x*10)).collect();
2857    /// // Keep only the elements with even-numbered keys.
2858    /// map.retain(|&k, _| k % 2 == 0);
2859    /// assert!(map.into_iter().eq(vec![(0, 0), (2, 20), (4, 40), (6, 60)]));
2860    /// ```
2861    pub fn retain<F, Q>(&mut self, mut f: F)
2862    where
2863        K: Borrow<Q> + Ord,
2864        Q: Ord,
2865        F: FnMut(&Q, &mut V) -> bool,
2866    {
2867        let mut positions_to_delete = vec![];
2868        for (node_idx, node) in self.set.inner.iter_mut().enumerate() {
2869            for (position_within_node, item) in node.iter_mut().enumerate() {
2870                if !f(item.key.borrow(), &mut item.value) {
2871                    positions_to_delete.push((node_idx, position_within_node));
2872                }
2873            }
2874        }
2875
2876        positions_to_delete.reverse();
2877
2878        positions_to_delete
2879            .into_iter()
2880            .for_each(|(node_idx, position_within_node)| {
2881                self.set.delete_at(node_idx, position_within_node);
2882            })
2883    }
2884    /// Splits the collection into two at the given key. Returns everything after the given key,
2885    /// including the key.
2886    ///
2887    /// # Examples
2888    ///
2889    /// Basic usage:
2890    ///
2891    /// ```
2892    /// use indexset::BTreeMap;
2893    ///
2894    /// let mut a = BTreeMap::new();
2895    /// a.insert(1, "a");
2896    /// a.insert(2, "b");
2897    /// a.insert(3, "c");
2898    /// a.insert(17, "d");
2899    /// a.insert(41, "e");
2900    ///
2901    /// let b = a.split_off(&3);
2902    ///
2903    /// assert_eq!(a.len(), 2);
2904    /// assert_eq!(b.len(), 3);
2905    ///
2906    /// assert_eq!(a[&1], "a");
2907    /// assert_eq!(a[&2], "b");
2908    ///
2909    /// assert_eq!(b[&3], "c");
2910    /// assert_eq!(b[&17], "d");
2911    /// assert_eq!(b[&41], "e");
2912    /// ```
2913    pub fn split_off<Q>(&mut self, key: &Q) -> Self
2914    where
2915        K: Borrow<Q> + Ord,
2916        Q: Ord,
2917    {
2918        BTreeMap {
2919            set: self.set.split_off_cmp(|item: &Pair<K, V>| item.key.borrow() < key),
2920        }
2921    }
2922    /// Gets an iterator over the values of the map, in order by key.
2923    ///
2924    /// # Examples
2925    ///
2926    /// Basic usage:
2927    ///
2928    /// ```
2929    /// use indexset::BTreeMap;
2930    ///
2931    /// let mut a = BTreeMap::new();
2932    /// a.insert(1, "hello");
2933    /// a.insert(2, "goodbye");
2934    ///
2935    /// let values: Vec<&str> = a.values().cloned().collect();
2936    /// assert_eq!(values, ["hello", "goodbye"]);
2937    /// ```
2938    pub fn values(&self) -> Values<'_, K, V> {
2939        Values { inner: self.set.iter() }
2940    }
2941    /// Gets a mutable iterator over the values of the map, in order by key.
2942    ///
2943    /// # Examples
2944    ///
2945    /// Basic usage:
2946    ///
2947    /// ```
2948    /// use indexset::BTreeMap;
2949    ///
2950    /// let mut a = BTreeMap::new();
2951    /// a.insert(1, String::from("hello"));
2952    /// a.insert(2, String::from("goodbye"));
2953    ///
2954    /// for value in a.values_mut() {
2955    ///     value.push_str("!");
2956    /// }
2957    ///
2958    /// let values: Vec<String> = a.values().cloned().collect();
2959    /// assert_eq!(values, [String::from("hello!"),
2960    ///                     String::from("goodbye!")]);
2961    /// ```
2962    pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
2963        ValuesMut { inner: self.iter_mut() }
2964    }
2965    /// Gets the given key's corresponding entry in the map for in-place manipulation.
2966    ///
2967    /// # Examples
2968    ///
2969    /// Basic usage:
2970    ///
2971    /// ```
2972    /// use std::collections::BTreeMap;
2973    ///
2974    /// let mut count: BTreeMap<&str, usize> = BTreeMap::new();
2975    ///
2976    /// // count the number of occurrences of letters in the vec
2977    /// for x in ["a", "b", "a", "c", "a", "b"] {
2978    ///     count.entry(x).and_modify(|curr| *curr += 1).or_insert(1);
2979    /// }
2980    ///
2981    /// assert_eq!(count["a"], 3);
2982    /// assert_eq!(count["b"], 2);
2983    /// assert_eq!(count["c"], 1);
2984    /// ```
2985    pub fn entry(&mut self, key: K) -> Entry<'_, K, V>
2986    where
2987        K: Ord,
2988    {
2989        if self.contains_key(&key) {
2990            let idx = self.set.rank_cmp(|item: &Pair<K, V>| item.key < key);
2991            return Occupied(OccupiedEntry { map: self, idx });
2992        }
2993
2994        Vacant(VacantEntry { map: self, key })
2995    }
2996    /// Returns the first entry in the map for in-place manipulation.
2997    /// The key of this entry is the minimum key in the map.
2998    ///
2999    /// # Examples
3000    ///
3001    /// ```
3002    /// use std::collections::BTreeMap;
3003    ///
3004    /// let mut map = BTreeMap::new();
3005    /// map.insert(1, "a");
3006    /// map.insert(2, "b");
3007    /// if let Some(mut entry) = map.first_entry() {
3008    ///     if *entry.key() > 0 {
3009    ///         entry.insert("first");
3010    ///     }
3011    /// }
3012    /// assert_eq!(*map.get(&1).unwrap(), "first");
3013    /// assert_eq!(*map.get(&2).unwrap(), "b");
3014    /// ```
3015    pub fn first_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
3016    where
3017        K: Ord,
3018    {
3019        if !self.is_empty() {
3020            return Some(OccupiedEntry { map: self, idx: 0 });
3021        }
3022
3023        None
3024    }
3025    /// Returns the last entry in the map for in-place manipulation.
3026    /// The key of this entry is the maximum key in the map.
3027    ///
3028    /// # Examples
3029    ///
3030    /// ```
3031    /// use std::collections::BTreeMap;
3032    ///
3033    /// let mut map = BTreeMap::new();
3034    /// map.insert(1, "a");
3035    /// map.insert(2, "b");
3036    /// if let Some(mut entry) = map.last_entry() {
3037    ///     if *entry.key() > 0 {
3038    ///         entry.insert("last");
3039    ///     }
3040    /// }
3041    /// assert_eq!(*map.get(&1).unwrap(), "a");
3042    /// assert_eq!(*map.get(&2).unwrap(), "last");
3043    /// ```
3044    pub fn last_entry(&mut self) -> Option<OccupiedEntry<'_, K, V>>
3045    where
3046        K: Ord,
3047    {
3048        let len = self.len();
3049        if len > 0 {
3050            return Some(OccupiedEntry {
3051                map: self,
3052                idx: len - 1,
3053            });
3054        }
3055
3056        None
3057    }
3058    /// Returns a [`Cursor`] pointing at the first element that is above the
3059    /// given bound.
3060    ///
3061    /// If no such element exists then a cursor pointing at the "ghost"
3062    /// non-element is returned.
3063    ///
3064    /// Passing [`Bound::Unbounded`] will return a cursor pointing at the first
3065    /// element of the map.
3066    ///
3067    /// # Examples
3068    ///
3069    /// Basic usage:
3070    ///
3071    /// ```
3072    /// use indexset::BTreeMap;
3073    /// use std::ops::Bound;
3074    ///
3075    /// let mut a = BTreeMap::new();
3076    /// a.insert(1, "a");
3077    /// a.insert(2, "b");
3078    /// a.insert(3, "c");
3079    /// a.insert(4, "c");
3080    /// let cursor = a.lower_bound(Bound::Excluded(&2));
3081    /// assert_eq!(cursor.key(), Some(&3));
3082    /// ```
3083    pub fn lower_bound<Q>(&self, bound: Bound<&Q>) -> CursorMap<'_, K, V>
3084    where
3085        K: Borrow<Q> + Ord,
3086        Q: Ord,
3087    {
3088        let start_idx = match bound {
3089            Bound::Included(start) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start),
3090            Bound::Excluded(start) => self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < start) + 1,
3091            Bound::Unbounded => 0,
3092        };
3093
3094        CursorMap {
3095            cursor: Cursor {
3096                set: &self.set,
3097                idx: start_idx,
3098            },
3099        }
3100    }
3101    /// Returns the position in which the given element would fall in the already-existing sorted
3102    /// order.
3103    ///
3104    /// The value may be any borrowed form of the set's element type,
3105    /// but the ordering on the borrowed form *must* match the
3106    /// ordering on the element type.
3107    ///
3108    /// # Examples
3109    ///
3110    /// ```
3111    /// use indexset::BTreeMap;
3112    ///
3113    /// let set = BTreeMap::from_iter([(1, "a"), (2, "b"), (3, "c")]);
3114    /// assert_eq!(set.rank(&1), 0);
3115    /// assert_eq!(set.rank(&3), 2);
3116    /// assert_eq!(set.rank(&4), 3);
3117    /// assert_eq!(set.rank(&100), 3);
3118    /// ```
3119    pub fn rank<Q>(&self, value: &Q) -> usize
3120    where
3121        Q: Ord + ?Sized,
3122        K: Borrow<Q>,
3123    {
3124        self.set.rank_cmp(|item: &Pair<K, V>| item.key.borrow() < value)
3125    }
3126}
3127
3128impl<K, V, const N: usize> From<[(K, V); N]> for BTreeMap<K, V>
3129where
3130    K: Ord,
3131{
3132    fn from(value: [(K, V); N]) -> Self {
3133        let mut btree: BTreeMap<K, V> = Default::default();
3134
3135        value.into_iter().for_each(|(key, value)| {
3136            btree.insert(key, value);
3137        });
3138
3139        btree
3140    }
3141}
3142
3143impl<K, V> IntoIterator for BTreeMap<K, V>
3144where
3145    K: Ord,
3146{
3147    type Item = (K, V);
3148    type IntoIter = IntoIterMap<K, V>;
3149
3150    fn into_iter(self) -> Self::IntoIter {
3151        IntoIterMap {
3152            inner: self.set.into_iter(),
3153        }
3154    }
3155}
3156
3157impl<'a, K, V> IntoIterator for &'a BTreeMap<K, V>
3158where
3159    K: Ord,
3160{
3161    type Item = (&'a K, &'a V);
3162
3163    type IntoIter = IterMap<'a, K, V>;
3164
3165    fn into_iter(self) -> Self::IntoIter {
3166        IterMap { inner: self.set.iter() }
3167    }
3168}
3169
3170/// An iterator over the entries of a `BTreeMap`.
3171///
3172/// This `struct` is created by the [`iter`] method on [`BTreeMap`]. See its
3173/// documentation for more.
3174///
3175/// [`iter`]: BTreeMap::iter
3176pub struct IterMap<'a, K, V>
3177where
3178    K: Ord,
3179{
3180    inner: Iter<'a, Pair<K, V>>,
3181}
3182
3183impl<'a, K, V> Iterator for IterMap<'a, K, V>
3184where
3185    K: Ord,
3186{
3187    type Item = (&'a K, &'a V);
3188
3189    fn next(&mut self) -> Option<Self::Item> {
3190        if let Some(entry) = self.inner.next() {
3191            return Some((&entry.key, &entry.value));
3192        }
3193
3194        None
3195    }
3196}
3197
3198impl<'a, K, V> DoubleEndedIterator for IterMap<'a, K, V>
3199where
3200    K: Ord,
3201{
3202    fn next_back(&mut self) -> Option<Self::Item> {
3203        if let Some(entry) = self.inner.next_back() {
3204            return Some((&entry.key, &entry.value));
3205        }
3206
3207        None
3208    }
3209}
3210
3211impl<'a, K, V> FusedIterator for IterMap<'a, K, V> where K: Ord {}
3212
3213/// An owning iterator over the entries of a `BTreeMap`.
3214///
3215/// This `struct` is created by the [`into_iter`] method on [`BTreeMap`]
3216/// (provided by the [`IntoIterator`] trait). See its documentation for more.
3217///
3218/// [`into_iter`]: IntoIterator::into_iter
3219pub struct IntoIterMap<K, V>
3220where
3221    K: Ord,
3222{
3223    inner: IntoIter<Pair<K, V>>,
3224}
3225
3226impl<K, V> Iterator for IntoIterMap<K, V>
3227where
3228    K: Ord,
3229{
3230    type Item = (K, V);
3231
3232    fn next(&mut self) -> Option<Self::Item> {
3233        if let Some(entry) = self.inner.next() {
3234            return Some((entry.key, entry.value));
3235        }
3236
3237        None
3238    }
3239}
3240
3241impl<K, V> DoubleEndedIterator for IntoIterMap<K, V>
3242where
3243    K: Ord,
3244{
3245    fn next_back(&mut self) -> Option<Self::Item> {
3246        if let Some(entry) = self.inner.next_back() {
3247            return Some((entry.key, entry.value));
3248        }
3249
3250        None
3251    }
3252}
3253
3254impl<K, V> FusedIterator for IntoIterMap<K, V> where K: Ord {}
3255
3256/// An owning iterator over the keys of a `BTreeMap`.
3257///
3258/// This `struct` is created by the [`into_keys`] method on [`BTreeMap`].
3259/// See its documentation for more.
3260///
3261/// [`into_keys`]: BTreeMap::into_keys
3262pub struct IntoKeys<K, V>
3263where
3264    K: Ord,
3265{
3266    inner: IntoIterMap<K, V>,
3267}
3268
3269impl<K, V> Iterator for IntoKeys<K, V>
3270where
3271    K: Ord,
3272{
3273    type Item = K;
3274
3275    fn next(&mut self) -> Option<Self::Item> {
3276        if let Some(entry) = self.inner.next() {
3277            return Some(entry.0);
3278        }
3279
3280        None
3281    }
3282}
3283
3284impl<K, V> DoubleEndedIterator for IntoKeys<K, V>
3285where
3286    K: Ord,
3287{
3288    fn next_back(&mut self) -> Option<Self::Item> {
3289        if let Some(entry) = self.inner.next_back() {
3290            return Some(entry.0);
3291        }
3292
3293        None
3294    }
3295}
3296
3297impl<K, V> FusedIterator for IntoKeys<K, V> where K: Ord {}
3298
3299/// An owning iterator over the values of a `BTreeMap`.
3300///
3301/// This `struct` is created by the [`into_values`] method on [`BTreeMap`].
3302/// See its documentation for more.
3303///
3304/// [`into_values`]: BTreeMap::into_values
3305pub struct IntoValues<K, V>
3306where
3307    K: Ord,
3308{
3309    inner: IntoIterMap<K, V>,
3310}
3311
3312impl<K, V> Iterator for IntoValues<K, V>
3313where
3314    K: Ord,
3315{
3316    type Item = V;
3317
3318    fn next(&mut self) -> Option<Self::Item> {
3319        if let Some(entry) = self.inner.next() {
3320            return Some(entry.1);
3321        }
3322
3323        None
3324    }
3325}
3326
3327impl<K, V> DoubleEndedIterator for IntoValues<K, V>
3328where
3329    K: Ord,
3330{
3331    fn next_back(&mut self) -> Option<Self::Item> {
3332        if let Some(entry) = self.inner.next_back() {
3333            return Some(entry.1);
3334        }
3335
3336        None
3337    }
3338}
3339
3340impl<K, V> FusedIterator for IntoValues<K, V> where K: Ord {}
3341
3342/// An iterator over a sub-range of entries in a `BTreeMap`.
3343///
3344/// This `struct` is created by the [`range`] method on [`BTreeMap`]. See its
3345/// documentation for more.
3346///
3347/// [`range`]: BTreeMap::range
3348pub struct RangeMap<'a, K, V>
3349where
3350    K: Ord,
3351{
3352    inner: Range<'a, Pair<K, V>>,
3353}
3354
3355impl<'a, K, V> Iterator for RangeMap<'a, K, V>
3356where
3357    K: Ord,
3358{
3359    type Item = (&'a K, &'a V);
3360
3361    fn next(&mut self) -> Option<Self::Item> {
3362        if let Some(entry) = self.inner.next() {
3363            return Some((&entry.key, &entry.value));
3364        }
3365
3366        None
3367    }
3368}
3369
3370impl<'a, K, V> DoubleEndedIterator for RangeMap<'a, K, V>
3371where
3372    K: Ord,
3373{
3374    fn next_back(&mut self) -> Option<Self::Item> {
3375        if let Some(entry) = self.inner.next_back() {
3376            return Some((&entry.key, &entry.value));
3377        }
3378
3379        None
3380    }
3381}
3382
3383impl<'a, K, V> FusedIterator for RangeMap<'a, K, V> where K: Ord {}
3384
3385/// An iterator over the values of a `BTreeMap`.
3386///
3387/// This `struct` is created by the [`values`] method on [`BTreeMap`]. See its
3388/// documentation for more.
3389///
3390/// [`values`]: BTreeMap::values
3391pub struct Values<'a, K, V>
3392where
3393    K: Ord,
3394{
3395    inner: Iter<'a, Pair<K, V>>,
3396}
3397
3398impl<'a, K, V> Iterator for Values<'a, K, V>
3399where
3400    K: Ord,
3401{
3402    type Item = &'a V;
3403
3404    fn next(&mut self) -> Option<Self::Item> {
3405        if let Some(entry) = self.inner.next() {
3406            return Some(&entry.value);
3407        }
3408
3409        None
3410    }
3411}
3412
3413impl<'a, K, V> DoubleEndedIterator for Values<'a, K, V>
3414where
3415    K: Ord,
3416{
3417    fn next_back(&mut self) -> Option<Self::Item> {
3418        if let Some(entry) = self.inner.next_back() {
3419            return Some(&entry.value);
3420        }
3421
3422        None
3423    }
3424}
3425
3426impl<'a, K, V> FusedIterator for Values<'a, K, V> where K: Ord {}
3427
3428/// An iterator over the keys of a `BTreeMap`.
3429///
3430/// This `struct` is created by the [`keys`] method on [`BTreeMap`]. See its
3431/// documentation for more.
3432///
3433/// [`keys`]: BTreeMap::keys
3434pub struct Keys<'a, K, V>
3435where
3436    K: Ord,
3437{
3438    inner: Iter<'a, Pair<K, V>>,
3439}
3440
3441impl<'a, K, V> Iterator for Keys<'a, K, V>
3442where
3443    K: Ord,
3444{
3445    type Item = &'a K;
3446
3447    fn next(&mut self) -> Option<Self::Item> {
3448        if let Some(entry) = self.inner.next() {
3449            return Some(&entry.key);
3450        }
3451
3452        None
3453    }
3454}
3455
3456impl<'a, K, V> DoubleEndedIterator for Keys<'a, K, V>
3457where
3458    K: Ord,
3459{
3460    fn next_back(&mut self) -> Option<Self::Item> {
3461        if let Some(entry) = self.inner.next_back() {
3462            return Some(&entry.key);
3463        }
3464
3465        None
3466    }
3467}
3468
3469impl<'a, K, V> FusedIterator for Keys<'a, K, V> where K: Ord {}
3470
3471/// A mutable iterator over the entries of a `BTreeMap`.
3472///
3473/// This `struct` is created by the [`iter_mut`] method on [`BTreeMap`]. See its
3474/// documentation for more.
3475///
3476/// [`iter_mut`]: BTreeMap::iter_mut
3477pub struct IterMut<'a, K: 'a, V: 'a>
3478where
3479    K: Ord,
3480{
3481    inner: ::core::slice::IterMut<'a, Node<Pair<K, V>>>,
3482    current_front_node_idx: usize,
3483    current_front_idx: usize,
3484    current_back_node_idx: usize,
3485    current_back_idx: usize,
3486    current_front_iterator: ::core::slice::IterMut<'a, Pair<K, V>>,
3487    current_back_iterator: ::core::slice::IterMut<'a, Pair<K, V>>,
3488}
3489
3490impl<'a, K, V> Iterator for IterMut<'a, K, V>
3491where
3492    K: Ord,
3493{
3494    type Item = (&'a K, &'a mut V);
3495
3496    fn next(&mut self) -> Option<Self::Item> {
3497        if self.current_front_idx == self.current_back_idx.wrapping_add(1) {
3498            return None;
3499        }
3500        if let Some(entry) = self.current_front_iterator.next() {
3501            self.current_front_idx += 1;
3502            return Some((&entry.key, &mut entry.value));
3503        } else {
3504            // If the current iterator has been exhausted, we have to check whether there are any
3505            // iterators left
3506            if self.current_front_node_idx == self.inner.size_hint().0 {
3507                return None;
3508            }
3509            if self.current_front_node_idx == self.current_back_node_idx - 1 {
3510                // take from the current back iter
3511                if let Some(entry) = self.current_back_iterator.next() {
3512                    self.current_front_idx += 1;
3513                    return Some((&entry.key, &mut entry.value));
3514                }
3515            } else {
3516                // advance front
3517                self.current_front_node_idx += 1;
3518                if let Some(node) = self.inner.next() {
3519                    self.current_front_iterator = node.iter_mut();
3520                }
3521
3522                return self.next();
3523            }
3524        };
3525
3526        None
3527    }
3528}
3529
3530impl<'a, K, V> DoubleEndedIterator for IterMut<'a, K, V>
3531where
3532    K: Ord,
3533{
3534    fn next_back(&mut self) -> Option<Self::Item> {
3535        if self.current_front_idx == self.current_back_idx.wrapping_add(1) {
3536            return None;
3537        }
3538        if let Some(entry) = self.current_back_iterator.next_back() {
3539            self.current_back_idx -= 1;
3540            return Some((&entry.key, &mut entry.value));
3541        } else {
3542            // If the current iterator has been exhausted, we have to check whether there are any
3543            // iterators left
3544            if self.current_back_node_idx == 0 && self.current_front_node_idx != 0 {
3545                return None;
3546            }
3547            // Handle single node case or adjacent nodes
3548            if self.current_front_node_idx == self.current_back_node_idx
3549                || self.current_front_node_idx == self.current_back_node_idx - 1
3550            {
3551                // take from the current front iter
3552                if let Some(entry) = self.current_front_iterator.next_back() {
3553                    if self.current_back_idx > 0 {
3554                        self.current_back_idx -= 1;
3555                    }
3556                    return Some((&entry.key, &mut entry.value));
3557                }
3558            } else {
3559                // advance back
3560                self.current_back_node_idx -= 1;
3561                if let Some(node) = self.inner.next_back() {
3562                    self.current_back_iterator = node.iter_mut();
3563                }
3564
3565                return self.next_back();
3566            }
3567        };
3568
3569        None
3570    }
3571}
3572
3573impl<'a, K, V> FusedIterator for IterMut<'a, K, V> where K: Ord {}
3574
3575/// A mutable iterator over the values of a `BTreeMap`.
3576///
3577/// This `struct` is created by the [`values_mut`] method on [`BTreeMap`]. See its
3578/// documentation for more.
3579///
3580/// [`values_mut`]: BTreeMap::values_mut
3581pub struct ValuesMut<'a, K: 'a, V: 'a>
3582where
3583    K: Ord,
3584{
3585    inner: IterMut<'a, K, V>,
3586}
3587
3588impl<'a, K, V> Iterator for ValuesMut<'a, K, V>
3589where
3590    K: Ord,
3591{
3592    type Item = &'a mut V;
3593
3594    fn next(&mut self) -> Option<Self::Item> {
3595        if let Some(entry) = self.inner.next() {
3596            return Some(entry.1);
3597        }
3598
3599        None
3600    }
3601}
3602
3603impl<'a, K, V> DoubleEndedIterator for ValuesMut<'a, K, V>
3604where
3605    K: Ord,
3606{
3607    fn next_back(&mut self) -> Option<Self::Item> {
3608        if let Some(entry) = self.inner.next_back() {
3609            return Some(entry.1);
3610        }
3611
3612        None
3613    }
3614}
3615
3616impl<'a, K, V> FusedIterator for ValuesMut<'a, K, V> where K: Ord {}
3617
3618/// A mutable iterator over a sub-range of entries in a `BTreeMap`.
3619///
3620/// This `struct` is created by the [`range_mut`] method on [`BTreeMap`]. See its
3621/// documentation for more.
3622///
3623/// [`range_mut`]: BTreeMap::range_mut
3624pub struct RangeMut<'a, K: 'a, V: 'a>
3625where
3626    K: Ord,
3627{
3628    inner: IterMut<'a, K, V>,
3629}
3630
3631impl<'a, K, V> Iterator for RangeMut<'a, K, V>
3632where
3633    K: Ord,
3634{
3635    type Item = (&'a K, &'a mut V);
3636
3637    fn next(&mut self) -> Option<Self::Item> {
3638        self.inner.next()
3639    }
3640}
3641
3642impl<'a, K, V> DoubleEndedIterator for RangeMut<'a, K, V>
3643where
3644    K: Ord,
3645{
3646    fn next_back(&mut self) -> Option<Self::Item> {
3647        self.inner.next_back()
3648    }
3649}
3650
3651impl<'a, K, V> FusedIterator for RangeMut<'a, K, V> where K: Ord {}
3652
3653impl<K, Q, V> Index<&Q> for BTreeMap<K, V>
3654where
3655    K: Borrow<Q> + Ord,
3656
3657    Q: Ord + ?Sized,
3658{
3659    type Output = V;
3660
3661    fn index(&self, index: &Q) -> &Self::Output {
3662        self.get(index).unwrap()
3663    }
3664}
3665
3666pub struct Cursor<'a, T>
3667where
3668    T: Ord,
3669{
3670    set: &'a BTreeSet<T>,
3671    idx: usize,
3672}
3673
3674impl<'a, T: Ord> Cursor<'a, T> {
3675    pub fn move_next(&mut self) {
3676        if self.idx == self.set.len() {
3677            self.idx = 0
3678        } else {
3679            self.idx += 1;
3680        }
3681    }
3682    pub fn move_index(&mut self, index: usize) {
3683        self.idx = index
3684    }
3685    pub fn move_prev(&mut self) {
3686        if self.idx == 0 {
3687            self.idx = self.set.len()
3688        } else {
3689            self.idx -= 1;
3690        }
3691    }
3692    pub fn item(&self) -> Option<&'a T> {
3693        self.set.get_index(self.idx)
3694    }
3695    pub fn peek_next(&self) -> Option<&'a T> {
3696        if self.idx == self.set.len() {
3697            return self.set.first();
3698        }
3699
3700        self.set.get_index(self.idx + 1)
3701    }
3702    pub fn peek_index(&self, index: usize) -> Option<&'a T> {
3703        self.set.get_index(index)
3704    }
3705    pub fn peek_prev(&self) -> Option<&'a T> {
3706        if self.idx == 0 {
3707            return None;
3708        }
3709
3710        self.set.get_index(self.idx - 1)
3711    }
3712}
3713
3714pub struct CursorMap<'a, K, V>
3715where
3716    K: 'a + Ord,
3717    V: 'a,
3718{
3719    cursor: Cursor<'a, Pair<K, V>>,
3720}
3721
3722impl<'a, K: Ord, V> CursorMap<'a, K, V> {
3723    pub fn move_next(&mut self) {
3724        self.cursor.move_next()
3725    }
3726    pub fn move_index(&mut self, index: usize) {
3727        self.cursor.move_index(index)
3728    }
3729    pub fn move_prev(&mut self) {
3730        self.cursor.move_prev()
3731    }
3732    pub fn key(&self) -> Option<&'a K> {
3733        if let Some(entry) = self.cursor.item() {
3734            return Some(&entry.key);
3735        }
3736
3737        None
3738    }
3739    pub fn value(&self) -> Option<&'a V> {
3740        if let Some(entry) = self.cursor.item() {
3741            return Some(&entry.value);
3742        }
3743
3744        None
3745    }
3746    pub fn key_value(&self) -> Option<(&'a K, &'a V)> {
3747        if let Some(entry) = self.cursor.item() {
3748            return Some((&entry.key, &entry.value));
3749        }
3750
3751        None
3752    }
3753    pub fn peek_next(&self) -> Option<(&'a K, &'a V)> {
3754        if let Some(entry) = self.cursor.peek_next() {
3755            return Some((&entry.key, &entry.value));
3756        }
3757
3758        None
3759    }
3760    pub fn peek_index(&self, index: usize) -> Option<(&'a K, &'a V)> {
3761        if let Some(entry) = self.cursor.peek_index(index) {
3762            return Some((&entry.key, &entry.value));
3763        }
3764
3765        None
3766    }
3767    pub fn peek_prev(&self) -> Option<(&'a K, &'a V)> {
3768        if let Some(entry) = self.cursor.peek_prev() {
3769            return Some((&entry.key, &entry.value));
3770        }
3771
3772        None
3773    }
3774}
3775
3776#[cfg(test)]
3777mod tests {
3778    use super::core::constants::*;
3779    use super::core::node::*;
3780    use crate::{BTreeMap, BTreeSet, Node};
3781    use rand::{Rng, SeedableRng};
3782    use std::collections::Bound::Included;
3783
3784    #[test]
3785    fn test_insert() {
3786        let input: Vec<isize> = vec![1, 9, 2, 7, 6, 3, 5, 4, 10, 8];
3787
3788        let expected_output: Vec<isize> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
3789
3790        let actual_node = input
3791            .iter()
3792            .fold(Node::with_capacity(DEFAULT_INNER_SIZE), |mut acc, curr| {
3793                NodeLike::insert(&mut acc, *curr);
3794                acc
3795            });
3796
3797        let actual_output: Vec<isize> = actual_node.iter().cloned().collect();
3798
3799        assert_eq!(expected_output, actual_output);
3800        assert_eq!(*actual_node.last().unwrap(), 10);
3801    }
3802
3803    #[test]
3804    fn test_halve() {
3805        let mut input: Vec<isize> = vec![];
3806        for item in 0..DEFAULT_INNER_SIZE {
3807            input.push(item.clone() as isize);
3808        }
3809
3810        let mut former_node = Node::with_capacity(DEFAULT_INNER_SIZE);
3811        input.iter().for_each(|item| {
3812            NodeLike::insert(&mut former_node, item.clone());
3813        });
3814        let latter_node = former_node.halve();
3815
3816        let expected_former_output: Vec<isize> = input[0..DEFAULT_CUTOFF].to_vec();
3817        let expected_latter_output: Vec<isize> = input[DEFAULT_CUTOFF..].to_vec();
3818
3819        let actual_former_output: Vec<isize> = former_node.iter().cloned().collect();
3820        let actual_latter_output: Vec<isize> = latter_node.iter().cloned().collect();
3821
3822        assert_eq!(expected_former_output, actual_former_output);
3823        assert_eq!(expected_latter_output, actual_latter_output);
3824    }
3825
3826    #[test]
3827    fn test_insert_btree() {
3828        // This will cause the btree to have at least more than one node
3829        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3830        let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3831
3832        let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3833            acc.insert(curr);
3834            acc
3835        });
3836        assert!(btree.inner.len() > 1);
3837
3838        let actual_output: Vec<usize> = btree.into_iter().collect();
3839
3840        assert_eq!(expected_output, actual_output);
3841    }
3842
3843    // Regression for https://github.com/lucidarium-systems/indexset/issues/57.
3844    #[test]
3845    fn test_node_size_two_preserves_all_u64_values() {
3846        let mut set = BTreeSet::with_maximum_node_size(2);
3847
3848        for value in 0..10_u64 {
3849            set.insert(value);
3850        }
3851
3852        assert_eq!(set.into_iter().collect::<Vec<_>>(), (0..10).collect::<Vec<_>>());
3853    }
3854
3855    // Regression for https://github.com/lucidarium-systems/indexset/issues/57.
3856    #[test]
3857    fn test_node_size_three_preserves_all_u8_values() {
3858        let mut set = BTreeSet::with_maximum_node_size(3);
3859
3860        for value in 0..20_u8 {
3861            set.insert(value);
3862        }
3863
3864        assert_eq!(set.into_iter().collect::<Vec<_>>(), (0..20).collect::<Vec<_>>());
3865    }
3866
3867    #[test]
3868    fn test_insert_duplicates() {
3869        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1))
3870            .into_iter()
3871            .rev()
3872            .cycle()
3873            .take(DEFAULT_INNER_SIZE * 3)
3874            .collect();
3875        let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3876
3877        let btree: BTreeSet<usize> = input.into_iter().fold(BTreeSet::new(), |mut acc, curr| {
3878            acc.insert(curr);
3879            acc
3880        });
3881        assert!(btree.inner.len() > 1);
3882
3883        let actual_output: Vec<usize> = btree.into_iter().collect();
3884
3885        assert_eq!(expected_output.len(), actual_output.len());
3886        assert_eq!(expected_output, actual_output);
3887    }
3888
3889    #[test]
3890    fn test_remove() {
3891        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3892
3893        let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3894            acc.insert(curr.clone());
3895            acc
3896        });
3897
3898        input.iter().for_each(|item| {
3899            assert!(btree.remove(item));
3900        });
3901
3902        let actual_output: Vec<usize> = btree.into_iter().collect();
3903        let expected_output: Vec<usize> = vec![];
3904
3905        assert_eq!(expected_output, actual_output);
3906    }
3907
3908    #[test]
3909    fn test_take() {
3910        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3911
3912        let mut btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3913            acc.insert(curr.clone());
3914            acc
3915        });
3916
3917        input.iter().for_each(|item| {
3918            assert_eq!(*item, btree.take(item).unwrap());
3919        });
3920
3921        let actual_output: Vec<usize> = btree.into_iter().collect();
3922        let expected_output: Vec<usize> = vec![];
3923
3924        assert_eq!(expected_output, actual_output);
3925    }
3926
3927    #[test]
3928    fn test_first_last_with_pop() {
3929        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().collect();
3930
3931        let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3932            acc.insert(curr.clone());
3933            acc
3934        });
3935
3936        let mut front_spine = btree.clone();
3937        let mut back_spine = btree.clone();
3938        btree.iter().for_each(|item| {
3939            if *item < DEFAULT_INNER_SIZE {
3940                assert_eq!(front_spine.get_index(0), front_spine.first());
3941                assert_eq!(front_spine.pop_first().unwrap() + 1, *front_spine.first().unwrap());
3942            } else {
3943                assert_eq!(front_spine.pop_first().unwrap(), DEFAULT_INNER_SIZE);
3944                assert_eq!(front_spine.first(), None);
3945            }
3946        });
3947
3948        input.iter().rev().for_each(|item| {
3949            if *item > 0 {
3950                assert_eq!(back_spine.get_index(back_spine.len() - 1), back_spine.last());
3951                assert_eq!(back_spine.pop_last().unwrap() - 1, *back_spine.last().unwrap());
3952            } else {
3953                assert_eq!(back_spine.pop_last(), Some(0));
3954                assert_eq!(back_spine.last(), None);
3955            }
3956        });
3957    }
3958
3959    #[test]
3960    fn test_map_get() {
3961        let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).map(|i| (i, i)));
3962
3963        assert_eq!(btree.len(), DEFAULT_INNER_SIZE * 10);
3964
3965        for item in 0..DEFAULT_INNER_SIZE * 10 {
3966            assert_eq!(btree.get(&item), Some(&item));
3967        }
3968    }
3969
3970    #[test]
3971    fn test_get_contains_lower_bound() {
3972        let input: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).into_iter().rev().collect();
3973        let expected_output: Vec<usize> = (0..(DEFAULT_INNER_SIZE + 1)).collect();
3974
3975        let btree: BTreeSet<usize> = input.iter().fold(BTreeSet::new(), |mut acc, curr| {
3976            acc.insert(curr.clone());
3977            acc
3978        });
3979
3980        expected_output.into_iter().for_each(|item| {
3981            assert_eq!(*btree.get_index(item).unwrap(), item);
3982            assert_eq!(*btree.get_index(item).unwrap(), *btree.lower_bound(&item).unwrap());
3983            assert!(btree.contains(&item));
3984        });
3985    }
3986
3987    #[test]
3988    fn test_iter() {
3989        let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3990        assert_eq!(btree.inner.len(), 19);
3991        let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
3992        let actual_forward = Vec::from_iter(btree.iter().cloned());
3993        assert_eq!(expected_forward, actual_forward);
3994        let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
3995        let actual_backward = Vec::from_iter(btree.iter().cloned().rev());
3996        assert_eq!(expected_backward, actual_backward);
3997    }
3998
3999    #[test]
4000    fn test_iter_mut() {
4001        let btree = BTreeMap::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
4002        assert_eq!(btree.set.inner.len(), 19);
4003        let expected_forward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate());
4004        btree.clone().iter_mut().zip(expected_forward).for_each(|(lhs, rhs)| {
4005            assert_eq!(*lhs.0, rhs.0);
4006            assert_eq!(*lhs.1, rhs.1);
4007        });
4008
4009        let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).enumerate().rev());
4010        btree
4011            .clone()
4012            .iter_mut()
4013            .rev()
4014            .zip(expected_backward)
4015            .for_each(|(lhs, rhs)| {
4016                assert_eq!(*lhs.0, rhs.0);
4017                assert_eq!(*lhs.1, rhs.1);
4018            });
4019    }
4020
4021    #[test]
4022    fn test_into_iter() {
4023        let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
4024        assert_eq!(btree.inner.len(), 19);
4025        let expected_forward = Vec::from_iter(0..(DEFAULT_INNER_SIZE * 10));
4026        let actual_forward = Vec::from_iter(btree.clone().into_iter());
4027        assert_eq!(expected_forward, actual_forward);
4028        let expected_backward = Vec::from_iter((0..(DEFAULT_INNER_SIZE * 10)).rev());
4029        let actual_backward = Vec::from_iter(btree.into_iter().rev());
4030        assert_eq!(expected_backward, actual_backward);
4031    }
4032
4033    #[test]
4034    fn test_range() {
4035        let btree = BTreeSet::from_iter(0..10);
4036        let first_to_second: Vec<usize> = (1..2).collect();
4037        let three_til_end: Vec<usize> = (3..10).collect();
4038        let start_til_four: Vec<usize> = (0..4).collect();
4039        let start_til_end: Vec<usize> = (0..10).collect();
4040        let five_til_six_included: Vec<usize> = (5..=6).collect();
4041        let start_til_seven_included: Vec<usize> = (0..=7).collect();
4042        assert_eq!(
4043            Vec::from_iter(btree.range_idx(..).cloned()),
4044            Vec::from_iter(btree.iter().cloned())
4045        );
4046        assert_eq!(
4047            Vec::from_iter(btree.range_idx(0..).cloned()),
4048            Vec::from_iter(btree.iter().cloned())
4049        );
4050        assert_eq!(
4051            Vec::from_iter(btree.range_idx(0..10).cloned()),
4052            Vec::from_iter(btree.iter().cloned())
4053        );
4054        assert_eq!(
4055            Vec::from_iter(btree.range_idx(..10).cloned()),
4056            Vec::from_iter(btree.iter().cloned())
4057        );
4058        assert_eq!(Vec::from_iter(btree.range_idx(1..2).cloned()), first_to_second);
4059        assert_eq!(Vec::from_iter(btree.range_idx(3..10).cloned()), three_til_end);
4060        assert_eq!(Vec::from_iter(btree.range_idx(0..4).cloned()), start_til_four);
4061        assert_eq!(Vec::from_iter(btree.range_idx(0..10).cloned()), start_til_end);
4062        assert_eq!(Vec::from_iter(btree.range_idx(5..=6).cloned()), five_til_six_included);
4063        assert_eq!(
4064            Vec::from_iter(btree.range_idx(0..=7).cloned()),
4065            start_til_seven_included
4066        );
4067    }
4068
4069    #[test]
4070    fn test_range_mut() {
4071        let btree = BTreeMap::from_iter((0..10).into_iter().enumerate());
4072        btree
4073            .clone()
4074            .range_mut_idx(..)
4075            .zip(btree.iter())
4076            .for_each(|(lhs, rhs)| {
4077                assert_eq!(lhs.0, rhs.0);
4078                assert_eq!(lhs.1, rhs.1);
4079            });
4080        btree
4081            .clone()
4082            .range_mut_idx(0..)
4083            .zip(btree.iter())
4084            .for_each(|(lhs, rhs)| {
4085                assert_eq!(lhs.0, rhs.0);
4086                assert_eq!(lhs.1, rhs.1);
4087            });
4088        btree
4089            .clone()
4090            .range_mut_idx(0..10)
4091            .zip(btree.iter())
4092            .for_each(|(lhs, rhs)| {
4093                assert_eq!(lhs.0, rhs.0);
4094                assert_eq!(lhs.1, rhs.1);
4095            });
4096        let first_to_second: Vec<(usize, usize)> = (1..2).map(|x| (x, x)).collect();
4097        let three_til_end: Vec<(usize, usize)> = (3..10).map(|x| (x, x)).collect();
4098        let start_til_four: Vec<(usize, usize)> = (0..4).map(|x| (x, x)).collect();
4099        let start_til_end: Vec<(usize, usize)> = (0..10).map(|x| (x, x)).collect();
4100        let five_til_six_included: Vec<(usize, usize)> = (5..=6).map(|x| (x, x)).collect();
4101        let start_til_seven_included: Vec<(usize, usize)> = (0..=7).map(|x| (x, x)).collect();
4102        btree
4103            .clone()
4104            .range_mut_idx(1..2)
4105            .zip(first_to_second)
4106            .for_each(|(lhs, rhs)| {
4107                assert_eq!(*lhs.0, rhs.0);
4108                assert_eq!(*lhs.1, rhs.1);
4109            });
4110        btree
4111            .clone()
4112            .range_mut_idx(3..10)
4113            .zip(three_til_end)
4114            .for_each(|(lhs, rhs)| {
4115                assert_eq!(*lhs.0, rhs.0);
4116                assert_eq!(*lhs.1, rhs.1);
4117            });
4118        btree
4119            .clone()
4120            .range_mut_idx(0..4)
4121            .zip(start_til_four)
4122            .for_each(|(lhs, rhs)| {
4123                assert_eq!(*lhs.0, rhs.0);
4124                assert_eq!(*lhs.1, rhs.1);
4125            });
4126        btree
4127            .clone()
4128            .range_mut_idx(0..10)
4129            .zip(start_til_end)
4130            .for_each(|(lhs, rhs)| {
4131                assert_eq!(*lhs.0, rhs.0);
4132                assert_eq!(*lhs.1, rhs.1);
4133            });
4134        btree
4135            .clone()
4136            .range_mut_idx(5..=6)
4137            .zip(five_til_six_included)
4138            .for_each(|(lhs, rhs)| {
4139                assert_eq!(*lhs.0, rhs.0);
4140                assert_eq!(*lhs.1, rhs.1);
4141            });
4142        btree
4143            .clone()
4144            .range_mut_idx(0..=7)
4145            .zip(start_til_seven_included)
4146            .for_each(|(lhs, rhs)| {
4147                assert_eq!(*lhs.0, rhs.0);
4148                assert_eq!(*lhs.1, rhs.1);
4149            });
4150    }
4151
4152    #[test]
4153    fn test_non_boolean_set_operations() {
4154        let left_spine = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4155        let right_spine = BTreeSet::from_iter(((DEFAULT_INNER_SIZE - 1)..((DEFAULT_INNER_SIZE + 1) * 2)).into_iter());
4156
4157        let mut union = left_spine.clone();
4158        let mut temp_right_spine = right_spine.clone();
4159        union.append(&mut temp_right_spine);
4160
4161        assert_eq!(
4162            Vec::from_iter(union.iter().cloned()),
4163            Vec::from_iter(left_spine.union(&right_spine).cloned())
4164        );
4165        assert_eq!(
4166            Vec::from_iter(union.iter().cloned()),
4167            Vec::from_iter(right_spine.union(&left_spine).cloned()),
4168        );
4169
4170        let left_diff = Vec::from_iter(0..(DEFAULT_INNER_SIZE - 1));
4171        let right_diff = Vec::from_iter((DEFAULT_INNER_SIZE + 1)..((DEFAULT_INNER_SIZE + 1) * 2));
4172
4173        assert_eq!(left_diff, Vec::from_iter(left_spine.difference(&right_spine).cloned()));
4174        assert_eq!(right_diff, Vec::from_iter(right_spine.difference(&left_spine).cloned()));
4175
4176        let intersection = vec![DEFAULT_INNER_SIZE - 1, DEFAULT_INNER_SIZE];
4177        assert_eq!(
4178            intersection,
4179            Vec::from_iter(left_spine.intersection(&right_spine).cloned())
4180        );
4181
4182        let mut sym_diff = left_diff.clone();
4183        sym_diff.append(&mut right_diff.clone());
4184        assert_eq!(
4185            sym_diff,
4186            Vec::from_iter(left_spine.symmetric_difference(&right_spine).cloned())
4187        );
4188        assert_eq!(
4189            sym_diff,
4190            Vec::from_iter(right_spine.symmetric_difference(&left_spine).cloned())
4191        );
4192    }
4193
4194    #[test]
4195    fn test_boolean_set_operations() {
4196        let empty_set: BTreeSet<usize> = BTreeSet::new();
4197        assert!(empty_set.is_empty());
4198        let a = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 1)).into_iter());
4199        let b = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 2)).into_iter());
4200        let c = BTreeSet::from_iter(((DEFAULT_INNER_SIZE + 2)..(DEFAULT_INNER_SIZE + 4)).into_iter());
4201
4202        assert!(a.is_subset(&a));
4203        assert!(a.is_superset(&a));
4204        assert!(a.is_subset(&b));
4205        assert!(!b.is_subset(&a));
4206        assert!(b.is_superset(&a));
4207        assert!(c.is_disjoint(&a));
4208        assert!(c.is_disjoint(&b));
4209        assert!(!a.is_disjoint(&b));
4210        assert!(!b.is_disjoint(&a));
4211    }
4212
4213    #[test]
4214    fn test_split_off() {
4215        let btree: BTreeSet<usize> = BTreeSet::from_iter(0..(DEFAULT_INNER_SIZE * 10));
4216        for split in vec![
4217            1,
4218            (DEFAULT_INNER_SIZE * 3) - 6,
4219            DEFAULT_INNER_SIZE,
4220            DEFAULT_INNER_SIZE + 1,
4221            (DEFAULT_INNER_SIZE * 10) - 1,
4222        ] {
4223            let mut left = btree.clone();
4224            let right = left.split_off(&split);
4225            assert!(left.is_disjoint(&right));
4226            assert!(Vec::from_iter(left.intersection(&right)).is_empty());
4227            let expected_left = Vec::from_iter(0..split);
4228            let expected_right = Vec::from_iter(split..(DEFAULT_INNER_SIZE * 10));
4229
4230            assert_eq!(expected_left, Vec::from_iter(left));
4231            let actual_right = Vec::from_iter(right);
4232            assert_eq!(expected_right, actual_right)
4233        }
4234    }
4235
4236    #[test]
4237    fn test_out_of_bounds_range() {
4238        let btree: BTreeSet<usize> = BTreeSet::from_iter(0..10);
4239        assert_eq!(btree.range((Included(5), Included(10))).count(), 5);
4240        assert_eq!(btree.range((Included(5), Included(11))).count(), 5);
4241        assert_eq!(btree.range((Included(5), Included(10 + DEFAULT_INNER_SIZE))).count(), 5);
4242        assert_eq!(btree.range((Included(0), Included(11))).count(), 10);
4243    }
4244
4245    #[test]
4246    fn test_iterating_over_blocks() {
4247        let btree = BTreeSet::from_iter((0..(DEFAULT_INNER_SIZE + 10)).into_iter());
4248        assert_eq!(btree.iter().count(), (0..(DEFAULT_INNER_SIZE + 10)).count());
4249        assert_eq!(
4250            btree.range(0..DEFAULT_INNER_SIZE).count(),
4251            (0..DEFAULT_INNER_SIZE).count()
4252        );
4253        assert_eq!(
4254            btree.range(0..=DEFAULT_INNER_SIZE).count(),
4255            (0..=DEFAULT_INNER_SIZE).count()
4256        );
4257        assert_eq!(
4258            btree.range(0..=DEFAULT_INNER_SIZE + 1).count(),
4259            (0..=DEFAULT_INNER_SIZE + 1).count()
4260        );
4261
4262        assert_eq!(btree.iter().rev().count(), (0..(DEFAULT_INNER_SIZE + 10)).count());
4263        assert_eq!(
4264            btree.range(0..DEFAULT_INNER_SIZE).rev().count(),
4265            (0..DEFAULT_INNER_SIZE).count()
4266        );
4267        assert_eq!(
4268            btree.range(0..=DEFAULT_INNER_SIZE).rev().count(),
4269            (0..=DEFAULT_INNER_SIZE).count()
4270        );
4271        assert_eq!(
4272            btree.range(0..=DEFAULT_INNER_SIZE + 1).rev().count(),
4273            (0..=DEFAULT_INNER_SIZE + 1).count()
4274        );
4275    }
4276
4277    #[test]
4278    fn test_empty_set() {
4279        let btree: BTreeSet<usize> = BTreeSet::new();
4280        assert_eq!(btree.iter().count(), 0);
4281        assert_eq!(btree.range(0..0).count(), 0);
4282        assert_eq!(btree.range(0..).count(), 0);
4283        assert_eq!(btree.range(..0).count(), 0);
4284        assert_eq!(btree.range(..).count(), 0);
4285        assert_eq!(btree.range(0..=0).count(), 0);
4286        assert_eq!(btree.range(..1).count(), 0);
4287
4288        assert_eq!(btree.iter().rev().count(), 0);
4289        assert_eq!(btree.range(0..0).rev().count(), 0);
4290        assert_eq!(btree.range(..).rev().count(), 0);
4291        assert_eq!(btree.range(..1).rev().count(), 0);
4292
4293        assert_eq!(btree.range(..DEFAULT_INNER_SIZE).count(), 0);
4294        assert_eq!(btree.range(DEFAULT_INNER_SIZE..DEFAULT_INNER_SIZE * 2).count(), 0);
4295    }
4296
4297    #[test]
4298    fn test_map() {
4299        let mut btree: BTreeMap<usize, usize> = BTreeMap::new();
4300        assert_eq!(btree.iter().count(), 0);
4301        assert_eq!(btree.iter_mut().count(), 0);
4302
4303        btree.insert(123, 456);
4304        assert_eq!(btree.iter().count(), 1);
4305        assert_eq!(btree.iter_mut().count(), 1);
4306
4307        btree.insert(7, 8);
4308        assert_eq!(btree.iter().count(), 2);
4309        assert_eq!(btree.iter_mut().count(), 2);
4310    }
4311
4312    #[test]
4313    fn test_many_fuzzy_duplicates() {
4314        // The below seed reproduces a previous bug
4315        let mut rng = rand::rngs::StdRng::from_seed([41u8; 32]);
4316        let mut btree = BTreeSet::new();
4317        let n = 100_000;
4318        for _ in 0..n {
4319            let value: u64 = rng.random_range(1..10000);
4320            let lower: u64 = 1650;
4321            let len_before = btree.len();
4322            // Use max to increase the number of duplicates
4323            if btree.insert(value.max(lower)) {
4324                assert_eq!(btree.len(), len_before + 1)
4325            } else {
4326                assert_eq!(btree.len(), len_before);
4327            }
4328        }
4329        let expected = btree.iter().cloned().collect::<Vec<_>>();
4330        assert_eq!(expected.len(), btree.len());
4331        for (i, expected_item) in expected.iter().enumerate() {
4332            if let Some(item) = btree.get_index(i) {
4333                assert_eq!(expected_item, item, "mismatch on index {i}");
4334            } else {
4335                panic!("missing index {i}")
4336            }
4337        }
4338    }
4339
4340    #[test]
4341    fn test_iter_mut_rev() {
4342        let mut map = BTreeMap::<i64, i64>::new();
4343        map.insert(1, 10);
4344        map.insert(2, 20);
4345        map.insert(3, 30);
4346
4347        let expected_forward = vec![(1, 10), (2, 20), (3, 30)];
4348        for (i, (k, v)) in map.iter_mut().enumerate() {
4349            assert_eq!(*k, expected_forward[i].0);
4350            assert_eq!(*v, expected_forward[i].1);
4351        }
4352
4353        let expected_backward = vec![(3, 30), (2, 20), (1, 10)];
4354        for (i, (k, v)) in map.iter_mut().rev().enumerate() {
4355            assert_eq!(*k, expected_backward[i].0);
4356            assert_eq!(*v, expected_backward[i].1);
4357        }
4358    }
4359
4360    #[test] // this test pass with std::collection::BTreeMap
4361    fn test_indexset_btreemap_overflow_bug() {
4362        // This test reproduces the "attempt to subtract with overflow" panic
4363        // that occurs in indexset::BTreeMap::range_to_idx at line 2639
4364
4365        let mut map = BTreeMap::new();
4366
4367        // Insert the same keys as in the failing test
4368        map.insert(vec![1, 2, 3, 4], 1);
4369        map.insert(vec![1, 2, 3, 7], 2);
4370        map.insert(vec![1, 2, 4, 5], 3);
4371        let end_key = vec![1, 2, 3, 4];
4372
4373        let mut range_iter = map.range(..end_key).rev();
4374
4375        let result = range_iter.next();
4376
4377        // In a working implementation, this should return None
4378        // since there are no keys before [1,2,3,4]
4379        assert!(result.is_none(), "Expected None when ranging before first key");
4380    }
4381
4382    use std::collections::Bound;
4383    use std::ops::RangeBounds;
4384
4385    pub struct RangeFromExcluding<'a, T> {
4386        pub(crate) from: &'a T,
4387    }
4388
4389    impl<T> RangeBounds<T> for RangeFromExcluding<'_, T> {
4390        fn start_bound(&self) -> Bound<&T> {
4391            Bound::Excluded(self.from)
4392        }
4393
4394        fn end_bound(&self) -> Bound<&T> {
4395            Bound::Unbounded
4396        }
4397    }
4398
4399    #[test]
4400    fn test_range_from_excluding_bug() {
4401        let mut map = BTreeMap::new();
4402        map.insert(vec![1, 2, 3, 4], 1);
4403        map.insert(vec![1, 2, 3, 7], 2);
4404        map.insert(vec![1, 2, 4, 5], 3);
4405
4406        // RangeFromExcluding with non-existing key [1,2,3,6]
4407        // Should return [1,2,3,7] but returns [1,2,4,5]
4408        let non_existing_key = vec![1, 2, 3, 6];
4409        let range = RangeFromExcluding {
4410            from: &non_existing_key,
4411        };
4412        let result = map.range(range).next().unwrap();
4413
4414        assert_eq!(
4415            result.0,
4416            &vec![1, 2, 3, 7],
4417            "RangeFromExcluding skips entries incorrectly"
4418        );
4419        assert_eq!(*result.1, 2);
4420    }
4421
4422    #[test]
4423    fn uuid_key_test() {
4424        let mut map = BTreeMap::new();
4425
4426        map.insert(uuid::uuid!("019c34bf-47c0-7df1-9d46-522cec0dd95f"), 1);
4427
4428        let out = map.get_mut(&uuid::uuid!("019c34bf-47c0-7df1-9d46-52013234139b"));
4429        assert!(out.is_none());
4430    }
4431}