Guest User

Untitled

a guest
Jan 20th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. use std::ops::Deref;
  2. use std::marker::PhantomData;
  3.  
  4. struct RawBasePtr(u8);
  5. struct RawDerivedPtr(u8);
  6.  
  7. #[derive(Clone, Copy)]
  8. struct BasePtr<T>(T);
  9.  
  10. impl<T: Into<*mut RawBasePtr>> BasePtr<T> {
  11. fn f1(&self) {
  12. let ptr = self.into();
  13. println!("call f1 on {:?}", ptr);
  14. }
  15. }
  16.  
  17. impl<T: Into<*mut RawBasePtr>> Into<*mut RawBasePtr> for BasePtr<T> {
  18. fn into(self) -> *mut RawBasePtr {
  19. self.0
  20. }
  21. }
  22.  
  23. #[derive(Clone, Copy)]
  24. struct DerivedPtr<T>(T);
  25.  
  26. impl<T: Into<*mut RawDerivedPtr>> DerivedPtr<T> {
  27. fn f2(&self) {
  28. let ptr = self.into();
  29. println!("call f2 on {:?}", ptr);
  30. }
  31. }
  32.  
  33. struct DerivedToBaseCast<T>(PhantomData<T>);
  34.  
  35. impl<T: Into<*mut RawDerivedPtr>> Into<*mut RawBasePtr> for DerivedToBaseCast<T> {
  36. fn into(self) -> *mut RawBasePtr {
  37. self.into() + 2
  38. }
  39. }
  40.  
  41. impl<T: Into<*mut RawDerivedPtr>> Into<*mut RawDerivedPtr> for BasePtr<T> {
  42. fn into(self) -> *mut RawDerivedPtr {
  43. self.0
  44. }
  45. }
  46.  
  47. impl<T: Into<*mut RawDerivedPtr>> Deref for DerivedPtr<T> {
  48. type Target = BasePtr<DerivedToBaseCast<T>>;
  49. fn deref(&self) -> &Self::Target {
  50. unsafe { std::mem::transmute::<&DerivedPtr, &Self::Target>(self) }
  51. }
  52. }
  53.  
  54. /*
  55. #[derive(Clone, Copy)]
  56. struct BasePtrSource<T: Into<*mut RawBasePtr>>(T);
  57.  
  58. impl<T: Into<*mut RawBasePtr>> BasePtrSource<T> {
  59. fn f1(self) {
  60. let ptr = self.0.into();
  61. println!("call f1 on {:?}", ptr);
  62. }
  63. }
  64.  
  65. impl Into<*mut RawBasePtr> for BasePtr {
  66. fn into(self) -> *mut RawBasePtr {
  67. self.ptr
  68. }
  69. }*/
  70.  
  71. /*impl Into<*mut RawBasePtr> for DerivedPtr {
  72. fn into(self) -> *mut RawBasePtr {
  73. ((self.ptr as usize) + 2) as _
  74. }
  75. }*/
  76.  
  77. /*impl Deref for DerivedPtr {
  78. type Target = BasePtr<DerivedPtr>;
  79. fn deref(&self) -> &Self::Target {
  80. unsafe { std::mem::transmute::<&DerivedPtr, &Self::Target>(self) }
  81. }
  82. }*/
  83.  
  84. fn main() {
  85. let base = BasePtr::<*mut RawBasePtr>(0x100 as _ );
  86. base.f1();
  87.  
  88. let derived = DerivedPtr::<*mut RawDerivedPtr>(0x200 as _);
  89. derived.f1();
  90.  
  91.  
  92. }
Add Comment
Please, Sign In to add comment