Chris@49: // Copyright (C) 2012 Ryan Curtin Chris@49: // Copyright (C) 2012 Conrad Sanderson Chris@49: // Chris@49: // This Source Code Form is subject to the terms of the Mozilla Public Chris@49: // License, v. 2.0. If a copy of the MPL was not distributed with this Chris@49: // file, You can obtain one at http://mozilla.org/MPL/2.0/. Chris@49: Chris@49: //! \addtogroup SpProxy Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class SpProxy< SpMat > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: typedef SpMat stored_type; Chris@49: Chris@49: typedef typename SpMat::const_iterator const_iterator_type; Chris@49: typedef typename SpMat::const_row_iterator const_row_iterator_type; Chris@49: Chris@49: static const bool must_use_iterator = false; Chris@49: static const bool Q_created_by_proxy = false; Chris@49: Chris@49: static const bool is_row = false; Chris@49: static const bool is_col = false; Chris@49: Chris@49: arma_aligned const SpMat& Q; Chris@49: Chris@49: inline explicit SpProxy(const SpMat& A) Chris@49: : Q(A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: arma_inline uword get_n_rows() const { return Q.n_rows; } Chris@49: arma_inline uword get_n_cols() const { return Q.n_cols; } Chris@49: arma_inline uword get_n_elem() const { return Q.n_elem; } Chris@49: arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } Chris@49: Chris@49: arma_inline elem_type operator[](const uword i) const { return Q[i]; } Chris@49: arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } Chris@49: Chris@49: arma_inline const eT* get_values() const { return Q.values; } Chris@49: arma_inline const uword* get_row_indices() const { return Q.row_indices; } Chris@49: arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } Chris@49: Chris@49: arma_inline const_iterator_type begin() const { return Q.begin(); } Chris@49: arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } Chris@49: arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } Chris@49: Chris@49: arma_inline const_iterator_type end() const { return Q.end(); } Chris@49: arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } Chris@49: arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } Chris@49: Chris@49: template Chris@49: arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q) == void_ptr(&X)); } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class SpProxy< SpCol > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: typedef SpCol stored_type; Chris@49: Chris@49: typedef typename SpCol::const_iterator const_iterator_type; Chris@49: typedef typename SpCol::const_row_iterator const_row_iterator_type; Chris@49: Chris@49: static const bool must_use_iterator = false; Chris@49: static const bool Q_created_by_proxy = false; Chris@49: Chris@49: static const bool is_row = false; Chris@49: static const bool is_col = true; Chris@49: Chris@49: arma_aligned const SpCol& Q; Chris@49: Chris@49: inline explicit SpProxy(const SpCol& A) Chris@49: : Q(A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: arma_inline uword get_n_rows() const { return Q.n_rows; } Chris@49: arma_inline uword get_n_cols() const { return 1; } Chris@49: arma_inline uword get_n_elem() const { return Q.n_elem; } Chris@49: arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } Chris@49: Chris@49: arma_inline elem_type operator[](const uword i) const { return Q[i]; } Chris@49: arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } Chris@49: Chris@49: arma_inline const eT* get_values() const { return Q.values; } Chris@49: arma_inline const uword* get_row_indices() const { return Q.row_indices; } Chris@49: arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } Chris@49: Chris@49: arma_inline const_iterator_type begin() const { return Q.begin(); } Chris@49: arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin(); } Chris@49: arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } Chris@49: Chris@49: arma_inline const_iterator_type end() const { return Q.end(); } Chris@49: arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } Chris@49: arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } Chris@49: Chris@49: template Chris@49: arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q) == void_ptr(&X)); } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class SpProxy< SpRow > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: typedef SpRow stored_type; Chris@49: Chris@49: typedef typename SpRow::const_iterator const_iterator_type; Chris@49: typedef typename SpRow::const_row_iterator const_row_iterator_type; Chris@49: Chris@49: static const bool must_use_iterator = false; Chris@49: static const bool Q_created_by_proxy = false; Chris@49: Chris@49: static const bool is_row = true; Chris@49: static const bool is_col = false; Chris@49: Chris@49: arma_aligned const SpRow& Q; Chris@49: Chris@49: inline explicit SpProxy(const SpRow& A) Chris@49: : Q(A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: arma_inline uword get_n_rows() const { return 1; } Chris@49: arma_inline uword get_n_cols() const { return Q.n_cols; } Chris@49: arma_inline uword get_n_elem() const { return Q.n_elem; } Chris@49: arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } Chris@49: Chris@49: arma_inline elem_type operator[](const uword i) const { return Q[i]; } Chris@49: arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } Chris@49: Chris@49: arma_inline const eT* get_values() const { return Q.values; } Chris@49: arma_inline const uword* get_row_indices() const { return Q.row_indices; } Chris@49: arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } Chris@49: Chris@49: arma_inline const_iterator_type begin() const { return Q.begin(); } Chris@49: arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } Chris@49: arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } Chris@49: Chris@49: arma_inline const_iterator_type end() const { return Q.end(); } Chris@49: arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } Chris@49: arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } Chris@49: Chris@49: template Chris@49: arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q) == void_ptr(&X)); } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class SpProxy< SpSubview > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef eT elem_type; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: typedef SpSubview stored_type; Chris@49: Chris@49: typedef typename SpSubview::const_iterator const_iterator_type; Chris@49: typedef typename SpSubview::const_row_iterator const_row_iterator_type; Chris@49: Chris@49: static const bool must_use_iterator = true; Chris@49: static const bool Q_created_by_proxy = false; Chris@49: Chris@49: static const bool is_row = false; Chris@49: static const bool is_col = false; Chris@49: Chris@49: arma_aligned const SpSubview& Q; Chris@49: Chris@49: inline explicit SpProxy(const SpSubview& A) Chris@49: : Q(A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: arma_inline uword get_n_rows() const { return Q.n_rows; } Chris@49: arma_inline uword get_n_cols() const { return Q.n_cols; } Chris@49: arma_inline uword get_n_elem() const { return Q.n_elem; } Chris@49: arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } Chris@49: Chris@49: arma_inline elem_type operator[](const uword i) const { return Q[i]; } Chris@49: arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } Chris@49: Chris@49: arma_inline const eT* get_values() const { return Q.m.values; } Chris@49: arma_inline const uword* get_row_indices() const { return Q.m.row_indices; } Chris@49: arma_inline const uword* get_col_ptrs() const { return Q.m.col_ptrs; } Chris@49: Chris@49: arma_inline const_iterator_type begin() const { return Q.begin(); } Chris@49: arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } Chris@49: arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } Chris@49: Chris@49: arma_inline const_iterator_type end() const { return Q.end(); } Chris@49: arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } Chris@49: arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } Chris@49: Chris@49: template Chris@49: arma_inline bool is_alias(const SpMat& X) const { return (void_ptr(&Q.m) == void_ptr(&X)); } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class SpProxy< SpOp > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef typename T1::elem_type elem_type; Chris@49: typedef typename T1::elem_type eT; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: typedef SpMat stored_type; Chris@49: Chris@49: typedef typename SpMat::const_iterator const_iterator_type; Chris@49: typedef typename SpMat::const_row_iterator const_row_iterator_type; Chris@49: Chris@49: static const bool must_use_iterator = false; Chris@49: static const bool Q_created_by_proxy = true; Chris@49: Chris@49: static const bool is_row = SpOp::is_row; Chris@49: static const bool is_col = SpOp::is_col; Chris@49: Chris@49: arma_aligned const SpMat Q; Chris@49: Chris@49: inline explicit SpProxy(const SpOp& A) Chris@49: : Q(A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } Chris@49: arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } Chris@49: arma_inline uword get_n_elem() const { return Q.n_elem; } Chris@49: arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } Chris@49: Chris@49: arma_inline elem_type operator[](const uword i) const { return Q[i]; } Chris@49: arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } Chris@49: Chris@49: arma_inline const eT* get_values() const { return Q.values; } Chris@49: arma_inline const uword* get_row_indices() const { return Q.row_indices; } Chris@49: arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } Chris@49: Chris@49: arma_inline const_iterator_type begin() const { return Q.begin(); } Chris@49: arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } Chris@49: arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } Chris@49: Chris@49: arma_inline const_iterator_type end() const { return Q.end(); } Chris@49: arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } Chris@49: arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } Chris@49: Chris@49: template Chris@49: arma_inline bool is_alias(const SpMat&) const { return false; } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class SpProxy< SpGlue > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef typename T1::elem_type elem_type; Chris@49: typedef typename T1::elem_type eT; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: typedef SpMat stored_type; Chris@49: Chris@49: typedef typename SpMat::const_iterator const_iterator_type; Chris@49: typedef typename SpMat::const_row_iterator const_row_iterator_type; Chris@49: Chris@49: static const bool must_use_iterator = false; Chris@49: static const bool Q_created_by_proxy = true; Chris@49: Chris@49: static const bool is_row = SpGlue::is_row; Chris@49: static const bool is_col = SpGlue::is_col; Chris@49: Chris@49: arma_aligned const SpMat Q; Chris@49: Chris@49: inline explicit SpProxy(const SpGlue& A) Chris@49: : Q(A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } Chris@49: arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } Chris@49: arma_inline uword get_n_elem() const { return Q.n_elem; } Chris@49: arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } Chris@49: Chris@49: arma_inline elem_type operator[](const uword i) const { return Q[i]; } Chris@49: arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } Chris@49: Chris@49: arma_inline const eT* get_values() const { return Q.values; } Chris@49: arma_inline const uword* get_row_indices() const { return Q.row_indices; } Chris@49: arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } Chris@49: Chris@49: arma_inline const_iterator_type begin() const { return Q.begin(); } Chris@49: arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } Chris@49: arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } Chris@49: Chris@49: arma_inline const_iterator_type end() const { return Q.end(); } Chris@49: arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } Chris@49: arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } Chris@49: Chris@49: template Chris@49: arma_inline bool is_alias(const SpMat&) const { return false; } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class SpProxy< mtSpOp > Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef out_eT elem_type; Chris@49: typedef typename T1::elem_type eT; Chris@49: typedef typename get_pod_type::result pod_type; Chris@49: typedef SpMat stored_type; Chris@49: Chris@49: typedef typename SpMat::const_iterator const_iterator_type; Chris@49: typedef typename SpMat::const_row_iterator const_row_iterator_type; Chris@49: Chris@49: static const bool must_use_iterator = false; Chris@49: static const bool Q_created_by_proxy = true; Chris@49: Chris@49: static const bool is_row = mtSpOp::is_row; Chris@49: static const bool is_col = mtSpOp::is_col; Chris@49: Chris@49: arma_aligned const SpMat Q; Chris@49: Chris@49: inline explicit SpProxy(const mtSpOp& A) Chris@49: : Q(A) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: } Chris@49: Chris@49: arma_inline uword get_n_rows() const { return is_row ? 1 : Q.n_rows; } Chris@49: arma_inline uword get_n_cols() const { return is_col ? 1 : Q.n_cols; } Chris@49: arma_inline uword get_n_elem() const { return Q.n_elem; } Chris@49: arma_inline uword get_n_nonzero() const { return Q.n_nonzero; } Chris@49: Chris@49: arma_inline elem_type operator[](const uword i) const { return Q[i]; } Chris@49: arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); } Chris@49: Chris@49: arma_inline const eT* get_values() const { return Q.values; } Chris@49: arma_inline const uword* get_row_indices() const { return Q.row_indices; } Chris@49: arma_inline const uword* get_col_ptrs() const { return Q.col_ptrs; } Chris@49: Chris@49: arma_inline const_iterator_type begin() const { return Q.begin(); } Chris@49: arma_inline const_iterator_type begin_col(const uword col_num) const { return Q.begin_col(col_num); } Chris@49: arma_inline const_row_iterator_type begin_row(const uword row_num = 0) const { return Q.begin_row(row_num); } Chris@49: Chris@49: arma_inline const_iterator_type end() const { return Q.end(); } Chris@49: arma_inline const_row_iterator_type end_row() const { return Q.end_row(); } Chris@49: arma_inline const_row_iterator_type end_row(const uword row_num) const { return Q.end_row(row_num); } Chris@49: Chris@49: template Chris@49: arma_inline bool is_alias(const SpMat&) const { return false; } Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: //! @}