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
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 value = &value;
187 let actual = value.as_usize();
188
189 assert_eq!(expected, actual);
190 }
191 }
192
193 #[test]
194 fn TEST_RANGE_OF_VALUES_IN_Box() {
195
196 const VALUES : &[usize] = &[
197 0,
199 1,
200 2,
201 4,
202 8,
203 16,
204 32,
205 64,
206 128,
207 256,
208 usize::MAX,
209 ];
210
211 for &value in VALUES {
212 let expected = value;
213 let instance = Box::new(value);
214 let actual = instance.as_usize();
215
216 assert_eq!(expected, actual);
217 }
218 }
219
220 #[test]
221 fn TEST_RANGE_OF_VALUES_IN_REF_Box() {
222
223 const VALUES : &[usize] = &[
224 0,
226 1,
227 2,
228 4,
229 8,
230 16,
231 32,
232 64,
233 128,
234 256,
235 usize::MAX,
236 ];
237
238 for &value in VALUES {
239 let expected = value;
240 let instance = &Box::new(value);
241 let actual = instance.as_usize();
242
243 assert_eq!(expected, actual);
244 }
245 }
246
247 #[test]
248 fn TEST_RANGE_OF_VALUES_IN_Rc() {
249
250 const VALUES : &[usize] = &[
251 0,
253 1,
254 2,
255 4,
256 8,
257 16,
258 32,
259 64,
260 128,
261 256,
262 usize::MAX,
263 ];
264
265 for &value in VALUES {
266 let expected = value;
267 let instance = std_rc::Rc::new(value);
268 let actual = instance.as_usize();
269
270 assert_eq!(expected, actual);
271 }
272 }
273
274 #[test]
275 fn TEST_RANGE_OF_VALUES_IN_REF_Rc() {
276
277 const VALUES : &[usize] = &[
278 0,
280 1,
281 2,
282 4,
283 8,
284 16,
285 32,
286 64,
287 128,
288 256,
289 usize::MAX,
290 ];
291
292 for &value in VALUES {
293 let expected = value;
294 let instance = &std_rc::Rc::new(value);
295 let actual = instance.as_usize();
296
297 assert_eq!(expected, actual);
298 }
299 }
300 }
301}
302
303
304