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