diff --git a/src/arith.h b/src/arith.h index ff79bfe..c3eb3cd 100644 --- a/src/arith.h +++ b/src/arith.h @@ -8,113 +8,36 @@ namespace MultiArrayHelper template struct plus { - static inline T&& apply(const T& a1, const T& a2) + static inline T& acc(T& target, const T& arg) { - T&& res = a1 + a2; - return std::forward( res ); + return target += arg; } - - static inline T&& apply(T&& a1, const T& a2) - { - T&& res = a1 + a2; - return std::forward( res ); - } - - static inline T&& apply(const T& a1, T&& a2) - { - T&& res = a1 + a2; - return std::forward( res ); - } - - static inline T&& apply(T&& a1, T&& a2) - { - T&& res = a1 + a2; - return std::forward( res ); - } - }; template struct minus { - static inline T&& apply(const T& a1, const T& a2) + static inline T& acc(T& target, const T& arg) { - T&& res = a1 - a2; - return std::forward( res ); - } - - static inline T&& apply(T&& a1, const T& a2) - { - T&& res = a1 - a2; - return std::forward( res ); - } - - static inline T&& apply(const T& a1, T&& a2) - { - T&& res = a1 - a2; - return std::forward( res ); - } - - static inline T&& apply(T&& a1, T&& a2) - { - T&& res = a1 - a2; - return std::forward( res ); + return target -= arg; } }; template struct multiplies { - static inline T&& apply(const T& a1, const T& a2) + static inline T& acc(T& target, const T& arg) { - T&& res = a1 * a2; - return std::forward( res ); - } - - static inline T&& apply(T&& a1, const T& a2) - { - T&& res = a1 * a2; - return std::forward( res ); - } - - static inline T&& apply(const T& a1, T&& a2) - { - T&& res = a1 * a2; - return std::forward( res ); - } - - static inline T&& apply(T&& a1, T&& a2) - { - T&& res = a1 * a2; - return std::forward( res ); + return target *= arg; } }; template struct divides { - static inline T&& apply(const T& a1, const T& a2) + static inline T& acc(T& target, const T& arg) { - T&& res = a1 / a2; - return std::forward( res ); - } - - static inline T&& apply(T&& a1, const T& a2) - { - T&& res = a1 / a2; - return std::forward( res ); - } - - static inline T&& apply(const T& a1, T&& a2) - { - T&& res = a1 / a2; - return std::forward( res ); - } - - static inline T&& apply(T&& a1, T&& a2) - { - T&& res = a1 / a2; - return std::forward( res ); + return target /= arg; } };