00001 #ifndef ARRAY3D_H
00002 #define ARRAY3D_H
00003
00004 #include <vector>
00005 #include "Dim3D.h"
00006 #include "Field3DImpl.h"
00007 #include <iostream>
00008
00009 namespace CompuCell3D {
00010
00011 template <typename T>
00012 class Array3D{
00013 public:
00014 typedef std::vector<std::vector<std::vector<T> > > ContainerType;
00015 void allocateArray(const Dim3D & _dim , T & val=T());
00016
00017 ContainerType & getContainer(){return array;}
00018
00019 private:
00020 std::vector<std::vector<std::vector<T> > > array;
00021
00022 };
00023
00024 template <typename T>
00025 void Array3D<T>::allocateArray(const Dim3D & _dim , T & val){
00026 using namespace std;
00027
00028
00029 array.assign(_dim.x, vector<vector< T > >(_dim.y,vector< T >(_dim.z,val)));
00030 }
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 template <typename T>
00047 class Array3DField3DAdapter:public Field3DImpl<T>{
00048 public:
00049 Array3DField3DAdapter() : Field3DImpl<T>(Dim3D(1,1,1),T()) , array3DPtr(0) , containerPtr(0){};
00050 virtual ~Array3DField3DAdapter(){
00051 if(array3DPtr)
00052 delete array3DPtr;
00053 array3DPtr=0;
00054 }
00055
00056 Array3D<T> * getArray3DPtr(){ return array3DPtr; }
00057 typename Array3D<T>::ContainerType & getContainer(){ return array3DPtr->getContainer(); }
00058 virtual void setDim(const Dim3D theDim) {
00059 if(!array3DPtr){
00060 array3DPtr=new Array3D<T>();
00061 T t;
00062 t=T();
00063
00064 array3DPtr->allocateArray( theDim ,t);
00065 containerPtr=&array3DPtr->getContainer();
00066 dim=theDim;
00067 }else{
00068 delete array3DPtr;
00069 array3DPtr=new Array3D<T>();
00070 T t;
00071 t=T();
00072 array3DPtr->allocateArray( theDim, t );
00073 containerPtr=&array3DPtr->getContainer();
00074 dim=theDim;
00075 }
00076 }
00077 virtual Dim3D getDim() const {return dim;};
00078 virtual bool isValid(const Point3D &pt) const {
00079 return (0 <= pt.x && pt.x < dim.x &&
00080 0 <= pt.y && pt.y < dim.y &&
00081 0 <= pt.z && pt.z < dim.z);
00082 }
00083 virtual void set(const Point3D &pt, const T value) {
00084 if(array3DPtr){
00085 (*containerPtr)[pt.x][pt.y][pt.z]=value;
00086 }
00087 }
00088 virtual T get(const Point3D &pt) const {
00089 return (*containerPtr)[pt.x][pt.y][pt.z];
00090
00091 };
00092 virtual T getByIndex(long _offset) const {
00093 return T();
00094 }
00095 virtual void setByIndex(long _offset, const T _value) {
00096
00097 }
00098 protected:
00099 Array3D<T> * array3DPtr;
00100 Dim3D dim;
00101 typename Array3D<T>::ContainerType * containerPtr;
00102 };
00103
00104
00106
00107 template <typename T>
00108 class Array3DBorders{
00109 public:
00110 typedef T *** ContainerType;
00111 Array3DBorders():array(0),borderWidth(1){
00112 }
00113 virtual ~Array3DBorders(){freeMemory();};
00114
00115 void allocateArray(const Dim3D & _dim , T & val=T());
00116
00117 ContainerType & getContainer(){return array;}
00118 void setBorderWidth(unsigned int _borderWidth){borderWidth=_borderWidth;}
00119 unsigned int getBorderWidth(){return borderWidth;}
00120 bool switchContainersQuick(Array3DBorders<T> & _array3D);
00121 Dim3D getInternalDim(){return internalDim;}
00122 protected:
00123 ContainerType array;
00124 unsigned int borderWidth;
00125 Dim3D internalDim;
00126
00127 void allocateMemory(const Dim3D & _dim, T & val=T());
00128 void freeMemory();
00129
00130 };
00131
00132
00133
00134 template <typename T>
00135 void Array3DBorders<T>::allocateArray(const Dim3D & _dim , T & val){
00136
00137 internalDim=_dim;
00138 freeMemory();
00139 allocateMemory(internalDim,val);
00140
00141 }
00142
00143 template <typename T>
00144 void Array3DBorders<T>::allocateMemory(const Dim3D & _dim, T & val){
00145
00146 array=new T** [_dim.x];
00147 for(int i = 0 ; i < _dim.x ; ++i){
00148 array[i]=new T* [_dim.y];
00149 }
00150
00151 for(int i = 0 ; i < _dim.x ; ++i)
00152 for(int j = 0 ; j < _dim.y ; ++j){
00153 array[i][j]=new T [_dim.z];
00154 }
00155
00156 for(int i = 0 ; i < _dim.x ; ++i)
00157 for(int j = 0 ; j < _dim.y ; ++j)
00158 for(int k = 0 ; k < _dim.z ; ++k){
00159 array[i][j][k]=val;
00160 }
00161
00162 }
00163
00164 #include <iostream>
00165 template <typename T>
00166 void Array3DBorders<T>::freeMemory(){
00167 using namespace std;
00168
00169 if(array){
00170
00171 for(int i = 0 ; i < internalDim.x ; ++i)
00172 for(int j = 0 ; j < internalDim.y ; ++j){
00173
00174 delete [] array[i][j];
00175 array[i][j]=0;
00176 }
00177
00178 for(int i = 0 ; i < internalDim.x ; ++i){
00179 delete [] array[i];
00180 array[i]=0;
00181 }
00182 delete [] array;
00183 array=0;
00184
00185 }
00186
00187
00188 }
00189
00190
00191 template <typename T>
00192 bool Array3DBorders<T>::switchContainersQuick(Array3DBorders<T> & _switchedArray){
00193 ContainerType tmpPtr;
00194 ContainerType & switchedArrayPtr=_switchedArray.getContainer();
00195
00196 tmpPtr=array;
00197 array=switchedArrayPtr;
00198 switchedArrayPtr=tmpPtr;
00199 return true;
00200 }
00201
00202
00203 template <typename T>
00204 class Array3DBordersField3DAdapter:public Field3DImpl<T>, public Array3DBorders<T>{
00205 public:
00206 Array3DBordersField3DAdapter() : Field3DImpl<T>(Dim3D(1,1,1),T()), Array3DBorders<T>() {};
00207 Array3DBordersField3DAdapter(Dim3D & _dim,T & _initVal):Field3DImpl<T>(Dim3D(1,1,1),T()), Array3DBorders<T>(){
00208 allocateMemory(_dim,_initVal);
00209 Array3DBorders<T>::internalDim=_dim;
00210 }
00211 virtual ~Array3DBordersField3DAdapter(){
00212
00213
00214
00215 };
00216
00217
00218
00219 virtual void setDim(const Dim3D theDim) {
00220 T t;
00221
00222 allocateMemory(theDim,t);
00223 Array3DBorders<T>::internalDim=theDim;
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 }
00243 virtual Dim3D getDim() const {
00244
00245 return Dim3D(Array3DBorders<T>::internalDim.x-2*Array3DBorders<T>::borderWidth,
00246 Array3DBorders<T>::internalDim.y-2*Array3DBorders<T>::borderWidth,
00247 Array3DBorders<T>::internalDim.z-2*Array3DBorders<T>::borderWidth);
00248 };
00249 virtual bool isValid(const Point3D &pt) const {
00250 return (0 <= pt.x && pt.x < Array3DBorders<T>::internalDim.x &&
00251 0 <= pt.y && pt.y < Array3DBorders<T>::internalDim.y &&
00252 0 <= pt.z && pt.z < Array3DBorders<T>::internalDim.z);
00253 }
00254 virtual void set(const Point3D &pt, const T value) {
00255
00256
00257 Array3DBorders<T>::array
00258 [pt.x+Array3DBorders<T>::borderWidth]
00259 [pt.y+Array3DBorders<T>::borderWidth]
00260 [pt.z+Array3DBorders<T>::borderWidth]=value;
00261
00262 }
00263 virtual T get(const Point3D &pt) const {
00264
00265 return Array3DBorders<T>::array
00266 [pt.x+Array3DBorders<T>::borderWidth]
00267 [pt.y+Array3DBorders<T>::borderWidth]
00268 [pt.z+Array3DBorders<T>::borderWidth];
00269 }
00270
00271 virtual T getByIndex(long _offset) const {
00272 return T();
00273 }
00274 virtual void setByIndex(long _offset, const T _value) {
00275
00276 }
00277 protected:
00278
00279
00280
00281
00282 };
00283
00284
00286 template <typename T>
00287 class Array2DBorders{
00288 public:
00289 typedef T ** ContainerType;
00290 Array2DBorders():array(0),borderWidth(1){
00291 }
00292 virtual ~Array2DBorders(){freeMemory();};
00293
00294 void allocateArray(const Dim3D & _dim , T & val=T());
00295
00296 ContainerType & getContainer(){return array;}
00297 void setBorderWidth(unsigned int _borderWidth){borderWidth=_borderWidth;}
00298 unsigned int getBorderWidth(){return borderWidth;}
00299 bool switchContainersQuick(Array2DBorders<T> & _array2D);
00300 Dim3D getInternalDim(){return internalDim;}
00301 protected:
00302 ContainerType array;
00303 unsigned int borderWidth;
00304 Dim3D internalDim;
00305
00306 void allocateMemory(const Dim3D & _dim, T & val=T());
00307 void freeMemory();
00308
00309 };
00310
00311
00312
00313 template <typename T>
00314 void Array2DBorders<T>::allocateArray(const Dim3D & _dim , T & val){
00315
00316 internalDim=_dim;
00317 freeMemory();
00318 allocateMemory(internalDim,val);
00319
00320 }
00321
00322 template <typename T>
00323 void Array2DBorders<T>::allocateMemory(const Dim3D & _dim, T & val){
00324
00325 array=new T* [_dim.x];
00326 for(int i = 0 ; i < _dim.x ; ++i){
00327 array[i]=new T [_dim.y];
00328 }
00329
00330 for(int i = 0 ; i < _dim.x ; ++i)
00331 for(int j = 0 ; j < _dim.y ; ++j)
00332 array[i][j]=val;
00333
00334
00335 }
00336
00337 #include <iostream>
00338 template <typename T>
00339 void Array2DBorders<T>::freeMemory(){
00340 using namespace std;
00341
00342 if(array){
00343
00344 for(int i = 0 ; i < internalDim.x ; ++i){
00345 delete [] array[i];
00346 array[i]=0;
00347 }
00348
00349 delete [] array;
00350 array=0;
00351
00352 }
00353
00354
00355 }
00356
00357
00358 template <typename T>
00359 bool Array2DBorders<T>::switchContainersQuick(Array2DBorders<T> & _switchedArray){
00360 ContainerType tmpPtr;
00361 ContainerType & switchedArrayPtr=_switchedArray.getContainer();
00362
00363 tmpPtr=array;
00364 array=switchedArrayPtr;
00365 switchedArrayPtr=tmpPtr;
00366 return true;
00367 }
00368
00369
00370 template <typename T>
00371 class Array2DBordersField3DAdapter:public Field3DImpl<T>, public Array2DBorders<T>{
00372 public:
00373 Array2DBordersField3DAdapter() : Field3DImpl<T>(Dim3D(1,1,1),T()), Array2DBorders<T>() {};
00374 Array2DBordersField3DAdapter(Dim3D & _dim,T & _initVal):Field3DImpl<T>(Dim3D(1,1,1),T()), Array2DBorders<T>(){
00375 allocateMemory(_dim,_initVal);
00376 Array2DBorders<T>::internalDim=_dim;
00377 }
00378 virtual ~Array2DBordersField3DAdapter(){
00379
00380
00381
00382 };
00383
00384
00385
00386 virtual void setDim(const Dim3D theDim) {
00387 T t;
00388
00389 allocateMemory(theDim,t);
00390 Array2DBorders<T>::internalDim=theDim;
00391
00392 }
00393 virtual Dim3D getDim() const {
00394
00395 return Dim3D(Array2DBorders<T>::internalDim.x-2*Array2DBorders<T>::borderWidth,
00396 Array2DBorders<T>::internalDim.y-2*Array2DBorders<T>::borderWidth,
00397 1);
00398 };
00399 virtual bool isValid(const Point3D &pt) const {
00400 return (0 <= pt.x && pt.x < Array2DBorders<T>::internalDim.x &&
00401 0 <= pt.y && pt.y < Array2DBorders<T>::internalDim.y &&
00402 0 == pt.z );
00403 }
00404 virtual void set(const Point3D &pt, const T value) {
00405
00406
00407 Array2DBorders<T>::array
00408 [pt.x+Array2DBorders<T>::borderWidth]
00409 [pt.y+Array2DBorders<T>::borderWidth]
00410 =value;
00411
00412 }
00413 virtual T get(const Point3D &pt) const {
00414
00415
00416
00417
00418
00419 return Array2DBorders<T>::array
00420 [pt.x+Array2DBorders<T>::borderWidth]
00421 [pt.y+Array2DBorders<T>::borderWidth];
00422 }
00423
00424 virtual T getByIndex(long _offset) const {
00425 return T();
00426 }
00427 virtual void setByIndex(long _offset, const T _value) {
00428
00429 }
00430 protected:
00431
00432
00433
00434
00435 };
00436
00437 };
00438
00439
00440
00441 #endif