00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef SEQUENCE_GEN_H
00012 #define SEQUENCE_GEN_H
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "PETE/IpplExpressions.h"
00039
00040
00041
00042 #define RNG_OPERATOR_WITH_SCALAR(GEN,SCA,OP,APP) \
00043 \
00044 inline PETEBinaryReturn<GEN,SCA,APP>::type \
00045 OP(const GEN& lhs, SCA sca) \
00046 { \
00047 return PETE_apply( APP(), lhs(), sca ); \
00048 } \
00049 \
00050 inline PETEBinaryReturn<SCA,GEN,APP>::type \
00051 OP(SCA sca, const GEN& rhs) \
00052 { \
00053 return PETE_apply( APP(), sca, rhs() ); \
00054 }
00055
00056 #define RNG_OPERATOR(GEN,OP,APP) \
00057 \
00058 RNG_OPERATOR_WITH_SCALAR(GEN,short,OP,APP) \
00059 RNG_OPERATOR_WITH_SCALAR(GEN,int,OP,APP) \
00060 RNG_OPERATOR_WITH_SCALAR(GEN,long,OP,APP) \
00061 RNG_OPERATOR_WITH_SCALAR(GEN,float,OP,APP) \
00062 RNG_OPERATOR_WITH_SCALAR(GEN,double,OP,APP) \
00063 RNG_OPERATOR_WITH_SCALAR(GEN,dcomplex,OP,APP)
00064
00065 #define RNG_BASIC_MATH(GEN) \
00066 \
00067 RNG_OPERATOR(GEN,operator+,OpAdd) \
00068 RNG_OPERATOR(GEN,operator-,OpSubtract) \
00069 RNG_OPERATOR(GEN,operator*,OpMultipply) \
00070 RNG_OPERATOR(GEN,operator/,OpDivide)
00071
00072
00073
00074 template <class GT>
00075 class SequenceGen : public PETE_Expr< SequenceGen<GT> >
00076 {
00077
00078 public:
00079 SequenceGen() { }
00080 SequenceGen(const GT& gen) : Gen(gen) { }
00081
00082
00083 enum { IsExpr = 1 };
00084 typedef SequenceGen<GT> PETE_Expr_t;
00085 typedef typename GT::Return_t PETE_Return_t;
00086 const PETE_Expr_t& MakeExpression() const { return *this; }
00087 PETE_Expr_t& MakeExpression() { return *this; }
00088
00089
00090 typedef typename GT::Return_t Return_t;
00091
00092
00093 GT& getGenerator() { return Gen; }
00094 const GT& getGenerator() const { return Gen; }
00095
00096
00097 inline Return_t operator()(void) const { return Gen(); }
00098
00099 private:
00100
00101 GT Gen;
00102 };
00103
00104
00105 #include "Utility/RNGAssignDefs.h"
00106
00107 #endif // SEQUENCE_GEN_H
00108
00109
00110
00111
00112
00113