From 2327b213e2a4a82e9f1cfd66559441e2ae7fae54 Mon Sep 17 00:00:00 2001
From: Drew Stone <drewstone329@gmail.com>
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 | 33 +++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/substrate/srml/session/src/lib.rs b/substrate/srml/session/src/lib.rs
index 43eeaaad501..21bc04edb98 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>;
-- 
GitLab