diff options
Diffstat (limited to 'src/operation')
-rw-r--r-- | src/operation/math.h | 37 |
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>; } |