75 template<
class WrappedExpr>
83 return static_cast<WrappedExpr&
>(*this);
87 return static_cast<const WrappedExpr&
>(*this);
209 template<
class T,
class C>
218 template<
class T,
class C>
245 template<
class Value_t,
class Child_t>
289 template<
class Value_t,
class Left_t,
class Right_t>
291 public PETE_Expr< PETE_TBTree<Value_t, Left_t, Right_t> >
337 template<
class Value_t,
class Left_t,
class M
iddle_t,
class Right_t >
339 :
public PETE_Expr< PETE_TTTree< Value_t, Left_t, Middle_t, Right_t > >
345 typename Middle_t::PETE_Return_t,
363 const Middle_t& m,
const Right_t& r)
379 template<
class Op,
class T1,
class Functor,
class Combiner>
381 typename Functor::PETE_Return_t
387 template<
class Op,
class T1,
class T2,
class Functor,
class Combiner>
389 typename Functor::PETE_Return_t
395 template<
class Op,
class T1,
class T2,
class T3,
class Functor,
class Combiner>
397 typename Functor::PETE_Return_t
408 template<
class T,
class Op>
425 if ( (l>=0) && (r>=0) ) {
426 PInsist(l==r,
"Arguments not equal in AssertEquals()!!");
429 if ( r>=0 )
return ret = r;
436 if ( (l>=0) && (m>=0) && (r>=0) ) {
437 PInsist(m==l && m==r,
"Arguments not equal in AssertEquals()!!");
478 template<
class Op,
class T1,
class Functor>
488 template<
class Op,
class T1,
class T2,
class Functor>
492 typename T2::PETE_Return_t,Op>
::type
512 template<
class T1,
class T2,
class Functor>
515 typedef typename T2::PETE_Return_t
T3;
528 template<
class Op,
class T1,
class T2,
class Functor>
568 template<
class Op,
class Sub>
575 template<
class Op,
class Left,
class Right>
582 template<
class Op,
class Left,
class M
iddle,
class Right>
589 template<
class Left,
class Right>
598 template<
int Safe,
class T1,
class T2,
class T3,
class Op,
class Functor>
603 typename T1::PETE_Return_t,
604 typename T2::PETE_Return_t,
605 typename T3::PETE_Return_t,
616 template<
class T1,
class T2,
class T3,
class Functor>
622 typename T1::PETE_Return_t,
623 typename T2::PETE_Return_t,
624 typename T3::PETE_Return_t,
634 template<
class T1,
class T2,
class T3,
class Functor,
class Op>
637 typename T2::PETE_Return_t,
638 typename T3::PETE_Return_t,Op>
::type
643 ,T1,T2,T3,Op,Functor>::apply(node,f);
652 #if !defined(PETE_USER_REDUCTION_CODE)
654 #define PETE_USER_REDUCTION_CODE
658 template<
class R,
class T,
class InitOp,
class AccOp>
661 InitOp init_op, AccOp acc_op )
665 typename T::PETE_Expr_t expr(const_expr.
PETE_unwrap().MakeExpression());
680 for (
int i = 1; i <
n; ++i)
704 #define PETE_DefineUnary(Fun,Expr,Op) \
706 inline typename PETEUnaryReturn<T, Op>::type \
707 PETE_apply(Op, const T& a) \
712 inline PETE_TUTree<Op, typename T::PETE_Expr_t> \
713 Fun(const PETE_Expr<T>& l) \
715 return PETE_TUTree<Op, typename T::PETE_Expr_t> \
716 (l.PETE_unwrap().MakeExpression()); \
748 template<class T1, class T2>
755 template<
class T1,
class Expr>
770 #define PETE_DefineBinary(Fun,Expr,Op) \
771 template<class T1, class T2> \
772 inline typename PETEBinaryReturn<T1, T2, Op>::type \
773 PETE_apply(Op, const T1& a, const T2& b) \
777 template<class T1, class T2> \
778 inline PETE_TBTree<Op, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t> \
779 Fun(const PETE_Expr<T1>& l, const PETE_Expr<T2>& r) \
781 typedef PETE_TBTree<Op,typename T1::PETE_Expr_t, \
782 typename T2::PETE_Expr_t> ret; \
783 return ret(l.PETE_unwrap().MakeExpression(), \
784 r.PETE_unwrap().MakeExpression()); \
787 #define PETE_DefineBinarySynonym(Fun,Op) \
788 template<class T1, class T2> \
789 inline PETE_TBTree<Op, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t> \
790 Fun(const PETE_Expr<T1>& l, const PETE_Expr<T2>& r) \
792 typedef PETE_TBTree<Op,typename T1::PETE_Expr_t,typename T2::PETE_Expr_t> \
794 return ret(l.PETE_unwrap().MakeExpression(), \
795 r.PETE_unwrap().MakeExpression()); \
823 #define PETE_DefineBinaryWithScalars(Fun,Op,Sca) \
825 inline PETE_TBTree<Op, PETE_Scalar<Sca>, typename T::PETE_Expr_t> \
826 Fun(const Sca l, const PETE_Expr<T>& r) \
828 typedef PETE_TBTree<Op, PETE_Scalar<Sca>, typename T::PETE_Expr_t> ret; \
829 return ret(PETE_Scalar<Sca>(l), r.PETE_unwrap().MakeExpression()); \
832 inline PETE_TBTree<Op, typename T::PETE_Expr_t, PETE_Scalar<Sca> > \
833 Fun(const PETE_Expr<T>& l, const Sca r) \
835 typedef PETE_TBTree<Op, typename T::PETE_Expr_t, PETE_Scalar<Sca> > ret; \
836 return ret(l.PETE_unwrap().MakeExpression(), PETE_Scalar<Sca>(r)); \
846 #define PETE_DefineTrinary(Fun,Expr,Op) \
847 template<class T1, class T2, class T3> \
848 inline typename PETETrinaryReturn<T1,T2,T3,Op>::type \
849 PETE_apply(Op, const T1& a, const T2& b, const T3& c) \
853 template<class Cond_t, class True_t, class False_t> \
854 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
855 typename True_t::PETE_Expr_t, typename False_t::PETE_Expr_t> \
856 Fun(const PETE_Expr<Cond_t>& c, const PETE_Expr<True_t>& t, \
857 const PETE_Expr<False_t>& f) \
859 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
860 typename True_t::PETE_Expr_t, typename False_t::PETE_Expr_t> ret; \
861 return ret(c.PETE_unwrap().MakeExpression(), \
862 t.PETE_unwrap().MakeExpression(), \
863 f.PETE_unwrap().MakeExpression()); \
866 template<
class T1,
class T2,
class T3>
873 template<
class Cond_t,
class True_t,
class False_t>
875 typename True_t::PETE_Expr_t,
876 typename False_t::PETE_Expr_t>
881 typename True_t::PETE_Expr_t,
882 typename False_t::PETE_Expr_t> ret;
883 return ret(
c.PETE_unwrap().MakeExpression(),
889 #define PETE_DefineTrinaryWithScalars(Fun, Op, Sca) \
890 template<class Cond_t, class True_t> \
891 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
892 typename True_t::PETE_Expr_t, PETE_Scalar<Sca> > \
893 Fun(const PETE_Expr<Cond_t>& c, const PETE_Expr<True_t>& t,Sca f) \
895 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, \
896 typename True_t::PETE_Expr_t, PETE_Scalar<Sca> > ret; \
897 return ret(c.PETE_unwrap().MakeExpression(), \
898 t.PETE_unwrap().MakeExpression(), PETE_Scalar<Sca>(f)); \
900 template<class Cond_t, class False_t> \
901 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
902 typename False_t::PETE_Expr_t > \
903 Fun(const PETE_Expr<Cond_t>& c, Sca t, const PETE_Expr<False_t>& f) \
905 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
906 typename False_t::PETE_Expr_t > ret; \
907 return ret(c.PETE_unwrap().MakeExpression(), \
908 PETE_Scalar<Sca>(t), f.PETE_unwrap().MakeExpression()); \
910 template<class Cond_t> \
911 inline PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
913 Fun(const PETE_Expr<Cond_t>& c, Sca t, Sca f) \
915 typedef PETE_TTTree<Op, typename Cond_t::PETE_Expr_t, PETE_Scalar<Sca>, \
916 PETE_Scalar<Sca> > ret; \
917 return ret(c.PETE_unwrap().MakeExpression(), \
918 PETE_Scalar<Sca>(t), PETE_Scalar<Sca>(f)); \
986 #define PETE_DefineScalar(Sca) \
987 PETE_DefineBinaryWithScalars(operator+, OpAdd, Sca) \
988 PETE_DefineBinaryWithScalars(operator-, OpSubtract, Sca) \
989 PETE_DefineBinaryWithScalars(operator*, OpMultipply, Sca) \
990 PETE_DefineBinaryWithScalars(operator/, OpDivide, Sca) \
991 PETE_DefineBinaryWithScalars(operator%, OpMod, Sca) \
992 PETE_DefineBinaryWithScalars(operator<, OpLT, Sca) \
993 PETE_DefineBinaryWithScalars(operator<=, OpLE, Sca) \
994 PETE_DefineBinaryWithScalars(operator>, OpGT, Sca) \
995 PETE_DefineBinaryWithScalars(operator>=, OpGE, Sca) \
996 PETE_DefineBinaryWithScalars(operator==, OpEQ, Sca) \
997 PETE_DefineBinaryWithScalars(operator!=, OpNE, Sca) \
998 PETE_DefineBinaryWithScalars(operator&&, OpAnd, Sca) \
999 PETE_DefineBinaryWithScalars(operator||, OpOr, Sca) \
1000 PETE_DefineBinaryWithScalars(operator&, OpBitwiseAnd, Sca) \
1001 PETE_DefineBinaryWithScalars(operator|, OpBitwiseOr, Sca) \
1002 PETE_DefineBinaryWithScalars(operator^, OpBitwiseXor, Sca) \
1003 PETE_DefineBinaryWithScalars(where, OpWhere, Sca) \
1004 PETE_DefineBinaryWithScalars(copysign, FnCopysign, Sca) \
1005 PETE_DefineBinaryWithScalars(ldexp, FnLdexp, Sca) \
1006 PETE_DefineBinaryWithScalars(pow, FnPow, Sca) \
1007 PETE_DefineBinaryWithScalars(fmod, FnFmod, Sca) \
1008 PETE_DefineBinaryWithScalars(atan2, FnArcTan2, Sca) \
1009 PETE_DefineTrinaryWithScalars(where, OpWhere, Sca)
1031 #define PETE_DefineAssign(Expr,Cond,Op) \
1032 template<class T1, class T2> \
1033 struct PETE_StructApply<Op,T1,T2> \
1035 static void apply(T1& a,const T2& b) { Expr; } \
1038 template<class T1, class T2> \
1039 struct PETE_StructApply<Op,T1,ConditionalAssign<T2> > \
1041 static void apply(T1& a, const ConditionalAssign<T2>& b) \
1048 template<class T1, class T2> \
1050 PETE_apply(Op, T1 &a, const T2& b) \
1052 PETE_StructApply<Op,T1,T2>::apply(a,b); \
1099 static inline const type&
1110 inline typename T::PETE_Expr_t::PETE_Return_t
1113 typename T::PETE_Expr_t::PETE_Return_t val ;
1120 inline typename T::PETE_Expr_t::PETE_Return_t
1123 typename T::PETE_Expr_t::PETE_Return_t val ;
1135 #define UNARY_FUNCTION(RET,FUNC,ARG) \
1136 struct FnUnary_ ## FUNC { \
1137 enum { tag = PETE_UnaryPassThruTag }; \
1139 PETE_DefineUnary(FUNC,FUNC(a),FnUnary_ ## FUNC) \
1141 struct PETEUnaryReturn<ARG, FnUnary_ ## FUNC> { \
1145 #define BINARY_FUNCTION(RET,FUNC,ARG1,ARG2) \
1146 struct FnBinary_ ## FUNC { \
1147 enum { tag = PETE_BinaryPromoteTag }; \
1149 PETE_DefineBinary(FUNC,(FUNC(a,b)),FnBinary_ ## FUNC) \
1151 struct PETEBinaryReturn<ARG1,ARG2,FnBinary_ ## FUNC> { \
PETE_TUTree< FnErf, typename T::PETE_Expr_t > erf(const PETE_Expr< T > &l)
T::PETE_Expr_t::PETE_Return_t sum(const PETE_Expr< T > &expr)
void Reduction(R &ret, const PETE_Expr< T > &const_expr, InitOp init_op, AccOp acc_op)
PETE_TUTree< FnHypTan, typename T::PETE_Expr_t > tanh(const PETE_Expr< T > &l)
T::PETE_Expr_t::PETE_Return_t prod(const PETE_Expr< T > &expr)
PETEUnaryReturn< T, OpUnaryMinus >::type PETE_apply(OpUnaryMinus, const T &a)
PETE_TUTree< FnLog10, typename T::PETE_Expr_t > log10(const PETE_Expr< T > &l)
T for_each(const PETE_Scalar< T > &p, EvalFunctor_0)
PETE_TUTree< FnCeil, typename T::PETE_Expr_t > ceil(const PETE_Expr< T > &l)
PETE_TBTree< FnCopysign, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t > copysign(const PETE_Expr< T1 > &l, const PETE_Expr< T2 > &r)
PETE_TUTree< FnHypCos, typename T::PETE_Expr_t > cosh(const PETE_Expr< T > &l)
#define PETE_USER_REDUCTION_CODE
#define PETE_DefineBinary(Fun, Expr, Op)
PETE_Combiner< bool, OpOr > PETE_OrCombiner
PETE_TTTree< OpWhere, typename Cond_t::PETE_Expr_t, typename True_t::PETE_Expr_t, typename False_t::PETE_Expr_t > where(const PETE_Expr< Cond_t > &c, const PETE_Expr< True_t > &t, const PETE_Expr< False_t > &f)
#define PETE_DefineBinarySynonym(Fun, Op)
PETE_TBTree< FnPow, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t > pow(const PETE_Expr< T1 > &l, const PETE_Expr< T2 > &r)
PETE_TUTree< FnFabs, typename T::PETE_Expr_t > fabs(const PETE_Expr< T > &l)
PETE_Combiner< int, OpAdd > PETE_SumCombiner
PETE_TUTree< FnArcTan, typename T::PETE_Expr_t > atan(const PETE_Expr< T > &l)
PETE_TUTree< FnLog, typename T::PETE_Expr_t > log(const PETE_Expr< T > &l)
PETE_TBTree< FnArcTan2, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t > atan2(const PETE_Expr< T1 > &l, const PETE_Expr< T2 > &r)
#define PETE_DefineScalar(Sca)
#define PETE_DefineUnary(Fun, Expr, Op)
PETE_TUTree< FnTan, typename T::PETE_Expr_t > tan(const PETE_Expr< T > &l)
PETE_TUTree< FnArcCos, typename T::PETE_Expr_t > acos(const PETE_Expr< T > &l)
PETE_TUTree< FnHypSin, typename T::PETE_Expr_t > sinh(const PETE_Expr< T > &l)
PETE_TUTree< FnExp, typename T::PETE_Expr_t > exp(const PETE_Expr< T > &l)
PETE_TUTree< OpCast< T1 >, typename Expr::PETE_Expr_t > pete_cast(const T1 &, const PETE_Expr< Expr > &l)
PETE_TUTree< OpIdentity, typename T::PETE_Expr_t > PETE_identity(const PETE_Expr< T > &l)
PETE_TUTree< FnArcSin, typename T::PETE_Expr_t > asin(const PETE_Expr< T > &l)
PETE_TUTree< FnSqrt, typename T::PETE_Expr_t > sqrt(const PETE_Expr< T > &l)
PETE_TUTree< FnSin, typename T::PETE_Expr_t > sin(const PETE_Expr< T > &l)
PETE_TUTree< FnFloor, typename T::PETE_Expr_t > floor(const PETE_Expr< T > &l)
PETE_TUTree< FnCos, typename T::PETE_Expr_t > cos(const PETE_Expr< T > &l)
PETE_TBTree< FnLdexp, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t > ldexp(const PETE_Expr< T1 > &l, const PETE_Expr< T2 > &r)
PETE_TBTree< FnFmod, typename T1::PETE_Expr_t, typename T2::PETE_Expr_t > fmod(const PETE_Expr< T1 > &l, const PETE_Expr< T2 > &r)
#define PETE_DefineAssign(Expr, Cond, Op)
PETE_Combiner< bool, OpAnd > PETE_AndCombiner
double Sub(double a, double b)
constexpr double c
The velocity of light in m/s.
boost::function< boost::tuple< double, bool >arguments_t)> type
const WrappedExpr & PETE_unwrap() const
WrappedExpr & PETE_unwrap()
PETE_Scalar< T > PETE_Expr_t
PETE_Expr_t MakeExpression() const
PETE_TUTree(const Child_t &c)
PETE_TUTree< Value_t, Child_t > PETE_Expr_t
PETE_TUTree(const Value_t &v, const Child_t &c)
const PETE_Expr_t & MakeExpression() const
PETEUnaryReturn< typename Child_t::PETE_Return_t, Value_t >::type PETE_Return_t
const PETE_Expr_t & MakeExpression() const
PETE_TBTree(const Left_t &l, const Right_t &r)
PETE_TBTree(const Value_t &v, const Left_t &l, const Right_t &r)
PETEBinaryReturn< typename Left_t::PETE_Return_t, typename Right_t::PETE_Return_t, Value_t >::type PETE_Return_t
PETE_TBTree< Value_t, Left_t, Right_t > PETE_Expr_t
PETE_TTTree< Value_t, Left_t, Middle_t, Right_t > PETE_Expr_t
PETE_TTTree(const Value_t &v, const Left_t &l, const Middle_t &m, const Right_t &r)
const PETE_Expr_t & MakeExpression() const
PETE_TTTree(const Left_t &l, const Middle_t &m, const Right_t &r)
PETETrinaryReturn< typename Left_t::PETE_Return_t, typename Middle_t::PETE_Return_t, typename Right_t::PETE_Return_t, Value_t >::type PETE_Return_t
T operator()(T x, T y, T z)
int operator()(int l, int r)
int operator()(int l, int m, int r)
int operator()(int, int, int)
PETEBinaryReturn< typename T1::PETE_Return_t, typename T2::PETE_Return_t, Op >::type Return_t
static Return_t apply(PETE_TBTree< Op, T1, T2 > &node, Functor f)
ConditionalAssign(bool q, const T &v)
static Return_t apply(PETE_TBTree< OpWhere, T1, T2 > &node, Functor f)
ConditionalAssign< T3 > Return_t
static PETETrinaryReturn< typename T1::PETE_Return_t, typename T2::PETE_Return_t, typename T3::PETE_Return_t, Op >::type apply(PETE_TTTree< Op, T1, T2, T3 > &node, Functor f)
static PETETrinaryReturn< typename T1::PETE_Return_t, typename T2::PETE_Return_t, typename T3::PETE_Return_t, OpWhere >::type apply(PETE_TTTree< OpWhere, T1, T2, T3 > &node, Functor f)
static type apply(const T &t)
PETE_TUTree< OpIdentity, T > type
static const type & apply(const PETE_Expr< T > &t)
PETE_ComputeUnaryType< T, Op, Op::tag >::type type
PETE_ComputeBinaryType< T2, T3, Op, Op::tag >::type type