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
// for asserts warning about incompatible constant values
// we actually measure performance increases with most of these
// for conditional compilation in docs
//! This crate provides a collection of data structures supported by fast implementations of
//! rank and select queries. The data structures are static, meaning that they cannot be modified
//! after they have been created.
//!
//! # Data structures
//! - [Bit-Vector][bit_vec::BitVec] with no overhead. The only data structure that can be modified after creation.
//! - [Succinct Bit-Vector][bit_vec::fast_rs_vec::RsVec] supporting fast rank and select queries.
//! - [Elias-Fano][elias_fano::EliasFanoVec] encoding of monotone sequences supporting constant-time predecessor queries.
//! - Two [Range Minimum Query][rmq] structures for constant-time range minimum queries.
//! - [Wavelet Matrix][wavelet::WaveletMatrix] encoding `k`-bit symbols, supporting rank, select, statistical, and predecessor/successor queries in `O(k)`.
//! - [Succinct Tree][trees::bp::BpTree] supporting tree navigation in `O(log n)` time,
//! as well as subtree size, level-order, and ancestor queries, and fast depth-first iteration.
//!
//! # Performance
//! Performance was benchmarked against publicly available implementations of the same (or similar)
//! data structures on crates.io.
//! Vers is among the fastest for all benchmarked operations.
//! The benchmark results can be found
//! in the [Benchmark repository](https://github.com/Cydhra/vers_benchmarks).
//! Some tradeoffs between average time, worst-case time, and available API features should be taken
//! into consideration when selecting among the fastest libraries
//! (see the GitHub repository for a discussion).
//!
//! # Intrinsics
//! This crate uses compiler intrinsics for bit-manipulation. The intrinsics are supported by
//! all modern ``x86_64`` CPUs, but not by other architectures. The crate will compile on other
//! architectures using fallback implementations,
//! but the performance will be significantly worse. It is strongly recommended to
//! enable the ``BMI2`` and ``popcnt`` target features when using this crate.
//!
//! The intrinsics in question are `popcnt` (supported since ``SSE4.2`` resp. ``SSE4a`` on AMD, 2007-2008),
//! `pdep` (supported with ``BMI2`` since Intel Haswell resp. AMD Excavator, in hardware since AMD Zen 3, 2011-2013),
//! and `tzcnt` (supported with ``BMI1`` since Intel Haswell resp. AMD Jaguar, ca. 2013).
//!
//! # Safety
//! When the `simd` crate feature is not enabled (default),
//! this crate uses no unsafe code, with the only exception being compiler intrinsics for
//! bit-manipulation, if available.
//! The intrinsics do not operate on addresses, so even if they were to be implemented incorrectly,
//! no memory safety issues would arise.
//!
//! The `simd` crate feature adds SIMD implementations to some of the operations (notably `select`)
//! which do operate on pointers.
//!
//! # Crate Features
//! - `simd` (disabled by default): Enables the use of SIMD instructions in the `RsVec`
//! implementation, and an additional iterator for the `RsVec` data structure.
//! - `serde` (disabled by default): Enables serialization and deserialization support for all
//! data structures in this crate using the `serde` crate.
//! - `mem_dbg` (disabled by default): Enables support for the `mem_dbg` crate on all structures,
//! providing memory layout debugging capabilities, as well as a more granular function to
//! calculate memory usage than `heap_size()`.
//! - `bp_u16_lookup` (disabled by default): Uses a 16-bit lookup table for the balanced parenthesis
//! tree data structure. This is faster, but requires 128 KiB instead of 4 KiB.
pub use RsVec;
pub use SparseRSVec;
pub use BitVec;
pub use EliasFanoVec;
pub use BinaryRmq;
pub use FastRmq;
pub use ;
pub use ;
pub use WaveletMatrix;
pub