#[cfg(doc)]
use crate::Eips;
use crate::node::Node;
use core::marker::PhantomData;
use integral_constant::{Bool, Constant, Usize};
mod arena {
pub use fixed_typed_arena::options::*;
}
mod skippy {
pub use skippy::options::*;
}
mod detail {
use super::*;
pub trait ListFanoutPriv: skippy::Fanout {}
pub trait ChunkSizePriv: Constant<usize> {
type ForArena<T>: arena::ChunkSize<T>;
}
pub trait SupportsMovePriv {
type Packed<Id, Opt: EipsOptions>: crate::node::Packed<Id, Opt>;
}
}
pub(crate) use detail::*;
pub trait ListFanout: ListFanoutPriv {}
impl<const N: usize> ListFanout for Usize<N> {}
impl<const N: usize> ListFanoutPriv for Usize<N> {}
pub trait ChunkSize: ChunkSizePriv {}
impl<const N: usize> ChunkSize for Usize<N> {}
impl<const N: usize> ChunkSizePriv for Usize<N> {
type ForArena<T> = Self;
}
pub trait SupportsMove: SupportsMovePriv {}
impl SupportsMove for Bool<false> {}
impl SupportsMove for Bool<true> {}
impl SupportsMovePriv for Bool<false> {
type Packed<Id, Opt: EipsOptions> = crate::node::MinimalPacked;
}
impl SupportsMovePriv for Bool<true> {
type Packed<Id, Opt: EipsOptions> = crate::node::FullPacked<Id, Opt>;
}
pub(crate) type Packed<Id, Opt> =
<<Opt as EipsOptions>::SupportsMove as SupportsMovePriv>::Packed<Id, Opt>;
mod sealed {
pub trait Sealed: Sized {}
}
pub trait EipsOptions: sealed::Sealed {
type SupportsMove: SupportsMove;
type ListFanout: ListFanout;
type ChunkSize: ChunkSize;
}
#[rustfmt::skip]
pub type Options<
const SUPPORTS_MOVE: bool = true,
const LIST_FANOUT: usize = 12,
const CHUNK_SIZE: usize = 32,
> = TypedOptions<
Bool<SUPPORTS_MOVE>,
Usize<LIST_FANOUT>,
Usize<CHUNK_SIZE>,
>;
#[allow(clippy::type_complexity)]
#[rustfmt::skip]
pub struct TypedOptions<
SupportsMove = Bool<true>,
ListFanout = Usize<12>,
ChunkSize = Usize<32>,
>(PhantomData<fn() -> (
SupportsMove,
ListFanout,
ChunkSize,
)>);
#[rustfmt::skip]
impl<
SupportsMove,
ListFanout,
ChunkSize,
> sealed::Sealed for TypedOptions<
SupportsMove,
ListFanout,
ChunkSize,
> {}
#[rustfmt::skip]
impl<
SupportsMove: self::SupportsMove,
ListFanout: self::ListFanout,
ChunkSize: self::ChunkSize,
> EipsOptions for TypedOptions<
SupportsMove,
ListFanout,
ChunkSize,
> {
type SupportsMove = SupportsMove;
type ListFanout = ListFanout;
type ChunkSize = ChunkSize;
}
type GetChunkSize<Opt> = <Opt as EipsOptions>::ChunkSize;
type ArenaChunkSize<Opt, T> =
<GetChunkSize<Opt> as ChunkSizePriv>::ForArena<T>;
pub(crate) type NodeAllocOptions<Id, Opt> = arena::TypedOptions<
ArenaChunkSize<Opt, Node<Id, Opt>>,
Bool<true>,
Bool<false>,
>;
pub(crate) type PosMapOptions<Id, Opt> = skippy::TypedOptions<
usize,
Bool<false>,
<Opt as EipsOptions>::ListFanout,
Node<Id, Opt>,
>;
pub(crate) type SiblingSetOptions<Id, Opt> = skippy::TypedOptions<
skippy::NoSize,
Bool<true>,
<Opt as EipsOptions>::ListFanout,
Node<Id, Opt>,
>;
pub(crate) const fn chunk_size<Opt: EipsOptions>() -> usize {
Opt::ChunkSize::VALUE
}