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

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

This commit was generated by cvs2svn to compensate for changes in r2362,
which included commits to RCS files with non-trunk default branches.

File size: 5.4 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
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.