From 2327b213e2a4a82e9f1cfd66559441e2ae7fae54 Mon Sep 17 00:00:00 2001 From: Drew Stone Date: Fri, 30 Nov 2018 18:26:24 +0200 Subject: [PATCH] Implement macro for session change trait over arbitrary tuples (limit 19) (#1177) * Implement macro for session change trait * Consolidate tuple macro into one --- substrate/srml/session/src/lib.rs | 37 ++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/substrate/srml/session/src/lib.rs b/substrate/srml/session/src/lib.rs index 43eeaaad50..21bc04edb9 100644 --- a/substrate/srml/session/src/lib.rs +++ b/substrate/srml/session/src/lib.rs @@ -51,19 +51,36 @@ pub trait OnSessionChange { fn on_session_change(time_elapsed: T, should_reward: bool); } -impl OnSessionChange for () { - fn on_session_change(_: T, _: bool) {} -} - -impl OnSessionChange for (A, B) - where T: Clone, A: OnSessionChange, B: OnSessionChange -{ - fn on_session_change(time_elapsed: T, should_reward: bool) { - A::on_session_change(time_elapsed.clone(), should_reward); - B::on_session_change(time_elapsed, should_reward); +macro_rules! for_each_tuple { + ($m:ident) => { + for_each_tuple! { @IMPL $m !! A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, } + }; + (@IMPL $m:ident !!) => { $m! { } }; + (@IMPL $m:ident !! $h:ident, $($t:ident,)*) => { + $m! { $h $($t)* } + for_each_tuple! { @IMPL $m !! $($t,)* } } } +macro_rules! impl_session_change { + () => ( + impl OnSessionChange for () { + fn on_session_change(_: T, _: bool) {} + } + ); + + ( $($t:ident)* ) => { + impl),*> OnSessionChange for ($($t,)*) { + fn on_session_change(time_elapsed: T, should_reward: bool) { + $($t::on_session_change(time_elapsed.clone(), should_reward);)* + } + } + } +} + +for_each_tuple!(impl_session_change); + + pub trait Trait: timestamp::Trait { type ConvertAccountIdToSessionKey: Convert; type OnSessionChange: OnSessionChange;