#![doc = include_str!("../README.md")]
use std::mem::MaybeUninit;
pub use certain_map_macros::certain_map;
pub use param::Param;
pub use param::ParamMaybeMut;
pub use param::ParamMaybeRef;
pub use param::ParamMut;
pub use param::ParamRef;
pub use param::ParamRemove;
pub use param::ParamSet;
pub use param::ParamTake;
#[derive(Default, Clone, Copy, PartialEq, Eq, Debug)]
pub struct Occupied<T>(pub T);
#[derive(Default, Clone, Copy, PartialEq, Eq, Debug)]
pub struct OccupiedM;
#[derive(Default, Clone, Copy, PartialEq, Eq, Debug)]
pub struct Vacancy;
mod sealed {
pub trait Sealed {}
impl Sealed for super::OccupiedM {}
impl Sealed for super::Vacancy {}
}
pub trait MaybeAvailable: sealed::Sealed {
unsafe fn do_maybe_ref<T>(data: &MaybeUninit<T>) -> Option<&T>;
unsafe fn do_maybe_mut<T>(data: &mut MaybeUninit<T>) -> Option<&mut T>;
unsafe fn do_set<T>(data: &mut MaybeUninit<T>, value: T);
unsafe fn do_drop<T>(data: &mut MaybeUninit<T>);
unsafe fn do_clone<T: Clone>(data: &MaybeUninit<T>) -> MaybeUninit<T>;
unsafe fn do_debug<T: std::fmt::Debug>(
data: &MaybeUninit<T>,
f: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result;
}
pub trait Available: MaybeAvailable {
unsafe fn do_ref<T>(data: &MaybeUninit<T>) -> &T;
unsafe fn do_mut<T>(data: &mut MaybeUninit<T>) -> &mut T;
unsafe fn do_read<T: Clone>(data: &MaybeUninit<T>) -> T;
unsafe fn do_take<T>(data: &MaybeUninit<T>) -> T;
}
impl Available for OccupiedM {
#[inline]
unsafe fn do_ref<T>(data: &MaybeUninit<T>) -> &T {
data.assume_init_ref()
}
#[inline]
unsafe fn do_mut<T>(data: &mut MaybeUninit<T>) -> &mut T {
data.assume_init_mut()
}
#[inline]
unsafe fn do_read<T: Clone>(data: &MaybeUninit<T>) -> T {
data.assume_init_ref().clone()
}
#[inline]
unsafe fn do_take<T>(data: &MaybeUninit<T>) -> T {
data.assume_init_read()
}
}
impl MaybeAvailable for OccupiedM {
#[inline]
unsafe fn do_maybe_ref<T>(data: &MaybeUninit<T>) -> Option<&T> {
Some(data.assume_init_ref())
}
#[inline]
unsafe fn do_maybe_mut<T>(data: &mut MaybeUninit<T>) -> Option<&mut T> {
Some(data.assume_init_mut())
}
#[inline]
unsafe fn do_set<T>(data: &mut MaybeUninit<T>, value: T) {
data.assume_init_drop();
*data = MaybeUninit::new(value)
}
#[inline]
unsafe fn do_drop<T>(data: &mut MaybeUninit<T>) {
data.assume_init_drop()
}
#[inline]
unsafe fn do_clone<T: Clone>(data: &MaybeUninit<T>) -> MaybeUninit<T> {
MaybeUninit::new(data.assume_init_ref().clone())
}
#[inline]
unsafe fn do_debug<T: std::fmt::Debug>(
data: &MaybeUninit<T>,
f: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
write!(f, "Occupied: {:?}", data.assume_init_ref())
}
}
impl MaybeAvailable for Vacancy {
#[inline]
unsafe fn do_maybe_ref<T>(_data: &MaybeUninit<T>) -> Option<&T> {
None
}
#[inline]
unsafe fn do_maybe_mut<T>(_data: &mut MaybeUninit<T>) -> Option<&mut T> {
None
}
#[inline]
unsafe fn do_set<T>(data: &mut MaybeUninit<T>, value: T) {
*data = MaybeUninit::new(value)
}
#[inline]
unsafe fn do_drop<T>(_data: &mut MaybeUninit<T>) {}
#[inline]
unsafe fn do_clone<T: Clone>(_data: &MaybeUninit<T>) -> MaybeUninit<T> {
MaybeUninit::uninit()
}
#[inline]
unsafe fn do_debug<T: std::fmt::Debug>(
_data: &MaybeUninit<T>,
f: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
write!(f, "Vacancy")
}
}
pub trait Handler {
type Hdr<'a>
where
Self: 'a;
fn handler(&mut self) -> Self::Hdr<'_>;
}
pub trait Fork {
type Store;
type State;
fn fork(&self) -> (Self::Store, Self::State);
}
pub trait Attach<Store> {
type Hdr<'a>
where
Store: 'a;
unsafe fn attach(self, store: &mut Store) -> Self::Hdr<'_>;
}