1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//! Level generator for skip lists.
//!
//! Skip lists use a probabilistic distribution to determine how many levels
//! each node participates in. Nodes at higher levels span greater distances,
//! making traversal faster by skipping over large portions of the list.
//!
//! The default level generator uses a geometric distribution with a fixed
//! probability `$p$` that a node is promoted to the next level. This is
//! implemented in [`Geometric`][geometric::Geometric].
//!
//! Custom level generators can be implemented via the [`LevelGenerator`]
//! trait. In practice, the default should suffice for most use cases.
/// Trait for generating the level of a new node inserted into a skip list.
///
/// A level generator controls how many skip-link levels each new node
/// participates in. Higher levels allow the skip list to skip over more nodes
/// during traversal, trading memory for speed. The generator determines the
/// probabilistic balance between the two.
///
/// The returned level must always be in the range `$[0, \text{total})$`.
/// Returning a value out of that range is considered a logic error and may
/// cause panics or incorrect behavior.
///
/// # Examples
///
/// Implementing a trivial level generator that always returns level 0:
///
/// ```rust
/// use skiplist::level_generator::LevelGenerator;
///
/// struct AlwaysZero {
/// max_levels: usize,
/// }
///
/// impl LevelGenerator for AlwaysZero {
/// fn total(&self) -> usize {
/// self.max_levels
/// }
///
/// fn level(&mut self) -> usize {
/// 0
/// }
/// }
///
/// let mut generator = AlwaysZero { max_levels: 16 };
/// assert_eq!(generator.total(), 16);
/// assert_eq!(generator.level(), 0);
/// ```