| //@ run-pass |
| #![feature(derive_smart_pointer, arbitrary_self_types)] |
| |
| use std::marker::SmartPointer; |
| |
| #[derive(SmartPointer)] |
| #[repr(transparent)] |
| struct MyPointer<'a, #[pointee] T: ?Sized> { |
| ptr: &'a T, |
| } |
| |
| impl<T: ?Sized> Copy for MyPointer<'_, T> {} |
| impl<T: ?Sized> Clone for MyPointer<'_, T> { |
| fn clone(&self) -> Self { |
| Self { ptr: self.ptr } |
| } |
| } |
| |
| impl<'a, T: ?Sized> core::ops::Deref for MyPointer<'a, T> { |
| type Target = T; |
| fn deref(&self) -> &'a T { |
| self.ptr |
| } |
| } |
| |
| struct MyValue(u32); |
| impl MyValue { |
| fn through_pointer(self: MyPointer<'_, Self>) -> u32 { |
| self.ptr.0 |
| } |
| } |
| |
| trait MyTrait { |
| fn through_trait(&self) -> u32; |
| fn through_trait_and_pointer(self: MyPointer<'_, Self>) -> u32; |
| } |
| |
| impl MyTrait for MyValue { |
| fn through_trait(&self) -> u32 { |
| self.0 |
| } |
| |
| fn through_trait_and_pointer(self: MyPointer<'_, Self>) -> u32 { |
| self.ptr.0 |
| } |
| } |
| |
| pub fn main() { |
| let v = MyValue(10); |
| let ptr = MyPointer { ptr: &v }; |
| assert_eq!(v.0, ptr.through_pointer()); |
| assert_eq!(v.0, ptr.through_pointer()); |
| let dptr = ptr as MyPointer<dyn MyTrait>; |
| assert_eq!(v.0, dptr.through_trait()); |
| assert_eq!(v.0, dptr.through_trait_and_pointer()); |
| } |