Diffstat (limited to 'src/any.rs')
| -rw-r--r-- | src/any.rs | 86 |
1 files changed, 72 insertions, 14 deletions
@@ -66,17 +66,74 @@ macro_rules! nameable { pub use nameable; pub struct Owned<T: ?Sized>(pub T); -nameable! { - pub ['a, 'lt, T] - Owned<T> where {T: ?Sized} - Owned<T::Nameable> where {T: ?Sized} -} -// pub struct Borrowed<'lt, T: ?Sized>(pub &'lt T); -// nameable!(['a, 'lt: 'a, T: ?Sized + 'static]: Borrowed<'lt, T> => Borrowed<'static, T>); -// -// pub struct MutBorrowed<'lt, T: ?Sized>(pub &'lt mut T); -// nameable!(['a, 'lt: 'a, T: ?Sized + 'static]: MutBorrowed<'lt, T> => MutBorrowed<'static, T>); +const _: () = { + pub struct Name<T: ?Sized>(PhantomData<fn() -> *const T>); + + impl<'a, 'lt, T: ?Sized + 'static> TypeNameable<'a, 'lt> for Owned<T> { + type Name = Name<T>; + } + + impl<'a, 'lt, T: ?Sized + 'static> TypeName<'a, 'lt> for Name<T> { + type Nameable = Owned<T>; + } +}; + +pub struct Borrowed<'lt, T: ?Sized>(pub &'lt T); + +const _: () = { + pub struct Name<T: ?Sized>(PhantomData<fn() -> *const T>); + + impl<'a, 'lt: 'a, T: ?Sized + 'static> TypeNameable<'a, 'lt> for Borrowed<'lt, T> { + type Name = Name<T>; + } + + impl<'a, 'lt: 'a, T: ?Sized + 'static> TypeName<'a, 'lt> for Name<T> { + type Nameable = Borrowed<'lt, T>; + } +}; + +pub struct TempBorrowed<'a, T: ?Sized>(pub &'a T); + +const _: () = { + pub struct Name<T: ?Sized>(PhantomData<fn() -> *const T>); + + impl<'a, 'lt, T: ?Sized + 'static> TypeNameable<'a, 'lt> for TempBorrowed<'a, T> { + type Name = Name<T>; + } + + impl<'a, 'lt, T: ?Sized + 'static> TypeName<'a, 'lt> for Name<T> { + type Nameable = TempBorrowed<'a, T>; + } +}; + +pub struct BorrowedMut<'lt, T: ?Sized>(pub &'lt mut T); + +const _: () = { + pub struct Name<T: ?Sized>(PhantomData<fn() -> *const T>); + + impl<'a, 'lt: 'a, T: ?Sized + 'static> TypeNameable<'a, 'lt> for BorrowedMut<'lt, T> { + type Name = Name<T>; + } + + impl<'a, 'lt: 'a, T: ?Sized + 'static> TypeName<'a, 'lt> for Name<T> { + type Nameable = BorrowedMut<'lt, T>; + } +}; + +pub struct TempBorrowedMut<'lt, T: ?Sized>(pub &'lt mut T); + +const _: () = { + pub struct Name<T: ?Sized>(PhantomData<fn() -> *const T>); + + impl<'a, 'lt, T: ?Sized + 'static> TypeNameable<'a, 'lt> for TempBorrowedMut<'a, T> { + type Name = Name<T>; + } + + impl<'a, 'lt, T: ?Sized + 'static> TypeName<'a, 'lt> for Name<T> { + type Nameable = TempBorrowedMut<'a, T>; + } +}; // box here @@ -149,7 +206,7 @@ pub trait AnyTrait<'lt> { 'lt: 'a; } -impl<'lt> dyn AnyTrait<'lt> { +impl<'lt> dyn AnyTrait<'lt> + '_ { pub fn upcast<'a, Trait: ?Sized + TypeNameable<'a, 'lt>>(&'a self) -> Option<&'a Trait> { self.upcast_to_id(LtTypeId::of::<Trait>()) .map(|object| match object.downcast::<Trait>() { @@ -163,7 +220,9 @@ impl<'lt> dyn AnyTrait<'lt> { }) } - pub fn upcast_mut<'a, Trait: ?Sized + TypeNameable<'a, 'lt>>(&'a mut self) -> Option<&'a mut Trait> { + pub fn upcast_mut<'a, Trait: ?Sized + TypeNameable<'a, 'lt>>( + &'a mut self, + ) -> Option<&'a mut Trait> { self.upcast_to_id_mut(LtTypeId::of::<Trait>()) .map(|object| match object.downcast::<Trait>() { Ok(object) => object, @@ -219,7 +278,6 @@ macro_rules! any_trait { #[doc(inline)] pub use any_trait; - #[must_use] pub struct IndirectLtAny<'a, 'lt: 'a, I: Indirect<'a>> { info: fn() -> (LtTypeId<'lt>, unsafe fn(RawIndirect)), @@ -440,7 +498,7 @@ mod test { } let x = X(42); - let y: &dyn AnyTrait = &x; + let y: &dyn AnyTrait<'_> = &x; let z: &dyn Z = y.upcast().unwrap(); assert_eq!(z.num(), 42); } |