@@ -1046,49 +1046,33 @@ impl Ptr<u8> {
10461046}
10471047
10481048pub ( crate ) trait ErasedPtr : std:: any:: Any {
1049- fn pointee_type_id ( & self ) -> std:: any:: TypeId ;
1050- fn memcpy ( & self , src : & dyn ErasedPtr , len : usize ) ;
1049+ fn as_bytes ( & self ) -> Ptr < u8 > ;
10511050 fn as_any ( & self ) -> & dyn std:: any:: Any ;
1052- fn equals ( & self , other : & dyn ErasedPtr ) -> Option < bool > ;
1051+ fn equals ( & self , other : & dyn ErasedPtr ) -> bool ;
10531052 fn is_null ( & self ) -> bool ;
10541053}
10551054
1055+ impl PartialEq for dyn ErasedPtr {
1056+ fn eq ( & self , other : & Self ) -> bool {
1057+ self . equals ( other)
1058+ }
1059+ }
1060+
10561061impl < T > ErasedPtr for Ptr < T >
10571062where
10581063 T : ByteRepr + ' static ,
10591064 Ptr < T > : PartialEq ,
10601065{
1061- fn pointee_type_id ( & self ) -> std:: any:: TypeId {
1062- std:: any:: TypeId :: of :: < T > ( )
1063- }
1064-
1065- fn memcpy ( & self , src : & dyn ErasedPtr , len : usize ) {
1066- if self . pointee_type_id ( ) != src. pointee_type_id ( ) {
1067- panic ! ( "memcpy: type mismatch" ) ;
1068- }
1069- let src_ptr = src
1070- . as_any ( )
1071- . downcast_ref :: < Ptr < T > > ( )
1072- . expect ( "memcpy: downcast to Ptr<T> failed" ) ;
1073- let dst_bytes: Ptr < u8 > = self . reinterpret_cast ( ) ;
1074- let src_bytes: Ptr < u8 > = src_ptr. reinterpret_cast ( ) ;
1075- dst_bytes. memcpy ( & src_bytes, len) ;
1066+ fn as_bytes ( & self ) -> Ptr < u8 > {
1067+ self . reinterpret_cast :: < u8 > ( )
10761068 }
10771069
10781070 fn as_any ( & self ) -> & dyn std:: any:: Any {
10791071 self
10801072 }
10811073
1082- fn equals ( & self , other : & dyn ErasedPtr ) -> Option < bool > {
1083- if self . pointee_type_id ( ) != other. pointee_type_id ( ) {
1084- return None ;
1085- }
1086-
1087- if let Some ( other_ptr) = other. as_any ( ) . downcast_ref :: < Ptr < T > > ( ) {
1088- return Some ( self == other_ptr) ;
1089- }
1090-
1091- None
1074+ fn equals ( & self , other : & dyn ErasedPtr ) -> bool {
1075+ other. as_any ( ) . downcast_ref :: < Ptr < T > > ( ) == Some ( self )
10921076 }
10931077
10941078 fn is_null ( & self ) -> bool {
@@ -1122,66 +1106,28 @@ impl AnyPtr {
11221106 }
11231107 self . ptr . as_any ( ) . downcast_ref :: < Ptr < T > > ( ) . cloned ( )
11241108 }
1125-
1126- pub fn reinterpret_cast < T : ByteRepr > ( & self ) -> Ptr < T > {
1127- macro_rules! try_src {
1128- ( $ty: ty) => { {
1129- if let Some ( p) = self . cast:: <$ty>( ) {
1130- return p. reinterpret_cast:: <T >( ) ;
1131- }
1132- if let Some ( pv) = self . cast:: <Vec <$ty>>( ) {
1133- return pv. reinterpret_cast:: <T >( ) ;
1134- }
1135- } } ;
1136- }
1137-
1138- try_src ! ( u8 ) ;
1139- try_src ! ( i8 ) ;
1140- try_src ! ( u16 ) ;
1141- try_src ! ( i16 ) ;
1142- try_src ! ( u32 ) ;
1143- try_src ! ( i32 ) ;
1144- try_src ! ( u64 ) ;
1145- try_src ! ( i64 ) ;
1146- try_src ! ( usize ) ;
1147- try_src ! ( isize ) ;
1148-
1149- panic ! ( "reinterpret_cast: unsupported AnyPtr source" ) ;
1150- }
11511109}
11521110
11531111impl PartialEq for AnyPtr {
11541112 fn eq ( & self , other : & Self ) -> bool {
1155- let lhs: & dyn ErasedPtr = self . ptr . as_ref ( ) ;
1156- let rhs: & dyn ErasedPtr = other. ptr . as_ref ( ) ;
1157-
1158- lhs. equals ( rhs) . unwrap_or_default ( )
1113+ * self . ptr == * other. ptr
11591114 }
11601115}
11611116
11621117impl AnyPtr {
11631118 pub fn memcpy ( & self , src : & AnyPtr , len : usize ) {
1164- let dst_erased = & * self . ptr ;
1165- let src_erased = & * src. ptr ;
1166-
1167- if dst_erased. pointee_type_id ( ) == src_erased. pointee_type_id ( ) {
1168- dst_erased. memcpy ( src_erased, len) ;
1169- return ;
1170- }
1171-
1172- let dst_u8: Ptr < u8 > = self . reinterpret_cast ( ) ;
1173- let src_u8: Ptr < u8 > = src. reinterpret_cast ( ) ;
1119+ let dst_u8 = self . ptr . as_bytes ( ) ;
1120+ let src_u8 = src. ptr . as_bytes ( ) ;
11741121 dst_u8. memcpy ( & src_u8, len) ;
11751122 }
11761123
11771124 pub fn memset ( & self , value : u8 , num : usize ) {
1178- let dst_u8: Ptr < u8 > = self . reinterpret_cast ( ) ;
1179- dst_u8. memset ( value, num) ;
1125+ self . ptr . as_bytes ( ) . memset ( value, num) ;
11801126 }
11811127
11821128 pub fn memcmp ( & self , other : & AnyPtr , len : usize ) -> i32 {
1183- let a: Ptr < u8 > = self . reinterpret_cast ( ) ;
1184- let b: Ptr < u8 > = other. reinterpret_cast ( ) ;
1129+ let a = self . ptr . as_bytes ( ) ;
1130+ let b = other. ptr . as_bytes ( ) ;
11851131 a. memcmp ( & b, len)
11861132 }
11871133}
0 commit comments