source: Sophya/trunk/SophyaLib/TArray/basarr.h@ 787

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

Introduction de BaseArray comme classe parente de TArray<T>
Separation des operations math (fonctions) ds la classe MathArr<T>

Reza 20/3/2000

File size: 5.2 KB
Line 
1// This may look like C code, but it is really -*- C++ -*-
2// Base array class - Memory organisation management
3// R. Ansari, C.Magneville 03/2000
4
5#ifndef BaseArray_SEEN
6#define BaseArray_SEEN
7
8#include "machdefs.h"
9#include <math.h>
10#include <iostream.h>
11#include "anydataobj.h"
12#include "dvlist.h"
13
14
15// Maximum number of dimensions for array
16#define BASEARRAY_MAXNDIMS 5
17
18namespace SOPHYA {
19
20// ------------ classe template Array -----------
21class BaseArray : public AnyDataObj {
22public:
23 // Creation / destruction
24 BaseArray();
25 virtual ~BaseArray();
26
27 // Returns true if ndim and sizes are equal
28 virtual bool CompareSizes(const BaseArray& a);
29
30 // Compacts size=1 array dimensions
31 virtual void CompactAllDim(); // suppresses all size==1 dimensions
32 virtual void CompactTrailingDim(); // suppresses size==1 dimensions after the last size>1 dimension
33
34 // Array dimensions
35 inline uint_4 NbDimensions() const { return( ndim_ ); }
36
37 inline uint_8 Size() const { return(totsize_); }
38 inline uint_4 SizeX() const { return(size_[0]); }
39 inline uint_4 SizeY() const { return(size_[1]); }
40 inline uint_4 SizeZ() const { return(size_[2]); }
41 inline uint_4 Size(int ka) const { return(size_[CheckDI(ka,1)]); }
42
43 uint_4 MaxSizeKA() const ;
44
45 // memory organisation - packing information
46 inline bool IsPacked() const { return(moystep_ == 1); }
47 inline bool IsPackedX() const { return(step_[0] == 1); }
48 inline bool IsPackedY() const { return(step_[1] == 1); }
49 inline bool IsPackedZ() const { return(step_[2] == 1); }
50 inline bool IsPacked(int ka) const { return(step_[CheckDI(ka,2)] == 1); }
51
52 inline uint_4 MinStep() const { return(minstep_); }
53 inline uint_4 AvgStep() const { return(moystep_); }
54 inline uint_4 StepX() const { return(step_[0]); }
55 inline uint_4 StepY() const { return(step_[1]); }
56 inline uint_4 StepZ() const { return(step_[2]); }
57 inline uint_4 Step(int ka) const { return(step_[CheckDI(ka,3)]); }
58
59 uint_4 MinStepKA() const ;
60
61 uint_8 Offset(uint_8 ip=0) const ;
62 inline uint_8 Offset(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it=0, uint_4 iu=0) const;
63
64// a abstract element acces methode
65 virtual double ValueAtPosition(uint_8 ip) const = 0;
66
67// Impression, I/O, ...
68 static void SetMaxPrint(uint_4 nprt=50);
69 void Show(ostream& os, bool si=false) const;
70 inline void Show() const { Show(cout); }
71 virtual string DataType() const = 0;
72
73// Objet DVList info
74 DVList& Info();
75
76protected:
77 // Verifie la compatibilite de l'index de dimension
78 inline int CheckDI(int ka, int msg) const ;
79 // Verifie la compatibilite des bornes d'index
80 inline void CheckBound(int ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu, int msg) const ;
81 // Changing Sizes/NDim ... return true if OK
82 bool UpdateSizes(uint_4 ndim, const uint_4 * siz, uint_4 step, uint_8 offset, string & exmsg);
83 bool UpdateSizes(uint_4 ndim, const uint_4 * siz, const uint_4 * step, uint_8 offset, string & exmsg);
84 bool UpdateSizes(const BaseArray& a, string & exmsg);
85 static uint_8 ComputeTotalSize(uint_4 ndim, uint_4 * siz, uint_4 step, uint_8 offset) ;
86 // Pour Extraction de sous-tableau
87 virtual void SubArray(BaseArray & ra, uint_4 ndim, uint_4 * siz, uint_4 * pos, uint_4 * step);
88
89 uint_4 ndim_; // nb of dimensions
90 uint_4 size_[BASEARRAY_MAXNDIMS]; // array size in each dimension
91 uint_8 totsize_; // Total number of elements
92 uint_4 step_[BASEARRAY_MAXNDIMS]; // two consecutive elements distance in a given dimension
93 uint_4 minstep_; // minimal step (in any axes)
94 uint_4 moystep_; // mean step 0 non regular steps
95 uint_8 offset_; // global offset -> position of elem[0] in DataBlock
96 uint_4 marowi_, macoli_; // For matrices, Row index and column index in dimensions
97
98 DVList* mInfo; // Infos (variables) attachees au tableau
99
100 static char * ck_op_msg_[6]; // Operation messages for CheckDI() CheckBound()
101 static uint_4 max_nprt_; // Nb maxi d'elements imprimes
102};
103
104// --------------------------------------------------
105// Methodes inline de verification
106// --------------------------------------------------
107inline int BaseArray::CheckDI(int ka, int msg) const
108{
109 if ( (ka < 0) || (ka >= ndim_) ) {
110 string txt = "BaseArray::CheckDimensionIndex/Error "; txt += ck_op_msg_[msg];
111 throw(ParmError(txt));
112 }
113 return(ka);
114}
115
116inline void BaseArray::CheckBound(int ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu, int msg) const
117{
118 if ( (ix >= size_[0]) || (iy >= size_[1]) || (iz > size_[2]) ||
119 (it >= size_[3]) || (iu >= size_[4]) ) {
120 string txt = "BaseArray::CheckArrayBound/Error "; txt += ck_op_msg_[msg];
121 throw(ParmError(txt));
122 }
123 return;
124}
125
126
127// --------------------------------------------------
128// Position d'un element
129// --------------------------------------------------
130inline uint_8 BaseArray::Offset(uint_4 ix, uint_4 iy, uint_4 iz, uint_4 it, uint_4 iu) const
131{
132#ifdef SO_BOUNDCHECKING
133 CheckBound(ix, iy, iz, it, iu, 4);
134#endif
135 return ( offset_+ ix*step_[0] + iy*step_[1] + iz*step_[2] +
136 it*step_[3] + iu*step_[4] );
137}
138
139
140} // Fin du namespace
141
142#endif
Note: See TracBrowser for help on using the repository browser.