Diffstat (limited to 'src/any.rs')
-rw-r--r--src/any.rs86
1 files changed, 72 insertions, 14 deletions
diff --git a/src/any.rs b/src/any.rs
index ed7d1f7..8296403 100644
--- a/src/any.rs
+++ b/src/any.rs
@@ -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);
}