27 #ifndef SCHNEK_ARREXPRESSION_H_ 28 #define SCHNEK_ARREXPRESSION_H_ 41 template<
class Operator,
size_t Length>
42 class ArrayExpression {
49 typedef typename Operator::value_type value_type;
51 static constexpr
size_t length = Length;
77 template<
class Exp1,
class OperatorType>
83 typedef typename OperatorType::value_type value_type;
95 SCHNEK_INLINE value_type
operator[](
size_t i)
const {
return OperatorType::apply(A[i]); }
103 template<
class Exp1,
class Exp2,
class OperatorType>
111 typedef typename OperatorType::value_type value_type;
114 SCHNEK_INLINE
ArrayBinaryOp(
const Exp1 &A_,
const Exp2 &B_) : A(A_), B(B_) {}
125 return OperatorType::apply(A[i], B[i]);
134 typedef T value_type;
136 SCHNEK_INLINE value_type
operator[](
size_t)
const {
return val; }
143 typedef T value_type;
146 SCHNEK_INLINE
static value_type
apply(value_type x, value_type y) {
155 typedef T value_type;
158 static SCHNEK_INLINE value_type
apply(value_type x, value_type y) {
return x-y; }
165 typedef T value_type;
168 static SCHNEK_INLINE value_type
apply(value_type x, value_type y) {
return x*y; }
175 typedef T value_type;
178 static SCHNEK_INLINE value_type
apply(value_type x, value_type y) {
return x/y; }
185 typedef T value_type;
188 static SCHNEK_INLINE value_type
apply(value_type x) {
return x; }
195 typedef T value_type;
198 static SCHNEK_INLINE value_type
apply(value_type x) {
return -x; }
202 #pragma GCC diagnostic push 203 #pragma GCC diagnostic ignored "-Wunused-local-typedefs" 213 #define EXPR_EXPR(op, symbol) \ 214 template<class exp1, class exp2, size_t length> \ 217 ArrayExpression<exp1, length>, \ 218 ArrayExpression<exp2, length>, \ 219 op<typename exp1::value_type> \ 223 SCHNEK_INLINE operator symbol ( \ 224 const ArrayExpression<exp1, length> &A, \ 225 const ArrayExpression<exp2, length> &B) \ 227 typedef ArrayBinaryOp \ 229 ArrayExpression<exp1, length>, \ 230 ArrayExpression<exp2, length>, \ 231 op<typename exp1::value_type> \ 234 return ArrayExpression<OperatorType, length>(OperatorType(A,B)); \ 239 #define ARR_ARR(op, symbol) \ 243 template<size_t> class CheckingPolicy1, \ 244 template<size_t> class CheckingPolicy2 \ 248 ArrayExpression< Array<T,length,CheckingPolicy1>, length >, \ 249 ArrayExpression< Array<T,length,CheckingPolicy2>, length >, \ 254 SCHNEK_INLINE operator symbol ( \ 255 const Array<T,length,CheckingPolicy1> &A, \ 256 const Array<T,length,CheckingPolicy2> &B \ 259 typedef ArrayBinaryOp< \ 260 ArrayExpression< Array<T,length,CheckingPolicy1>, length >, \ 261 ArrayExpression< Array<T,length,CheckingPolicy2>, length >, \ 264 return ArrayExpression<OperatorType, length> (OperatorType(A,B)); \ 268 #define EXPR_ARR(op, symbol) \ 273 template<size_t> class CheckingPolicy \ 277 ArrayExpression<exp, length>, \ 278 ArrayExpression< Array<T,length,CheckingPolicy>, length >, \ 283 SCHNEK_INLINE operator symbol ( \ 284 const ArrayExpression<exp, length> &A, \ 285 const Array<T,length,CheckingPolicy> &B \ 288 typedef ArrayBinaryOp< \ 289 ArrayExpression<exp, length>, \ 290 ArrayExpression< Array<T,length,CheckingPolicy>, length >, \ 294 return ArrayExpression<OperatorType, length> (OperatorType(A,B)); \ 299 #define ARR_EXPR(op, symbol) \ 304 template<size_t> class CheckingPolicy \ 308 ArrayExpression< Array<T,length,CheckingPolicy>, length >, \ 309 ArrayExpression<exp, length>, \ 314 SCHNEK_INLINE operator symbol ( \ 315 const Array<T,length,CheckingPolicy> &A, \ 316 const ArrayExpression<exp, length> &B \ 319 typedef ArrayBinaryOp< \ 320 ArrayExpression< Array<T,length,CheckingPolicy>, length >, \ 321 ArrayExpression<exp, length>, \ 325 return ArrayExpression<OperatorType, length> (OperatorType(A,B)); \ 329 #define SCAL_EXPR(op, symbol) \ 330 template<class T, class exp, size_t length> \ 333 ArrayConstantExp<T>, \ 334 ArrayExpression<exp, length>, \ 339 SCHNEK_INLINE operator symbol (const T &A, const ArrayExpression<exp, length> &B) \ 341 typedef ArrayBinaryOp< \ 342 ArrayConstantExp<T>, \ 343 ArrayExpression<exp, length>, \ 347 return ArrayExpression<OperatorType, length> (OperatorType(A,B)); \ 351 #define EXPR_SCAL(op, symbol) \ 352 template<class T, class exp, size_t length> \ 355 ArrayExpression<exp, length>, \ 356 ArrayConstantExp<T>, \ 361 SCHNEK_INLINE operator symbol (const ArrayExpression<exp, length> &A, const T &B) \ 363 typedef ArrayBinaryOp< \ 364 ArrayExpression<exp, length>, \ 365 ArrayConstantExp<T>, \ 369 return ArrayExpression<OperatorType, length> (OperatorType(A,B)); \ 372 #define SCAL_ARR(op, symbol) \ 373 template<class T, size_t length, template<size_t> class CheckingPolicy> \ 376 ArrayConstantExp<T>, \ 377 Array<T,length,CheckingPolicy>, \ 382 SCHNEK_INLINE operator symbol (const T &A, const Array<T,length,CheckingPolicy> &B) \ 384 typedef ArrayBinaryOp< \ 385 ArrayConstantExp<T>, \ 386 Array<T,length,CheckingPolicy>, \ 390 return ArrayExpression<OperatorType, length> (OperatorType(A,B)); \ 394 #define ARR_SCAL(op, symbol) \ 395 template<class T, size_t length, template<size_t> class CheckingPolicy> \ 398 Array<T,length,CheckingPolicy>, \ 399 ArrayConstantExp<T>, \ 404 SCHNEK_INLINE operator symbol (const Array<T,length,CheckingPolicy> &A, const T &B) \ 406 typedef ArrayBinaryOp< \ 407 Array<T,length,CheckingPolicy>, \ 408 ArrayConstantExp<T>, \ 412 return ArrayExpression<OperatorType, length> (OperatorType(A,B)); \ 416 #define UNARY_ARR(op, symbol) \ 420 template<size_t> class CheckingPolicy1 \ 424 ArrayExpression< Array<T,length,CheckingPolicy1>, length >, \ 429 SCHNEK_INLINE operator symbol ( \ 430 const Array<T,length,CheckingPolicy1> &A \ 433 typedef ArrayUnaryOp< \ 434 ArrayExpression< Array<T,length,CheckingPolicy1>, length >, \ 438 return ArrayExpression<OperatorType, length> (OperatorType(A)); \ 443 #define UNARY_EXPR(op, symbol) \ 448 template<size_t> class CheckingPolicy \ 452 ArrayExpression<exp, length>, \ 457 SCHNEK_INLINE operator symbol ( \ 458 const ArrayExpression<exp, length> &A \ 461 typedef ArrayUnaryOp< \ 462 ArrayExpression<exp, length>, \ 466 return ArrayExpression<OperatorType, length> (OperatorType(A)); \ 538 #pragma GCC diagnostic pop 540 template<
class T,
size_t Length,
template <
size_t>
class CheckingPolicy>
541 template<
class Operator>
544 for (
size_t i=0; i<Length; ++i)
551 template<
class T,
size_t Length,
template <
size_t>
class CheckingPolicy>
552 template<
class Operator>
555 for (
size_t i=0; i<Length; ++i)
560 template<
class T,
size_t Length,
template <
size_t>
class CheckingPolicy>
561 template<
class Operator>
564 for (
size_t i=0; i<Length; ++i)
569 template<
class T,
size_t Length,
template <
size_t>
class CheckingPolicy>
570 template<
class Operator>
573 for (
size_t i=0; i<Length; ++i)
578 template<
class T,
size_t Length,
template <
size_t>
class CheckingPolicy>
579 template<
class Operator>
582 for (
size_t i=0; i<Length; ++i)
589 template<
class T,
size_t Length,
template <
size_t>
class CheckingPolicy>
590 template<
class Operator>
593 for (
size_t i=0; i<Length; ++i)
600 #endif // SCHNEK_ARRAYEXPRESSION_H_ SCHNEK_INLINE Array< T, Length, CheckingPolicy > & operator+=(const Array< T2, Length, CheckingPolicy2 > &)
Definition: operators2.hpp:34
SCHNEK_INLINE Array()
The default constructor.
Definition: arrayexpression.hpp:154
static SCHNEK_INLINE value_type apply(value_type x)
Returns the sum of the two elements.
Definition: arrayexpression.hpp:198
Definition: arrayexpression.hpp:130
SCHNEK_INLINE ArrayBinaryOp(const Exp1 &A_, const Exp2 &B_)
Definition: arrayexpression.hpp:114
static SCHNEK_INLINE value_type apply(value_type x)
Returns the sum of the two elements.
Definition: arrayexpression.hpp:188
Definition: arrayexpression.hpp:164
static SCHNEK_INLINE value_type apply(value_type x, value_type y)
Returns the sum of the two elements.
Definition: arrayexpression.hpp:178
SCHNEK_INLINE value_type operator[](size_t i) const
Definition: arrayexpression.hpp:95
Definition: arrayexpression.hpp:104
SCHNEK_INLINE ArrayExpression(const Operator Op_)
Definition: arrayexpression.hpp:54
Definition: arrayexpression.hpp:142
SCHNEK_INLINE value_type operator[](size_t i) const
Definition: arrayexpression.hpp:124
Definition: arrayexpression.hpp:78
static SCHNEK_INLINE value_type apply(value_type x, value_type y)
Returns the sum of the two elements.
Definition: arrayexpression.hpp:158
static SCHNEK_INLINE value_type apply(value_type x, value_type y)
Returns the sum of the two elements.
Definition: arrayexpression.hpp:146
SCHNEK_INLINE Array< T, Length, CheckingPolicy > & operator*=(const Array< T2, Length, CheckingPolicy2 > &)
SCHNEK_INLINE value_type operator[](size_t i) const
Definition: arrayexpression.hpp:67
SCHNEK_INLINE ArrayUnaryOp(const ArrayUnaryOp &Op)
Definition: arrayexpression.hpp:89
SCHNEK_INLINE Array< T, Length, CheckingPolicy > & operator=(const Array< T2, Length, CheckingPolicy2 > &)
static SCHNEK_INLINE value_type apply(value_type x, value_type y)
Returns the sum of the two elements.
Definition: arrayexpression.hpp:168
Definition: arrayexpression.hpp:194
SCHNEK_INLINE Array< T, Length, CheckingPolicy > & operator/=(const Array< T2, Length, CheckingPolicy2 > &)
SCHNEK_INLINE ArrayBinaryOp(const ArrayBinaryOp &Op)
Definition: arrayexpression.hpp:117
SCHNEK_INLINE ArrayUnaryOp(const Exp1 &A_)
Definition: arrayexpression.hpp:86
SCHNEK_INLINE Array< T, Length, CheckingPolicy > & operator-=(const Array< T2, Length, CheckingPolicy2 > &)
Definition: arrayexpression.hpp:174
SCHNEK_INLINE ArrayExpression(const ArrayExpression &Expr)
Definition: arrayexpression.hpp:57
Definition: arrayexpression.hpp:184