@@ -1009,6 +1009,7 @@ trait ErasedPtr: std::any::Any {
10091009 fn memcpy ( & self , src : & dyn ErasedPtr , len : usize ) ;
10101010 fn as_any ( & self ) -> & dyn std:: any:: Any ;
10111011 fn equals ( & self , other : & dyn ErasedPtr ) -> Option < bool > ;
1012+ fn is_null ( & self ) -> bool ;
10121013}
10131014
10141015impl < T > ErasedPtr for Ptr < T >
@@ -1048,6 +1049,10 @@ where
10481049
10491050 None
10501051 }
1052+
1053+ fn is_null ( & self ) -> bool {
1054+ Ptr :: is_null ( self )
1055+ }
10511056}
10521057
10531058#[ derive( Clone ) ]
@@ -1071,10 +1076,8 @@ impl Default for AnyPtr {
10711076
10721077impl AnyPtr {
10731078 pub fn cast < T : ' static > ( & self ) -> Option < Ptr < T > > {
1074- if let Some ( p) = self . ptr . as_any ( ) . downcast_ref :: < Ptr < ( ) > > ( ) {
1075- if p. is_null ( ) {
1076- return Some ( Ptr :: < T > :: null ( ) ) ;
1077- }
1079+ if self . ptr . is_null ( ) {
1080+ return Some ( Ptr :: < T > :: null ( ) ) ;
10781081 }
10791082 self . ptr . as_any ( ) . downcast_ref :: < Ptr < T > > ( ) . cloned ( )
10801083 }
@@ -1272,6 +1275,7 @@ mod tests {
12721275
12731276 #[ test]
12741277 fn anyptr_null_cast ( ) {
1278+ // void* nullptr
12751279 let any = Ptr :: < ( ) > :: null ( ) . to_any ( ) ;
12761280 let p: Option < Ptr < u32 > > = any. cast :: < u32 > ( ) ;
12771281 assert ! ( p. is_some( ) ) ;
@@ -1280,6 +1284,12 @@ mod tests {
12801284 let p2: Option < Ptr < u8 > > = any. cast :: < u8 > ( ) ;
12811285 assert ! ( p2. is_some( ) ) ;
12821286 assert ! ( p2. unwrap( ) . is_null( ) ) ;
1287+
1288+ // int* nullptr
1289+ let any2 = Ptr :: < i32 > :: null ( ) . to_any ( ) ;
1290+ let p3: Option < Ptr < f32 > > = any2. cast :: < f32 > ( ) ;
1291+ assert ! ( p3. is_some( ) ) ;
1292+ assert ! ( p3. unwrap( ) . is_null( ) ) ;
12831293 }
12841294
12851295 #[ test]
0 commit comments