1pub trait ToU64 {
21 fn to_u64(&self) -> u64;
22}
23
24
25#[cfg(any(test, not(feature = "nostd")))]
26impl<T : ToU64 + ?Sized> ToU64 for Box<T> {
27 fn to_u64(&self) -> u64 {
28 (**self).to_u64()
29 }
30}
31
32#[cfg(any(test, not(feature = "nostd")))]
33impl<T : ToU64 + ?Sized> ToU64 for std::rc::Rc<T> {
34 fn to_u64(&self) -> u64 {
35 (**self).to_u64()
36 }
37}
38
39
40#[cfg(feature = "implement-ToU64-for-built_ins")]
41#[rustfmt::skip]
42mod impl_for_built_ins {
43 #![allow(non_snake_case)]
44
45
46 impl super::ToU64 for u64 {
47 #[inline]
48 fn to_u64(&self) -> u64 {
49 *self
50 }
51 }
52
53 macro_rules! implement_ToU64_ {
54 ($type:tt) => {
55 impl super::ToU64 for $type {
56 #[inline]
57 fn to_u64(&self) -> u64 {
58 *self as u64
59 }
60 }
61 };
62 }
63
64 implement_ToU64_!(u8);
65 implement_ToU64_!(u16);
66 implement_ToU64_!(u32);
67}
68
69
70#[cfg(test)]
71mod tests {
72 #![allow(non_snake_case)]
73
74 use super::ToU64;
75
76 use std::rc as std_rc;
77
78
79 mod TEST_CUSTOM_TYPE {
80 #![allow(clippy::redundant_field_names)]
81 #![allow(non_snake_case)]
82
83 use super::ToU64;
84
85
86 struct CustomType {
87 value : u64,
88 }
89
90 impl ToU64 for CustomType {
91 fn to_u64(&self) -> u64 {
92 self.value
93 }
94 }
95
96 #[test]
97 fn TEST_RANGE_OF_VALUES() {
98 const VALUES : &[u64] = &[
99 0,
101 1,
102 2,
103 4,
104 8,
105 16,
106 32,
107 64,
108 64,
109 256,
110 u16::MAX as u64,
111 u32::MAX as u64,
112 u64::MAX,
113 ];
114
115 for &value in VALUES {
116 let expected = value;
117 let instance = CustomType { value: value };
118 let actual = instance.to_u64();
119
120 assert_eq!(expected, actual);
121 }
122 }
123 }
124
125
126 #[cfg(feature = "implement-ToU64-for-built_ins")]
127 mod TEST_BUILTIN_TYPES {
128 #![allow(non_snake_case)]
129
130 use super::*;
131
132
133 #[test]
134 fn TEST_RANGE_OF_u64_VALUES() {
135 const VALUES : &[u64] = &[
136 0,
138 1,
139 2,
140 4,
141 8,
142 16,
143 32,
144 64,
145 64,
146 256,
147 u64::MAX,
148 ];
149
150 for &value in VALUES {
151 let expected = value;
152 let actual = value.to_u64();
153
154 assert_eq!(expected, actual);
155 }
156 }
157
158 #[test]
159 fn TEST_RANGE_OF_u16_VALUES_REF() {
160 const VALUES : &[u16] = &[
161 0,
163 1,
164 2,
165 4,
166 8,
167 16,
168 32,
169 64,
170 64,
171 256,
172 u16::MAX,
173 ];
174
175 for &value in VALUES {
176 let expected = value as u64;
177 let value = &value;
178 let actual = value.to_u64();
179
180 assert_eq!(expected, actual);
181 }
182 }
183
184 #[test]
185 fn TEST_RANGE_OF_u32_VALUES_REF() {
186 const VALUES : &[u32] = &[
187 0,
189 1,
190 2,
191 4,
192 8,
193 16,
194 32,
195 64,
196 64,
197 256,
198 u32::MAX,
199 ];
200
201 for &value in VALUES {
202 let expected = value as u64;
203 let value = &value;
204 let actual = value.to_u64();
205
206 assert_eq!(expected, actual);
207 }
208 }
209
210 #[test]
211 fn TEST_RANGE_OF_u64_VALUES_REF() {
212 const VALUES : &[u64] = &[
213 0,
215 1,
216 2,
217 4,
218 8,
219 16,
220 32,
221 64,
222 64,
223 256,
224 u64::MAX,
225 ];
226
227 for &value in VALUES {
228 let expected = value;
229 let value = &value;
230 let actual = value.to_u64();
231
232 assert_eq!(expected, actual);
233 }
234 }
235
236 #[test]
237 fn TEST_RANGE_OF_u64_VALUES_IN_Box() {
238 const VALUES : &[u64] = &[
239 0,
241 1,
242 2,
243 4,
244 8,
245 16,
246 32,
247 64,
248 64,
249 256,
250 u64::MAX,
251 ];
252
253 for &value in VALUES {
254 let expected = value;
255 let instance = Box::new(value);
256 let actual = instance.to_u64();
257
258 assert_eq!(expected, actual);
259 }
260 }
261
262 #[test]
263 fn TEST_RANGE_OF_u64_VALUES_IN_REF_Box() {
264 const VALUES : &[u64] = &[
265 0,
267 1,
268 2,
269 4,
270 8,
271 16,
272 32,
273 64,
274 64,
275 256,
276 u64::MAX,
277 ];
278
279 for &value in VALUES {
280 let expected = value;
281 let instance = &Box::new(value);
282 let actual = instance.to_u64();
283
284 assert_eq!(expected, actual);
285 }
286 }
287
288 #[test]
289 fn TEST_RANGE_OF_u64_VALUES_IN_Rc() {
290 const VALUES : &[u64] = &[
291 0,
293 1,
294 2,
295 4,
296 8,
297 16,
298 32,
299 64,
300 64,
301 256,
302 u64::MAX,
303 ];
304
305 for &value in VALUES {
306 let expected = value;
307 let instance = std_rc::Rc::new(value);
308 let actual = instance.to_u64();
309
310 assert_eq!(expected, actual);
311 }
312 }
313
314 #[test]
315 fn TEST_RANGE_OF_u64_VALUES_IN_REF_Rc() {
316 const VALUES : &[u64] = &[
317 0,
319 1,
320 2,
321 4,
322 8,
323 16,
324 32,
325 64,
326 64,
327 256,
328 u64::MAX,
329 ];
330
331 for &value in VALUES {
332 let expected = value;
333 let instance = &std_rc::Rc::new(value);
334 let actual = instance.to_u64();
335
336 assert_eq!(expected, actual);
337 }
338 }
339 }
340}
341
342
343