1 #ifndef MEDMEM_WRAPPER_FIELD_HXX
2 #define MEDMEM_WRAPPER_FIELD_HXX
4 #include "MEDMEM_Field.hxx"
8 //////////////////////////////////////////////////////////////////
10 /// DECLARATIONS ET CODE ///
12 //////////////////////////////////////////////////////////////////
14 /*********************************************************/
16 /* Template Arithmétiques de Valdhuizen */
18 /*********************************************************/
20 template <class TYPE> class Valeur;
25 static double apply(double a,double b) {return a+b;}
31 static double apply(double a,double b) {return a*b;}
35 template <typename Left,typename Op, typename Right> struct X
39 X(Left l,Right r):left(l),right(r){}
40 double operator[](int i)
42 return Op::apply(left[i],right[i]);
46 template <typename Right> struct X<double,Multiply,Right>
50 X(double l,Right r):left(l),right(r){}
51 double operator[](int i)
53 return Multiply::apply(left,right[i]);
57 template <typename TYPE> X< Valeur<TYPE>,Plus,Valeur<TYPE> > operator+(Valeur<TYPE> v1,Valeur<TYPE> v2)
59 return X< Valeur<TYPE>,Plus,Valeur<TYPE> >(v1,v2);
62 template <typename TYPE> X< double,Multiply,Valeur<double> > operator*(TYPE sca,Valeur<TYPE> v)
64 return X< TYPE,Multiply,Valeur<TYPE> >(sca,v);
67 template <typename TYPE,typename L, typename O, typename R> X< Valeur<TYPE>,Plus,X<L,O,R> > operator+(Valeur<TYPE> v,X<L,O,R> expression)
69 return X< Valeur<TYPE>,Plus,X<L,O,R> >(v,expression);
72 template <typename TYPE,typename L, typename O, typename R> X< X<L,O,R>,Plus,Valeur<TYPE> > operator+(X<L,O,R> expression,Valeur<TYPE> v)
74 return X< X<L,O,R>,Plus,Valeur<TYPE> >(expression,v);
77 template <typename Ll, typename Ol, typename Rl,typename Lr, typename Or, typename Rr> X< X<Ll,Ol,Rl>,Plus, X<Lr,Or,Rr> > operator+(X<Ll,Ol,Rl> el, X<Lr,Or,Rr> er )
79 return X< X<Ll,Ol,Rl>,Plus,X<Lr,Or,Rr> >(el,er);
82 template <typename L, typename O, typename R> X< double,Multiply,X<L,O,R> > operator*(double sca,X<L,O,R> expression)
84 return X< double,Multiply,X<L,O,R> >(sca,expression);
87 template <typename Left,typename Op,typename Right> X< double,Multiply,X<Left,Op,Right> > operator/(X<Left,Op,Right> l,double x)
89 return X< double,Multiply,X<Left,Op,Right> >(((double) 1/x),l);
92 /*********************************************************/
96 /*********************************************************/
98 // Problèmes : les constructeurs par copie ne sont pas satisfaisants
100 template <class TYPE> class Valeur
107 Valeur():valeurs(NULL),a_detruire(0){}
108 Valeur(TYPE * val,int nv):valeurs(val),nbr_valeurs(nv),a_detruire(0){} // A VERIFIER
109 Valeur(int n):nbr_valeurs(n),a_detruire(1)
111 valeurs=new TYPE[nbr_valeurs];
113 template <typename Left,typename Op,typename Right> Valeur(X<Left,Op,Right> expression)
115 for (int i=0;i<nbr_valeurs;i++) valeurs[i]=expression[i];
117 template <typename Left,typename Op,typename Right> void operator=(X<Left,Op,Right> expression)
119 for (int i=0;i<nbr_valeurs;i++) valeurs[i]=expression[i];
121 void operator=(Valeur v)
123 for (int i=0;i<nbr_valeurs;i++) valeurs[i]=v[i];
125 Valeur(const Valeur &v):nbr_valeurs(v.nbr_valeurs)
130 valeurs=new TYPE[nbr_valeurs];
131 for (int i=0;i<nbr_valeurs;i++) valeurs[i]=v.valeurs[i];
139 ~Valeur(){if (a_detruire) delete [] valeurs;}
140 TYPE operator[](int i){return valeurs[i];}
141 int SIZE() const {return nbr_valeurs;}
144 template <class TYPE> ostream &operator<<(ostream &os,Valeur<TYPE> v)
147 for (int i=0;i<v.SIZE();i++) os<<" "<<v[i]<<flush;
152 /*********************************************************/
154 /* Classe Wrapper_MED_Field */
156 /*********************************************************/
158 class Wrapper_MED_Field
165 Wrapper_MED_Field():valeurs(NULL){}
166 Wrapper_MED_Field(int nv, int nc, double * v):nbr_valeurs(nv),nbr_composantes(nc),valeurs(v)
169 Wrapper_MED_Field(const FIELD<double> * medfield)
171 nbr_valeurs=medfield->getNumberOfValues();
172 nbr_composantes=medfield->getNumberOfComponents();
173 valeurs=const_cast<double *>(medfield->getValue(MED_FULL_INTERLACE));
175 ~Wrapper_MED_Field(){}
176 inline Valeur<double> operator[](int i)
178 if ((i<0)||(i>=nbr_valeurs))
181 cerr<<"Outbound call dans Wrapper MED Field"<<endl;
182 cerr<<"Inférior Bound = "<<0<<endl;
183 cerr<<"Supérior Bound = "<<nbr_valeurs-1<<endl;
184 cerr<<"Call = "<<i<<endl;
187 return Valeur<double>(&valeurs[nbr_composantes*i],nbr_composantes);
189 double * Get_Valeurs() {return valeurs;}
190 inline int Get_Nbr_Valeurs() const {return nbr_valeurs;}
191 inline int Get_Nbr_Composantes() const {return nbr_composantes;}
192 friend ostream & operator<<(ostream &os, Wrapper_MED_Field);
195 ostream & operator<<(ostream &os, Wrapper_MED_Field wmf)
197 for (int i=0;i<wmf.nbr_valeurs;i++) os<<"Wrapper_MED_Field["<<i<<"] = "<<wmf[i]<<endl;