source: Sophya/trunk/Eval/JET/jet.h@ 2534

Last change on this file since 2534 was 2366, checked in by ansari, 22 years ago

Ajout fonctions Sin/Cos/... ds jet.h + prog en f90 - Reza 18/4/2003

File size: 6.7 KB
Line 
1#ifndef JET_H_SEEN
2#define JET_H_SEEN
3
4#include "machdefs.h"
5
6//========================================================
7// Test d'expression template sur tableaux
8// Reza - Avril 2003
9//========================================================
10
11// ---------------------------------------------------
12// -------- Classe Taille objet Matrice --------------
13// ---------------------------------------------------
14class MtxSize {
15public:
16 MtxSize() : nrow_(0), ncol_(0) { }
17 MtxSize(MtxSize const & a) : nrow_(a.nrow_), ncol_(a.ncol_) { }
18 MtxSize(sa_size_t nr, sa_size_t nc) { nrow_ = nr; ncol_ = nc; }
19 ~MtxSize() {};
20 void ReSize(const MtxSize & a) { nrow_ = a.nrow_; ncol_ = a.ncol_; }
21 bool CompareSize(const MtxSize & a) const ;
22protected:
23 sa_size_t nrow_, ncol_;
24};
25
26
27class JETEvaluator {
28public:
29 JETEvaluator() {}
30 // virtual ~JETEvaluator() {}
31 virtual void EvaluateAll(AnyDataObj& dest) const = 0;
32 /*
33 { throw PError("JETEvaluator::EvaluateAll(AnyDataObj &) Unsupported operation"); }
34 virtual void EvaluateAll(NDataBlock<T> & dest) const
35 { throw PError("JETEvaluator::EvaluateAll( &) Unsupported operation"); }
36 */
37};
38
39// -------- Classe generique d'expression --------------
40
41template <class T, class E>
42class JETExpression : public JETEvaluator {
43public:
44 JETExpression() : e_() { }
45 JETExpression(E const & e) : e_(e) { }
46 JETExpression( JETExpression<T, E> const & e) : e_(e.e_) { }
47 inline T EvaluateAndStep() const { return e_.EvaluateAndStep(); }
48 inline MtxSize const & RefSize() const { return e_.RefSize(); }
49 inline void Reset() const { e_.Reset(); }
50 virtual void EvaluateAll(AnyDataObj& dest) const;
51 inline E & Expression() { return e_; }
52protected:
53 E e_;
54};
55
56// -------- Classe Expression+Constante --------------
57
58template <class T, class E>
59class JETExprAddConst {
60public:
61 JETExprAddConst(E e, T c) : e_(e) , c_(c)
62 { }
63 JETExprAddConst(JETExprAddConst<T, E> const & a) : e_(a.e_), c_(a.c_) { }
64
65 inline T EvaluateAndStep() const { return (e_.EvaluateAndStep()+c_); }
66 MtxSize const & RefSize() const { return e_.RefSize() ; }
67 inline void Reset() const { e_.Reset(); }
68
69protected:
70 E e_;
71 T c_;
72};
73
74// -------- Classe Expression*Constante --------------
75
76template <class T, class E>
77class JETExprMulConst {
78public:
79 JETExprMulConst(E e, T c) : e_(e) , c_(c)
80 { }
81 JETExprMulConst(JETExprMulConst<T, E> const & a) : e_(a.e_), c_(a.c_) { }
82
83 inline T EvaluateAndStep() const { return (e_.EvaluateAndStep()*c_); }
84 MtxSize const & RefSize() const { return e_.RefSize() ; }
85 inline void Reset() const { e_.Reset(); }
86
87protected:
88 E e_;
89 T c_;
90};
91
92
93
94// -------- Classe Expression+Expression --------------
95template <class T, class E1, class E2>
96class JETExprAdd {
97public:
98 JETExprAdd(E1 e1, E2 e2) :
99 e1_(e1) , e2_(e2)
100 {
101 if (! e1.RefSize().CompareSize(e2.RefSize()) )
102 throw SzMismatchError("JETExprAdd() Unequal matrix size");
103 }
104 JETExprAdd(JETExprAdd<T, E1, E2> const & a) : e1_(a.e1_), e2_(a.e2_) { }
105
106 inline T EvaluateAndStep() const { return (e1_.EvaluateAndStep() + e2_.EvaluateAndStep()); }
107 virtual MtxSize const & RefSize() const { return e1_.RefSize() ; }
108 inline void Reset() const { e1_.Reset(); e2_.Reset(); }
109protected:
110 E1 e1_;
111 E2 e2_;
112};
113
114// -------- Classe Expression*Expression --------------
115template <class T, class E1, class E2>
116class JETExprMult {
117public:
118 JETExprMult(E1 e1, E2 e2) :
119 e1_(e1) , e2_(e2)
120 {
121 if (! e1.RefSize().CompareSize(e2.RefSize()) )
122 throw SzMismatchError("JETExprAdd() Unequal matrix size");
123 }
124 JETExprMult(JETExprMult<T, E1, E2> const & a) : e1_(a.e1_), e2_(a.e2_) { }
125
126 inline T EvaluateAndStep() const { return (e1_.EvaluateAndStep() * e2_.EvaluateAndStep()); }
127 virtual MtxSize const & RefSize() const { return e1_.RefSize() ; }
128 inline void Reset() const { e1_.Reset(); e2_.Reset(); }
129protected:
130 E1 e1_;
131 E2 e2_;
132};
133
134// -------- Classe Fonc(Expression) --------------
135template <class T>
136class FSin {
137public:
138 FSin() { }
139 FSin(FSin<T> const &) { }
140 inline T FuncVal(T x) const { return sin(x); }
141};
142template <class T>
143class FCos {
144public:
145 FCos() { }
146 FCos(FCos<T> const &) { }
147 inline T FuncVal(T x) const { return cos(x); }
148};
149template <class T>
150class FTan {
151public:
152 FTan() { }
153 FTan(FTan<T> const &) { }
154 inline T FuncVal(T x) const { return tan(x); }
155};
156template <class T>
157class FLog {
158public:
159 FLog() { }
160 FLog(FLog<T> const &) { }
161 inline T FuncVal(T x) const { return log(x); }
162};
163template <class T>
164class FExp {
165public:
166 FExp() { }
167 FExp(FExp<T> const &) { }
168 inline T FuncVal(T x) const { return exp(x); }
169};
170
171template <class T, class E, class F>
172class JETExprFunc {
173public:
174 JETExprFunc(E e, F f) : e_(e), f_(f) { }
175 JETExprFunc( JETExprFunc<T, E, F> const & a) : e_(a.e_), f_(a.f_) { }
176 inline T EvaluateAndStep() const { return f_.FuncVal(e_.EvaluateAndStep()); }
177 virtual MtxSize const & RefSize() const { return e_.RefSize() ; }
178 inline void Reset() const { e_.Reset(); }
179protected:
180 E e_;
181 F f_;
182};
183
184
185//----- Definition operateur Expression + Cste
186template <class T, class E>
187JETExpression< T, JETExprAddConst<T,E> > operator +
188 (JETExpression<T,E> e, T c)
189 { return JETExpression< T, JETExprAddConst<T,E> >
190 (JETExprAddConst<T,E>(e.Expression(), c) ); }
191
192template <class T, class E>
193JETExpression< T, JETExprAddConst<T,E> > operator +
194 (T c, JETExpression<T,E> e)
195 { return JETExpression< T, JETExprAddConst<T,E> >
196 (JETExprAddConst<T,E>(e.Expression(), c) ); }
197
198//----- Definition operateur Expression * Cste
199template <class T, class E>
200JETExpression< T, JETExprMulConst<T,E> > operator *
201 (JETExpression<T,E> e, T c)
202 { return JETExpression< T, JETExprMulConst<T,E> >
203 (JETExprMulConst<T,E>(e.Expression(), c) ); }
204
205template <class T, class E>
206JETExpression< T, JETExprMulConst<T,E> > operator *
207 (T c, JETExpression<T,E> e)
208 { return JETExpression< T, JETExprMulConst<T,E> >
209 (JETExprMulConst<T,E>(e.Expression(), c) ); }
210
211//----- Definition operateur Expression + Expression
212template <class T, class E1, class E2>
213JETExpression< T, JETExprAdd<T,E1, E2> > operator +
214 (JETExpression<T,E1> e1, JETExpression<T,E2> e2)
215 { return JETExpression< T, JETExprAdd<T, E1, E2> >
216 (JETExprAdd<T,E1,E2>(e1.Expression(), e2.Expression()) ); }
217
218//----- Definition operateur Expression * Expression
219template <class T, class E1, class E2>
220JETExpression< T, JETExprMult<T,E1, E2> > operator *
221 (JETExpression<T,E1> e1, JETExpression<T,E2> e2)
222 { return JETExpression< T, JETExprMult<T, E1, E2> >
223 (JETExprMult<T,E1,E2>(e1.Expression(), e2.Expression()) ); }
224
225//---- Definition Sin/Cos/Tan/Log/Exp
226template <class T, class E>
227JETExpression< T, JETExprFunc<T,E,FSin<T> > > Sin ( JETExpression<T,E> e)
228{ return JETExpression< T, JETExprFunc<T,E,FSin<T> > > (JETExprFunc<T,E,FSin<T> >(e.Expression(), FSin<T>() ) ); }
229#endif
230
Note: See TracBrowser for help on using the repository browser.