#if !defined(ARRAY_H) #define ARRAY_H //------------------------------------------ // 4-dimensional dynamic memory allocation // template class : Array4D // 1996.10.12 by CHEN Ching-Han //------------------------------------------ template class Array4D { protected: void alloc(); void free(); public: int nr; int nc; int nd; int nw; T ****m; Array4D(){m=0;} Array4D(int r,int c,int d, int w){nr=r;nc=c;nd=d;nw=w;alloc();} void Initialize(int row, int col, int dep, int wid); void Finish(){free();} Array4D operator=(Array4D& t); T operator()(int x,int y,int z,int w){return m[x][y][z][w];} ~Array4D(){} }; //------------------------------------------ // 3-dimensional dynamic memory allocation // template class : Array3D // 1996.10.3 by CHEN Ching-Han //------------------------------------------ template class Array3D { protected: void alloc(); void free(); public: int nr; int nc; int nd; T ***m; int err; Array3D(){m=0;} Array3D(int r,int c,int d){nr=r;nc=c;nd=d;alloc();} void Initialize(int row, int col, int dep); void Finish(){free();} Array3D operator=(Array3D& t); T& operator()(int ndx, int ndy, int ndz){return m[ndx][ndy][ndz];} ~Array3D(){} }; //------------------------------------------ // 2-dimensional dynamic memory allocation // template class : Array2D // 1996.10.3 by CHEN Ching-Han //------------------------------------------ template class Array2D { protected: void alloc(); void free(); public: int nr; int nc; T **m; Array2D(){m=0;} Array2D(int row, int col){nr=row;nc=col;alloc();} void Initialize(int row, int col); void Finish(){free();} Array2D operator=(Array2D& m); T& operator()(int ndx, int ndy){return m[ndx][ndy];} ~Array2D(){} }; //------------------------------------------ // 1-dimensional dynamic memory allocation // template class : Array1D // 1996.10.3 by CHEN Ching-Han //------------------------------------------ template class Array1D { protected: void alloc(); void free(); public: int nb; T *m; Array1D(){m=0;} Array1D(int n){nb=n;alloc();} void Initialize(int n); void Finish(){free();} Array1D& operator=(Array1D& m); T& operator[](int ndx){return m[ndx];} ~Array1D(){} }; template class FlexArray { private: int ALLOC_INC; int curSize, allocated; int maxSize; T **items; void resize(int); int Max(int x, int y){if(x>y)return x;else return y;} public: FlexArray(void); FlexArray(int initial); ~FlexArray(void); T& operator[](int); FlexArray operator = (FlexArray &); int size(void) {return curSize;}; void setMaximumSize(int); void setIncrement(int d){ALLOC_INC = d;} int getMaximumSize(void) {return maxSize;}; void reset(void); void remove(int); void swap(int,int); }; // //----- Definition of the member functions--------- // template void Array4D::alloc() { free(); m=new T***[nr]; for(int i=0;i void Array4D::Initialize(int row, int col, int dep, int wid) { free(); nr=row; nc=col; nd=dep; nw=wid; alloc(); } template void Array4D::free( ) { if(m){ for(int i=0;i Array4D Array4D::operator=(Array4D& t) { nr=t.nr; nc=t.nc; nd=t.nd; nw=t.nw; m=t.m; return *this; } template void Array3D::alloc() { free(); m=new T**[nr]; for(int i=0;i void Array3D::Initialize(int row, int col, int dep) { if(m!=0)free(); nr=row; nc=col; nd=dep; alloc(); } template void Array3D::free( ) { if (m){ for(int i=0;i Array3D Array3D::operator = (Array3D& t) { nr=t.nr; nc=t.nc; nd=t.nd; m=t.m; return *this; } // // Array2D // template void Array2D::alloc() { free(); m=new T*[nr]; for(int i=0;i void Array2D::free( ) { if(m==0)return; for(int i=0;i void Array2D::Initialize(int row, int col) { if(m!=0)free(); nr=row; nc=col; alloc(); } template Array2D Array2D::operator = (Array2D& d) { nr=d.nr; nc=d.nc; m=d.m; return *this; } // // Array1D // template void Array1D::alloc() { free(); m=new T[nb]; } template void Array1D::free( ) { if(m) delete m; m=0; } template void Array1D::Initialize(int n) { if(m!=0)free(); nb=n; alloc(); } template Array1D& Array1D::operator=(Array1D& d) { nb=d.nb; m=d.m; return *this; } template FlexArray::FlexArray(void) { ALLOC_INC = 5; curSize = 0; allocated = 0; maxSize = 100; items = 0; }; // // Flexible 1-D Array // template FlexArray::FlexArray(int initial) { curSize = 0; allocated = 0; maxSize = initial + 100; items = 0; (*this)[initial-1]; } template FlexArray::~FlexArray(void) { for(int i=0; i < allocated; i++) delete items[i]; if(items)delete items; }; template T& FlexArray::operator[](int index) { resize(index + 1); curSize = Max(curSize, index + 1); return *(items[index]); }; template FlexArray FlexArray::operator = (FlexArray& lSrc) { int i; resize(lSrc.size()); curSize = lSrc.size(); maxSize = lSrc.getMaximumSize(); for (i=0; i void FlexArray::resize(int new_size) { if(new_size > allocated) { int old_size = allocated; allocated = Max(allocated + ALLOC_INC, new_size); T **new_items = new T * [allocated]; for(int i=0; i < old_size; i++) new_items[i] = items[i]; for(int i=old_size; i < allocated; i++) new_items[i] = new T; if(items)delete items; items = new_items; } return; } template void FlexArray::setMaximumSize(int newSize) { maxSize = newSize; }; template void FlexArray::reset(void) { for (int i=0; i void FlexArray::remove(int index) { if(index < allocated) delete items[index]; swap(index, allocated-1); allocated--; curSize--; if(curSize == 0) reset(); return; }; template void FlexArray::swap(int index1,int index2) { T *tempitem; if (index1>=maxSize) { // printf("***Requested table index = %d, table size = %d***", index1,maxSize); // exit(1); } if (index2>=maxSize) { // printf("***Requested table index = %d, table size = %d***", index2,maxSize); // exit(1); } tempitem = items[index1]; items[index1] = items[index2]; items[index2] = tempitem; curSize = Max(index1+1,curSize); curSize = Max(index2+1,curSize); return; }; typedef Array3D f3D; typedef Array2D f2D; typedef Array1D f1D; typedef Array2D uc2D; typedef Array1D uc1D; typedef Array2D i2D; typedef Array1D i1D; #endif