diff options
Diffstat (limited to 'decoder/array2d.h')
-rw-r--r-- | decoder/array2d.h | 172 |
1 files changed, 0 insertions, 172 deletions
diff --git a/decoder/array2d.h b/decoder/array2d.h deleted file mode 100644 index e63eda0d..00000000 --- a/decoder/array2d.h +++ /dev/null @@ -1,172 +0,0 @@ -#ifndef ARRAY2D_H_ -#define ARRAY2D_H_ - -#include <iostream> -#include <algorithm> -#include <cassert> -#include <vector> -#include <string> - -template<typename T> -class Array2D { - public: - typedef typename std::vector<T>::reference reference; - typedef typename std::vector<T>::const_reference const_reference; - typedef typename std::vector<T>::iterator iterator; - typedef typename std::vector<T>::const_iterator const_iterator; - Array2D() : width_(0), height_(0) {} - Array2D(int w, int h, const T& d = T()) : - width_(w), height_(h), data_(w*h, d) {} - Array2D(const Array2D& rhs) : - width_(rhs.width_), height_(rhs.height_), data_(rhs.data_) {} - bool empty() const { return data_.empty(); } - void resize(int w, int h, const T& d = T()) { - data_.resize(w * h, d); - width_ = w; - height_ = h; - } - const Array2D& operator=(const Array2D& rhs) { - data_ = rhs.data_; - width_ = rhs.width_; - height_ = rhs.height_; - return *this; - } - void fill(const T& v) { data_.assign(data_.size(), v); } - int width() const { return width_; } - int height() const { return height_; } - reference operator()(int i, int j) { - return data_[offset(i, j)]; - } - void clear() { data_.clear(); width_=0; height_=0; } - const_reference operator()(int i, int j) const { - return data_[offset(i, j)]; - } - iterator begin_col(int j) { - return data_.begin() + offset(0,j); - } - const_iterator begin_col(int j) const { - return data_.begin() + offset(0,j); - } - iterator end_col(int j) { - return data_.begin() + offset(0,j) + width_; - } - const_iterator end_col(int j) const { - return data_.begin() + offset(0,j) + width_; - } - iterator end() { return data_.end(); } - const_iterator end() const { return data_.end(); } - const Array2D<T>& operator*=(const T& x) { - std::transform(data_.begin(), data_.end(), data_.begin(), - std::bind2nd(std::multiplies<T>(), x)); - } - const Array2D<T>& operator/=(const T& x) { - std::transform(data_.begin(), data_.end(), data_.begin(), - std::bind2nd(std::divides<T>(), x)); - } - const Array2D<T>& operator+=(const Array2D<T>& m) { - std::transform(m.data_.begin(), m.data_.end(), data_.begin(), data_.begin(), std::plus<T>()); - } - const Array2D<T>& operator-=(const Array2D<T>& m) { - std::transform(m.data_.begin(), m.data_.end(), data_.begin(), data_.begin(), std::minus<T>()); - } - - private: - inline int offset(int i, int j) const { - assert(i<width_); - assert(j<height_); - return i + j * width_; - } - - int width_; - int height_; - - std::vector<T> data_; -}; - -template <typename T> -Array2D<T> operator*(const Array2D<T>& l, const T& scalar) { - Array2D<T> res(l); - res *= scalar; - return res; -} - -template <typename T> -Array2D<T> operator*(const T& scalar, const Array2D<T>& l) { - Array2D<T> res(l); - res *= scalar; - return res; -} - -template <typename T> -Array2D<T> operator/(const Array2D<T>& l, const T& scalar) { - Array2D<T> res(l); - res /= scalar; - return res; -} - -template <typename T> -Array2D<T> operator+(const Array2D<T>& l, const Array2D<T>& r) { - Array2D<T> res(l); - res += r; - return res; -} - -template <typename T> -Array2D<T> operator-(const Array2D<T>& l, const Array2D<T>& r) { - Array2D<T> res(l); - res -= r; - return res; -} - -template <typename T> -inline std::ostream& operator<<(std::ostream& os, const Array2D<T>& m) { - for (int i=0; i<m.width(); ++i) { - for (int j=0; j<m.height(); ++j) - os << '\t' << m(i,j); - os << '\n'; - } - return os; -} - -inline std::ostream& operator<<(std::ostream& os, const Array2D<bool>& m) { - os << ' '; - for (int j=0; j<m.height(); ++j) - os << (j%10); - os << "\n"; - for (int i=0; i<m.width(); ++i) { - os << (i%10); - for (int j=0; j<m.height(); ++j) - os << (m(i,j) ? '*' : '.'); - os << (i%10) << "\n"; - } - os << ' '; - for (int j=0; j<m.height(); ++j) - os << (j%10); - os << "\n"; - return os; -} - -inline std::ostream& operator<<(std::ostream& os, const Array2D<std::vector<bool> >& m) { - os << ' '; - for (int j=0; j<m.height(); ++j) - os << (j%10) << "\t"; - os << "\n"; - for (int i=0; i<m.width(); ++i) { - os << (i%10); - for (int j=0; j<m.height(); ++j) { - const std::vector<bool>& ar = m(i,j); - for (int k=0; k<ar.size(); ++k) - os << (ar[k] ? '*' : '.'); - } - os << "\t"; - os << (i%10) << "\n"; - } - os << ' '; - for (int j=0; j<m.height(); ++j) - os << (j%10) << "\t"; - os << "\n"; - return os; -} - -#endif - |