1#![allow(dead_code)]
24
25pub(crate) trait U8 {
26    fn as_usize(self) -> usize;
27}
28
29impl U8 for u8 {
30    fn as_usize(self) -> usize {
31        usize::from(self)
32    }
33}
34
35pub(crate) trait U16 {
36    fn as_usize(self) -> usize;
37    fn low_u8(self) -> u8;
38    fn high_u8(self) -> u8;
39}
40
41impl U16 for u16 {
42    fn as_usize(self) -> usize {
43        usize::from(self)
44    }
45
46    fn low_u8(self) -> u8 {
47        self as u8
48    }
49
50    fn high_u8(self) -> u8 {
51        (self >> 8) as u8
52    }
53}
54
55pub(crate) trait U32 {
56    fn as_usize(self) -> usize;
57    fn low_u8(self) -> u8;
58    fn low_u16(self) -> u16;
59    fn high_u16(self) -> u16;
60}
61
62impl U32 for u32 {
63    #[inline]
64    fn as_usize(self) -> usize {
65        #[cfg(debug_assertions)]
66        {
67            usize::try_from(self).expect("u32 overflowed usize")
68        }
69        #[cfg(not(debug_assertions))]
70        {
71            self as usize
72        }
73    }
74
75    fn low_u8(self) -> u8 {
76        self as u8
77    }
78
79    fn low_u16(self) -> u16 {
80        self as u16
81    }
82
83    fn high_u16(self) -> u16 {
84        (self >> 16) as u16
85    }
86}
87
88pub(crate) trait U64 {
89    fn as_usize(self) -> usize;
90    fn low_u8(self) -> u8;
91    fn low_u16(self) -> u16;
92    fn low_u32(self) -> u32;
93    fn high_u32(self) -> u32;
94}
95
96impl U64 for u64 {
97    fn as_usize(self) -> usize {
98        #[cfg(debug_assertions)]
99        {
100            usize::try_from(self).expect("u64 overflowed usize")
101        }
102        #[cfg(not(debug_assertions))]
103        {
104            self as usize
105        }
106    }
107
108    fn low_u8(self) -> u8 {
109        self as u8
110    }
111
112    fn low_u16(self) -> u16 {
113        self as u16
114    }
115
116    fn low_u32(self) -> u32 {
117        self as u32
118    }
119
120    fn high_u32(self) -> u32 {
121        (self >> 32) as u32
122    }
123}
124
125pub(crate) trait I8 {
126    fn as_usize(self) -> usize;
127    fn to_bits(self) -> u8;
128    fn from_bits(n: u8) -> i8;
129}
130
131impl I8 for i8 {
132    fn as_usize(self) -> usize {
133        #[cfg(debug_assertions)]
134        {
135            usize::try_from(self).expect("i8 overflowed usize")
136        }
137        #[cfg(not(debug_assertions))]
138        {
139            self as usize
140        }
141    }
142
143    fn to_bits(self) -> u8 {
144        self as u8
145    }
146
147    fn from_bits(n: u8) -> i8 {
148        n as i8
149    }
150}
151
152pub(crate) trait I32 {
153    fn as_usize(self) -> usize;
154    fn to_bits(self) -> u32;
155    fn from_bits(n: u32) -> i32;
156}
157
158impl I32 for i32 {
159    fn as_usize(self) -> usize {
160        #[cfg(debug_assertions)]
161        {
162            usize::try_from(self).expect("i32 overflowed usize")
163        }
164        #[cfg(not(debug_assertions))]
165        {
166            self as usize
167        }
168    }
169
170    fn to_bits(self) -> u32 {
171        self as u32
172    }
173
174    fn from_bits(n: u32) -> i32 {
175        n as i32
176    }
177}
178
179pub(crate) trait I64 {
180    fn as_usize(self) -> usize;
181    fn to_bits(self) -> u64;
182    fn from_bits(n: u64) -> i64;
183}
184
185impl I64 for i64 {
186    fn as_usize(self) -> usize {
187        #[cfg(debug_assertions)]
188        {
189            usize::try_from(self).expect("i64 overflowed usize")
190        }
191        #[cfg(not(debug_assertions))]
192        {
193            self as usize
194        }
195    }
196
197    fn to_bits(self) -> u64 {
198        self as u64
199    }
200
201    fn from_bits(n: u64) -> i64 {
202        n as i64
203    }
204}
205
206pub(crate) trait Usize {
207    fn as_u8(self) -> u8;
208    fn as_u16(self) -> u16;
209    fn as_u32(self) -> u32;
210    fn as_u64(self) -> u64;
211}
212
213impl Usize for usize {
214    fn as_u8(self) -> u8 {
215        #[cfg(debug_assertions)]
216        {
217            u8::try_from(self).expect("usize overflowed u8")
218        }
219        #[cfg(not(debug_assertions))]
220        {
221            self as u8
222        }
223    }
224
225    fn as_u16(self) -> u16 {
226        #[cfg(debug_assertions)]
227        {
228            u16::try_from(self).expect("usize overflowed u16")
229        }
230        #[cfg(not(debug_assertions))]
231        {
232            self as u16
233        }
234    }
235
236    fn as_u32(self) -> u32 {
237        #[cfg(debug_assertions)]
238        {
239            u32::try_from(self).expect("usize overflowed u32")
240        }
241        #[cfg(not(debug_assertions))]
242        {
243            self as u32
244        }
245    }
246
247    fn as_u64(self) -> u64 {
248        #[cfg(debug_assertions)]
249        {
250            u64::try_from(self).expect("usize overflowed u64")
251        }
252        #[cfg(not(debug_assertions))]
253        {
254            self as u64
255        }
256    }
257}
258
259pub(crate) trait Pointer {
271    fn as_usize(self) -> usize;
272}
273
274impl<T> Pointer for *const T {
275    fn as_usize(self) -> usize {
276        self as usize
277    }
278}