source: Sophya/branches/Reza/Eval/JET/jet.h@ 2362

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

Creation du module JET, Test / evaluation de Expressions Template

Reza 17 Avril 2003

File size: 5.4 KB
RevLine 
[2362]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
135
136//----- Definition operateur Expression + Cste
137template <class T, class E>
138JETExpression< 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
143template <class T, class E>
144JETExpression< 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
150template <class T, class E>
151JETExpression< 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
156template <class T, class E>
157JETExpression< 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
163template <class T, class E1, class E2>
164JETExpression< 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
170template <class T, class E1, class E2>
171JETExpression< 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
Note: See TracBrowser for help on using the repository browser.