30 #include "../../error/exception_utils.hpp"
31 #include "../../types.hpp"
32 #include "../../utilities/sfinae_macros.hpp"
37 #define CHECK_ARITHMETIC_SINGLE(type)\
38 static_assert(std::is_arithmetic<typename type::value_type>::value || \
39 is_complex_type<typename type::value_type>::value,\
40 "Arithemtic operations can only be used with arithmetic types!")
42 #define CHECK_ARITHMETIC_DOUBLE(type1,type2)\
44 (std::is_arithmetic<typename type1::value_type>::value || \
45 is_complex_type<typename type1::value_type>::value) && \
46 (std::is_arithmetic<typename type2::value_type>::value || \
47 is_complex_type<typename type2::value_type>::value), \
48 "Arithemtic operations can only be used with arithmetic types!")
87 static void add(LTYPE &a,T b)
89 CHECK_ARITHMETIC_SINGLE(LTYPE);
92 for(
size_t i = 0;i<n;++i) a[i] += b;
122 static void add(LTYPE &a,
const RTYPE &b)
124 CHECK_ARITHMETIC_DOUBLE(LTYPE,RTYPE);
126 for(
size_t i=0;i<n;++i) a[i] += b[i];
154 static void sub(LTYPE &a,T b)
156 CHECK_ARITHMETIC_SINGLE(LTYPE);
158 for(
size_t i=0;i<n;++i) a[i] -= b;
187 static void sub(LTYPE &a,
const RTYPE &b)
189 CHECK_ARITHMETIC_DOUBLE(LTYPE,RTYPE);
191 for(
size_t i=0;i<n;++i) a[i] -= b[i];
222 CHECK_ARITHMETIC_SINGLE(LTYPE);
224 for(
size_t i=0;i<n;++i) a[i] *= b;
253 static void mult(LTYPE &a,
const RTYPE &b)
255 CHECK_ARITHMETIC_DOUBLE(LTYPE,RTYPE);
257 for(
size_t i=0;i<n;++i) a[i] *= b[i];
285 static void div(LTYPE &a,T b)
287 CHECK_ARITHMETIC_SINGLE(LTYPE);
289 for(
size_t i=0;i<n;++i) a[i] /= b;
318 static void div(LTYPE &a,
const RTYPE &b)
320 CHECK_ARITHMETIC_DOUBLE(LTYPE,RTYPE);
322 for(
size_t i=0;i<n;++i) a[i] /= b[i];
static void add(LTYPE &a, const RTYPE &b)
add array to array
Definition: inplace_arithmetics.hpp:122
static void sub(LTYPE &a, const RTYPE &b)
subtract array from array
Definition: inplace_arithmetics.hpp:187
check complex type
Definition: traits.hpp:74
logical not
Definition: sfinae_macros.hpp:97
static void div(LTYPE &a, T b)
divide array with scalar
Definition: inplace_arithmetics.hpp:285
static void mult(LTYPE &a, T b)
multiply array with scalar
Definition: inplace_arithmetics.hpp:220
static void add(LTYPE &a, T b)
add scalar to array
Definition: inplace_arithmetics.hpp:87
Definition: add_op.hpp:29
static void div(LTYPE &a, const RTYPE &b)
divide array by array
Definition: inplace_arithmetics.hpp:318
invoke< std::enable_if< C::value >> enable_if
shortcut for std::enable_if
Definition: sfinae_macros.hpp:108
static void mult(LTYPE &a, const RTYPE &b)
multiply array by array
Definition: inplace_arithmetics.hpp:253
std::is_pod< T > is_pod
shortcut for std::is_pod
Definition: sfinae_macros.hpp:115
static void sub(LTYPE &a, T b)
subtract scalar from array
Definition: inplace_arithmetics.hpp:154
or type
Definition: sfinae_macros.hpp:60
single threaded inplace arithmetics
Definition: inplace_arithmetics.hpp:58