use crate::IsLessThan;
use smallvec::SmallVec;
use std::collections::LinkedList;
use std::fmt::Debug;
mod extend;
mod get_set;
mod insert;
mod iterator;
mod rank;
mod skiplist_impl;
mod trait_impl;
#[cfg(any(test, debug_assertions))]
mod validation;
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Index(usize);
#[derive(Debug)]
struct SkipNodeHead {
rank: i64,
forward: Vec<usize>,
}
#[derive(Debug)]
struct SkipNode<K, V>
where
K: Debug + Clone + IsLessThan,
V: Debug + Clone,
{
kv: Option<(K, V)>,
rank: i64,
forward: SmallVec<[usize; 1]>,
prev: usize,
}
#[derive(Debug)]
struct SkipNodeTail {
rank: i64,
prev: usize,
}
const HEAD_INDEX: usize = usize::MAX - 1;
const TAIL_INDEX: usize = usize::MAX;
#[derive(Debug)]
pub struct SkipList<K, V>
where
K: Debug + Clone + IsLessThan,
V: Debug + Clone,
{
p: f64,
max_level: usize,
original_max_level: usize,
current_level: usize,
head: SkipNodeHead,
tail: SkipNodeTail,
nodes: Vec<SkipNode<K, V>>,
free_index_pool: LinkedList<usize>,
is_congested: bool,
}
#[cfg(test)]
mod tests {
mod reinsert_test;
mod test;
}