pub(crate) mod private {
pub trait Sealed {}
}
macro_rules! impl_sealed_for {
( $($primitive:ty),* ) => {
$(
impl private::Sealed for $primitive {}
)*
}
}
impl_sealed_for!(bool, u8, u16, u32, u64, u128);
pub trait TotalSizeIsMultipleOfEightBits: private::Sealed {}
pub trait TotalSizeIsNotMultipleOfEightBits: private::Sealed {}
pub trait RenameSizeType: private::Sealed {
type CheckType;
}
pub struct TotalSize<T>(::core::marker::PhantomData<T>);
macro_rules! impl_total_size_for {
( $(($n:expr, $name:ident)),* ) => {
$(
pub enum $name {}
impl private::Sealed for TotalSize<BitCount<$n>> {}
impl private::Sealed for $name {}
impl RenameSizeType for TotalSize<BitCount<$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 {}
impl TotalSizeIsNotMultipleOfEightBits for OneMod8 {}
impl TotalSizeIsNotMultipleOfEightBits for TwoMod8 {}
impl TotalSizeIsNotMultipleOfEightBits for ThreeMod8 {}
impl TotalSizeIsNotMultipleOfEightBits for FourMod8 {}
impl TotalSizeIsNotMultipleOfEightBits for FiveMod8 {}
impl TotalSizeIsNotMultipleOfEightBits for SixMod8 {}
impl TotalSizeIsNotMultipleOfEightBits for SevenMod8 {}
pub trait CheckTotalSizeMultipleOf8
where
<Self::Size as RenameSizeType>::CheckType: TotalSizeIsMultipleOfEightBits,
{
type Size: RenameSizeType;
}
pub trait CheckTotalSizeIsNotMultipleOf8
where
<Self::Size as RenameSizeType>::CheckType: TotalSizeIsNotMultipleOfEightBits,
{
type Size: RenameSizeType;
}
pub trait DiscriminantInRange: private::Sealed {}
pub trait SpecifierHasAtMost128Bits: private::Sealed {}
pub enum True {}
pub enum False {}
impl private::Sealed for True {}
impl DiscriminantInRange for True {}
impl SpecifierHasAtMost128Bits for True {}
impl FillsUnalignedBits for True {}
impl DoesNotFillUnalignedBits for True {}
pub trait DispatchTrueFalse: private::Sealed {
type Out;
}
pub struct BitCount<const N: usize>;
impl private::Sealed for BitCount<0> {}
impl DispatchTrueFalse for BitCount<0> {
type Out = False;
}
impl DispatchTrueFalse for BitCount<1> {
type Out = True;
}
pub trait CheckDiscriminantInRange<A>
where
<Self::CheckType as DispatchTrueFalse>::Out: DiscriminantInRange,
{
type CheckType: DispatchTrueFalse;
}
pub trait CheckSpecifierHasAtMost128Bits
where
<Self::CheckType as DispatchTrueFalse>::Out: SpecifierHasAtMost128Bits,
{
type CheckType: DispatchTrueFalse;
}
pub trait CheckFillsUnalignedBits
where
<Self::CheckType as DispatchTrueFalse>::Out: FillsUnalignedBits,
{
type CheckType: DispatchTrueFalse;
}
pub trait FillsUnalignedBits {}
pub trait CheckDoesNotFillUnalignedBits
where
<Self::CheckType as DispatchTrueFalse>::Out: DoesNotFillUnalignedBits,
{
type CheckType: DispatchTrueFalse;
}
pub trait DoesNotFillUnalignedBits {}