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 {}