skiplist/
skipmap.rs

1//! SkipMap stores key-value pairs, with the keys being unique and always
2//! sorted.
3
4#![allow(warnings)]
5#![allow(clippy)]
6#![allow(unknown_lints)]
7
8use std::{
9    borrow::Borrow, cmp, cmp::Ordering, default, fmt, hash, hash::Hash, iter, mem, ops, ops::Bound,
10};
11
12pub use crate::skipnode::IntoIter;
13use crate::{
14    level_generator::{LevelGenerator, geometric::Geometric},
15    skipnode::{self, SkipListAction, insertion_fixup},
16};
17
18type SkipNode<K, V> = skipnode::SkipNode<(K, V)>;
19
20impl<K, V> SkipNode<K, V> {
21    fn key_ref(&self) -> Option<&K> {
22        self.item.as_ref().map(|item| &item.0)
23    }
24
25    fn value_ref(&self) -> Option<&V> {
26        self.item.as_ref().map(|item| &item.1)
27    }
28
29    fn value_mut(&mut self) -> Option<&mut V> {
30        self.item.as_mut().map(|item| &mut item.1)
31    }
32
33    fn item_ref(&self) -> Option<(&K, &V)> {
34        self.item.as_ref().map(|item| (&item.0, &item.1))
35    }
36
37    fn item_mut(&mut self) -> Option<(&K, &mut V)> {
38        self.item.as_mut().map(|item| (&item.0, &mut item.1))
39    }
40}
41
42// ////////////////////////////////////////////////////////////////////////////
43// SkipMap
44// ////////////////////////////////////////////////////////////////////////////
45
46/// The skipmap provides a way of storing element pairs such that they keys are
47/// always sorted whilst at the same time providing efficient way to access,
48/// insert and removes nodes.
49///
50/// A particular node can be accessed through the matching key, and since the
51/// keys are always sorted, it is also possible to access key-value pairs by
52/// index.
53///
54/// Note that mutable references to keys are not available at all as this could
55/// result in a node being left out of the proper ordering.
56pub struct SkipMap<K, V> {
57    // Storage, this is not sorted
58    head: Box<SkipNode<K, V>>,
59    len: usize,
60    level_generator: Geometric,
61}
62
63// ///////////////////////////////////////////////
64// Inherent methods
65// ///////////////////////////////////////////////
66
67impl<K, V> SkipMap<K, V>
68where
69    K: cmp::Ord,
70{
71    /// Create a new skipmap with the default number of 16 levels.
72    ///
73    /// # Examples
74    ///
75    /// ```
76    /// use skiplist::SkipMap;
77    ///
78    /// let mut skipmap: SkipMap<i64, String> = SkipMap::new();
79    /// ```
80    #[inline]
81    pub fn new() -> Self {
82        // Parameters are fixed and will produce a valid level generator.
83        let lg = Geometric::new(16, 1.0 / 2.0).expect("Failed to create level generator.");
84        SkipMap {
85            head: Box::new(SkipNode::head(lg.total())),
86            len: 0,
87            level_generator: lg,
88        }
89    }
90
91    /// Constructs a new, empty skipmap with the optimal number of levels for
92    /// the intended capacity.  Specifically, it uses `floor(log2(capacity))`
93    /// number of levels, ensuring that only *a few* nodes occupy the highest
94    /// level.
95    ///
96    /// # Examples
97    ///
98    /// ```
99    /// use skiplist::SkipMap;
100    ///
101    /// let mut skipmap = SkipMap::with_capacity(100);
102    /// skipmap.extend((0..100).map(|x| (x, x)));
103    /// ```
104    #[inline]
105    pub fn with_capacity(capacity: usize) -> Self {
106        let levels = cmp::max(1, (capacity as f64).log2().floor() as usize);
107        // Parameters are safe as levels >= 1 and p is in (0, 1).
108        let lg = Geometric::new(levels, 1.0 / 2.0).expect("Failed to create level generator.");
109        SkipMap {
110            head: Box::new(SkipNode::head(lg.total())),
111            len: 0,
112            level_generator: lg,
113        }
114    }
115
116    /// Insert the element into the skipmap.
117    ///
118    /// # Examples
119    ///
120    /// ```
121    /// use skiplist::SkipMap;
122    ///
123    /// let mut skipmap = SkipMap::new();
124    ///
125    /// skipmap.insert(1, "Hello");
126    /// skipmap.insert(2, "World");
127    /// assert_eq!(skipmap.len(), 2);
128    /// assert!(!skipmap.is_empty());
129    /// ```
130    pub fn insert(&mut self, key: K, value: V) -> Option<V> {
131        let level_gen = &mut self.level_generator;
132        let inserter = InsertOrReplace::new(key, value, |k, v| {
133            Box::new(SkipNode::new((k, v), level_gen.level()))
134        });
135        let insert_res = inserter.act(self.head.as_mut());
136        match insert_res {
137            Ok(_) => {
138                self.len += 1;
139                None
140            }
141            Err(old_val) => Some(old_val),
142        }
143    }
144}
145
146impl<K, V> SkipMap<K, V> {
147    /// Clears the skipmap, removing all values.
148    ///
149    /// # Examples
150    ///
151    /// ```
152    /// use skiplist::SkipMap;
153    ///
154    /// let mut skipmap = SkipMap::new();
155    /// skipmap.extend((0..10).map(|x| (x, x)));
156    /// skipmap.clear();
157    /// assert!(skipmap.is_empty());
158    /// ```
159    #[inline]
160    pub fn clear(&mut self) {
161        self.len = 0;
162        *self.head = SkipNode::head(self.level_generator.total());
163    }
164
165    /// Returns the number of elements in the skipmap.
166    ///
167    /// # Examples
168    ///
169    /// ```
170    /// use skiplist::SkipMap;
171    ///
172    /// let mut skipmap = SkipMap::new();
173    /// skipmap.extend((0..10).map(|x| (x, x)));
174    /// assert_eq!(skipmap.len(), 10);
175    /// ```
176    #[inline]
177    pub fn len(&self) -> usize {
178        self.len
179    }
180
181    /// Returns `true` if the skipmap contains no elements.
182    ///
183    /// # Examples
184    ///
185    /// ```
186    /// use skiplist::SkipMap;
187    ///
188    /// let mut skipmap = SkipMap::new();
189    /// assert!(skipmap.is_empty());
190    ///
191    /// skipmap.insert(1, "Rust");
192    /// assert!(!skipmap.is_empty());
193    /// ```
194    #[inline]
195    pub fn is_empty(&self) -> bool {
196        self.len == 0
197    }
198
199    /// Provides a reference to the front element, or `None` if the skipmap is
200    /// empty.
201    ///
202    /// # Examples
203    ///
204    /// ```
205    /// use skiplist::SkipMap;
206    ///
207    /// let mut skipmap = SkipMap::new();
208    /// assert!(skipmap.front().is_none());
209    ///
210    /// skipmap.insert(1, "Hello");
211    /// skipmap.insert(2, "World");
212    /// assert_eq!(skipmap.front(), Some((&1, &"Hello")));
213    /// ```
214    #[inline]
215    pub fn front(&self) -> Option<(&K, &V)> {
216        self.get_index(0).and_then(|node| node.item_ref())
217    }
218
219    /// Provides a mutable reference to the front element, or `None` if the
220    /// skipmap is empty.
221    ///
222    /// The reference to the key remains immutable as the keys must remain
223    /// sorted.
224    ///
225    /// # Examples
226    ///
227    /// ```
228    /// use skiplist::SkipMap;
229    ///
230    /// let mut skipmap = SkipMap::new();
231    /// assert!(skipmap.front().is_none());
232    ///
233    /// skipmap.insert(1, "Hello");
234    /// skipmap.insert(2, "World");
235    /// assert_eq!(skipmap.front_mut(), Some((&1, &mut "Hello")));
236    /// ```
237    #[inline]
238    pub fn front_mut(&mut self) -> Option<(&K, &mut V)> {
239        self.get_index_mut(0).and_then(|node| node.item_mut())
240    }
241
242    /// Provides a reference to the back element, or `None` if the skipmap is
243    /// empty.
244    ///
245    /// # Examples
246    ///
247    /// ```
248    /// use skiplist::SkipMap;
249    ///
250    /// let mut skipmap = SkipMap::new();
251    /// assert!(skipmap.back().is_none());
252    ///
253    /// skipmap.insert(1, "Hello");
254    /// skipmap.insert(2, "World");
255    /// assert_eq!(skipmap.back(), Some((&2, &"World")));
256    /// ```
257    #[inline]
258    pub fn back(&self) -> Option<(&K, &V)> {
259        self.head.last().item_ref()
260    }
261
262    /// Provides a reference to the back element, or `None` if the skipmap is
263    /// empty.
264    ///
265    /// The reference to the key remains immutable as the keys must remain
266    /// sorted.
267    ///
268    /// # Examples
269    ///
270    /// ```
271    /// use skiplist::SkipMap;
272    ///
273    /// let mut skipmap = SkipMap::new();
274    /// assert!(skipmap.back().is_none());
275    ///
276    /// skipmap.insert(1, "Hello");
277    /// skipmap.insert(2, "World");
278    /// assert_eq!(skipmap.back_mut(), Some((&2, &mut "World")));
279    /// ```
280    #[inline]
281    pub fn back_mut(&mut self) -> Option<(&K, &mut V)> {
282        self.head.last_mut().item_mut()
283    }
284
285    /// Provides a reference to the element at the given index, or `None` if the
286    /// skipmap is empty or the index is out of bounds.
287    ///
288    /// # Examples
289    ///
290    /// ```
291    /// use skiplist::SkipMap;
292    ///
293    /// let mut skipmap = SkipMap::new();
294    /// assert!(skipmap.get(&0).is_none());
295    /// skipmap.extend((0..10).map(|x| (x, x)));
296    /// assert_eq!(skipmap.get(&0), Some(&0));
297    /// assert!(skipmap.get(&10).is_none());
298    /// ```
299    #[inline]
300    pub fn get<Q>(&self, key: &Q) -> Option<&V>
301    where
302        K: Borrow<Q>,
303        Q: Ord + ?Sized,
304    {
305        self.find_key(key).and_then(|node| node.value_ref())
306    }
307
308    /// Provides a reference to the element at the given index, or `None` if the
309    /// skipmap is empty or the index is out of bounds.
310    ///
311    /// # Examples
312    ///
313    /// ```
314    /// use skiplist::SkipMap;
315    ///
316    /// let mut skipmap = SkipMap::new();
317    /// assert!(skipmap.get(&0).is_none());
318    /// skipmap.extend((0..10).map(|x| (x, x)));
319    /// assert_eq!(skipmap.get_mut(&0), Some(&mut 0));
320    /// assert!(skipmap.get_mut(&10).is_none());
321    ///
322    /// match skipmap.get_mut(&0) {
323    ///     Some(x) => *x = 100,
324    ///     None => (),
325    /// }
326    /// assert_eq!(skipmap.get(&0), Some(&100));
327    /// ```
328    #[inline]
329    pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
330    where
331        K: Borrow<Q>,
332        Q: Ord + ?Sized,
333    {
334        self.find_key_mut(key).and_then(|node| node.value_mut())
335    }
336
337    /// Removes the first element and returns it, or `None` if the sequence is
338    /// empty.
339    ///
340    /// # Examples
341    ///
342    /// ```
343    /// use skiplist::SkipMap;
344    ///
345    /// let mut skipmap = SkipMap::new();
346    /// skipmap.insert(1, "Hello");
347    /// skipmap.insert(2, "World");
348    ///
349    /// assert_eq!(skipmap.pop_front(), Some((1, "Hello")));
350    /// assert_eq!(skipmap.pop_front(), Some((2, "World")));
351    /// assert!(skipmap.pop_front().is_none());
352    /// ```
353    #[inline]
354    pub fn pop_front(&mut self) -> Option<(K, V)> {
355        if self.is_empty() {
356            None
357        } else {
358            Some(self.remove_index(0))
359        }
360    }
361
362    /// Removes the last element and returns it, or `None` if the sequence is
363    /// empty.
364    ///
365    /// # Examples
366    ///
367    /// ```
368    /// use skiplist::SkipMap;
369    ///
370    /// let mut skipmap = SkipMap::new();
371    /// skipmap.insert(1, "Hello");
372    /// skipmap.insert(2, "World");
373    ///
374    /// assert_eq!(skipmap.pop_back(), Some((2, "World")));
375    /// assert_eq!(skipmap.pop_back(), Some((1, "Hello")));
376    /// assert!(skipmap.pop_back().is_none());
377    /// ```
378    #[inline]
379    pub fn pop_back(&mut self) -> Option<(K, V)> {
380        let len = self.len();
381        if len > 0 {
382            Some(self.remove_index(len - 1))
383        } else {
384            None
385        }
386    }
387
388    /// Returns true if the value is contained in the skipmap.
389    ///
390    /// # Examples
391    ///
392    /// ```
393    /// use skiplist::SkipMap;
394    ///
395    /// let mut skipmap = SkipMap::new();
396    /// skipmap.extend((0..10).map(|x| (x, x)));
397    /// assert!(skipmap.contains_key(&4));
398    /// assert!(!skipmap.contains_key(&15));
399    /// ```
400    pub fn contains_key<Q>(&self, key: &Q) -> bool
401    where
402        K: Borrow<Q>,
403        Q: Ord + ?Sized,
404    {
405        self.find_key(key).is_some()
406    }
407
408    /// Removes and returns an element with the same value or None if there are
409    /// no such values in the skipmap.
410    ///
411    /// # Examples
412    ///
413    /// ```
414    /// use skiplist::SkipMap;
415    ///
416    /// let mut skipmap = SkipMap::new();
417    /// skipmap.extend((0..10).map(|x| (x, x)));
418    /// assert_eq!(skipmap.remove(&4), Some(4)); // Removes the last one
419    /// assert!(skipmap.remove(&4).is_none());    // No more '4' left
420    /// ```
421    pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
422    where
423        K: Borrow<Q>,
424        Q: Ord + ?Sized,
425    {
426        let remover = Remover(key);
427        match remover.act(self.head.as_mut()) {
428            Ok(node) => {
429                self.len -= 1;
430                node.into_inner().map(|(_key, val)| val)
431            }
432            Err(_) => None,
433        }
434    }
435
436    /// Removes and returns an element with the given index.
437    ///
438    /// # Panics
439    ///
440    /// Panics is the index is out of bounds.
441    ///
442    /// # Examples
443    ///
444    /// ```
445    /// use skiplist::SkipMap;
446    ///
447    /// let mut skipmap = SkipMap::new();
448    /// skipmap.extend((0..10).map(|x| (x, x)));
449    /// assert_eq!(skipmap.remove_index(4), (4, 4));
450    /// assert_eq!(skipmap.remove_index(4), (5, 5));
451    /// ```
452    pub fn remove_index(&mut self, index: usize) -> (K, V) {
453        if index >= self.len() {
454            panic!("Index out of bounds.");
455        } else {
456            let node = self.head.remove_at(index).unwrap();
457            self.len -= 1;
458            node.into_inner().unwrap()
459        }
460    }
461
462    /// Get an owning iterator over the entries of the skipmap.
463    ///
464    /// # Examples
465    ///
466    /// ```
467    /// use skiplist::SkipMap;
468    ///
469    /// let mut skipmap = SkipMap::new();
470    /// skipmap.extend((0..10).map(|x| (x, x)));
471    /// for (k, v) in skipmap.into_iter() {
472    ///     println!("Key {}, Value: {}", k, v);
473    /// }
474    /// ```
475    #[allow(clippy::should_implement_trait)]
476    pub fn into_iter(mut self) -> IntoIter<(K, V)> {
477        let len = self.len();
478        unsafe { IntoIter::from_head(&mut self.head, len) }
479    }
480
481    /// Creates an iterator over the entries of the skipmap.
482    ///
483    /// # Examples
484    ///
485    /// ```
486    /// use skiplist::SkipMap;
487    ///
488    /// let mut skipmap = SkipMap::new();
489    /// skipmap.extend((0..10).map(|x| (x, x)));
490    /// for (k, v) in skipmap.iter() {
491    ///     println!("Key: {}, Value: {}", k, v);
492    /// }
493    /// ```
494    pub fn iter(&self) -> Iter<K, V> {
495        let len = self.len();
496        unsafe { Iter::from_head(&self.head, len) }
497    }
498
499    /// Creates an mutable iterator over the entries of the skipmap.
500    ///
501    /// The keys cannot be modified as they must remain in order.
502    ///
503    /// # Examples
504    ///
505    /// ```
506    /// use skiplist::SkipMap;
507    ///
508    /// let mut skipmap = SkipMap::new();
509    /// skipmap.extend((0..10).map(|x| (x, x)));
510    /// for (k, v) in skipmap.iter_mut() {
511    ///     println!("Key: {}, Value: {}", k, v);
512    /// }
513    /// ```
514    pub fn iter_mut(&mut self) -> IterMut<K, V> {
515        let len = self.len();
516        unsafe { IterMut::from_head(&mut self.head, len) }
517    }
518
519    /// Creates an iterator over the keys of the skipmap.
520    ///
521    /// # Examples
522    ///
523    /// ```
524    /// use skiplist::SkipMap;
525    ///
526    /// let mut skipmap = SkipMap::new();
527    /// skipmap.extend((0..10).map(|x| (x, x)));
528    /// for k in skipmap.keys() {
529    ///     println!("Key: {}", k);
530    /// }
531    /// ```
532    pub fn keys(&self) -> Keys<K, V> {
533        Keys(self.iter())
534    }
535
536    /// Creates an iterator over the values of the skipmap.
537    ///
538    /// # Examples
539    ///
540    /// ```
541    /// use skiplist::SkipMap;
542    ///
543    /// let mut skipmap = SkipMap::new();
544    /// skipmap.extend((0..10).map(|x| (x, x)));
545    /// for v in skipmap.values() {
546    ///     println!("Value: {}", v);
547    /// }
548    /// ```
549    pub fn values(&self) -> Values<K, V> {
550        Values(self.iter())
551    }
552
553    /// Constructs a double-ended iterator over a sub-range of elements in the
554    /// skipmap, starting at min, and ending at max. If min is `Unbounded`, then
555    /// it will be treated as "negative infinity", and if max is `Unbounded`,
556    /// then it will be treated as "positive infinity".  Thus range(Unbounded,
557    /// Unbounded) will yield the whole collection.
558    ///
559    /// # Examples
560    ///
561    /// ```
562    /// use skiplist::SkipMap;
563    /// use std::ops::Bound::{Included, Unbounded};
564    ///
565    /// let mut skipmap = SkipMap::new();
566    /// skipmap.extend((0..10).map(|x| (x, x)));
567    /// for (k, v) in skipmap.range(Included(&3), Included(&7)) {
568    ///     println!("Key: {}, Value: {}", k, v);
569    /// }
570    /// assert_eq!(Some((&4, &4)), skipmap.range(Included(&4), Unbounded).next());
571    /// ```
572    pub fn range<Q>(&self, min: Bound<&Q>, max: Bound<&Q>) -> Iter<K, V>
573    where
574        K: Borrow<Q>,
575        Q: Ord,
576    {
577        let iter_inner = self._range(min, max).unwrap_or(skipnode::Iter {
578            first: None,
579            last: None,
580            size: 0,
581        });
582        Iter(iter_inner)
583    }
584
585    fn _range<Q>(&self, min: Bound<&Q>, max: Bound<&Q>) -> Option<skipnode::Iter<(K, V)>>
586    where
587        K: Borrow<Q>,
588        Q: Ord,
589    {
590        let (first, first_distance_from_head) = self._lower_bound(min)?;
591        let (last, last_distance_from_head) = self._upper_bound(max);
592        let size = last_distance_from_head.checked_sub(first_distance_from_head)? + 1;
593        Some(skipnode::Iter {
594            first: Some(first),
595            last: Some(last),
596            size,
597        })
598    }
599
600    /// Returns an `Option<&V>` pointing to the lowest element whose key is above
601    /// the given bound. If no such element is found then `None` is
602    /// returned.
603    ///
604    /// # Examples
605    ///
606    /// ```
607    /// use skiplist::SkipMap;
608    /// use std::ops::Bound::{Included, Excluded, Unbounded};
609    ///
610    /// let mut skipmap = SkipMap::new();
611    /// skipmap.extend((0..10).map(|x| (x, x)));
612    ///
613    /// assert_eq!(skipmap.lower_bound(Unbounded), Some((&0, &0)));
614    /// assert_eq!(skipmap.lower_bound(Excluded(&0)), Some((&1, &1)));
615    /// assert_eq!(skipmap.lower_bound(Included(&0)), Some((&0, &0)));
616    /// assert_eq!(skipmap.lower_bound(Included(&10)), None);
617    /// ```
618    pub fn lower_bound<Q>(&self, min: Bound<&Q>) -> Option<(&K, &V)>
619    where
620        K: Borrow<Q>,
621        Q: Ord,
622    {
623        self._lower_bound(min).and_then(|(node, _)| node.item_ref())
624    }
625
626    /// Returns an `Option<&V>` pointing to the highest element whose key is above
627    /// the given bound. If no such element is found then `None` is
628    /// returned.
629    ///
630    /// # Examples
631    ///
632    /// ```
633    /// use skiplist::SkipMap;
634    /// use std::ops::Bound::{Included, Excluded, Unbounded};
635    ///
636    /// let mut skipmap = SkipMap::new();
637    /// skipmap.extend((0..10).map(|x| (x, x)));
638    ///
639    /// assert_eq!(skipmap.upper_bound(Unbounded), Some((&9, &9)));
640    /// assert_eq!(skipmap.upper_bound(Excluded(&9)), Some((&8, &8)));
641    /// assert_eq!(skipmap.upper_bound(Included(&9)), Some((&9, &9)));
642    /// assert_eq!(skipmap.upper_bound(Excluded(&0)), None);
643    /// ```
644    pub fn upper_bound<Q>(&self, max: Bound<&Q>) -> Option<(&K, &V)>
645    where
646        K: Borrow<Q>,
647        Q: Ord,
648    {
649        self._upper_bound(max).0.item_ref()
650    }
651
652    fn _lower_bound<Q>(&self, min: Bound<&Q>) -> Option<(&SkipNode<K, V>, usize)>
653    where
654        K: Borrow<Q>,
655        Q: Ord,
656    {
657        Some(match min {
658            Bound::Unbounded => (self.head.next_ref()?, 1usize),
659            Bound::Included(min) => {
660                let (last_lt, last_lt_from_head) = self.head.find_last_lt_with(cmp, min);
661                let first_ge = last_lt.next_ref()?;
662                (first_ge, last_lt_from_head + 1)
663            }
664            Bound::Excluded(min) => {
665                let (last_le, last_le_from_head) = self.head.find_last_le_with(cmp, min);
666                let first_gt = last_le.next_ref()?;
667                (first_gt, last_le_from_head + 1)
668            }
669        })
670    }
671
672    fn _upper_bound<Q>(&self, max: Bound<&Q>) -> (&SkipNode<K, V>, usize)
673    where
674        K: Borrow<Q>,
675        Q: Ord,
676    {
677        match max {
678            Bound::Unbounded => (self.head.last(), self.len()),
679            Bound::Included(max) => self.head.find_last_le_with(cmp, max),
680            Bound::Excluded(max) => self.head.find_last_lt_with(cmp, max),
681        }
682    }
683}
684
685fn cmp<Q: Ord, K: Borrow<Q>, V>(node_item: &(K, V), target: &Q) -> Ordering {
686    node_item.0.borrow().cmp(target)
687}
688
689// ///////////////////////////////////////////////
690// Internal methods
691// ///////////////////////////////////////////////
692
693impl<K: Ord, V> SkipMap<K, V> {
694    /// Checks the integrity of the skipmap.
695    #[allow(dead_code)]
696    fn check(&self) {
697        self.head.check();
698        if let Some(mut node) = self.head.next_ref() {
699            let mut key = node.key_ref().unwrap();
700            while let Some(next_node) = node.next_ref() {
701                let next_key = next_node.key_ref().unwrap();
702                assert!(key <= next_key);
703                node = next_node;
704                key = next_key;
705            }
706        }
707    }
708}
709
710impl<K, V> SkipMap<K, V> {
711    /// Find the reference to the node equal to the given key.
712    fn find_key<Q>(&self, key: &Q) -> Option<&SkipNode<K, V>>
713    where
714        K: Borrow<Q>,
715        Q: Ord + ?Sized,
716    {
717        let (last_le, _) = self.head.find_last_le_with(
718            |(node_key, _), target| Ord::cmp(node_key.borrow(), target),
719            key,
720        );
721        let node_key = last_le.key_ref()?;
722        if node_key.borrow() == key {
723            Some(last_le)
724        } else {
725            None
726        }
727    }
728
729    /// Find the mutable reference to the node equal to the given key.
730    fn find_key_mut<Q>(&mut self, key: &Q) -> Option<&mut SkipNode<K, V>>
731    where
732        K: Borrow<Q>,
733        Q: Ord + ?Sized,
734    {
735        let (last_le, _) = self.head.find_last_le_with_mut(
736            |(node_key, _), target| Ord::cmp(node_key.borrow(), target),
737            key,
738        );
739        let node_key = last_le.key_ref()?;
740        if node_key.borrow() == key {
741            Some(last_le)
742        } else {
743            None
744        }
745    }
746
747    /// Gets a reference to the node with the given index.
748    fn get_index(&self, index: usize) -> Option<&SkipNode<K, V>> {
749        self.head.advance(index + 1)
750    }
751
752    /// Gets a mutable reference to the node with the given index.
753    fn get_index_mut(&mut self, index: usize) -> Option<&mut SkipNode<K, V>> {
754        self.head.advance_mut(index + 1)
755    }
756}
757
758impl<K, V> SkipMap<K, V>
759where
760    K: fmt::Debug,
761    V: fmt::Debug,
762{
763    /// Prints out the internal structure of the skipmap (for debugging
764    /// purposes).
765    #[allow(dead_code)]
766    fn debug_structure(&self) {
767        unsafe {
768            let mut node: *const SkipNode<K, V> = mem::transmute_copy(&self.head);
769            let mut rows: Vec<_> = iter::repeat(String::new())
770                .take(self.level_generator.total())
771                .collect();
772
773            loop {
774                let value = match ((*node).key_ref(), (*node).value_ref()) {
775                    (Some(k), Some(v)) => {
776                        format!("> ({:?}, {:?})", k, v)
777                    }
778                    _ => "> ()".to_string(),
779                };
780
781                let max_str_len = format!("{} -{}-", value, (*node).links_len[(*node).level]).len();
782
783                let mut lvl = self.level_generator.total();
784                while lvl > 0 {
785                    lvl -= 1;
786
787                    let mut value_len = if lvl <= (*node).level {
788                        format!("{} -{}-", value, (*node).links_len[lvl])
789                    } else {
790                        format!("{} -", value)
791                    };
792                    for _ in 0..(max_str_len - value_len.len()) {
793                        value_len.push('-');
794                    }
795
796                    let mut dashes = String::new();
797                    for _ in 0..value_len.len() {
798                        dashes.push('-');
799                    }
800
801                    if lvl <= (*node).level {
802                        rows[lvl].push_str(value_len.as_ref());
803                    } else {
804                        rows[lvl].push_str(dashes.as_ref());
805                    }
806                }
807
808                match (*node).links[0].and_then(|p| p.as_ptr().as_ref()) {
809                    Some(next) => {
810                        node = next;
811                    }
812                    _ => {
813                        break;
814                    }
815                }
816            }
817
818            for row in rows.iter().rev() {
819                println!("{}", row);
820            }
821        }
822    }
823}
824
825// ///////////////////////////////////////////////
826// List Actions
827// ///////////////////////////////////////////////
828
829struct InsertOrReplace<K, V, MakeNode>
830where
831    K: Ord,
832    MakeNode: FnOnce(K, V) -> Box<SkipNode<K, V>>,
833{
834    key: K,
835    value: V,
836    make_node: MakeNode,
837}
838
839impl<K, V, MakeNode> InsertOrReplace<K, V, MakeNode>
840where
841    K: Ord,
842    MakeNode: FnOnce(K, V) -> Box<SkipNode<K, V>>,
843{
844    fn new(key: K, value: V, make_node: MakeNode) -> Self {
845        Self {
846            key,
847            value,
848            make_node,
849        }
850    }
851}
852
853impl<'a, K: 'a, V: 'a, MakeNode> SkipListAction<'a, (K, V)> for InsertOrReplace<K, V, MakeNode>
854where
855    K: Ord,
856    MakeNode: FnOnce(K, V) -> Box<SkipNode<K, V>>,
857{
858    type Ok = &'a mut SkipNode<K, V>;
859    type Err = V;
860    fn fail(self) -> Self::Err {
861        panic!("This action should never fail")
862    }
863    fn seek(
864        &mut self,
865        node: &'a mut SkipNode<K, V>,
866        level: usize,
867    ) -> Option<(&'a mut SkipNode<K, V>, usize)> {
868        Some(node.advance_while_at_level_mut(level, |_, next_node| {
869            let next_key = next_node.key_ref().unwrap();
870            let target_key = &self.key;
871            next_key < target_key
872        }))
873    }
874
875    unsafe fn act_on_node(self, node: &'a mut SkipNode<K, V>) -> Result<Self::Ok, Self::Err> {
876        unsafe {
877            let target_key = &self.key;
878            if let Some(target_node) = node.next_mut() {
879                if let Some(node_key) = target_node.key_ref() {
880                    if target_key == node_key {
881                        let old_value = mem::replace(target_node.value_mut().unwrap(), self.value);
882                        return Err(old_value);
883                    }
884                }
885            }
886            let new_node = (self.make_node)(self.key, self.value);
887            node.insert_next(new_node);
888            Ok(node.next_mut().unwrap())
889        }
890    }
891    fn fixup(
892        level: usize,
893        level_head: &'a mut SkipNode<K, V>,
894        distance_to_target: usize,
895        action_result: &mut Self::Ok,
896    ) {
897        insertion_fixup(level, level_head, distance_to_target, action_result)
898    }
899}
900
901struct Remover<'a, Q: ?Sized>(&'a Q);
902
903impl<'a, Q: Ord + ?Sized, K: Borrow<Q>, V> SkipListAction<'a, (K, V)> for Remover<'a, Q> {
904    type Ok = Box<SkipNode<K, V>>;
905    type Err = ();
906    #[allow(clippy::unused_unit)]
907    fn fail(self) -> Self::Err {
908        ()
909    }
910
911    fn seek(
912        &mut self,
913        node: &'a mut SkipNode<K, V>,
914        level: usize,
915    ) -> Option<(&'a mut SkipNode<K, V>, usize)> {
916        Some(node.advance_while_at_level_mut(level, |_, next_node| {
917            let next_key = next_node.key_ref().unwrap().borrow();
918            let target_key = self.0;
919            next_key < target_key
920        }))
921    }
922
923    unsafe fn act_on_node(
924        self,
925        target_parent: &'a mut SkipNode<K, V>,
926    ) -> Result<Self::Ok, Self::Err> {
927        unsafe {
928            let node_key = target_parent
929                .next_mut()
930                .and_then(|node| node.key_ref())
931                .ok_or(())?
932                .borrow();
933            let target_key = self.0;
934            if node_key == target_key {
935                Ok(target_parent.take_next().unwrap())
936            } else {
937                Err(())
938            }
939        }
940    }
941    fn fixup(
942        level: usize,
943        level_head: &'a mut SkipNode<K, V>,
944        _distance: usize,
945        action_result: &mut Self::Ok,
946    ) {
947        skipnode::removal_fixup(level, level_head, action_result)
948    }
949}
950
951// ///////////////////////////////////////////////
952// Trait implementation
953// ///////////////////////////////////////////////
954
955unsafe impl<K: Send, V: Send> Send for SkipMap<K, V> {}
956unsafe impl<K: Sync, V: Sync> Sync for SkipMap<K, V> {}
957
958impl<K: Ord, V> default::Default for SkipMap<K, V> {
959    fn default() -> SkipMap<K, V> {
960        SkipMap::new()
961    }
962}
963
964/// This implementation of PartialEq only checks that the *values* are equal; it
965/// does not check for equivalence of other features (such as the ordering
966/// function and the node levels). Furthermore, this uses `T`'s implementation
967/// of PartialEq and *does not* use the owning skipmap's comparison function.
968impl<AK, AV, BK, BV> cmp::PartialEq<SkipMap<BK, BV>> for SkipMap<AK, AV>
969where
970    AK: cmp::PartialEq<BK>,
971    AV: cmp::PartialEq<BV>,
972{
973    #[inline]
974    fn eq(&self, other: &SkipMap<BK, BV>) -> bool {
975        self.len() == other.len()
976            && self
977                .iter()
978                .zip(other.iter())
979                .all(|(x, y)| x.0 == y.0 && x.1 == y.1)
980    }
981    #[allow(clippy::partialeq_ne_impl)]
982    #[inline]
983    fn ne(&self, other: &SkipMap<BK, BV>) -> bool {
984        self.len() != other.len()
985            || self
986                .iter()
987                .zip(other.iter())
988                .any(|(x, y)| x.0 != y.0 || x.1 != y.1)
989    }
990}
991
992impl<K, V> cmp::Eq for SkipMap<K, V>
993where
994    K: cmp::Eq,
995    V: cmp::Eq,
996{
997}
998
999impl<AK, AV, BK, BV> cmp::PartialOrd<SkipMap<BK, BV>> for SkipMap<AK, AV>
1000where
1001    AK: cmp::PartialOrd<BK>,
1002    AV: cmp::PartialOrd<BV>,
1003{
1004    #[inline]
1005    fn partial_cmp(&self, other: &SkipMap<BK, BV>) -> Option<Ordering> {
1006        match self
1007            .iter()
1008            .map(|x| x.0)
1009            .partial_cmp(other.iter().map(|x| x.0))
1010        {
1011            None => None,
1012            Some(Ordering::Less) => Some(Ordering::Less),
1013            Some(Ordering::Greater) => Some(Ordering::Greater),
1014            Some(Ordering::Equal) => self
1015                .iter()
1016                .map(|x| x.1)
1017                .partial_cmp(other.iter().map(|x| x.1)),
1018        }
1019    }
1020}
1021
1022impl<K, V> Ord for SkipMap<K, V>
1023where
1024    K: cmp::Ord,
1025    V: cmp::Ord,
1026{
1027    #[inline]
1028    fn cmp(&self, other: &SkipMap<K, V>) -> Ordering {
1029        self.iter().cmp(other)
1030    }
1031}
1032
1033impl<K, V> Extend<(K, V)> for SkipMap<K, V>
1034where
1035    K: Ord,
1036{
1037    #[inline]
1038    fn extend<I: iter::IntoIterator<Item = (K, V)>>(&mut self, iterable: I) {
1039        let iterator = iterable.into_iter();
1040        for element in iterator {
1041            self.insert(element.0, element.1);
1042        }
1043    }
1044}
1045
1046impl<K, V> ops::Index<usize> for SkipMap<K, V> {
1047    type Output = V;
1048
1049    fn index(&self, index: usize) -> &V {
1050        self.get_index(index)
1051            .and_then(|node| node.value_ref())
1052            .expect("Index out of bounds")
1053    }
1054}
1055
1056impl<K, V> ops::IndexMut<usize> for SkipMap<K, V> {
1057    fn index_mut(&mut self, index: usize) -> &mut V {
1058        self.get_index_mut(index)
1059            .and_then(|node| node.value_mut())
1060            .expect("Index out of bounds")
1061    }
1062}
1063
1064impl<K, V> fmt::Debug for SkipMap<K, V>
1065where
1066    K: fmt::Debug,
1067    V: fmt::Debug,
1068{
1069    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1070        write!(f, "[")?;
1071
1072        for (i, (k, v)) in self.iter().enumerate() {
1073            if i != 0 {
1074                write!(f, ", ")?;
1075            }
1076            write!(f, "({:?}, {:?})", k, v)?;
1077        }
1078        write!(f, "]")
1079    }
1080}
1081
1082impl<K, V> fmt::Display for SkipMap<K, V>
1083where
1084    K: fmt::Display,
1085    V: fmt::Display,
1086{
1087    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1088        write!(f, "[")?;
1089
1090        for (i, (k, v)) in self.iter().enumerate() {
1091            if i != 0 {
1092                write!(f, ", ")?;
1093            }
1094            write!(f, "({}, {})", k, v)?;
1095        }
1096        write!(f, "]")
1097    }
1098}
1099
1100impl<K, V> iter::IntoIterator for SkipMap<K, V> {
1101    type Item = (K, V);
1102    type IntoIter = IntoIter<(K, V)>;
1103
1104    fn into_iter(self) -> Self::IntoIter {
1105        self.into_iter()
1106    }
1107}
1108impl<'a, K, V> iter::IntoIterator for &'a SkipMap<K, V> {
1109    type Item = (&'a K, &'a V);
1110    type IntoIter = Iter<'a, K, V>;
1111
1112    fn into_iter(self) -> Self::IntoIter {
1113        self.iter()
1114    }
1115}
1116impl<'a, K, V> iter::IntoIterator for &'a mut SkipMap<K, V> {
1117    type Item = (&'a K, &'a mut V);
1118    type IntoIter = IterMut<'a, K, V>;
1119
1120    fn into_iter(self) -> IterMut<'a, K, V> {
1121        self.iter_mut()
1122    }
1123}
1124
1125impl<K, V> iter::FromIterator<(K, V)> for SkipMap<K, V>
1126where
1127    K: Ord,
1128{
1129    #[inline]
1130    fn from_iter<I>(iter: I) -> SkipMap<K, V>
1131    where
1132        I: iter::IntoIterator<Item = (K, V)>,
1133    {
1134        let mut skipmap = SkipMap::new();
1135        skipmap.extend(iter);
1136        skipmap
1137    }
1138}
1139
1140impl<K: Hash, V: Hash> Hash for SkipMap<K, V> {
1141    #[inline]
1142    fn hash<H: hash::Hasher>(&self, state: &mut H) {
1143        for elt in self {
1144            elt.hash(state);
1145        }
1146    }
1147}
1148
1149// ///////////////////////////////////////////////
1150// Extra structs
1151// ///////////////////////////////////////////////
1152//
1153
1154/// An iterator for [SkipMap]
1155pub struct Iter<'a, K: 'a, V: 'a>(skipnode::Iter<'a, (K, V)>);
1156
1157impl<'a, K: 'a, V: 'a> Iter<'a, K, V> {
1158    /// SAFETY: There must be `len` nodes after head.
1159    unsafe fn from_head(head: &'a SkipNode<K, V>, len: usize) -> Self {
1160        unsafe { Self(skipnode::Iter::from_head(head, len)) }
1161    }
1162}
1163
1164impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> {
1165    type Item = (&'a K, &'a V);
1166    fn next(&mut self) -> Option<Self::Item> {
1167        self.0.next().map(|x| (&x.0, &x.1))
1168    }
1169    fn size_hint(&self) -> (usize, Option<usize>) {
1170        self.0.size_hint()
1171    }
1172}
1173
1174impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
1175    fn next_back(&mut self) -> Option<Self::Item> {
1176        self.0.next_back().map(|x| (&x.0, &x.1))
1177    }
1178}
1179
1180/// A mutable iterator for [SkipMap]
1181pub struct IterMut<'a, K: 'a, V: 'a>(skipnode::IterMut<'a, (K, V)>);
1182
1183impl<'a, K: 'a, V: 'a> IterMut<'a, K, V> {
1184    /// SAFETY: There must be `len` nodes after head.
1185    unsafe fn from_head(head: &'a mut SkipNode<K, V>, len: usize) -> Self {
1186        unsafe { Self(skipnode::IterMut::from_head(head, len)) }
1187    }
1188}
1189
1190impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> {
1191    type Item = (&'a K, &'a mut V);
1192    fn next(&mut self) -> Option<Self::Item> {
1193        self.0.next().map(|x| (&x.0, &mut x.1))
1194    }
1195    fn size_hint(&self) -> (usize, Option<usize>) {
1196        self.0.size_hint()
1197    }
1198}
1199
1200impl<'a, K: 'a, V: 'a> DoubleEndedIterator for IterMut<'a, K, V> {
1201    fn next_back(&mut self) -> Option<Self::Item> {
1202        self.0.next_back().map(|x| (&x.0, &mut x.1))
1203    }
1204}
1205
1206/// Iterator over a [`SkipMap`]'s keys.
1207pub struct Keys<'a, K: 'a, V>(Iter<'a, K, V>);
1208
1209impl<'a, K: 'a, V> Iterator for Keys<'a, K, V> {
1210    type Item = &'a K;
1211    fn next(&mut self) -> Option<Self::Item> {
1212        self.0.next().map(|x| x.0)
1213    }
1214    fn size_hint(&self) -> (usize, Option<usize>) {
1215        self.0.size_hint()
1216    }
1217}
1218
1219impl<'a, K: 'a, V> DoubleEndedIterator for Keys<'a, K, V> {
1220    fn next_back(&mut self) -> Option<Self::Item> {
1221        self.0.next_back().map(|x| x.0)
1222    }
1223}
1224
1225/// Iterator over a [`SkipMap`]'s values.
1226pub struct Values<'a, K, V: 'a>(Iter<'a, K, V>);
1227
1228impl<'a, K, V: 'a> Iterator for Values<'a, K, V> {
1229    type Item = &'a V;
1230    fn next(&mut self) -> Option<Self::Item> {
1231        self.0.next().map(|x| x.1)
1232    }
1233    fn size_hint(&self) -> (usize, Option<usize>) {
1234        self.0.size_hint()
1235    }
1236}
1237
1238impl<'a, K, V: 'a> DoubleEndedIterator for Values<'a, K, V> {
1239    fn next_back(&mut self) -> Option<Self::Item> {
1240        self.0.next_back().map(|x| x.1)
1241    }
1242}
1243
1244// ////////////////////////////////////////////////////////////////////////////
1245// Tests
1246// ////////////////////////////////////////////////////////////////////////////
1247
1248#[cfg(test)]
1249mod tests {
1250    use std::ops::Bound::{self, Excluded, Included, Unbounded};
1251
1252    use super::SkipMap;
1253
1254    #[test]
1255    fn basic_small() {
1256        let mut sm: SkipMap<i64, i64> = SkipMap::new();
1257        sm.check();
1258        assert!(sm.remove(&1).is_none());
1259        sm.check();
1260        assert!(sm.insert(1, 0).is_none());
1261        sm.check();
1262        assert_eq!(sm.insert(1, 5), Some(0));
1263        sm.check();
1264        assert_eq!(sm.remove(&1), Some(5));
1265        sm.check();
1266        assert!(sm.insert(1, 10).is_none());
1267        sm.check();
1268        assert!(sm.insert(2, 20).is_none());
1269        sm.check();
1270        assert_eq!(sm.remove(&1), Some(10));
1271        sm.check();
1272        assert_eq!(sm.remove(&2), Some(20));
1273        sm.check();
1274        assert!(sm.remove(&1).is_none());
1275        sm.check();
1276    }
1277
1278    #[test]
1279    fn basic_large() {
1280        let size = 10_000;
1281        let mut sm = SkipMap::with_capacity(size);
1282        assert!(sm.is_empty());
1283
1284        for i in 0..size {
1285            sm.insert(i, i * 10);
1286            assert_eq!(sm.len(), i + 1);
1287        }
1288        sm.check();
1289
1290        for i in 0..size {
1291            assert_eq!(sm.remove(&i), Some(i * 10));
1292            assert_eq!(sm.len(), size - i - 1);
1293        }
1294        sm.check();
1295    }
1296
1297    #[test]
1298    fn insert_existing() {
1299        let size = 100;
1300        let mut sm = SkipMap::new();
1301
1302        for i in 0..size {
1303            assert!(sm.insert(i, format!("{}", i)).is_none());
1304        }
1305
1306        for i in 0..size {
1307            assert_eq!(sm.insert(i, format!("{}", i)), Some(format!("{}", i)));
1308        }
1309        for i in (0..size).rev() {
1310            assert_eq!(sm.insert(i, format!("{}", i)), Some(format!("{}", i)));
1311        }
1312    }
1313
1314    #[test]
1315    fn clear() {
1316        let mut sm: SkipMap<_, _> = (0..100).map(|x| (x, x)).collect();
1317        assert_eq!(sm.len(), 100);
1318        sm.clear();
1319        sm.check();
1320        assert!(sm.is_empty());
1321    }
1322
1323    #[test]
1324    fn iter() {
1325        let size = 10000;
1326
1327        let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1328
1329        fn test<T>(size: usize, mut iter: T)
1330        where
1331            T: Iterator<Item = (usize, usize)>,
1332        {
1333            for i in 0..size {
1334                assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
1335                assert_eq!(iter.next().unwrap(), (i, i));
1336            }
1337            assert_eq!(iter.size_hint(), (0, Some(0)));
1338            assert!(iter.next().is_none());
1339        }
1340        test(size, sm.iter().map(|(&a, &b)| (a, b)));
1341        test(size, sm.iter_mut().map(|(&a, &mut b)| (a, b)));
1342        test(size, sm.into_iter());
1343    }
1344
1345    #[test]
1346    fn iter_rev() {
1347        let size = 1000;
1348
1349        let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1350
1351        fn test<T>(size: usize, mut iter: T)
1352        where
1353            T: Iterator<Item = (usize, usize)>,
1354        {
1355            for i in 0..size {
1356                assert_eq!(iter.size_hint(), (size - i, Some(size - i)));
1357                assert_eq!(iter.next().unwrap(), (size - i - 1, size - i - 1));
1358            }
1359            assert_eq!(iter.size_hint(), (0, Some(0)));
1360            assert!(iter.next().is_none());
1361        }
1362        test(size, sm.iter().rev().map(|(&a, &b)| (a, b)));
1363        test(size, sm.iter_mut().rev().map(|(&a, &mut b)| (a, b)));
1364        test(size, sm.into_iter().rev());
1365    }
1366
1367    #[test]
1368    fn iter_mixed() {
1369        let size = 1000;
1370        let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1371
1372        fn test<T>(size: usize, mut iter: T)
1373        where
1374            T: Iterator<Item = (usize, usize)> + DoubleEndedIterator,
1375        {
1376            for i in 0..size / 4 {
1377                assert_eq!(iter.size_hint(), (size - i * 2, Some(size - i * 2)));
1378                assert_eq!(iter.next().unwrap(), (i, i));
1379                assert_eq!(iter.next_back().unwrap(), (size - i - 1, size - i - 1));
1380            }
1381            for i in size / 4..size * 3 / 4 {
1382                assert_eq!(iter.size_hint(), (size * 3 / 4 - i, Some(size * 3 / 4 - i)));
1383                assert_eq!(iter.next().unwrap(), (i, i));
1384            }
1385            assert_eq!(iter.size_hint(), (0, Some(0)));
1386            assert!(iter.next().is_none());
1387        }
1388        test(size, sm.iter().map(|(&a, &b)| (a, b)));
1389        test(size, sm.iter_mut().map(|(&a, &mut b)| (a, b)));
1390        test(size, sm.into_iter());
1391    }
1392
1393    #[test]
1394    fn iter_key_val() {
1395        let size = 1000;
1396        let sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1397
1398        let mut keys = sm.keys();
1399        for i in 0..size / 2 {
1400            assert_eq!(keys.next(), Some(&i));
1401        }
1402        for i in 0..size / 2 {
1403            assert_eq!(keys.next_back(), Some(&(size - i - 1)))
1404        }
1405        assert!(keys.next().is_none());
1406
1407        let mut vals = sm.values();
1408        for i in 0..size / 2 {
1409            assert_eq!(vals.next(), Some(&(2 * i)));
1410        }
1411        for i in 0..size / 2 {
1412            assert_eq!(vals.next_back(), Some(&(2 * (size - i) - 2)))
1413        }
1414        assert!(vals.next().is_none());
1415    }
1416
1417    #[test]
1418    fn range_small() {
1419        let size = 5;
1420
1421        let sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1422
1423        let mut j = 0;
1424        for ((&k, &v), i) in sm.range(Included(&2), Unbounded).zip(2..size) {
1425            assert_eq!(k, i);
1426            assert_eq!(v, i);
1427            j += 1;
1428        }
1429        assert_eq!(j, size - 2);
1430    }
1431
1432    #[test]
1433    fn range_1000() {
1434        let size = 1000;
1435        let sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1436
1437        fn test(sm: &SkipMap<usize, usize>, min: Bound<&usize>, max: Bound<&usize>) {
1438            let mut values = sm.range(min, max);
1439            #[allow(clippy::range_plus_one)]
1440            let mut expects = match (min, max) {
1441                (Excluded(&a), Excluded(&b)) => (a + 1)..b,
1442                (Included(&a), Excluded(&b)) => a..b,
1443                (Unbounded, Excluded(&b)) => 0..b,
1444                (Excluded(&a), Included(&b)) => (a + 1)..(b + 1),
1445                (Included(&a), Included(&b)) => a..(b + 1),
1446                (Unbounded, Included(&b)) => 0..(b + 1),
1447                (Excluded(&a), Unbounded) => (a + 1)..1000,
1448                (Included(&a), Unbounded) => a..1000,
1449                (Unbounded, Unbounded) => 0..1000,
1450            };
1451
1452            assert_eq!(values.size_hint(), expects.size_hint());
1453
1454            for ((&k, &v), e) in values.by_ref().zip(expects.by_ref()) {
1455                assert_eq!(k, e);
1456                assert_eq!(v, e);
1457            }
1458            assert!(values.next().is_none());
1459            assert!(expects.next().is_none());
1460        }
1461
1462        test(&sm, Excluded(&200), Excluded(&800));
1463        test(&sm, Included(&200), Excluded(&800));
1464        test(&sm, Unbounded, Excluded(&800));
1465        test(&sm, Excluded(&200), Included(&800));
1466        test(&sm, Included(&200), Included(&800));
1467        test(&sm, Unbounded, Included(&800));
1468        test(&sm, Excluded(&200), Unbounded);
1469        test(&sm, Included(&200), Unbounded);
1470        test(&sm, Unbounded, Unbounded);
1471    }
1472
1473    #[test]
1474    fn range() {
1475        let size = 200;
1476        let sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1477
1478        for i in 0..size {
1479            for j in 0..size {
1480                let mut values = sm.range(Included(&i), Included(&j)).map(|(&a, &b)| (a, b));
1481                let mut expects = i..=j;
1482
1483                assert_eq!(values.size_hint(), expects.size_hint());
1484
1485                for ((k, v), e) in values.by_ref().zip(expects.by_ref()) {
1486                    assert_eq!(k, e);
1487                    assert_eq!(v, e);
1488                }
1489                assert!(values.next().is_none());
1490                assert!(expects.next().is_none());
1491            }
1492        }
1493
1494        // let mut values = sm.range(Included(&10), Included(&5)).map(|(&a, &b)| (a, b));
1495        // assert!(values.next().is_none());
1496    }
1497
1498    #[test]
1499    fn bound() {
1500        let sm: SkipMap<_, _> = (1..3).map(|x| (x, x)).collect();
1501
1502        assert_eq!(sm.lower_bound(Unbounded), Some((&1, &1)));
1503        assert_eq!(sm.lower_bound(Excluded(&1)), Some((&2, &2)));
1504        assert_eq!(sm.lower_bound(Included(&1)), Some((&1, &1)));
1505
1506        assert_eq!(sm.lower_bound(Excluded(&3)), None);
1507        assert_eq!(sm.lower_bound(Included(&3)), None);
1508
1509        assert_eq!(sm.upper_bound(Unbounded), Some((&2, &2)));
1510        assert_eq!(sm.upper_bound(Excluded(&2)), Some((&1, &1)));
1511        assert_eq!(sm.upper_bound(Included(&2)), Some((&2, &2)));
1512
1513        assert_eq!(sm.upper_bound(Excluded(&0)), None);
1514        assert_eq!(sm.upper_bound(Included(&0)), None);
1515    }
1516
1517    #[test]
1518    fn index_pop() {
1519        let size = 1000;
1520        let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1521        assert_eq!(sm.front(), Some((&0, &0)));
1522        assert_eq!(sm.front_mut(), Some((&0, &mut 0)));
1523        assert_eq!(sm.back(), Some((&(size - 1), &(2 * size - 2))));
1524        assert_eq!(sm.back_mut(), Some((&(size - 1), &mut (2 * size - 2))));
1525        for i in 0..size {
1526            assert_eq!(sm[i], 2 * i);
1527            assert_eq!(sm.get(&i), Some(&(2 * i)));
1528            assert_eq!(sm.get_mut(&i), Some(&mut (2 * i)));
1529        }
1530
1531        let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1532        for i in 0..size {
1533            assert_eq!(sm.pop_front(), Some((i, 2 * i)));
1534            assert_eq!(sm.len(), size - i - 1);
1535        }
1536        assert!(sm.pop_front().is_none());
1537        assert!(sm.front().is_none());
1538        assert!(sm.is_empty());
1539
1540        let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, 2 * x)).collect();
1541        for i in 0..size {
1542            assert_eq!(sm.pop_back(), Some((size - i - 1, 2 * (size - i - 1))));
1543            assert_eq!(sm.len(), size - i - 1);
1544        }
1545        assert!(sm.pop_back().is_none());
1546        assert!(sm.back().is_none());
1547        assert!(sm.is_empty());
1548    }
1549
1550    #[test]
1551    fn remove_index() {
1552        let size = 100;
1553
1554        for i in 0..size {
1555            let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1556            assert_eq!(sm.remove_index(i), (i, i));
1557            assert_eq!(sm.len(), size - 1);
1558        }
1559
1560        let mut sm: SkipMap<_, _> = (0..size).map(|x| (x, x)).collect();
1561        for i in 0..size {
1562            assert_eq!(sm.remove_index(0), (i, i));
1563            assert_eq!(sm.len(), size - i - 1);
1564            sm.check();
1565        }
1566        assert!(sm.is_empty());
1567    }
1568
1569    #[test]
1570    fn contains() {
1571        let (min, max) = (25, 75);
1572        let sm: SkipMap<_, _> = (min..max).map(|x| (x, x)).collect();
1573
1574        for i in 0..100 {
1575            println!("i = {} (contained: {})", i, sm.contains_key(&i));
1576            if i < min || i >= max {
1577                assert!(!sm.contains_key(&i));
1578            } else {
1579                assert!(sm.contains_key(&i));
1580            }
1581        }
1582    }
1583
1584    #[test]
1585    fn debug_display() {
1586        let sl: SkipMap<_, _> = (0..10).map(|x| (x, x)).collect();
1587        sl.debug_structure();
1588        println!("{:?}", sl);
1589        println!("{}", sl);
1590    }
1591
1592    #[test]
1593    #[allow(clippy::eq_op, clippy::many_single_char_names)]
1594    fn equality() {
1595        let a: SkipMap<i64, i64> = (0..100).map(|x| (x, x)).collect();
1596        let b: SkipMap<i64, i64> = (0..100).map(|x| (x, x)).collect();
1597        let c: SkipMap<i64, i64> = (0..10).map(|x| (x, x)).collect();
1598        let d: SkipMap<i64, i64> = (100..200).map(|x| (x, x)).collect();
1599        let e: SkipMap<i64, i64> = (0..100).chain(0..1).map(|x| (x, x)).collect();
1600
1601        assert_eq!(a, a);
1602        assert_eq!(a, b);
1603        assert_ne!(a, c);
1604        assert_ne!(a, d);
1605        assert_eq!(a, e);
1606        assert_eq!(b, b);
1607        assert_ne!(b, c);
1608        assert_ne!(b, d);
1609        assert_eq!(b, e);
1610        assert_eq!(c, c);
1611        assert_ne!(c, d);
1612        assert_ne!(c, e);
1613        assert_eq!(d, d);
1614        assert_ne!(d, e);
1615        assert_eq!(e, e);
1616    }
1617}