source: Sophya/trunk/SophyaLib/TArray/tarray.h@ 785

Last change on this file since 785 was 785, checked in by ansari, 26 years ago

Corrections,amelioration de TArray<T> - Reza 16/3/2000

File size: 12.8 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2// template array class for numerical types
3// R. Ansari, C.Magneville 03/2000
4
5#ifndef TArray_SEEN
6#define TArray_SEEN
7
8#include "machdefs.h"
9#include <math.h>
10#include <iostream.h>
11#include "ndatablock.h"
12#include <complex>
13#include "anydataobj.h"
14#include "ndatablock.h"
15#include "dvlist.h"
16#include "utilarr.h"
17
18
19// Maximum number of dimensions for array
20#define TARRAY_MAXNDIMS 5
21
22namespace SOPHYA {
23
24// Forward declaration
25template <class T> class FIO_TArray;
26
27// ------------ classe template Array -----------
28template <class T>
29class TArray : public AnyDataObj {
30public:
31 // Creation / destruction
32 TArray();
33 TArray(uint_4 ndim, uint_4 * siz, uint_4 step =1);
34 TArray(uint_4 nx, uint_4 ny=0, uint_4 nz=0);
35 TArray(uint_4 ndim, uint_4 * siz, NDataBlock<T> & db, bool share=false, uint_4 step=1, uint_8 offset=0);
36 TArray(uint_4 ndim, uint_4 * siz, T* values, uint_4 step=1, uint_8 offset=0, Bridge* br=NULL);
37 TArray(const TArray<T>& a);
38 TArray(const TArray<T>& a, bool share);
39
40 virtual ~TArray();
41
42 // A = B : partage les donnees si "a" est temporaire, clone sinon.
43 virtual TArray<T>& operator = (const TArray<T>& a);
44
45
46 // Gestion taille/Remplissage
47 virtual void Clone(const TArray<T>& a);
48 virtual void ReSize(uint_4 ndim, uint_4 * siz, uint_4 step=1);
49 virtual void Realloc(uint_4 ndim, uint_4 * siz, uint_4 step=1, bool force=false);
50 // Returns true if ndim and sizes are equal
51 virtual bool CompareSizes(const TArray<T>& a);
52 // Compacts size=1 array dimensions
53 virtual TArray<T>& CompactDim();
54
55 // Array dimensions
56 inline uint_4 NbDimensions() const { return( ndim_ ); }
57
58 inline uint_8 Size() const { return(totsize_); }
59 inline uint_4 SizeX() const { return(size_[0]); }
60 inline uint_4 SizeY() const { return(size_[1]); }
61 inline uint_4 SizeZ() const { return(size_[2]); }
62 inline uint_4 Size(int ka) const { return(size_[CheckDI(ka,1)]); }
63
64 uint_4 MaxSizeKA() const ;
65
66 // memory organisation - packing information
67 inline bool IsPacked() const { return(moystep_ == 1); }
68 inline bool IsPackedX() const { return(step_[0] == 1); }
69 inline bool IsPackedY() const { return(step_[1] == 1); }
70 inline bool IsPackedZ() const { return(step_[2] == 1); }
71 inline bool IsPacked(int ka) const { return(step_[CheckDI(ka,2)] == 1); }
72
73 inline uint_4 MinStep() const { return(minstep_); }
74 inline uint_4 AvgStep() const { return(moystep_); }
75 inline uint_4 StepX() const { return(step_[0]); }
76 inline uint_4 StepZ() const { return(step_[1]); }
77 inline uint_4 StepY() const { return(step_[2]); }
78 inline uint_4 Step(int ka) const { return(step_[CheckDI(ka,3)]); }
79
80 uint_4 MinStepKA() const ;
81
82 uint_8 Offset(uint_8 ip=0) const ;
83
84
85 // Temporaire?
86 inline bool IsTemp(void) const {return mNDBlock.IsTemp();}
87 inline void SetTemp(bool temp=false) const {mNDBlock.SetTemp(temp);}
88
89 // SubArrays
90 virtual TArray<T> operator () (Range rx, Range ry, Range rz=0, Range rt=0, Range ru=0);
91
92 // Acces to data
93 inline T const& operator()(uint_4 ix, uint_4 iy, uint_4 iz) const ;
94 inline T& operator()(uint_4 ix, uint_4 iy, uint_4 iz);
95 inline T const& operator()(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu=0) const ;
96 inline T& operator()(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu=0);
97 inline T const& operator[](uint_8 ip) const ;
98 inline T& operator[](uint_8 ip);
99
100 inline T const& Elem(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it=0, uint_4 iu=0) const ;
101 inline T& Elem(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it=0, uint_4 iu=0);
102 inline T const& ElemCheckBound(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it=0, uint_4 iu=0) const ;
103 inline T& ElemCheckBound(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it=0, uint_4 iu=0);
104
105 inline T* Data() {return mNDBlock.Begin()+offset_;}
106 inline const T* Data() const {return mNDBlock.Begin()+offset_;}
107 inline NDataBlock<T>& DataBlock() {return mNDBlock;}
108 inline const NDataBlock<T>& DataBlock() const {return mNDBlock;}
109
110// Operations diverses = , +=, ...
111// Conversion en type T, if Size() == 1
112 inline operator T();
113// Met les elements a une suite de valeurs
114 virtual TArray<T>& operator = (Sequence seq);
115// A = x (tous les elements a x)
116 virtual TArray<T>& operator = (T x);
117// A += -= *= /= x (ajoute, soustrait, ... x a tous les elements)
118 virtual TArray<T>& operator += (T x);
119 virtual TArray<T>& operator -= (T x);
120 virtual TArray<T>& operator *= (T x);
121 virtual TArray<T>& operator /= (T x);
122// A += -= (ajoute, soustrait element par element les deux tableaux )
123 virtual TArray<T>& operator += (const TArray<T>& a);
124 virtual TArray<T>& operator -= (const TArray<T>& a);
125// Multilication, division element par element les deux tableaux
126 virtual TArray<T>& MultElt(const TArray<T>& a);
127 virtual TArray<T>& DivElt(const TArray<T>& a);
128
129// Application d'une fonction
130 virtual TArray<T>& ApplyFunction(Arr_DoubleFunctionOfX f);
131 virtual TArray<T>& ApplyFunction(Arr_FloatFunctionOfX f);
132
133// Impression, I/O, ...
134 static void SetMaxPrint(uint_4 nprt=50);
135 void Show(ostream& os, bool si=false) const;
136 inline void Show() const { Show(cout); }
137 void Print(ostream& os, int_4 maxprt=-1, bool si=false) const ;
138
139// Objet DVList info
140 DVList& Info();
141
142// Pour la gestion de persistance
143 friend class FIO_TArray<T>;
144
145protected:
146 // Verifie la compatibilite de l'index de dimension
147 inline int CheckDI(int ka, int msg) const ;
148 // Verifie la compatibilite des bornes d'index
149 inline void CheckBound(int ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu, int msg) const ;
150 // Changing Sizes/NDim ... return true if OK
151 bool UpdateSizes(uint_4 ndim, const uint_4 * siz, uint_4 step, uint_8 offset, string & exmsg);
152 bool UpdateSizes(uint_4 ndim, const uint_4 * siz, const uint_4 * step, uint_8 offset, string & exmsg);
153 bool UpdateSizes(const TArray<T>& a, string & exmsg);
154 static uint_8 ComputeTotalSize(uint_4 ndim, uint_4 * siz, uint_4 step, uint_8 offset) ;
155 // partage les donnees si "a" temporaire, clone sinon.
156 void CloneOrShare(const TArray<T>& a);
157 // Share: partage les donnees de "a"
158 void Share(const TArray<T>& a);
159 // Extraction de sous-tableau
160 virtual void SubArray(TArray<T> & ra, uint_4 ndim, uint_4 * siz, uint_4 * pos, uint_4 * step);
161
162 uint_4 ndim_; // nb of dimensions
163 uint_4 size_[TARRAY_MAXNDIMS]; // array size in each dimension
164 uint_8 totsize_; // Total number of elements
165 uint_4 step_[TARRAY_MAXNDIMS]; // two consecutive elements distance in a given dimension
166 uint_4 minstep_; // minimal step (in any axes)
167 uint_4 moystep_; // mean step 0 non regular steps
168 uint_8 offset_; // global offset -> position of elem[0] in DataBlock
169 NDataBlock<T> mNDBlock; // Le bloc des donnees
170 uint_4 marowi_, macoli_; // For matrices, Row index and column index in dimensions
171
172 DVList* mInfo; // Infos (variables) attachees au tableau
173
174 static char * ck_op_msg_[6]; // Operation messages for CheckDI() CheckBound()
175 static uint_4 max_nprt_; // Nb maxi d'elements imprimes
176};
177
178////////////////////////////////////////////////////////////////
179// Surcharge d'operateur <<
180template <class T>
181inline ostream& operator << (ostream& os, const TArray<T>& a)
182 { a.Print(os); return(os); }
183
184////////////////////////////////////////////////////////////////
185// Surcharge d'operateurs A (+,-,*,/) (T) x
186
187template <class T> inline TArray<T> operator + (const TArray<T>& a, T b)
188 {TArray<T> result(a); result.SetTemp(true); result += b; return result;}
189
190template <class T> inline TArray<T> operator + (T b,const TArray<T>& a)
191 {TArray<T> result(a); result.SetTemp(true); result += b; return result;}
192
193template <class T> inline TArray<T> operator - (const TArray<T>& a, T b)
194 {TArray<T> result(a); result.SetTemp(true); result -= b; return result;}
195
196template <class T> inline TArray<T> operator - (T b,const TArray<T>& a)
197 {TArray<T> result(a); result.SetTemp(true);
198 result.DataBlock() = b-result.DataBlock(); return result;}
199
200template <class T> inline TArray<T> operator * (const TArray<T>& a, T b)
201 {TArray<T> result(a); result.SetTemp(true); result *= b; return result;}
202
203template <class T> inline TArray<T> operator * (T b,const TArray<T>& a)
204 {TArray<T> result(a); result.SetTemp(true); result *= b; return result;}
205
206template <class T> inline TArray<T> operator / (const TArray<T>& a, T b)
207 {TArray<T> result(a); result.SetTemp(true); result /= b; return result;}
208
209////////////////////////////////////////////////////////////////
210// Surcharge d'operateurs C = A (+,-) B
211
212template <class T>
213inline TArray<T> operator + (const TArray<T>& a,const TArray<T>& b)
214 {TArray<T> result(a); result.SetTemp(true); result += b; return result;}
215
216template <class T>
217inline TArray<T> operator - (const TArray<T>& a,const TArray<T>& b)
218 {TArray<T> result(a); result.SetTemp(true); result += b; return result;}
219
220////////////////////////////////////////////////
221// Calcul de fonction
222template <class T>
223inline TArray<T> sin(const TArray<T>& a)
224 {TArray<T> result(a); result.SetTemp(true); result.ApplyFunction(sin); return result;}
225
226template <class T>
227inline TArray<T> cos(const TArray<T>& a)
228 {TArray<T> result(a); result.SetTemp(true); result.ApplyFunction(cos); return result;}
229
230// --------------------------------------------------
231// Methodes inline de verification
232// --------------------------------------------------
233template <class T>
234inline int TArray<T>::CheckDI(int ka, int msg) const
235{
236 if ( (ka < 0) || (ka >= ndim_) ) {
237 string txt = "TArray<T>::CheckDimensionIndex/Error "; txt += ck_op_msg_[msg];
238 throw(ParmError(txt));
239 }
240 return(ka);
241}
242
243template <class T>
244inline void TArray<T>::CheckBound(int ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu, int msg) const
245{
246 if ( (ix >= size_[0]) || (iy >= size_[1]) || (iz > size_[2]) ||
247 (it >= size_[3]) || (iu >= size_[4]) ) {
248 string txt = "TArray<T>::CheckArrayBound/Error "; txt += ck_op_msg_[msg];
249 throw(ParmError(txt));
250 }
251 return;
252}
253
254
255// --------------------------------------------------
256// inline element acces methods
257// --------------------------------------------------
258template <class T>
259inline T const& TArray<T>::Elem(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu) const
260{
261 return ( *( mNDBlock.Begin()+ offset_+
262 ix*step_[0] + iy*step_[1] + iz*step_[2] +
263 it*step_[3] + iu*step_[4]) );
264}
265
266template <class T>
267inline T & TArray<T>::Elem(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu)
268{
269 return ( *( mNDBlock.Begin()+ offset_+
270 ix*step_[0] + iy*step_[1] + iz*step_[2] +
271 it*step_[3] + iu*step_[4]) );
272}
273
274template <class T>
275inline T const& TArray<T>::ElemCheckBound(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu) const
276{
277 CheckBound(ix, iy, iz, it, iu, 4);
278 Elem(ix, iy, iz, it, iu);
279}
280
281template <class T>
282inline T & TArray<T>::ElemCheckBound(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu)
283{
284 CheckBound(ix, iy, iz, it, iu, 4);
285 Elem(ix, iy, iz, it, iu);
286}
287
288template <class T>
289inline T const& TArray<T>::operator()(uint_4 ix, uint_4 iy, uint_4 iz) const
290{
291#ifdef SO_BOUNDCHECKING
292 CheckBound(ix, iy, iz, 0, 0, 4);
293#endif
294 return ( *( mNDBlock.Begin()+ offset_+
295 ix*step_[0] + iy*step_[1] + iz*step_[2]) );
296}
297
298template <class T>
299inline T & TArray<T>::operator()(uint_4 ix, uint_4 iy, uint_4 iz)
300{
301#ifdef SO_BOUNDCHECKING
302 CheckBound(ix, iy, iz, 0, 0, 4);
303#endif
304 return ( *( mNDBlock.Begin()+ offset_+
305 ix*step_[0] + iy*step_[1] + iz*step_[2]) );
306}
307
308template <class T>
309inline T const& TArray<T>::operator()(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu) const
310{
311#ifdef SO_BOUNDCHECKING
312 CheckBound(ix, iy, iz, it, iu, 4);
313#endif
314 return ( *( mNDBlock.Begin()+ offset_+
315 ix*step_[0] + iy*step_[1] + iz*step_[2] +
316 it*step_[3] + iu*step_[4]) );
317}
318
319template <class T>
320inline T & TArray<T>::operator()(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu)
321{
322#ifdef SO_BOUNDCHECKING
323 CheckBound(ix, iy, iz, it, iu, 4);
324#endif
325 return ( *( mNDBlock.Begin()+ offset_+
326 ix*step_[0] + iy*step_[1] + iz*step_[2] +
327 it*step_[3] + iu*step_[4]) );
328}
329
330
331template <class T>
332inline T const& TArray<T>::operator[](uint_8 ip) const
333{
334#ifdef SO_BOUNDCHECKING
335 if (ip >= totsize_) throw( ParmError("TArray<T>::operator[] Out-of-bound Error") );
336#endif
337return *(mNDBlock.Begin()+Offset(ip));
338}
339
340template <class T>
341inline T & TArray<T>::operator[](uint_8 ip)
342{
343#ifdef SO_BOUNDCHECKING
344 if (ip >= totsize_) throw( ParmError("TArray<T>::operator[] Out-of-bound Error") );
345#endif
346return *(mNDBlock.Begin()+Offset(ip));
347}
348
349
350template <class T>
351inline TArray<T>::operator T()
352{
353 if (Size() != 1) throw(SzMismatchError("TArray<T>::operator T() Size() != 1")) ;
354 return ( (*this)[0] );
355}
356
357} // Fin du namespace
358
359#endif
Note: See TracBrowser for help on using the repository browser.