diff options
author | Adrian Kummerlaender | 2015-01-24 15:24:19 +0100 |
---|---|---|
committer | Adrian Kummerlaender | 2015-01-24 15:24:19 +0100 |
commit | 8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090 (patch) | |
tree | 188b3f8940ca810a241ca2265da331af105d0d14 /src | |
parent | f9844b741feac35622b9566c6afae9bb686f5149 (diff) | |
download | TypeAsValue-8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090.tar TypeAsValue-8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090.tar.gz TypeAsValue-8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090.tar.bz2 TypeAsValue-8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090.tar.lz TypeAsValue-8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090.tar.xz TypeAsValue-8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090.tar.zst TypeAsValue-8b0d1c5296c22ce28fd0c8f9b251308b7bbf3090.zip |
Added `Modulo` math operator
* redefined `Even` in terms of `Modulo` and removed unnecessary dependent name declarators
* added appropriate test case, also for `Square`
Diffstat (limited to 'src')
-rw-r--r-- | src/operation/math.h | 37 | ||||
-rw-r--r-- | src/type.h | 6 |
2 files changed, 28 insertions, 15 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>; } @@ -6,13 +6,13 @@ namespace tav { template <int Value> -using Int = typename std::integral_constant<int, Value>::type; +using Int = std::integral_constant<int, Value>; template <std::size_t Value> -using Size = typename std::integral_constant<std::size_t, Value>::type; +using Size = std::integral_constant<std::size_t, Value>; template <bool Value> -using Boolean = typename std::integral_constant<bool, Value>::type; +using Boolean = std::integral_constant<bool, Value>; template < typename X, |