#ifndef JET_H_SEEN #define JET_H_SEEN #include "machdefs.h" #include "sopnamsp.h" //======================================================== // Test d'expression template sur tableaux // Reza - Avril 2003 //======================================================== // --------------------------------------------------- // -------- Classe Taille objet Matrice -------------- // --------------------------------------------------- class MtxSize { public: MtxSize() : nrow_(0), ncol_(0) { } MtxSize(MtxSize const & a) : nrow_(a.nrow_), ncol_(a.ncol_) { } MtxSize(sa_size_t nr, sa_size_t nc) { nrow_ = nr; ncol_ = nc; } ~MtxSize() {}; void ReSize(const MtxSize & a) { nrow_ = a.nrow_; ncol_ = a.ncol_; } bool CompareSize(const MtxSize & a) const { if ((a.nrow_ == 0) || (a.ncol_ == 0) ) throw RangeCheckError("MtxSize::CompareSize(mx) Size(mx) = 0"); if ((nrow_ == a.nrow_) && (ncol_ == a.ncol_)) return true; else return false; } protected: sa_size_t nrow_, ncol_; }; class JETEvaluator { public: JETEvaluator() {} // virtual ~JETEvaluator() {} virtual void EvaluateAll(AnyDataObj& dest) const = 0; /* { throw PError("JETEvaluator::EvaluateAll(AnyDataObj &) Unsupported operation"); } virtual void EvaluateAll(NDataBlock & dest) const { throw PError("JETEvaluator::EvaluateAll( &) Unsupported operation"); } */ }; // -------- Classe generique d'expression -------------- template class JETExpression : public JETEvaluator { public: JETExpression() : e_() { } JETExpression(E const & e) : e_(e) { } JETExpression( JETExpression const & e) : e_(e.e_) { } inline T EvaluateAndStep() const { return e_.EvaluateAndStep(); } inline MtxSize const & RefSize() const { return e_.RefSize(); } inline void Reset() const { e_.Reset(); } virtual void EvaluateAll(AnyDataObj& dest) const; inline E & Expression() { return e_; } protected: E e_; }; // -------- Classe Expression+Constante -------------- template class JETExprAddConst { public: JETExprAddConst(E e, T c) : e_(e) , c_(c) { } JETExprAddConst(JETExprAddConst const & a) : e_(a.e_), c_(a.c_) { } inline T EvaluateAndStep() const { return (e_.EvaluateAndStep()+c_); } MtxSize const & RefSize() const { return e_.RefSize() ; } inline void Reset() const { e_.Reset(); } protected: E e_; T c_; }; // -------- Classe Expression*Constante -------------- template class JETExprMulConst { public: JETExprMulConst(E e, T c) : e_(e) , c_(c) { } JETExprMulConst(JETExprMulConst const & a) : e_(a.e_), c_(a.c_) { } inline T EvaluateAndStep() const { return (e_.EvaluateAndStep()*c_); } MtxSize const & RefSize() const { return e_.RefSize() ; } inline void Reset() const { e_.Reset(); } protected: E e_; T c_; }; // -------- Classe Expression+Expression -------------- template class JETExprAdd { public: JETExprAdd(E1 e1, E2 e2) : e1_(e1) , e2_(e2) { if (! e1.RefSize().CompareSize(e2.RefSize()) ) throw SzMismatchError("JETExprAdd() Unequal matrix size"); } JETExprAdd(JETExprAdd const & a) : e1_(a.e1_), e2_(a.e2_) { } inline T EvaluateAndStep() const { return (e1_.EvaluateAndStep() + e2_.EvaluateAndStep()); } virtual MtxSize const & RefSize() const { return e1_.RefSize() ; } inline void Reset() const { e1_.Reset(); e2_.Reset(); } protected: E1 e1_; E2 e2_; }; // -------- Classe Expression*Expression -------------- template class JETExprMult { public: JETExprMult(E1 e1, E2 e2) : e1_(e1) , e2_(e2) { if (! e1.RefSize().CompareSize(e2.RefSize()) ) throw SzMismatchError("JETExprAdd() Unequal matrix size"); } JETExprMult(JETExprMult const & a) : e1_(a.e1_), e2_(a.e2_) { } inline T EvaluateAndStep() const { return (e1_.EvaluateAndStep() * e2_.EvaluateAndStep()); } virtual MtxSize const & RefSize() const { return e1_.RefSize() ; } inline void Reset() const { e1_.Reset(); e2_.Reset(); } protected: E1 e1_; E2 e2_; }; // -------- Classe Fonc(Expression) -------------- template class FSin { public: FSin() { } FSin(FSin const &) { } inline T FuncVal(T x) const { return sin(x); } }; template class FCos { public: FCos() { } FCos(FCos const &) { } inline T FuncVal(T x) const { return cos(x); } }; template class FTan { public: FTan() { } FTan(FTan const &) { } inline T FuncVal(T x) const { return tan(x); } }; template class FLog { public: FLog() { } FLog(FLog const &) { } inline T FuncVal(T x) const { return log(x); } }; template class FExp { public: FExp() { } FExp(FExp const &) { } inline T FuncVal(T x) const { return exp(x); } }; template class JETExprFunc { public: JETExprFunc(E e, F f) : e_(e), f_(f) { } JETExprFunc( JETExprFunc const & a) : e_(a.e_), f_(a.f_) { } inline T EvaluateAndStep() const { return f_.FuncVal(e_.EvaluateAndStep()); } virtual MtxSize const & RefSize() const { return e_.RefSize() ; } inline void Reset() const { e_.Reset(); } protected: E e_; F f_; }; //----- Definition operateur Expression + Cste template JETExpression< T, JETExprAddConst > operator + (JETExpression e, T c) { return JETExpression< T, JETExprAddConst > (JETExprAddConst(e.Expression(), c) ); } template JETExpression< T, JETExprAddConst > operator + (T c, JETExpression e) { return JETExpression< T, JETExprAddConst > (JETExprAddConst(e.Expression(), c) ); } //----- Definition operateur Expression * Cste template JETExpression< T, JETExprMulConst > operator * (JETExpression e, T c) { return JETExpression< T, JETExprMulConst > (JETExprMulConst(e.Expression(), c) ); } template JETExpression< T, JETExprMulConst > operator * (T c, JETExpression e) { return JETExpression< T, JETExprMulConst > (JETExprMulConst(e.Expression(), c) ); } //----- Definition operateur Expression + Expression template JETExpression< T, JETExprAdd > operator + (JETExpression e1, JETExpression e2) { return JETExpression< T, JETExprAdd > (JETExprAdd(e1.Expression(), e2.Expression()) ); } //----- Definition operateur Expression * Expression template JETExpression< T, JETExprMult > operator * (JETExpression e1, JETExpression e2) { return JETExpression< T, JETExprMult > (JETExprMult(e1.Expression(), e2.Expression()) ); } //---- Definition Sin/Cos/Tan/Log/Exp template JETExpression< T, JETExprFunc > > Sin ( JETExpression e) { return JETExpression< T, JETExprFunc > > (JETExprFunc >(e.Expression(), FSin() ) ); } #endif