Memory access using row x col.
template<class T>
struct Array
{
size_t m_Rows;
size_t m_Cols;
T* m_p;
size_t m_Capacity;
void BuyMemory(size_t rows, size_t cols)
{
T* p = new T[rows * cols];
delete [] m_p;
m_p = p;
m_Capacity = rows * cols;
}
public:
Array() : m_p(0), m_Rows(0), m_Cols(0), m_Capacity(0)
{
}
Array(size_t rows, size_t cols) : m_p(0), m_Rows(0), m_Cols(0), m_Capacity(0)
{
Resize(rows, cols);
}
size_t Cols() const
{
return m_Cols;
}
size_t Rows() const
{
return m_Rows;
}
void Resize(size_t rows, size_t cols)
{
// memory changed?
if (rows * cols != m_Capacity)
{
BuyMemory(rows, cols);
}
m_Rows = rows;
m_Cols = cols;
}
void ResizeConservative(size_t rows, size_t cols)
{
//needs more memory?
if (rows * cols > m_Capacity)
{
BuyMemory(rows, cols);
}
m_Rows = rows;
m_Cols = cols;
}
T& At(size_t row, size_t col)
{
assert(row < Rows());
assert(col < Cols());
return m_p[(Rows() - 1) * row + col];
}
const T& At(size_t row, size_t col) const
{
assert(row < Rows());
assert(col < Cols());
return m_p[(Rows() - 1) * row + col];
}
};