16 #include <type_traits>
25 #define declareDeepUnaryOperatorTemplates(IN,OP) \
28 IN<T> operator OP (IN<T> const & a) \
42 #define declareDeepReducedArithmeticTemplates(OUT,OP,IN) \
47 class = typename std::enable_if<is_scalar<T2>::value>::type \
48 > OUT<T1> operator OP##= (OUT<T1> & a, T2 const & b) \
50 T1 * restrict pa = a.data(); \
52 size_t N = a.size(); \
53 for (size_t i = 0; i < N; i++) \
59 template <class T1, class T2> \
60 OUT<T1> operator OP##= (OUT<T1> & a, IN<T2> const & b) \
62 assert(a.size() == b.size()); \
64 T1 * restrict pa = a.data(); \
65 T2 const * restrict pb = b.data(); \
67 size_t N = a.size(); \
68 for (size_t i = 0; i < N; i++) \
79 #define declareShallowReducedArithmeticTemplates(OUT,OP,IN) \
84 class = typename std::enable_if<is_scalar<T2>::value>::type \
85 > OUT<T1> operator OP##= (OUT<T1> a, T2 const & b) \
87 T1 * restrict pa = a.data(); \
89 size_t N = a.size(); \
90 for (size_t i = 0; i < N; i++) \
96 template <class T1, class T2> \
97 OUT<T1> operator OP##= (OUT<T1> a, IN<T2> b) \
99 assert(a.size() == b.size()); \
101 T1 * restrict pa = a.data(); \
102 T2 const * restrict pb = b.data(); \
104 size_t N = a.size(); \
105 for (size_t i = 0; i < N; i++) \
120 #define declareDeepBinaryOperatorTemplates(OUT,OP,IN) \
125 class T3 = decltype(T1(1) OP T2(1)) \
126 > OUT<T3> operator OP (IN<T1> const & a, IN<T2> const & b) \
128 assert(a.size() == b.size()); \
130 size_t N = a.size(); \
133 T1 const * restrict pa = a.data(); \
134 T2 const * restrict pb = b.data(); \
135 T3 * restrict pc = c.data(); \
137 for (size_t i = 0; i < N; i++) \
138 pc[i] = pa[i] OP pb[i]; \
146 class T3 = decltype(T1(1) OP T2(1)), \
147 class = typename std::enable_if<is_scalar<T2>::value>::type \
148 > OUT<T3> operator OP (IN<T1> const & a, T2 const & b) \
150 size_t N = a.size(); \
153 T1 const * restrict pa = a.data(); \
154 T3 * restrict pc = c.data(); \
156 for (size_t i = 0; i < N; i++) \
157 pc[i] = pa[i] OP b; \
164 class T3 = decltype(T1(1) OP T2(1)), \
165 class = typename std::enable_if<is_scalar<T1>::value>::type \
166 > OUT<T3> operator OP (T1 const & a, IN<T2> const & b) \
168 size_t N = b.size(); \
171 T2 const * restrict pb = b.data(); \
172 T3 * restrict pc = c.data(); \
174 for (size_t i = 0; i < N; i++) \
175 pc[i] = a OP pb[i]; \
Array view.
Definition: arrays.h:186
#define declareDeepBinaryOperatorTemplates(OUT, OP, IN)
Definition: arrithm.h:120
A comfortable number array class.
Definition: arrays.h:171
#define declareDeepReducedArithmeticTemplates(OUT, OP, IN)
Definition: arrithm.h:42
#define declareShallowReducedArithmeticTemplates(OUT, OP, IN)
Definition: arrithm.h:79
#define declareDeepUnaryOperatorTemplates(IN, OP)
Definition: arrithm.h:25
A comfortable data array class.
Definition: arrays.h:151