/* matrix.hh -- declare and implement 2d arrays source file of the Flower Library (c) 2006 Joe Neeman */ #ifndef MATRIX_HH #define MATRIX_HH #include "std-vector.hh" template > class Matrix { public: Matrix () { rank_ = 0; } Matrix (vsize rows, vsize columns, T const &t) : data_(rows * columns, t) { rank_ = rows; } const T &at (vsize row, vsize col) const { assert (row < rank_ && col * rank_ + row < data_.size ()); return data_[col * rank_ + row]; } T &at (vsize row, vsize col) { assert (row < rank_ && col * rank_ + row < data_.size ()); return data_[col * rank_ + row]; } void resize (vsize rows, vsize columns, T const &t) { if (rows == rank_) data_.resize (rows * columns, t); else { vector new_data; new_data.resize (rows * columns, t); vsize cur_cols = rank_ ? data_.size () / rank_: 0; for (vsize i = 0; i < cur_cols; i++) for (vsize j = 0; j < rank_; j++) new_data[i*rows + j] = data_[i*rank_ + j]; rank_ = rows; data_ = new_data; } } private: vector data_; vsize rank_; }; #endif /* MATRIX_HH */