From dd1e70aa3b51be4e14753142bc46cc78a892eaf8 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Thu, 12 May 2022 00:01:47 +0100 Subject: [PATCH] ambassador: impl_via_ambassador: Introduce and use it once Signed-off-by: Ian Jackson --- src/fastsplit.rs | 7 ++++--- src/prelude.rs | 1 + src/utils.rs | 18 ++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/fastsplit.rs b/src/fastsplit.rs index f6c23f69..23622621 100644 --- a/src/fastsplit.rs +++ b/src/fastsplit.rs @@ -56,10 +56,11 @@ impl Piece { } } -#[dyn_upcast] -impl OutlineTrait for Piece { - ambassador_impl_OutlineTrait! {body_struct(<>, _, (), (inner()), ())} +impl_via_ambassador!{ + #[dyn_upcast] + impl OutlineTrait for Piece { inner() } } + #[dyn_upcast] impl PieceBaseTrait for Piece { ambassador_impl_PieceBaseTrait! {body_struct(<>, _, (), (inner()), ())} diff --git a/src/prelude.rs b/src/prelude.rs index a8c1610a..e502c85d 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -136,6 +136,7 @@ pub use base_misc::*; pub use crate::{deref_to_field, deref_to_field_mut}; pub use crate::ensure_eq; pub use crate::format_by_fmt_hex; +pub use crate::impl_via_ambassador; pub use crate::matches_doesnot; pub use crate::trace_dbg; pub use crate::{want, wantok, wants, want_let, want_failed_internal}; diff --git a/src/utils.rs b/src/utils.rs index bb0953f9..40d3031b 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -773,6 +773,24 @@ paste!{ pub fn []() -> T { panic!("todo item triggered") } } +#[macro_export] +macro_rules! impl_via_ambassador{ + { + $( #[ $attr:meta ] )* + impl $Trait:ident for $Type:ty + { $($how_immut:tt)* } + } => { paste!{ + $( #[ $attr ] )* + impl $Trait for $Type { + [< ambassador_impl_ $Trait >]!{ body_struct( <>, _, + (), + ($($how_immut)*), + () + ) } + } + } } +} + #[macro_export] macro_rules! trace_dbg { ($msg:expr $(,$val:expr)*) => { -- 2.30.2