@@ -1096,11 +1096,14 @@ impl Default for AnyPtr {
10961096}
10971097
10981098impl AnyPtr {
1099- pub fn cast < T : ' static > ( & self ) -> Option < Ptr < T > > {
1099+ pub fn reinterpret_cast < T : ByteRepr > ( & self ) -> Ptr < T > {
11001100 if self . ptr . is_null ( ) {
1101- return Some ( Ptr :: < T > :: null ( ) ) ;
1101+ return Ptr :: < T > :: null ( ) ;
11021102 }
1103- self . ptr . as_any ( ) . downcast_ref :: < Ptr < T > > ( ) . cloned ( )
1103+ if let Some ( p) = self . ptr . as_any ( ) . downcast_ref :: < Ptr < T > > ( ) {
1104+ return p. clone ( ) ;
1105+ }
1106+ self . ptr . as_bytes ( ) . reinterpret_cast :: < T > ( )
11041107 }
11051108}
11061109
@@ -1260,27 +1263,23 @@ mod tests {
12601263 fn anyptr_null_cast ( ) {
12611264 // void* nullptr
12621265 let any = Ptr :: < ( ) > :: null ( ) . to_any ( ) ;
1263- let p: Option < Ptr < u32 > > = any. cast :: < u32 > ( ) ;
1264- assert ! ( p. is_some( ) ) ;
1265- assert ! ( p. unwrap( ) . is_null( ) ) ;
1266+ let p = any. reinterpret_cast :: < u32 > ( ) ;
1267+ assert ! ( p. is_null( ) ) ;
12661268
1267- let p2: Option < Ptr < u8 > > = any. cast :: < u8 > ( ) ;
1268- assert ! ( p2. is_some( ) ) ;
1269- assert ! ( p2. unwrap( ) . is_null( ) ) ;
1269+ let p2 = any. reinterpret_cast :: < u8 > ( ) ;
1270+ assert ! ( p2. is_null( ) ) ;
12701271
12711272 // int* nullptr
12721273 let any2 = Ptr :: < i32 > :: null ( ) . to_any ( ) ;
1273- let p3: Option < Ptr < f32 > > = any2. cast :: < f32 > ( ) ;
1274- assert ! ( p3. is_some( ) ) ;
1275- assert ! ( p3. unwrap( ) . is_null( ) ) ;
1274+ let p3 = any2. reinterpret_cast :: < f32 > ( ) ;
1275+ assert ! ( p3. is_null( ) ) ;
12761276 }
12771277
12781278 #[ test]
12791279 fn to_any_without_clone ( ) {
12801280 let p: Ptr < std:: fs:: File > = Ptr :: null ( ) ; // std::fs::File is not Clone
12811281 let any = p. to_any ( ) ;
1282- let recovered = any. cast :: < std:: fs:: File > ( ) ;
1283- assert ! ( recovered. is_some( ) ) ;
1284- assert ! ( recovered. unwrap( ) . is_null( ) ) ;
1282+ let recovered = any. reinterpret_cast :: < std:: fs:: File > ( ) ;
1283+ assert ! ( recovered. is_null( ) ) ;
12851284 }
12861285}
0 commit comments