#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(docsrs, allow(unused_attributes))]
#![cfg_attr(not(feature = "std"), no_std)]
#![doc = include_str!("../README.md")]
extern crate alloc;
#[cfg(any(feature = "std", test))]
extern crate std;
use alloc::boxed::Box;
use alloc::rc::Rc;
use alloc::sync::Arc;
use core::ptr::NonNull;
pub trait Pointer: Sized {
type Target;
fn as_ref(&self) -> &Self::Target;
#[allow(clippy::missing_safety_doc)]
unsafe fn from_raw(p: *const Self::Target) -> Self;
fn into_raw(self) -> *const Self::Target;
}
#[allow(clippy::unnecessary_cast)]
impl<T> Pointer for *const T {
type Target = T;
#[inline]
fn as_ref(&self) -> &Self::Target {
unsafe { &**self }
}
unsafe fn from_raw(p: *const Self::Target) -> Self {
p as *const T
}
fn into_raw(self) -> *const Self::Target {
self as *const T
}
}
#[allow(clippy::unnecessary_cast)]
impl<T> Pointer for *mut T {
type Target = T;
#[inline]
fn as_ref(&self) -> &Self::Target {
unsafe { &**self }
}
unsafe fn from_raw(p: *const Self::Target) -> Self {
p as *mut T
}
fn into_raw(self) -> *const Self::Target {
self as *mut T
}
}
impl<T> Pointer for NonNull<T> {
type Target = T;
#[inline]
fn as_ref(&self) -> &Self::Target {
unsafe { self.as_ref() }
}
unsafe fn from_raw(p: *const Self::Target) -> Self {
unsafe { NonNull::new_unchecked(p as *mut T) }
}
fn into_raw(self) -> *const Self::Target {
self.as_ptr()
}
}
impl<T> Pointer for Box<T> {
type Target = T;
#[inline]
fn as_ref(&self) -> &Self::Target {
self
}
unsafe fn from_raw(p: *const Self::Target) -> Self {
unsafe { Box::from_raw(p as *mut T) }
}
fn into_raw(self) -> *const Self::Target {
Box::into_raw(self)
}
}
impl<T> Pointer for Rc<T> {
type Target = T;
#[inline]
fn as_ref(&self) -> &Self::Target {
self
}
unsafe fn from_raw(p: *const Self::Target) -> Self {
unsafe { Rc::from_raw(p) }
}
fn into_raw(self) -> *const Self::Target {
Rc::into_raw(self)
}
}
impl<T> Pointer for Arc<T> {
type Target = T;
#[inline]
fn as_ref(&self) -> &Self::Target {
self
}
unsafe fn from_raw(p: *const Self::Target) -> Self {
unsafe { Arc::from_raw(p) }
}
fn into_raw(self) -> *const Self::Target {
Arc::into_raw(self)
}
}
#[cfg(feature = "avl")]
pub mod avl;
pub mod const_vec;
pub use const_vec::ConstVec;
#[cfg(feature = "dlist")]
pub mod dlist;
pub mod seg_list;
pub use seg_list::SegList;
#[cfg(feature = "slist")]
pub mod slist;
#[cfg(feature = "slist")]
pub mod slist_owned;
pub mod various;
pub use various::Various;
#[cfg(feature = "btree")]
pub mod btree;
#[cfg(feature = "btree")]
pub use btree::BTreeMap;
#[cfg(test)]
pub mod test;
#[cfg(any(
target_arch = "x86_64",
target_arch = "aarch64",
target_arch = "arm64ec",
target_arch = "powerpc64",
))]
pub const CACHE_LINE_SIZE: usize = 64;
#[cfg(not(any(
target_arch = "x86_64",
target_arch = "aarch64",
target_arch = "arm64ec",
target_arch = "powerpc64",
)))]
pub const CACHE_LINE_SIZE: usize = 32;
#[macro_export(local_inner_macros)]
macro_rules! trace_log {
($($arg:tt)+)=>{
#[cfg(feature="trace_log")]
{
log::debug!($($arg)+);
}
};
}
#[macro_export(local_inner_macros)]
macro_rules! print_log {
($($arg:tt)+)=>{
#[cfg(feature="trace_log")]
{
log::debug!($($arg)+);
}
#[cfg(not(feature="trace_log"))]
{
std::println!($($arg)+);
}
};
}