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#[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")))]
22pub mod append_alloc;
24#[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;