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: Chris@49: //! \addtogroup subview_each Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class subview_each_common Chris@49: { Chris@49: public: Chris@49: Chris@49: typedef typename parent::elem_type eT; Chris@49: Chris@49: Chris@49: protected: Chris@49: Chris@49: parent& p; Chris@49: Chris@49: arma_inline subview_each_common(parent& in_p); Chris@49: Chris@49: arma_inline const Mat& get_mat_ref_helper(const Mat & X) const; Chris@49: arma_inline const Mat& get_mat_ref_helper(const subview& X) const; Chris@49: Chris@49: arma_inline const Mat& get_mat_ref() const; Chris@49: Chris@49: inline void check_size(const Mat& A) const; Chris@49: Chris@49: arma_cold inline const std::string incompat_size_string(const Mat& A) const; Chris@49: Chris@49: Chris@49: private: Chris@49: Chris@49: subview_each_common(); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class subview_each1 : public subview_each_common Chris@49: { Chris@49: protected: Chris@49: Chris@49: arma_inline subview_each1(parent& in_p); Chris@49: Chris@49: Chris@49: public: Chris@49: Chris@49: typedef typename parent::elem_type eT; Chris@49: Chris@49: inline ~subview_each1(); Chris@49: Chris@49: // deliberately returning void Chris@49: template inline void operator= (const Base& x); Chris@49: template inline void operator+= (const Base& x); Chris@49: template inline void operator-= (const Base& x); Chris@49: template inline void operator%= (const Base& x); Chris@49: template inline void operator/= (const Base& x); Chris@49: Chris@49: Chris@49: private: Chris@49: Chris@49: friend class Mat; Chris@49: friend class subview; Chris@49: Chris@49: subview_each1(); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: class subview_each2 : public subview_each_common Chris@49: { Chris@49: protected: Chris@49: Chris@49: const Base& base_indices; Chris@49: Chris@49: inline subview_each2(parent& in_p, const Base& in_indices); Chris@49: Chris@49: inline void check_indices(const Mat& indices) const; Chris@49: Chris@49: Chris@49: public: Chris@49: Chris@49: typedef typename parent::elem_type eT; Chris@49: Chris@49: inline ~subview_each2(); Chris@49: Chris@49: // deliberately returning void Chris@49: template inline void operator= (const Base& x); Chris@49: template inline void operator+= (const Base& x); Chris@49: template inline void operator-= (const Base& x); Chris@49: template inline void operator%= (const Base& x); Chris@49: template inline void operator/= (const Base& x); Chris@49: Chris@49: // TODO: add handling of scalars Chris@49: Chris@49: Chris@49: private: Chris@49: Chris@49: friend class Mat; Chris@49: friend class subview; Chris@49: Chris@49: subview_each2(); Chris@49: }; Chris@49: Chris@49: Chris@49: Chris@49: //! @}