1pub trait AsUSize {
18 fn as_usize(&self) -> usize;
19}
20
21
22#[cfg(all(not(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(all(not(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
80 const VALUES : &[usize] = &[
81 0,
83 1,
84 2,
85 4,
86 8,
87 16,
88 32,
89 64,
90 128,
91 256,
92 u32::MAX as usize,
93 ];
94
95 for &value in VALUES {
96 let expected = value;
97 let instance = CustomType { value: value as u64 };
98 let actual = instance.as_usize();
99
100 assert_eq!(expected, actual);
101 }
102 }
103
104 #[test]
105 fn TEST_RANGE_OF_VALUES_IN_Box() {
106
107 const VALUES : &[usize] = &[
108 0,
110 1,
111 2,
112 4,
113 8,
114 16,
115 32,
116 64,
117 128,
118 256,
119 u32::MAX as usize,
120 ];
121
122 for &value in VALUES {
123 let expected = value;
124 let instance = Box::new(CustomType { value: value as u64 });
125 let actual = instance.as_usize();
126
127 assert_eq!(expected, actual);
128 }
129 }
130 }
131
132
133 #[cfg(feature = "implement-AsUSize-for-built_ins")]
134 mod TEST_BUILTIN_TYPES {
135 #![allow(non_snake_case)]
136
137 use super::*;
138
139
140 #[test]
141 fn TEST_RANGE_OF_VALUES() {
142
143 const VALUES : &[usize] = &[
144 0,
146 1,
147 2,
148 4,
149 8,
150 16,
151 32,
152 64,
153 128,
154 256,
155 usize::MAX,
156 ];
157
158 for &value in VALUES {
159 let expected = value;
160 let actual = value.as_usize();
161
162 assert_eq!(expected, actual);
163 }
164 }
165
166 #[test]
167 fn TEST_RANGE_OF_VALUES_REF() {
168
169 const VALUES : &[usize] = &[
170 0,
172 1,
173 2,
174 4,
175 8,
176 16,
177 32,
178 64,
179 128,
180 256,
181 usize::MAX,
182 ];
183
184 for &value in VALUES {
185 let expected = value;
186 let actual = (&value).as_usize();
187
188 assert_eq!(expected, actual);
189 }
190 }
191
192 #[test]
193 fn TEST_RANGE_OF_VALUES_IN_Box() {
194
195 const VALUES : &[usize] = &[
196 0,
198 1,
199 2,
200 4,
201 8,
202 16,
203 32,
204 64,
205 128,
206 256,
207 usize::MAX,
208 ];
209
210 for &value in VALUES {
211 let expected = value;
212 let instance = Box::new(value);
213 let actual = instance.as_usize();
214
215 assert_eq!(expected, actual);
216 }
217 }
218
219 #[test]
220 fn TEST_RANGE_OF_VALUES_IN_REF_Box() {
221
222 const VALUES : &[usize] = &[
223 0,
225 1,
226 2,
227 4,
228 8,
229 16,
230 32,
231 64,
232 128,
233 256,
234 usize::MAX,
235 ];
236
237 for &value in VALUES {
238 let expected = value;
239 let instance = Box::new(value);
240 let actual = (&instance).as_usize();
241
242 assert_eq!(expected, actual);
243 }
244 }
245
246 #[test]
247 fn TEST_RANGE_OF_VALUES_IN_Rc() {
248
249 const VALUES : &[usize] = &[
250 0,
252 1,
253 2,
254 4,
255 8,
256 16,
257 32,
258 64,
259 128,
260 256,
261 usize::MAX,
262 ];
263
264 for &value in VALUES {
265 let expected = value;
266 let instance = std_rc::Rc::new(value);
267 let actual = instance.as_usize();
268
269 assert_eq!(expected, actual);
270 }
271 }
272
273 #[test]
274 fn TEST_RANGE_OF_VALUES_IN_REF_Rc() {
275
276 const VALUES : &[usize] = &[
277 0,
279 1,
280 2,
281 4,
282 8,
283 16,
284 32,
285 64,
286 128,
287 256,
288 usize::MAX,
289 ];
290
291 for &value in VALUES {
292 let expected = value;
293 let instance = std_rc::Rc::new(value);
294 let actual = (&instance).as_usize();
295
296 assert_eq!(expected, actual);
297 }
298 }
299 }
300}
301
302
303