From 246cb31c1e20cdcc21a6a607de4b0095c71315d6 Mon Sep 17 00:00:00 2001
From: Adrian Kummerlaender
Date: Thu, 12 Feb 2015 14:32:33 +0100
Subject: Implemented `Cond` conditional * returns the `CDR` of the first true
 `CAR` in a given list of pairs * reimplemented `Apply` base class selection
 in terms of `Cond`

---
 src/function/apply.h        | 26 ++++++++++++++++++--------
 src/function/detail/apply.h |  8 ++++++++
 2 files changed, 26 insertions(+), 8 deletions(-)

(limited to 'src/function')

diff --git a/src/function/apply.h b/src/function/apply.h
index 21364a8..5a2105c 100644
--- a/src/function/apply.h
+++ b/src/function/apply.h
@@ -1,7 +1,8 @@
 #ifndef TYPEASVALUE_SRC_FUNCTION_APPLY_H_
 #define TYPEASVALUE_SRC_FUNCTION_APPLY_H_
 
-#include "conditional/if.h"
+#include "operation/math.h"
+#include "conditional/cond.h"
 
 #include "detail/apply.h"
 
@@ -16,14 +17,23 @@ template <
 	template<typename...> class Function,
 	typename...                 Arguments
 >
-struct Apply : If<
-	(detail::count_placeholders<Arguments...>::type::value > 2),
-	detail::apply_variadic<Function, Arguments...>,
-	typename If<
-		detail::count_placeholders<Arguments...>::type::value == 2,
-		detail::apply_pair<Function, Arguments...>,
+struct Apply : Cond<
+	Pair<
+		GreaterThan<typename detail::count_placeholders<Arguments...>::type,  Size<2>>,
+		detail::apply_variadic<Function, Arguments...>
+	>,
+	Pair<
+		IsEqualValue<typename detail::count_placeholders<Arguments...>::type, Size<2>>,
+		detail::apply_pair<Function, Arguments...>
+	>,
+	Pair<
+		IsEqualValue<typename detail::count_placeholders<Arguments...>::type, Size<1>>,
 		detail::apply_single<Function, Arguments...>
-	>::type
+	>,
+	Pair<
+		Boolean<true>,
+		detail::apply_none<Function, Arguments...>
+	>
 >::type { };
 
 }
diff --git a/src/function/detail/apply.h b/src/function/detail/apply.h
index bf60be1..d9f058a 100644
--- a/src/function/detail/apply.h
+++ b/src/function/detail/apply.h
@@ -42,6 +42,14 @@ using count_placeholders = Count<
 	typename List<Arguments...>::type
 >;
 
+template <
+	template<typename...> class Function,
+	typename...                 Arguments
+>
+struct apply_none {
+	using type = Function<Arguments...>;
+};
+
 template <
 	template<typename...> class Function,
 	typename...                 Arguments
-- 
cgit v1.2.3