@@ -646,12 +646,22 @@ fn writeln_trait<'a, 'b, W: std::io::Write>(w: &mut W, t: &'a syn::ItemTrait, ty
646
646
writeln ! ( w, " for {} {{" , trait_name) . unwrap ( ) ;
647
647
impl_trait_for_c ! ( t, "" , types, & syn:: PathArguments :: None ) ;
648
648
writeln ! ( w, "}}\n " ) . unwrap ( ) ;
649
+
650
+ writeln ! ( w, "struct {}Ref({});" , trait_name, trait_name) . unwrap ( ) ;
651
+ write ! ( w, "impl" ) . unwrap ( ) ;
652
+ maybe_write_lifetime_generics ( w, & t. generics , types) ;
653
+ write ! ( w, " rust{}" , t. ident) . unwrap ( ) ;
654
+ maybe_write_generics ( w, & t. generics , & syn:: PathArguments :: None , types, false ) ;
655
+ writeln ! ( w, " for {}Ref {{" , trait_name) . unwrap ( ) ;
656
+ impl_trait_for_c ! ( t, ".0" , types, & syn:: PathArguments :: None ) ;
657
+ writeln ! ( w, "}}\n " ) . unwrap ( ) ;
658
+
649
659
writeln ! ( w, "// We're essentially a pointer already, or at least a set of pointers, so allow us to be used" ) . unwrap ( ) ;
650
660
writeln ! ( w, "// directly as a Deref trait in higher-level structs:" ) . unwrap ( ) ;
651
- writeln ! ( w, "impl core::ops::Deref for {} {{\n \t type Target = Self;" , trait_name) . unwrap ( ) ;
652
- writeln ! ( w, "\t fn deref(&self) -> &Self {{\n \t \t self \n \t }}\n }}" ) . unwrap ( ) ;
661
+ writeln ! ( w, "impl core::ops::Deref for {} {{\n \t type Target = {}Ref;" , trait_name , trait_name) . unwrap ( ) ;
662
+ writeln ! ( w, "\t fn deref(&self) -> &Self::Target {{\n \t \t unsafe {{ &*(self as *const _ as *const {}Ref) }} \n \t }}\n }}" , trait_name ) . unwrap ( ) ;
653
663
writeln ! ( w, "impl core::ops::DerefMut for {} {{" , trait_name) . unwrap ( ) ;
654
- writeln ! ( w, "\t fn deref_mut(&mut self) -> &mut Self {{\n \t \t self \n \t }}\n }}" ) . unwrap ( ) ;
664
+ writeln ! ( w, "\t fn deref_mut(&mut self) -> &mut {}Ref {{\n \t \t unsafe {{ &mut *(self as *mut _ as *mut {}Ref) }} \n \t }}\n }}" , trait_name , trait_name ) . unwrap ( ) ;
655
665
}
656
666
657
667
writeln ! ( w, "/// Calls the free function if one is set" ) . unwrap ( ) ;
0 commit comments