Changeset 787 in Sophya for trunk/SophyaLib/TArray/tarray.h
- Timestamp:
- Mar 20, 2000, 7:22:49 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/TArray/tarray.h
r785 r787 9 9 #include <math.h> 10 10 #include <iostream.h> 11 #include "basarr.h" 11 12 #include "ndatablock.h" 12 13 #include <complex> 13 #include "anydataobj.h"14 #include "ndatablock.h"15 #include "dvlist.h"16 14 #include "utilarr.h" 17 15 18 19 // Maximum number of dimensions for array20 #define TARRAY_MAXNDIMS 521 16 22 17 namespace SOPHYA { … … 25 20 template <class T> class FIO_TArray; 26 21 27 // ------------ classe template Array ----------- 28 template <class T> 29 class TArray : public AnyDataObj { 22 // --------------------------- classe template Array ----------------------- 23 // ( See BaseArray class for data organisation in memory and related methods ) 24 25 template <class T> 26 class TArray : public BaseArray { 30 27 public: 31 28 // Creation / destruction … … 43 40 virtual TArray<T>& operator = (const TArray<T>& a); 44 41 45 46 42 // Gestion taille/Remplissage 47 43 virtual void Clone(const TArray<T>& a); 48 44 virtual void ReSize(uint_4 ndim, uint_4 * siz, uint_4 step=1); 49 45 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); 46 52 47 // 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);} 48 virtual TArray<T>& CompactAllDimensions(); 49 virtual TArray<T>& CompactTrailingDimensions(); 88 50 89 51 // SubArrays 90 52 virtual TArray<T> operator () (Range rx, Range ry, Range rz=0, Range rt=0, Range ru=0); 91 53 92 // Acces to data 54 55 // ---- Access to data 56 // Definition of virtual element acces method inherited from BaseArray class 57 virtual double ValueAtPosition(uint_8 ip) const; 58 59 // Data Access: operator overloaded inline acces methods 93 60 inline T const& operator()(uint_4 ix, uint_4 iy, uint_4 iz) const ; 94 61 inline T& operator()(uint_4 ix, uint_4 iy, uint_4 iz); … … 108 75 inline const NDataBlock<T>& DataBlock() const {return mNDBlock;} 109 76 77 // Temporaire? 78 inline bool IsTemp(void) const {return mNDBlock.IsTemp();} 79 inline void SetTemp(bool temp=false) const {mNDBlock.SetTemp(temp);} 80 110 81 // Operations diverses = , +=, ... 111 82 // Conversion en type T, if Size() == 1 112 inline operator T();83 inline T toScalar(); 113 84 // Met les elements a une suite de valeurs 114 85 virtual TArray<T>& operator = (Sequence seq); … … 123 94 virtual TArray<T>& operator += (const TArray<T>& a); 124 95 virtual TArray<T>& operator -= (const TArray<T>& a); 125 // Multi lication, division element par element les deux tableaux96 // Multiplication, division element par element les deux tableaux 126 97 virtual TArray<T>& MultElt(const TArray<T>& a); 127 98 virtual TArray<T>& DivElt(const TArray<T>& a); 128 99 129 // Application d'une fonction130 virtual TArray<T>& ApplyFunction(Arr_DoubleFunctionOfX f);131 virtual TArray<T>& ApplyFunction(Arr_FloatFunctionOfX f);132 133 100 // 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(); 101 virtual string DataType() const; // definition of abstract method inherited from BaseArray 102 virtual void Print(ostream& os, int_4 maxprt=-1, bool si=false) const ; 141 103 142 104 // Pour la gestion de persistance … … 144 106 145 107 protected: 146 // Verifie la compatibilite de l'index de dimension147 inline int CheckDI(int ka, int msg) const ;148 // Verifie la compatibilite des bornes d'index149 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 OK151 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 108 // partage les donnees si "a" temporaire, clone sinon. 156 109 void CloneOrShare(const TArray<T>& a); 157 110 // Share: partage les donnees de "a" 158 111 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 112 169 113 NDataBlock<T> mNDBlock; // Le bloc des donnees 170 uint_4 marowi_, macoli_; // For matrices, Row index and column index in dimensions171 172 DVList* mInfo; // Infos (variables) attachees au tableau173 174 static char * ck_op_msg_[6]; // Operation messages for CheckDI() CheckBound()175 static uint_4 max_nprt_; // Nb maxi d'elements imprimes176 114 }; 177 115 … … 218 156 {TArray<T> result(a); result.SetTemp(true); result += b; return result;} 219 157 220 ////////////////////////////////////////////////221 // Calcul de fonction222 template <class T>223 inline TArray<T> sin(const TArray<T>& a)224 {TArray<T> result(a); result.SetTemp(true); result.ApplyFunction(sin); return result;}225 226 template <class T>227 inline 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 verification232 // --------------------------------------------------233 template <class T>234 inline int TArray<T>::CheckDI(int ka, int msg) const235 {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 243 template <class T>244 inline void TArray<T>::CheckBound(int ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu, int msg) const245 {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 158 255 159 // -------------------------------------------------- … … 349 253 350 254 template <class T> 351 inline T Array<T>::operator T()255 inline T TArray<T>::toScalar() 352 256 { 353 257 if (Size() != 1) throw(SzMismatchError("TArray<T>::operator T() Size() != 1")) ;
Note:
See TracChangeset
for help on using the changeset viewer.