#ifndef _ARRAY2D_H
#define _ARRAY2D_H
#include <xutility>
template<typename T>
class array2d
{
// Data
protected:
T **m_ppData;
public:
long m_lRows, m_lCols;
// Constructor
public:
array2d()
{
Init(0, 0);
}
array2d(long lRows, long lCols)
{
Init(lRows, lCols);
}
array2d(array2d& other)
{
Init(other.GetRows(), other.GetCols());
T **pTmp = other.GetData();
copy(pTmp[0], pTmp[0]+m_lRows*m_lCols, m_ppData[0]);
}
array2d<T> operator= (array2d other)
{
Destroy();
Init(other.GetRows(), other.GetCols());
T **pTmp = other.GetData();
if (m_lRows>0 && m_lCols>0)
{
copy(pTmp[0], pTmp[0]+m_lRows*m_lCols, m_ppData[0]);
}
return *this;
}
virtual ~array2d()
{
Destroy();
}
// Attribute
// 重载()对数组元素进行存取
T& operator()(long lRows, long lCols)
{
return m_ppData[lRows][lCols];
}
long GetRows()
{
return m_lRows;
}
void SetRows(long lRows)
{
m_lRows = lRows;
}
long GetCols()
{
return m_lCols;
}
void SetCols(long lCols)
{
m_lCols = lCols;
}
void GetSize(long *plRows, long *plCols)
{
*plRows = m_lRows;
*plCols = m_lCols;
}
void SetSize(long lRows, long lCols)
{
m_lRows = lRows;
m_lCols = lCols;
}
T** GetData()
{
return m_ppData;
}
private:
void Init(long lRows, long lCols)
{
m_lRows = lRows;
m_lCols = lCols;
if (lRows <= 0 || lCols <= 0)
{
m_ppData = NULL;
return;
}
T *pTmp = new T[lRows*lCols];
m_ppData = new T*[lRows];
for (long i=0; i<lRows; ++i)
{
m_ppData[i] = &pTmp[i*lCols];
}
}
void Destroy()
{
if (m_ppData)
{
delete []m_ppData[0];
}
delete []m_ppData;
m_ppData = NULL;
}
};
#endif