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