Diffstat (limited to 'src/protocol/visitor/value.rs')
| -rw-r--r-- | src/protocol/visitor/value.rs | 73 |
1 files changed, 37 insertions, 36 deletions
diff --git a/src/protocol/visitor/value.rs b/src/protocol/visitor/value.rs index 2c616ec..86063b1 100644 --- a/src/protocol/visitor/value.rs +++ b/src/protocol/visitor/value.rs @@ -33,28 +33,27 @@ pub trait Value<'ctx, T: ?Sized + TypeName::MemberType, E: Effect> { value: TypeName::T<'a, 'ctx, T>, ) -> ErasedEffective<'a, VisitResult<TypeName::T<'a, 'ctx, T>>, E> where - TypeName::T<'a, 'ctx, T>: Send + Sized, + TypeName::T<'a, 'ctx, T>: Send + Sync + Sized, 'ctx: 'a; } pub struct ValueProto<T: ?Sized + TypeName::MemberType, E: Effect>(Marker<(*const T, E)>); -higher_ranked_type! { - impl TypeName { - impl['a, 'ctx, T, E] type T['a, 'ctx] for ValueProto<T, E> = - dyn Value<'ctx, T, E> + Send + Sync + 'a - where { - T: ?Sized + TypeName::MemberType, - E: Effect - }; +impl<'a, 'ctx, T: ?Sized, E> TypeName::MemberTypeForLt<'a, 'ctx, &'a &'ctx ()> for ValueProto<T, E> +where + E: Effect, + T: TypeName::MemberType, +{ + type T = dyn Value<'ctx, T, E> + Send + Sync + 'a; +} - impl['a, 'ctx, T, E] type HigherRanked['a, 'ctx] for dyn Value<'ctx, T, E> + Send + Sync + 'a = - ValueProto<T, E> - where { - T: ?Sized + TypeName::MemberType, - E: Effect - }; - } +impl<'a, 'ctx, T: ?Sized, E> TypeName::LowerTypeWithBound<'a, 'ctx, &'a &'ctx ()> + for dyn Value<'ctx, T, E> + Send + Sync + 'a +where + E: Effect, + T: TypeName::MemberType, +{ + type Higher = ValueProto<T, E>; } #[derive(Copy, Clone, PartialEq, Debug)] @@ -68,20 +67,19 @@ pub struct ValueKnown<'a, T: ?Sized> { #[derive(Copy, Clone, Debug)] pub struct ValueKnownHrt<T: ?Sized>(Marker<T>); -higher_ranked_type! { - impl Meta { - impl['a, 'ctx, T] type T['a, 'ctx] for ValueKnownHrt<T> = - ValueKnown<'a, TypeName::T<'a, 'ctx, T>> - where { - T: ?Sized + TypeName::LowerForLt<'a, 'ctx, TypeName::Bound<'a, 'ctx>>, - }; +impl<'a, 'ctx, T> Meta::MemberTypeForLt<'a, 'ctx, &'a &'ctx ()> for ValueKnownHrt<T> +where + T: ?Sized + TypeName::MemberType, + // for<'a, 'ctx> TypeName::T<'a, 'ctx, T>: Send + Sync, +{ + type T = ValueKnown<'a, TypeName::T<'a, 'ctx, T>>; +} - impl['a, 'ctx, T] type HigherRanked['a, 'ctx] for ValueKnown<'a, T> = - ValueKnownHrt<<T as TypeName::RaiseForLt<'a, 'ctx, TypeName::Bound<'a, 'ctx>>>::HigherRanked> - where { - T: ?Sized + TypeName::LowerType<'a, 'ctx>, - }; - } +impl<'a, 'ctx, T: ?Sized> Meta::LowerTypeWithBound<'a, 'ctx, &'a &'ctx ()> for ValueKnown<'a, T> +where + T: TypeName::LowerType<'a, 'ctx>, +{ + type Higher = ValueKnownHrt<TypeName::HigherRanked<'a, 'ctx, T>>; } // This enrolls the Value protocol into the walker hint system. @@ -93,16 +91,19 @@ impl<T: TypeName::MemberType, E: Effect> HintMeta for ValueProto<T, E> { type Effect = E; } -pub fn visit_value<'a, 'ctx, T: Send + TypeName::LowerType<'a, 'ctx>, E: Effect>( - visitor: DynVisitor<'a, 'ctx>, +pub fn visit_value< + 'ctx: 'visitor, + 'visitor: 'e, + 'e, + T: Send + Sync + TypeName::LowerType<'e, 'ctx>, + E: Effect, +>( + visitor: DynVisitor<'visitor, 'ctx>, value: T, -) -> ErasedEffective<'a, VisitResult<T>, E> -where - TypeName::HigherRanked<'a, 'ctx, T>: TypeName::MemberType, -{ +) -> ErasedEffective<'e, VisitResult<T>, E> { if let Some(object) = visitor .0 - .upcast_mut::<ValueProto<TypeName::HigherRanked<'a, 'ctx, T>, E>>() + .upcast_mut::<ValueProto<TypeName::HigherRanked<'e, 'ctx, T>, E>>() { // Allow the visitor to give a hint if it wants. object.visit(value) |