modular_bitfield/private/
checks.rs1pub(crate) mod private {
2    pub trait Sealed {}
4}
5
6macro_rules! impl_sealed_for {
7    ( $($primitive:ty),* ) => {
8        $(
9            impl private::Sealed for $primitive {}
10        )*
11    }
12}
13impl_sealed_for!(bool, u8, u16, u32, u64, u128);
14
15pub trait TotalSizeIsMultipleOfEightBits: private::Sealed {}
18
19pub trait TotalSizeIsNotMultipleOfEightBits: private::Sealed {}
22
23pub trait RenameSizeType: private::Sealed {
25    type CheckType;
26}
27
28pub struct TotalSize<T>(::core::marker::PhantomData<T>);
30
31macro_rules! impl_total_size_for {
32    ( $(($n:expr, $name:ident)),* ) => {
33        $(
34            pub enum $name {}
35            impl private::Sealed for TotalSize<[(); $n]> {}
36            impl private::Sealed for $name {}
37            impl RenameSizeType for TotalSize<[(); $n]> {
38                type CheckType = $name;
39            }
40        )*
41    }
42}
43
44impl_total_size_for!(
45    (0, ZeroMod8),
46    (1, OneMod8),
47    (2, TwoMod8),
48    (3, ThreeMod8),
49    (4, FourMod8),
50    (5, FiveMod8),
51    (6, SixMod8),
52    (7, SevenMod8)
53);
54
55impl TotalSizeIsMultipleOfEightBits for ZeroMod8 {}
56
57impl TotalSizeIsNotMultipleOfEightBits for OneMod8 {}
58impl TotalSizeIsNotMultipleOfEightBits for TwoMod8 {}
59impl TotalSizeIsNotMultipleOfEightBits for ThreeMod8 {}
60impl TotalSizeIsNotMultipleOfEightBits for FourMod8 {}
61impl TotalSizeIsNotMultipleOfEightBits for FiveMod8 {}
62impl TotalSizeIsNotMultipleOfEightBits for SixMod8 {}
63impl TotalSizeIsNotMultipleOfEightBits for SevenMod8 {}
64
65pub trait CheckTotalSizeMultipleOf8
68where
69    <Self::Size as RenameSizeType>::CheckType: TotalSizeIsMultipleOfEightBits,
70{
71    type Size: RenameSizeType;
72}
73
74pub trait CheckTotalSizeIsNotMultipleOf8
77where
78    <Self::Size as RenameSizeType>::CheckType: TotalSizeIsNotMultipleOfEightBits,
79{
80    type Size: RenameSizeType;
81}
82
83pub trait DiscriminantInRange: private::Sealed {}
86
87pub trait SpecifierHasAtMost128Bits: private::Sealed {}
91
92pub enum True {}
98
99pub enum False {}
105
106impl private::Sealed for True {}
107impl DiscriminantInRange for True {}
108impl SpecifierHasAtMost128Bits for True {}
109impl FillsUnalignedBits for True {}
110impl DoesNotFillUnalignedBits for True {}
111
112pub trait DispatchTrueFalse: private::Sealed {
114    type Out;
115}
116
117impl private::Sealed for [(); 0] {}
118impl DispatchTrueFalse for [(); 0] {
119    type Out = False;
120}
121
122impl DispatchTrueFalse for [(); 1] {
124    type Out = True;
125}
126
127pub trait CheckDiscriminantInRange<A>
131where
132    <Self::CheckType as DispatchTrueFalse>::Out: DiscriminantInRange,
133{
134    type CheckType: DispatchTrueFalse;
135}
136
137pub trait CheckSpecifierHasAtMost128Bits
140where
141    <Self::CheckType as DispatchTrueFalse>::Out: SpecifierHasAtMost128Bits,
142{
143    type CheckType: DispatchTrueFalse;
144}
145
146pub struct BitsCheck<A> {
149    pub arr: A,
150}
151
152pub trait CheckFillsUnalignedBits
153where
154    <Self::CheckType as DispatchTrueFalse>::Out: FillsUnalignedBits,
155{
156    type CheckType: DispatchTrueFalse;
157}
158
159pub trait FillsUnalignedBits {}
160
161pub trait CheckDoesNotFillUnalignedBits
162where
163    <Self::CheckType as DispatchTrueFalse>::Out: DoesNotFillUnalignedBits,
164{
165    type CheckType: DispatchTrueFalse;
166}
167
168pub trait DoesNotFillUnalignedBits {}