diff --git a/substrate/srml/session/src/lib.rs b/substrate/srml/session/src/lib.rs index 43eeaaad501e53b0cb475c83b8943b253cd5d1d0..21bc04edb98f0bc20a8a666403e153cf3dd77068 100644 --- a/substrate/srml/session/src/lib.rs +++ b/substrate/srml/session/src/lib.rs @@ -51,19 +51,36 @@ pub trait OnSessionChange<T> { fn on_session_change(time_elapsed: T, should_reward: bool); } -impl<T> OnSessionChange<T> for () { - fn on_session_change(_: T, _: bool) {} +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,)* } + } } -impl<T, A, B> OnSessionChange<T> for (A, B) - where T: Clone, A: OnSessionChange<T>, B: OnSessionChange<T> -{ - 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! impl_session_change { + () => ( + impl<T> OnSessionChange<T> for () { + fn on_session_change(_: T, _: bool) {} + } + ); + + ( $($t:ident)* ) => { + impl<T: Clone, $($t: OnSessionChange<T>),*> OnSessionChange<T> 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<Self::AccountId, Self::SessionKey>; type OnSessionChange: OnSessionChange<Self::Moment>;