1pub trait AsUSize {
18 fn as_usize(&self) -> usize;
19}
20
21
22#[cfg(any(test, not(feature = "nostd")))]
23impl<T : AsUSize + ?Sized> AsUSize for Box<T> {
24 fn as_usize(&self) -> usize {
25 (**self).as_usize()
26 }
27}
28
29#[cfg(any(test, not(feature = "nostd")))]
30impl<T : AsUSize + ?Sized> AsUSize for std::rc::Rc<T> {
31 fn as_usize(&self) -> usize {
32 (**self).as_usize()
33 }
34}
35
36
37#[cfg(feature = "implement-AsUSize-for-built_ins")]
38mod impl_for_built_ins {
39 #![allow(non_snake_case)]
40
41
42 impl super::AsUSize for usize {
43 #[inline]
44 fn as_usize(&self) -> usize {
45 *self
46 }
47 }
48}
49
50
51#[cfg(test)]
52mod tests {
53 #![allow(non_snake_case)]
54
55 use super::AsUSize;
56
57 use std::rc as std_rc;
58
59
60 mod TEST_CUSTOM_TYPE {
61 #![allow(non_snake_case)]
62
63 use super::*;
64
65
66 struct CustomType {
67 value : u64,
68 }
69
70 impl AsUSize for CustomType {
71 fn as_usize(&self) -> usize {
72 self.value as usize
73 }
74 }
75
76
77 #[test]
78 fn TEST_RANGE_OF_VALUES() {
79 const VALUES : &[usize] = &[
80 0,
82 1,
83 2,
84 4,
85 8,
86 16,
87 32,
88 64,
89 128,
90 256,
91 u32::MAX as usize,
92 ];
93
94 for &value in VALUES {
95 let expected = value;
96 let instance = CustomType { value: value as u64 };
97 let actual = instance.as_usize();
98
99 assert_eq!(expected, actual);
100 }
101 }
102
103 #[test]
104 fn TEST_RANGE_OF_VALUES_IN_Box() {
105 const VALUES : &[usize] = &[
106 0,
108 1,
109 2,
110 4,
111 8,
112 16,
113 32,
114 64,
115 128,
116 256,
117 u32::MAX as usize,
118 ];
119
120 for &value in VALUES {
121 let expected = value;
122 let instance = Box::new(CustomType { value: value as u64 });
123 let actual = instance.as_usize();
124
125 assert_eq!(expected, actual);
126 }
127 }
128 }
129
130
131 #[cfg(feature = "implement-AsUSize-for-built_ins")]
132 mod TEST_BUILTIN_TYPES {
133 #![allow(non_snake_case)]
134
135 use super::*;
136
137
138 #[test]
139 fn TEST_RANGE_OF_VALUES() {
140 const VALUES : &[usize] = &[
141 0,
143 1,
144 2,
145 4,
146 8,
147 16,
148 32,
149 64,
150 128,
151 256,
152 usize::MAX,
153 ];
154
155 for &value in VALUES {
156 let expected = value;
157 let actual = value.as_usize();
158
159 assert_eq!(expected, actual);
160 }
161 }
162
163 #[test]
164 fn TEST_RANGE_OF_VALUES_REF() {
165 const VALUES : &[usize] = &[
166 0,
168 1,
169 2,
170 4,
171 8,
172 16,
173 32,
174 64,
175 128,
176 256,
177 usize::MAX,
178 ];
179
180 for &value in VALUES {
181 let expected = value;
182 let value = &value;
183 let actual = value.as_usize();
184
185 assert_eq!(expected, actual);
186 }
187 }
188
189 #[test]
190 fn TEST_RANGE_OF_VALUES_IN_Box() {
191 const VALUES : &[usize] = &[
192 0,
194 1,
195 2,
196 4,
197 8,
198 16,
199 32,
200 64,
201 128,
202 256,
203 usize::MAX,
204 ];
205
206 for &value in VALUES {
207 let expected = value;
208 let instance = Box::new(value);
209 let actual = instance.as_usize();
210
211 assert_eq!(expected, actual);
212 }
213 }
214
215 #[test]
216 fn TEST_RANGE_OF_VALUES_IN_REF_Box() {
217 const VALUES : &[usize] = &[
218 0,
220 1,
221 2,
222 4,
223 8,
224 16,
225 32,
226 64,
227 128,
228 256,
229 usize::MAX,
230 ];
231
232 for &value in VALUES {
233 let expected = value;
234 let instance = &Box::new(value);
235 let actual = instance.as_usize();
236
237 assert_eq!(expected, actual);
238 }
239 }
240
241 #[test]
242 fn TEST_RANGE_OF_VALUES_IN_Rc() {
243 const VALUES : &[usize] = &[
244 0,
246 1,
247 2,
248 4,
249 8,
250 16,
251 32,
252 64,
253 128,
254 256,
255 usize::MAX,
256 ];
257
258 for &value in VALUES {
259 let expected = value;
260 let instance = std_rc::Rc::new(value);
261 let actual = instance.as_usize();
262
263 assert_eq!(expected, actual);
264 }
265 }
266
267 #[test]
268 fn TEST_RANGE_OF_VALUES_IN_REF_Rc() {
269 const VALUES : &[usize] = &[
270 0,
272 1,
273 2,
274 4,
275 8,
276 16,
277 32,
278 64,
279 128,
280 256,
281 usize::MAX,
282 ];
283
284 for &value in VALUES {
285 let expected = value;
286 let instance = &std_rc::Rc::new(value);
287 let actual = instance.as_usize();
288
289 assert_eq!(expected, actual);
290 }
291 }
292 }
293}
294
295
296