#ifndef _ARRAY2D_H #define _ARRAY2D_H template class CArray2D { public: CArray2D(); CArray2D(int usize,int vsize); CArray2D(int usize,int vsize,const T* data); CArray2D(const CArray2D& rhs); virtual ~CArray2D(); CArray2D& operator=(const CArray2D& rhs); operator T*(); operator const T*() const; int usize() const; int vsize() const; void size(int& usize,int& vsize) const; void resize(int usize,int vsize); void fill(const T* elements); T& operator()(int a,int b); const T& operator()(int a,int b) const; T& at(int a,int b); const T& at(int a,int b) const; protected: // allocate and deallocate are overrideable by subclasses, allowing alternative // (more efficient) allocation in certain circumstances // * if allocation/deallocation is not done using new[]/delete[], it is necessary // to override both functions virtual void allocate(); virtual void deallocate(); int _usize; // no of columns; int _vsize; // no of rows T* _elements; }; /////////////////////////////////////////////////////////////////////////// #include #include template CArray2D::CArray2D() : _usize(0), _vsize(0), _elements(0) { } template CArray2D::CArray2D(int usize,int vsize) : _usize(usize), _vsize(vsize), _elements(0) { allocate(); } template CArray2D::CArray2D(int usize,int vsize,const T* elements) : _usize(usize), _vsize(vsize), _elements(0) { assert(elements!=0); allocate(); fill(elements); } template CArray2D::CArray2D(const CArray2D& rhs) : _usize(rhs._usize), _vsize(rhs._vsize), _elements(0) { allocate(); fill(rhs._elements); } template CArray2D::~CArray2D() { deallocate(); } template CArray2D& CArray2D::operator=(const CArray2D& rhs) { if (this==&rhs) return *this; deallocate(); _usize=rhs._usize; _vsize=rhs._vsize; allocate(); fill(rhs._elements); return *this; } template void CArray2D::allocate() { assert(_elements==0); _elements=new T[_usize*_vsize]; } template void CArray2D::deallocate() { delete[] _elements; _elements=0; } template int CArray2D::usize() const { return _usize; } template int CArray2D::vsize() const { return _vsize; } template void CArray2D::size(int& usize,int& vsize) const { usize=_usize; vsize=_vsize; } template void CArray2D::resize(int usize,int vsize) { deallocate(); _usize=usize; _vsize=vsize; allocate(); } template void CArray2D::fill(const T* elements) { memcpy(_elements,elements,sizeof(T)*_usize*_vsize); } // operator()(int r,int c) // return the element at (r,c) (ie c'th element in r'th row) template T& CArray2D::operator()(int u,int v) { assert(u>=0 && u<_usize); assert(v>=0 && v<_vsize); return _elements[(u*_vsize)+v]; } template const T& CArray2D::operator()(int u,int v) const { assert(u>=0 && u<_usize); assert(v>=0 && v<_vsize); return _elements[(u*_vsize)+v]; } template T& CArray2D::at(int u,int v) { assert(u>=0 && u<_usize); assert(v>=0 && v<_vsize); return _elements[(u*_vsize)+v]; } template const T& CArray2D::at(int u,int v) const { assert(u>=0 && u<_usize); assert(v>=0 && v<_vsize); return _elements[(u*_vsize)+v]; } template CArray2D::operator T*() { return _elements; } template CArray2D::operator const T*() const { return _elements; } /////////////////////////////////////////////////////////////////////////// #endif