/* * dmatrix.h * (C) Porkolab Zoltan, ELTE, Budapest, Hungary * (C) 2003 */ #ifndef DMATRIX_H #define DMATRIX_H #include <algorithm> #include <vector> template<typename T> class dmatrix { public: dmatrix( int n, int k) : n_(n), k_(k), v_(n*(2*k-1)) { } T get( int i, int j) const { return indiag(i,j) ? v_[atindex(i,j)] : T(); } void set(int i, int j, const T& t) { v_[atindex(i,j)] = t; } typedef typename std::vector<T>::iterator iterator; typedef typename std::vector<T>::const_iterator const_iterator; iterator begin() { return v_.begin(); } iterator end() { return v_.end(); } const_iterator begin() const { return v_.begin(); } const_iterator end() const { return v_.end(); } T& operator()(int i, int j) { return v_[atindex(i,j)]; } T operator()(int i, int j) const { return v_[atindex(i,j)]; } private: int n_; int k_; std::vector<T> v_; bool indiag(int i, int j) const { return i-j>0 ? i-j<k_ : j-i<k_; } int atindex(int i, int j) const { return i*(2*k_-1) + (i-j+k_-1); } }; #endif