pub(crate) mod private {
pub trait Sealed {}
}
pub trait TotalSizeIsMultipleOfEightBits
: private::Sealed
{}
pub trait RenameSizeType
: private::Sealed
{
type CheckType;
}
pub struct TotalSize<T>(std::marker::PhantomData<T>);
macro_rules! impl_total_size_for {
( $(($n:expr, $name:ident)),* ) => {
$(
pub enum $name {}
impl private::Sealed for TotalSize<[(); $n]> {}
impl private::Sealed for $name {}
impl RenameSizeType for TotalSize<[(); $n]> {
type CheckType = $name;
}
)*
}
}
impl_total_size_for!(
(0, ZeroMod8),
(1, OneMod8),
(2, TwoMod8),
(3, ThreeMod8),
(4, FourMod8),
(5, FiveMod8),
(6, SixMod8),
(7, SevenMod8)
);
impl TotalSizeIsMultipleOfEightBits for ZeroMod8 {}
pub trait CheckTotalSizeMultipleOf8
where
<Self::Size as RenameSizeType>::CheckType: TotalSizeIsMultipleOfEightBits,
{
type Size: RenameSizeType;
}
pub trait DiscriminantInRange: private::Sealed {}
pub enum True {}
pub enum False {}
impl private::Sealed for True {}
impl DiscriminantInRange for True {}
pub trait DispatchTrueFalse: private::Sealed {
type Out;
}
impl private::Sealed for [(); 0] {}
impl DispatchTrueFalse for [(); 0] {
type Out = False;
}
impl DispatchTrueFalse for [(); 1] {
type Out = True;
}
pub trait CheckDiscriminantInRange<A>
where
<Self::CheckType as DispatchTrueFalse>::Out: DiscriminantInRange
{
type CheckType: DispatchTrueFalse;
}
pub struct BitsCheck<A> {
pub arr: A,
}