chiark / gitweb /
ambassador: impl_via_ambassador: Introduce and use it once
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 11 May 2022 23:01:47 +0000 (00:01 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 11 May 2022 23:19:17 +0000 (00:19 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/fastsplit.rs
src/prelude.rs
src/utils.rs

index f6c23f6978d6086ec3cebbc0ba3e8c8a3434e96a..236226219809633f6c20304ee5bf64d895fc8674 100644 (file)
@@ -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()), ())}
index a8c1610af5323fc2b097707e2189deed7fbaaa06..e502c85d6fa3c4183d92de35f86cebc85a4a0c3d 100644 (file)
@@ -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};
index bb0953f9e0058e62a0a3d64fc04a7ef0b26f4bf2..40d3031be9d5160ef4aef6b1b552235b74bd40a6 100644 (file)
@@ -773,6 +773,24 @@ paste!{
   pub fn [<x x x>]<T>() -> 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)*) => {