/* * mmatrix.h * (C) Porkolab Zoltan, ELTE, Budapest, Hungary * (C) 2003 */ #ifndef MMATRIX_H #define MMATRIX_H #include <vector> template <typename T> class mmatrix { public: class index : public std::vector<int> { public: void reset() { clear(); } index &put(int i) { push_back(i); return *this; } int maxIndex() const; }; typedef typename std::vector<T>::iterator iterator; typedef typename std::vector<T>::const_iterator const_iterator; iterator begin() { return vec_.begin(); } const_iterator begin() const { return vec_.begin(); } iterator end() { return vec_.end(); } const_iterator end() const { return vec_.end(); } mmatrix(index ix) : size_(ix), vec_(ix.maxIndex()) { } int dim() const { return size_.size(); } T& at(index ix); const T& at(index ix) const; T& operator[](index ix); const T& operator[](index ix) const; private: const std::vector<int> size_; std::vector<T> vec_; int plainIndex(index ix) const; }; template <typename T> int mmatrix<T>::index::maxIndex() const { int max = 1; for (size_t i = 0; i < size(); ++i) max *= operator[](i); return max; } template <typename T> int mmatrix<T>::plainIndex( index ix) const { int ind = ix[0]; for ( size_t i = 0; i < ix.size()-1; ++i) ind = ind * size_[i+1] + ix[i+1]; return ind; } template <typename T> T& mmatrix<T>::at(index ix) { return vec_.at(plainIndex(ix)); } template <typename T> const T& mmatrix<T>::at(index ix) const { return vec_.at(plainIndex(ix)); } template <typename T> T& mmatrix<T>::operator[](index ix) { return vec_[plainIndex(ix)]; } template <typename T> const T& mmatrix<T>::operator[](index ix) const { return vec_[plainIndex(ix)]; } #endif /* MMATRIX_H */