From 39f5a9ffbeccb3026efb0fc135d91b6b207436e7 Mon Sep 17 00:00:00 2001 From: Philipp Mildenberger Date: Sun, 23 Jul 2023 13:53:01 +0200 Subject: [PATCH] Make function trait-bounds of the `Memoize`, `Adapt` and `AdaptState` views configurable (mostly to mirror the `View` trait bounds) --- crates/xilem_core/src/view/adapt.rs | 17 ++++++++--------- crates/xilem_core/src/view/memoize.rs | 11 ++++++----- crates/xilem_html/src/view.rs | 6 +++--- crates/xilem_svg/src/view.rs | 4 +++- src/view/view.rs | 6 +++--- 5 files changed, 23 insertions(+), 21 deletions(-) diff --git a/crates/xilem_core/src/view/adapt.rs b/crates/xilem_core/src/view/adapt.rs index 769b3a61..9e521207 100644 --- a/crates/xilem_core/src/view/adapt.rs +++ b/crates/xilem_core/src/view/adapt.rs @@ -1,6 +1,6 @@ #[macro_export] macro_rules! generate_adapt_view { - ($viewtrait:ident, $cx:ty, $changeflags:ty) => { + ($viewtrait:ident, $cx:ty, $changeflags:ty; $($ss:tt)*) => { /// A view that wraps a child view and modifies the state that callbacks have access to. /// /// # Examples @@ -81,7 +81,7 @@ macro_rules! generate_adapt_view { impl Adapt where V: $viewtrait, - F: Fn(&mut ParentT, AdaptThunk) -> $crate::MessageResult, + F: Fn(&mut ParentT, AdaptThunk) -> $crate::MessageResult $( $ss )*, { pub fn new(f: F, child: V) -> Self { Adapt { @@ -103,8 +103,7 @@ macro_rules! generate_adapt_view { for Adapt where V: $viewtrait, - F: Fn(&mut ParentT, AdaptThunk) -> $crate::MessageResult - + Send, + F: Fn(&mut ParentT, AdaptThunk) -> $crate::MessageResult $( $ss )*, { type State = V::State; @@ -146,7 +145,7 @@ macro_rules! generate_adapt_view { for Adapt where V: $viewtrait, - F: Fn(&mut ParentT, AdaptThunk) -> $crate::MessageResult, + F: Fn(&mut ParentT, AdaptThunk) -> $crate::MessageResult $( $ss )*, { } }; @@ -154,7 +153,7 @@ macro_rules! generate_adapt_view { #[macro_export] macro_rules! generate_adapt_state_view { - ($viewtrait:ident, $cx:ty, $changeflags:ty) => { + ($viewtrait:ident, $cx:ty, $changeflags:ty; $($ss:tt)*) => { /// A view that wraps a child view and modifies the state that callbacks have access to. pub struct AdaptState &mut ChildT> { f: F, @@ -164,7 +163,7 @@ macro_rules! generate_adapt_state_view { impl AdaptState where - F: Fn(&mut ParentT) -> &mut ChildT + Send, + F: Fn(&mut ParentT) -> &mut ChildT $( $ss )*, { pub fn new(f: F, child: V) -> Self { Self { @@ -178,7 +177,7 @@ macro_rules! generate_adapt_state_view { impl $viewtrait for AdaptState where V: $viewtrait, - F: Fn(&mut ParentT) -> &mut ChildT + Send, + F: Fn(&mut ParentT) -> &mut ChildT $( $ss )*, { type State = V::State; type Element = V::Element; @@ -211,7 +210,7 @@ macro_rules! generate_adapt_state_view { } impl ViewMarker for AdaptState where - F: Fn(&mut ParentT) -> &mut ChildT + F: Fn(&mut ParentT) -> &mut ChildT $( $ss )* { } }; diff --git a/crates/xilem_core/src/view/memoize.rs b/crates/xilem_core/src/view/memoize.rs index 04f8c765..36db4fec 100644 --- a/crates/xilem_core/src/view/memoize.rs +++ b/crates/xilem_core/src/view/memoize.rs @@ -10,7 +10,8 @@ macro_rules! generate_memoize_view { $cx:ty, $changeflags:ty, $staticviewfunction:ident, - $memoizeviewfunction:ident + $memoizeviewfunction:ident; + $($ss:tt)* ) => { pub struct $memoizeview { data: D, @@ -36,9 +37,9 @@ macro_rules! generate_memoize_view { impl $viewtrait for $memoizeview where - D: PartialEq + Send + 'static, + D: PartialEq $( $ss )* + 'static, V: $viewtrait, - F: Fn(&D) -> V + Send, + F: Fn(&D) -> V $( $ss )*, { type State = $memoizestate; @@ -93,7 +94,7 @@ macro_rules! generate_memoize_view { /// A static view, all of the content of the `view` should be constant, as this function is only run once pub fn $staticviewfunction(view: F) -> $memoizeview<(), impl Fn(&()) -> V> where - F: Fn() -> V + 'static, + F: Fn() -> V $( $ss )* + 'static, { $memoizeview::new((), move |_: &()| view()) } @@ -101,7 +102,7 @@ macro_rules! generate_memoize_view { /// Memoize the view, until the `data` changes (in which case `view` is called again) pub fn $memoizeviewfunction(data: D, view: F) -> $memoizeview where - F: Fn(&D) -> V, + F: Fn(&D) -> V $( $ss )*, { $memoizeview::new(data, view) } diff --git a/crates/xilem_html/src/view.rs b/crates/xilem_html/src/view.rs index bef0b512..5f083bc7 100644 --- a/crates/xilem_html/src/view.rs +++ b/crates/xilem_html/src/view.rs @@ -100,9 +100,9 @@ impl Pod { xilem_core::generate_view_trait! {View, DomNode, Cx, ChangeFlags;} xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomNode, Cx, ChangeFlags, Pod;} xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyNode, BoxedView;} -xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize} -xilem_core::generate_adapt_view! {View, Cx, ChangeFlags} -xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags} +xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize;} +xilem_core::generate_adapt_view! {View, Cx, ChangeFlags;} +xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags;} /// This view container can switch between two views. /// diff --git a/crates/xilem_svg/src/view.rs b/crates/xilem_svg/src/view.rs index f6e20d16..f847e9a1 100644 --- a/crates/xilem_svg/src/view.rs +++ b/crates/xilem_svg/src/view.rs @@ -75,4 +75,6 @@ impl Pod { xilem_core::generate_view_trait! {View, DomElement, Cx, ChangeFlags;} xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, DomElement, Cx, ChangeFlags, Pod;} xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyElement, BoxedView;} -xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize} +xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize;} +xilem_core::generate_adapt_view! {View, Cx, ChangeFlags;} +xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags;} diff --git a/src/view/view.rs b/src/view/view.rs index ec000483..3a1bfaca 100644 --- a/src/view/view.rs +++ b/src/view/view.rs @@ -26,9 +26,9 @@ use crate::widget::{AnyWidget, ChangeFlags, Pod, Widget}; xilem_core::generate_view_trait! {View, Widget, Cx, ChangeFlags; : Send} xilem_core::generate_viewsequence_trait! {ViewSequence, View, ViewMarker, Widget, Cx, ChangeFlags, Pod; : Send} xilem_core::generate_anyview_trait! {AnyView, View, ViewMarker, Cx, ChangeFlags, AnyWidget, BoxedView; + Send} -xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize} -xilem_core::generate_adapt_view! {View, Cx, ChangeFlags} -xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags} +xilem_core::generate_memoize_view! {Memoize, MemoizeState, View, ViewMarker, Cx, ChangeFlags, s, memoize; + Send} +xilem_core::generate_adapt_view! {View, Cx, ChangeFlags; + Send} +xilem_core::generate_adapt_state_view! {View, Cx, ChangeFlags; + Send} #[derive(Clone)] pub struct Cx {