#ifndef PIFRAME_H #define PIFRAME_H #include "pivector.h" template class PIFrame { public: inline PIFrame() {rows_ = cols_ = 0;} inline PIFrame(size_t rows, size_t cols, const T & f = T()) { rows_ = rows; cols_ = cols; mat.resize(rows*cols, f); } inline PIFrame(const PIVector > & v) { rows_ = v.size(); if (rows_) { cols_ = v[0].size(); for (size_t i = 0; i < rows_; i++) { mat.append(v[i]); } mat.resize(rows_*cols_); } if (mat.isEmpty()) rows_ = cols_ = 0; } inline size_t rows() const {return rows_;} inline size_t cols() const {return cols_;} // inline size_t size() const {return mat.size();} // inline ssize_t size_s() const {return mat.size_s();} inline size_t length() const {return mat.length();} inline bool isEmpty() const {return mat.isEmpty();} class PIFrameRow { friend class PIFrame; private: inline PIFrameRow(PIFrame * p, size_t row) : p_(p) {st_ = p_->cols_ * row;} PIFrame * p_; size_t st_; public: inline size_t size() const {return p_->cols_;} inline T & operator [](size_t index) {return p_->mat[st_ + index];} inline const T & operator [](size_t index) const {return p_->mat[st_ + index];} }; class PIFrameRowConst { friend class PIFrame; private: inline PIFrameRowConst(const PIFrame * p, size_t row) : p_(p) {st_ = p_->cols_ * row;} const PIFrame * p_; size_t st_; public: inline size_t size() const {return p_->cols_;} inline const T & operator [](size_t index) const {return p_->mat[st_ + index];} }; inline PIFrameRow operator[](size_t index) {return PIFrameRow(this, index);} inline PIFrameRowConst operator[](size_t index) const {return PIFrameRowConst(this, index);} private: size_t rows_, cols_; PIVector mat; }; template inline PICout operator <<(PICout s, const PIFrame & v) { s.setControl(0, true); s << "{"; for (size_t i = 0; i < v.rows(); ++i) { s << "{ "; for (size_t j = 0; j < v.cols(); ++j) { s << v[i][j]; if (j < v.cols() - 1) s << ", "; } s << " }"; if (i < v.rows() - 1) s << PICoutManipulators::NewLine ; } if (v.isEmpty()) s << "{ }"; s << "}"; s.restoreControl(); return s; } #endif // PIFRAME_H