stele/
lib.rs

1#![deny(
2    unsafe_op_in_unsafe_fn,
3    clippy::pedantic,
4    clippy::style,
5    rustdoc::broken_intra_doc_links,
6    missing_debug_implementations
7)]
8#![warn(missing_docs)]
9#![cfg_attr(feature = "allocator_api", feature(allocator_api))]
10#![cfg_attr(doc, feature(doc_cfg))]
11#![cfg_attr(not(feature = "std"), no_std)]
12#![doc = include_str!("../README.md")]
13extern crate alloc;
14
15///The Standard Stele implementation
16#[cfg(any(not(feature = "allocator_api"), doc))]
17#[cfg_attr(doc, doc(cfg(not(feature = "allocator_api"))))]
18pub mod append;
19
20#[cfg(any(feature = "allocator_api", doc))]
21#[cfg_attr(doc, doc(cfg(feature = "allocator_api")))]
22///The Allocator API compatible Stele implementation
23pub mod append_alloc;
24//This is a hacky way to make the rename not error when compiling documentation
25#[cfg(all(feature = "allocator_api", not(doc)))]
26pub use append_alloc as append;
27mod mem;
28mod sync;
29
30pub use append::reader::ReadHandle;
31pub use append::writer::WriteHandle;
32pub use append::Stele;
33pub(crate) use mem::Inner;
34
35const fn split_idx(idx: usize) -> (usize, usize) {
36    let outer_idx = 32_usize.saturating_sub(
37        (idx.leading_zeros() as usize).saturating_sub(usize::BITS.saturating_sub(32) as usize),
38    );
39    let inner_idx = idx.saturating_sub(1 << (outer_idx.saturating_sub(1)));
40    (outer_idx, inner_idx)
41}
42
43const fn max_len(n: usize) -> usize {
44    match n {
45        0 | 1 => 1,
46        _ => 1 << (n - 1),
47    }
48}
49
50#[cfg(all(not(loom), test))]
51mod test;
52
53#[cfg(all(loom, test))]
54mod loom_test;