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 | // ---------------------------------------------------
|
---|
14 | class MtxSize {
|
---|
15 | public:
|
---|
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 ;
|
---|
22 | protected:
|
---|
23 | sa_size_t nrow_, ncol_;
|
---|
24 | };
|
---|
25 |
|
---|
26 |
|
---|
27 | class JETEvaluator {
|
---|
28 | public:
|
---|
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 |
|
---|
41 | template <class T, class E>
|
---|
42 | class JETExpression : public JETEvaluator {
|
---|
43 | public:
|
---|
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_; }
|
---|
52 | protected:
|
---|
53 | E e_;
|
---|
54 | };
|
---|
55 |
|
---|
56 | // -------- Classe Expression+Constante --------------
|
---|
57 |
|
---|
58 | template <class T, class E>
|
---|
59 | class JETExprAddConst {
|
---|
60 | public:
|
---|
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 |
|
---|
69 | protected:
|
---|
70 | E e_;
|
---|
71 | T c_;
|
---|
72 | };
|
---|
73 |
|
---|
74 | // -------- Classe Expression*Constante --------------
|
---|
75 |
|
---|
76 | template <class T, class E>
|
---|
77 | class JETExprMulConst {
|
---|
78 | public:
|
---|
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 |
|
---|
87 | protected:
|
---|
88 | E e_;
|
---|
89 | T c_;
|
---|
90 | };
|
---|
91 |
|
---|
92 |
|
---|
93 |
|
---|
94 | // -------- Classe Expression+Expression --------------
|
---|
95 | template <class T, class E1, class E2>
|
---|
96 | class JETExprAdd {
|
---|
97 | public:
|
---|
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(); }
|
---|
109 | protected:
|
---|
110 | E1 e1_;
|
---|
111 | E2 e2_;
|
---|
112 | };
|
---|
113 |
|
---|
114 | // -------- Classe Expression*Expression --------------
|
---|
115 | template <class T, class E1, class E2>
|
---|
116 | class JETExprMult {
|
---|
117 | public:
|
---|
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(); }
|
---|
129 | protected:
|
---|
130 | E1 e1_;
|
---|
131 | E2 e2_;
|
---|
132 | };
|
---|
133 |
|
---|
134 |
|
---|
135 |
|
---|
136 | //----- Definition operateur Expression + Cste
|
---|
137 | template <class T, class E>
|
---|
138 | JETExpression< T, JETExprAddConst<T,E> > operator +
|
---|
139 | (JETExpression<T,E> e, T c)
|
---|
140 | { return JETExpression< T, JETExprAddConst<T,E> >
|
---|
141 | (JETExprAddConst<T,E>(e.Expression(), c) ); }
|
---|
142 |
|
---|
143 | template <class T, class E>
|
---|
144 | JETExpression< T, JETExprAddConst<T,E> > operator +
|
---|
145 | (T c, JETExpression<T,E> e)
|
---|
146 | { return JETExpression< T, JETExprAddConst<T,E> >
|
---|
147 | (JETExprAddConst<T,E>(e.Expression(), c) ); }
|
---|
148 |
|
---|
149 | //----- Definition operateur Expression * Cste
|
---|
150 | template <class T, class E>
|
---|
151 | JETExpression< T, JETExprMulConst<T,E> > operator *
|
---|
152 | (JETExpression<T,E> e, T c)
|
---|
153 | { return JETExpression< T, JETExprMulConst<T,E> >
|
---|
154 | (JETExprMulConst<T,E>(e.Expression(), c) ); }
|
---|
155 |
|
---|
156 | template <class T, class E>
|
---|
157 | JETExpression< T, JETExprMulConst<T,E> > operator *
|
---|
158 | (T c, JETExpression<T,E> e)
|
---|
159 | { return JETExpression< T, JETExprMulConst<T,E> >
|
---|
160 | (JETExprMulConst<T,E>(e.Expression(), c) ); }
|
---|
161 |
|
---|
162 | //----- Definition operateur Expression + Expression
|
---|
163 | template <class T, class E1, class E2>
|
---|
164 | JETExpression< T, JETExprAdd<T,E1, E2> > operator +
|
---|
165 | (JETExpression<T,E1> e1, JETExpression<T,E2> e2)
|
---|
166 | { return JETExpression< T, JETExprAdd<T, E1, E2> >
|
---|
167 | (JETExprAdd<T,E1,E2>(e1.Expression(), e2.Expression()) ); }
|
---|
168 |
|
---|
169 | //----- Definition operateur Expression * Expression
|
---|
170 | template <class T, class E1, class E2>
|
---|
171 | JETExpression< T, JETExprMult<T,E1, E2> > operator *
|
---|
172 | (JETExpression<T,E1> e1, JETExpression<T,E2> e2)
|
---|
173 | { return JETExpression< T, JETExprMult<T, E1, E2> >
|
---|
174 | (JETExprMult<T,E1,E2>(e1.Expression(), e2.Expression()) ); }
|
---|
175 |
|
---|
176 | #endif
|
---|
177 |
|
---|