aboutsummaryrefslogtreecommitdiff
path: root/src/operation/math.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/operation/math.h')
-rw-r--r--src/operation/math.h37
1 files changed, 25 insertions, 12 deletions
diff --git a/src/operation/math.h b/src/operation/math.h
index 0ede3f5..28a6832 100644
--- a/src/operation/math.h
+++ b/src/operation/math.h
@@ -2,6 +2,7 @@
#define TYPEASVALUE_SRC_OPERATION_MATH_H_
#include "type.h"
+#include "logic.h"
namespace tav {
@@ -9,46 +10,58 @@ template <
typename X,
typename Y
>
-using Add = typename std::integral_constant<
+using Add = std::integral_constant<
decltype(X::value + Y::value),
X::value + Y::value
->::type;
+>;
template <
typename X,
typename Y
>
-using Substract = typename std::integral_constant<
+using Substract = std::integral_constant<
decltype(X::value - Y::value),
X::value - Y::value
->::type;
+>;
template <
typename X,
typename Y
>
-using Multiply = typename std::integral_constant<
+using Multiply = std::integral_constant<
decltype(X::value * Y::value),
X::value * Y::value
->::type;
+>;
template <
typename X,
typename Y
>
-using Divide = typename std::integral_constant<
+using Divide = std::integral_constant<
decltype(X::value / Y::value),
X::value / Y::value
->::type;
+>;
-template <typename Base>
-using Square = Multiply<Base, Base>;
+template <
+ typename X,
+ typename Y
+>
+using Modulo = std::integral_constant<
+ decltype(X::value % Y::value),
+ X::value % Y::value
+>;
template <typename X>
-using Even = Boolean<(X::value % 2 == 0)>;
+using Even = EqualValue<
+ Modulo<X, Size<2>>,
+ Size<0>
+>;
template <typename X>
-using Odd = Boolean<!Even<X>::value>;
+using Odd = Not<Even<X>>;
+
+template <typename Base>
+using Square = Multiply<Base, Base>;
}