--- /dev/null
+/**
+ * Author: Mark Larkin
+ *
+ * Copyright (c) 2007 Des Higgins, Julie Thompson and Toby Gibson.
+ */
+#ifndef ARRAY2D_H
+#define ARRAY2D_H
+
+#include<iostream>
+#include <vector>
+namespace clustalw
+{
+
+using namespace std;
+
+template <class T>
+class Array2D
+{
+public:
+ Array2D():m_dimRow(0), m_dimCol(0){;}
+ Array2D(int nRow, int nCol)
+ {
+ m_dimRow = nRow;
+ m_dimCol = nCol;
+ for (int i=0; i < nRow; i++)
+ {
+ vector<T> x(nCol);
+ int y = x.size();
+ m_2DVector.push_back(x);
+ }
+ }
+
+ int getRowSize()
+ {
+ return m_dimRow;
+ }
+
+ int getColSize()
+ {
+ return m_dimCol;
+ }
+
+ void SetAt(int nRow, int nCol, const T& value)
+ {
+ m_2DVector[nRow][nCol] = value;
+ }
+ T GetAt(int nRow, int nCol)
+ {
+ return m_2DVector[nRow][nCol];
+ }
+ void GrowRow(int newSize)
+ {
+ if (newSize <= (int)m_dimRow)
+ return;
+ m_dimRow = newSize;
+ for(int i = 0 ; i < newSize - (int)m_dimCol; i++)
+ {
+ vector<T> x(m_dimRow);
+ m_2DVector.push_back(x);
+ }
+ }
+ void GrowCol(int newSize)
+ {
+ if(newSize <= (int)m_dimCol)
+ return;
+ m_dimCol = newSize;
+ for (int i=0; i < (int)m_dimRow; i++)
+ m_2DVector[i].resize(newSize);
+ }
+
+ void ResizeRect(int row, int col)
+ {
+ GrowRow(row);
+ GrowCol(col);
+ }
+
+ /* This is to get everything initialised to a value */
+ void GrowRow(int newSize, const T& value)
+ {
+ if (newSize <= m_dimRow)
+ return;
+ m_dimRow = newSize;
+ for(int i = 0 ; i < newSize - m_dimCol; i++)
+ {
+ vector<T> x(m_dimRow, value);
+ m_2DVector.push_back(x);
+ }
+ }
+ void GrowCol(int newSize, const T& value)
+ {
+ if(newSize <= m_dimCol)
+ return;
+ m_dimCol = newSize;
+ for (int i=0; i <m_dimRow; i++)
+ m_2DVector[i].resize(newSize, value);
+ }
+
+ void ResizeRect(int row, int col, const T& value)
+ {
+ GrowRow(row, value);
+ GrowCol(col, value);
+ }
+
+ void printArray()
+ {
+ for(int row=0; row < m_dimRow; row++)
+ {
+ for(int col=0; col < m_dimCol; col++)
+ {
+ cout <<" "<< m_2DVector[row][col];
+ }
+ cout<<"\n";
+ }
+ }
+
+ void clearArray()
+ {
+ int size = m_2DVector.size();
+ for(int i = 0; i < size; i++)
+ {
+ m_2DVector[i].clear();
+ }
+ m_2DVector.clear();
+ m_dimRow = 0;
+ m_dimCol = 0;
+
+ }
+
+ vector<T>& operator[](int x)
+ {
+ return m_2DVector[x];
+ }
+private:
+ vector< vector <T> > m_2DVector;
+ unsigned int m_dimRow;
+ unsigned int m_dimCol;
+};
+
+}
+#endif
+