Chris@49: // Copyright (C) 2010 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2010 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 injector Chris@49: //! @{ Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: mat_injector_row::mat_injector_row() Chris@49: : n_cols(0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: A.set_size( podarray_prealloc_n_elem::val ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: mat_injector_row::insert(const eT val) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(n_cols < A.n_elem) Chris@49: { Chris@49: A[n_cols] = val; Chris@49: ++n_cols; Chris@49: } Chris@49: else Chris@49: { Chris@49: B.set_size(2 * A.n_elem); Chris@49: Chris@49: arrayops::copy(B.memptr(), A.memptr(), n_cols); Chris@49: Chris@49: B[n_cols] = val; Chris@49: ++n_cols; Chris@49: Chris@49: std::swap( access::rw(A.mem), access::rw(B.mem) ); Chris@49: std::swap( access::rw(A.n_elem), access::rw(B.n_elem) ); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // Chris@49: // Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: mat_injector::mat_injector(T1& in_X, const typename mat_injector::elem_type val) Chris@49: : X(in_X) Chris@49: , n_rows(1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename mat_injector::elem_type eT; Chris@49: Chris@49: AA = new podarray< mat_injector_row* >; Chris@49: BB = new podarray< mat_injector_row* >; Chris@49: Chris@49: podarray< mat_injector_row* >& A = *AA; Chris@49: Chris@49: A.set_size(n_rows); Chris@49: Chris@49: for(uword row=0; row; Chris@49: } Chris@49: Chris@49: (*(A[0])).insert(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: mat_injector::mat_injector(T1& in_X, const injector_end_of_row<>& x) Chris@49: : X(in_X) Chris@49: , n_rows(1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(x); Chris@49: Chris@49: typedef typename mat_injector::elem_type eT; Chris@49: Chris@49: AA = new podarray< mat_injector_row* >; Chris@49: BB = new podarray< mat_injector_row* >; Chris@49: Chris@49: podarray< mat_injector_row* >& A = *AA; Chris@49: Chris@49: A.set_size(n_rows); Chris@49: Chris@49: for(uword row=0; row; Chris@49: } Chris@49: Chris@49: (*this).end_of_row(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: mat_injector::~mat_injector() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename mat_injector::elem_type eT; Chris@49: Chris@49: podarray< mat_injector_row* >& A = *AA; Chris@49: Chris@49: if(n_rows > 0) Chris@49: { Chris@49: uword max_n_cols = (*(A[0])).n_cols; Chris@49: Chris@49: for(uword row=1; row::value == true) Chris@49: { Chris@49: X.set_size(max_n_rows, max_n_cols); Chris@49: Chris@49: for(uword row=0; row::value == true) Chris@49: { Chris@49: arma_debug_check( (max_n_rows > 1), "matrix initialisation: incompatible dimensions" ); Chris@49: Chris@49: const uword n_cols = (*(A[0])).n_cols; Chris@49: Chris@49: X.set_size(1, n_cols); Chris@49: Chris@49: arrayops::copy( X.memptr(), (*(A[0])).A.memptr(), n_cols ); Chris@49: } Chris@49: else Chris@49: if(is_Col::value == true) Chris@49: { Chris@49: const bool is_vec = ( (max_n_rows == 1) || (max_n_cols == 1) ); Chris@49: Chris@49: arma_debug_check( (is_vec == false), "matrix initialisation: incompatible dimensions" ); Chris@49: Chris@49: const uword n_elem = (std::max)(max_n_rows, max_n_cols); Chris@49: Chris@49: X.set_size(n_elem, 1); Chris@49: Chris@49: uword i = 0; Chris@49: for(uword row=0; row Chris@49: inline Chris@49: void Chris@49: mat_injector::insert(const typename mat_injector::elem_type val) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename mat_injector::elem_type eT; Chris@49: Chris@49: podarray< mat_injector_row* >& A = *AA; Chris@49: Chris@49: (*(A[n_rows-1])).insert(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: mat_injector::end_of_row() const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename mat_injector::elem_type eT; Chris@49: Chris@49: podarray< mat_injector_row* >& A = *AA; Chris@49: podarray< mat_injector_row* >& B = *BB; Chris@49: Chris@49: B.set_size( n_rows+1 ); Chris@49: Chris@49: arrayops::copy(B.memptr(), A.memptr(), n_rows); Chris@49: Chris@49: for(uword row=n_rows; row<(n_rows+1); ++row) Chris@49: { Chris@49: B[row] = new mat_injector_row; Chris@49: } Chris@49: Chris@49: std::swap(AA, BB); Chris@49: Chris@49: n_rows += 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const mat_injector& Chris@49: operator<<(const mat_injector& ref, const typename mat_injector::elem_type val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: ref.insert(val); Chris@49: Chris@49: return ref; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const mat_injector& Chris@49: operator<<(const mat_injector& ref, const injector_end_of_row<>& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(x); Chris@49: Chris@49: ref.end_of_row(); Chris@49: Chris@49: return ref; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //// using a mixture of operator << and , doesn't work yet Chris@49: //// e.g. A << 1, 2, 3 << endr Chris@49: //// in the above "3 << endr" requires special handling. Chris@49: //// similarly, special handling is necessary for "endr << 3" Chris@49: //// Chris@49: // template Chris@49: // arma_inline Chris@49: // const mat_injector& Chris@49: // operator,(const mat_injector& ref, const typename mat_injector::elem_type val) Chris@49: // { Chris@49: // arma_extra_debug_sigprint(); Chris@49: // Chris@49: // ref.insert(val); Chris@49: // Chris@49: // return ref; Chris@49: // } Chris@49: Chris@49: Chris@49: Chris@49: // template Chris@49: // arma_inline Chris@49: // const mat_injector& Chris@49: // operator,(const mat_injector& ref, const injector_end_of_row<>& x) Chris@49: // { Chris@49: // arma_extra_debug_sigprint(); Chris@49: // arma_ignore(x); Chris@49: // Chris@49: // ref.end_of_row(); Chris@49: // Chris@49: // return ref; Chris@49: // } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: // Chris@49: // Chris@49: // Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: field_injector_row::field_injector_row() Chris@49: : n_cols(0) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: AA = new field; Chris@49: BB = new field; Chris@49: Chris@49: field& A = *AA; Chris@49: Chris@49: A.set_size( field_prealloc_n_elem::val ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: field_injector_row::~field_injector_row() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: delete AA; Chris@49: delete BB; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: field_injector_row::insert(const oT& val) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: field& A = *AA; Chris@49: field& B = *BB; Chris@49: Chris@49: if(n_cols < A.n_elem) Chris@49: { Chris@49: A[n_cols] = val; Chris@49: ++n_cols; Chris@49: } Chris@49: else Chris@49: { Chris@49: B.set_size(2 * A.n_elem); Chris@49: Chris@49: for(uword i=0; i Chris@49: inline Chris@49: field_injector::field_injector(T1& in_X, const typename field_injector::object_type& val) Chris@49: : X(in_X) Chris@49: , n_rows(1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename field_injector::object_type oT; Chris@49: Chris@49: AA = new podarray< field_injector_row* >; Chris@49: BB = new podarray< field_injector_row* >; Chris@49: Chris@49: podarray< field_injector_row* >& A = *AA; Chris@49: Chris@49: A.set_size(n_rows); Chris@49: Chris@49: for(uword row=0; row; Chris@49: } Chris@49: Chris@49: (*(A[0])).insert(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: field_injector::field_injector(T1& in_X, const injector_end_of_row<>& x) Chris@49: : X(in_X) Chris@49: , n_rows(1) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(x); Chris@49: Chris@49: typedef typename field_injector::object_type oT; Chris@49: Chris@49: AA = new podarray< field_injector_row* >; Chris@49: BB = new podarray< field_injector_row* >; Chris@49: Chris@49: podarray< field_injector_row* >& A = *AA; Chris@49: Chris@49: A.set_size(n_rows); Chris@49: Chris@49: for(uword row=0; row; Chris@49: } Chris@49: Chris@49: (*this).end_of_row(); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: field_injector::~field_injector() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename field_injector::object_type oT; Chris@49: Chris@49: podarray< field_injector_row* >& A = *AA; Chris@49: Chris@49: if(n_rows > 0) Chris@49: { Chris@49: uword max_n_cols = (*(A[0])).n_cols; Chris@49: Chris@49: for(uword row=1; row& tmp = *((*(A[row])).AA); Chris@49: X.at(row,col) = tmp[col]; Chris@49: } Chris@49: Chris@49: for(uword col=n_cols; col Chris@49: inline Chris@49: void Chris@49: field_injector::insert(const typename field_injector::object_type& val) const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename field_injector::object_type oT; Chris@49: Chris@49: podarray< field_injector_row* >& A = *AA; Chris@49: Chris@49: (*(A[n_rows-1])).insert(val); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: field_injector::end_of_row() const Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: typedef typename field_injector::object_type oT; Chris@49: Chris@49: podarray< field_injector_row* >& A = *AA; Chris@49: podarray< field_injector_row* >& B = *BB; Chris@49: Chris@49: B.set_size( n_rows+1 ); Chris@49: Chris@49: for(uword row=0; row; Chris@49: } Chris@49: Chris@49: std::swap(AA, BB); Chris@49: Chris@49: n_rows += 1; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const field_injector& Chris@49: operator<<(const field_injector& ref, const typename field_injector::object_type& val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: ref.insert(val); Chris@49: Chris@49: return ref; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const field_injector& Chris@49: operator<<(const field_injector& ref, const injector_end_of_row<>& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: arma_ignore(x); Chris@49: Chris@49: ref.end_of_row(); Chris@49: Chris@49: return ref; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}