Diffstat (limited to 'src/protocol/visitor/value.rs')
-rw-r--r--src/protocol/visitor/value.rs73
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)