1use core::any::Any;
17#[cfg(feature = "alloc")]
18use alloc::string::String;
19
20pub trait AsAny {
61 fn as_any(&self) -> &dyn Any;
64}
65
66impl AsAny for usize {
67 #[inline]
68 fn as_any(&self) -> &dyn Any {
69 self as &dyn Any
70 }
71}
72
73impl AsAny for u8 {
74 #[inline]
75 fn as_any(&self) -> &dyn Any {
76 self as &dyn Any
77 }
78}
79
80impl AsAny for u16 {
81 #[inline]
82 fn as_any(&self) -> &dyn Any {
83 self as &dyn Any
84 }
85}
86
87impl AsAny for u32 {
88 #[inline]
89 fn as_any(&self) -> &dyn Any {
90 self as &dyn Any
91 }
92}
93
94impl AsAny for u64 {
95 #[inline]
96 fn as_any(&self) -> &dyn Any {
97 self as &dyn Any
98 }
99}
100
101impl AsAny for u128 {
102 #[inline]
103 fn as_any(&self) -> &dyn Any {
104 self as &dyn Any
105 }
106}
107
108impl AsAny for i8 {
109 #[inline]
110 fn as_any(&self) -> &dyn Any {
111 self as &dyn Any
112 }
113}
114
115impl AsAny for i16 {
116 #[inline]
117 fn as_any(&self) -> &dyn Any {
118 self as &dyn Any
119 }
120}
121
122impl AsAny for i32 {
123 #[inline]
124 fn as_any(&self) -> &dyn Any {
125 self as &dyn Any
126 }
127}
128
129impl AsAny for i64 {
130 #[inline]
131 fn as_any(&self) -> &dyn Any {
132 self as &dyn Any
133 }
134}
135
136impl AsAny for i128 {
137 #[inline]
138 fn as_any(&self) -> &dyn Any {
139 self as &dyn Any
140 }
141}
142
143#[cfg(any(test, feature = "std", feature = "alloc"))]
144impl AsAny for String {
145 #[inline]
146 fn as_any(&self) -> &dyn Any {
147 self as &dyn Any
148 }
149}
150
151#[cfg(test)]
152mod test {
153 use ::core::any::Any;
154
155 use super::AsAny;
156
157 #[test]
158 fn test_as_any_correct() {
159 assert_eq!(1usize.as_any().type_id(), (&5usize as &dyn Any).type_id());
160 assert_eq!(1usize.as_any().downcast_ref::<usize>().unwrap(), &1usize);
161 assert_eq!(1u8.as_any().downcast_ref::<u8>().unwrap(), &1u8);
162 assert_eq!(1u16.as_any().downcast_ref::<u16>().unwrap(), &1u16);
163 assert_eq!(1u32.as_any().downcast_ref::<u32>().unwrap(), &1u32);
164 assert_eq!(1u64.as_any().downcast_ref::<u64>().unwrap(), &1u64);
165 assert_eq!(1u128.as_any().downcast_ref::<u128>().unwrap(), &1u128);
166 assert_eq!(1i8.as_any().downcast_ref::<i8>().unwrap(), &1i8);
167 assert_eq!(1i16.as_any().downcast_ref::<i16>().unwrap(), &1i16);
168 assert_eq!(1i32.as_any().downcast_ref::<i32>().unwrap(), &1i32);
169 assert_eq!(1i64.as_any().downcast_ref::<i64>().unwrap(), &1i64);
170 assert_eq!(1i128.as_any().downcast_ref::<i128>().unwrap(), &1i128);
171 assert_eq!(
172 s!("string").as_any().downcast_ref::<String>().unwrap(),
173 &"string"
174 );
175 }
176
177 #[test]
178 fn test_as_any_wrong() {
179 assert!(1usize.as_any().downcast_ref::<u32>().is_none());
180 assert!(1i8.as_any().downcast_ref::<u8>().is_none());
181 assert!(1i16.as_any().downcast_ref::<u16>().is_none());
182 assert!(1i32.as_any().downcast_ref::<u32>().is_none());
183 assert!(1i64.as_any().downcast_ref::<u64>().is_none());
184 assert!(1i128.as_any().downcast_ref::<u128>().is_none());
185 assert!(s!("str").as_any().downcast_ref::<&str>().is_none());
186 }
187}