Diffstat (limited to 'src/protocol/visitor/value.rs')
| -rw-r--r-- | src/protocol/visitor/value.rs | 56 |
1 files changed, 33 insertions, 23 deletions
diff --git a/src/protocol/visitor/value.rs b/src/protocol/visitor/value.rs index 87dbd47..3cb8908 100644 --- a/src/protocol/visitor/value.rs +++ b/src/protocol/visitor/value.rs @@ -3,6 +3,7 @@ //! In some sense, this is the most basic protocol. use crate::{ + any::{TypeName, TypeNameable}, nameable, protocol::{walker::HintMeta, ControlFlow}, }; @@ -24,9 +25,9 @@ pub trait Value<T> { } nameable! { - pub ['a, 'ctx, T] - dyn Value<T> + 'a where {T: ?Sized} - dyn Value<T::Nameable> + 'a where {T: ?Sized} + pub struct Name['a, 'ctx, T]; + impl [T::Name] for dyn Value<T> + 'a where { T: TypeNameable<'a, 'ctx> + ?Sized } + impl [T] where dyn Value<T::Nameable> + 'a { T: TypeName<'a, 'ctx> + ?Sized } } // This enrolls the Value protocol into the walker hint system. @@ -39,7 +40,10 @@ impl<'ctx, T> HintMeta<'ctx> for dyn Value<T> + '_ { #[cfg(test)] mod test { use crate::{ - any::{AnyTrait, Borrowed, BorrowedMut, Owned}, + any::{ + static_wrapper::{BorrowedMutStatic, BorrowedStatic, OwnedStatic}, + AnyTrait, + }, any_trait, }; @@ -49,15 +53,15 @@ mod test { fn visit() { struct Visitor(Option<i32>); - impl Value<Owned<i32>> for Visitor { - fn visit(&mut self, Owned(value): Owned<i32>) -> ControlFlow<()> { + impl Value<OwnedStatic<i32>> for Visitor { + fn visit(&mut self, OwnedStatic(value): OwnedStatic<i32>) -> ControlFlow<()> { self.0 = Some(value); ControlFlow::Continue(()) } } - impl Value<Borrowed<'_, i32>> for Visitor { - fn visit(&mut self, Borrowed(value): Borrowed<'_, i32>) -> ControlFlow<()> { + impl Value<BorrowedStatic<'_, i32>> for Visitor { + fn visit(&mut self, BorrowedStatic(value): BorrowedStatic<'_, i32>) -> ControlFlow<()> { self.0 = Some(*value); ControlFlow::Continue(()) } @@ -65,25 +69,25 @@ mod test { any_trait! { impl['a, 'ctx] Visitor = [ - dyn Value<Owned<i32>>, - dyn Value<Borrowed<'ctx, i32>>, + dyn Value<OwnedStatic<i32>>, + dyn Value<BorrowedStatic<'ctx, i32>>, ]; } let mut v = Visitor(None); let object: &mut dyn AnyTrait<'_> = &mut v; object - .upcast_mut::<dyn Value<Owned<i32>>>() + .upcast_mut::<dyn Value<OwnedStatic<i32>>>() .unwrap() - .visit(Owned(42)); + .visit(OwnedStatic(42)); assert_eq!(v.0, Some(42)); let object: &mut dyn AnyTrait<'_> = &mut v; object - .upcast_mut::<dyn Value<Borrowed<'_, i32>>>() + .upcast_mut::<dyn Value<BorrowedStatic<'_, i32>>>() .unwrap() - .visit(Borrowed(&101)); + .visit(BorrowedStatic(&101)); assert_eq!(v.0, Some(101)); } @@ -92,8 +96,11 @@ mod test { fn visit_borrowed() { struct Visitor<'ctx>(Option<&'ctx mut String>); - impl<'ctx> Value<BorrowedMut<'ctx, String>> for Visitor<'ctx> { - fn visit(&mut self, BorrowedMut(value): BorrowedMut<'ctx, String>) -> ControlFlow<()> { + impl<'ctx> Value<BorrowedMutStatic<'ctx, String>> for Visitor<'ctx> { + fn visit( + &mut self, + BorrowedMutStatic(value): BorrowedMutStatic<'ctx, String>, + ) -> ControlFlow<()> { self.0 = Some(value); ControlFlow::Continue(()) } @@ -101,7 +108,7 @@ mod test { any_trait! { impl['a, 'ctx] Visitor<'ctx> = [ - dyn Value<BorrowedMut<'ctx, String>> + 'a, + dyn Value<BorrowedMutStatic<'ctx, String>> + 'a, ]; } @@ -112,7 +119,7 @@ mod test { object .upcast_mut::<dyn Value<_>>() .unwrap() - .visit(BorrowedMut(&mut y)); + .visit(BorrowedMutStatic(&mut y)); v.0.unwrap().push_str("def"); assert_eq!(y, "abcdef"); @@ -122,8 +129,11 @@ mod test { fn visit_borrowed_unsized() { struct Visitor<'ctx>(Option<&'ctx str>); - impl<'ctx> Value<Borrowed<'ctx, str>> for Visitor<'ctx> { - fn visit(&mut self, Borrowed(value): Borrowed<'ctx, str>) -> ControlFlow<()> { + impl<'ctx> Value<BorrowedStatic<'ctx, str>> for Visitor<'ctx> { + fn visit( + &mut self, + BorrowedStatic(value): BorrowedStatic<'ctx, str>, + ) -> ControlFlow<()> { self.0 = Some(value); ControlFlow::Continue(()) } @@ -131,7 +141,7 @@ mod test { any_trait! { impl['a, 'ctx] Visitor<'ctx> = [ - dyn Value<Borrowed<'ctx, str>> + 'a, + dyn Value<BorrowedStatic<'ctx, str>> + 'a, ]; } @@ -140,9 +150,9 @@ mod test { let y = String::from("abc"); let object: &mut dyn AnyTrait<'_> = &mut v; object - .upcast_mut::<dyn Value<Borrowed<'_, str>>>() + .upcast_mut::<dyn Value<BorrowedStatic<'_, str>>>() .unwrap() - .visit(Borrowed(&y)); + .visit(BorrowedStatic(&y)); assert_eq!(v.0, Some("abc")); } |