Chris@49: // Copyright (C) 2008-2012 NICTA (www.nicta.com.au) Chris@49: // Copyright (C) 2008-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 podarray Chris@49: //! @{ Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: podarray::~podarray() Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: if(n_elem > podarray_prealloc_n_elem::val ) Chris@49: { Chris@49: memory::release( mem ); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: podarray::podarray() Chris@49: : n_elem(0) Chris@49: , mem (0) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: podarray::podarray(const podarray& x) Chris@49: : n_elem(x.n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: const uword x_n_elem = x.n_elem; Chris@49: Chris@49: init_cold(x_n_elem); Chris@49: Chris@49: arrayops::copy( memptr(), x.memptr(), x_n_elem ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: const podarray& Chris@49: podarray::operator=(const podarray& x) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(this != &x) Chris@49: { Chris@49: const uword x_n_elem = x.n_elem; Chris@49: Chris@49: init_warm(x_n_elem); Chris@49: Chris@49: arrayops::copy( memptr(), x.memptr(), x_n_elem ); Chris@49: } Chris@49: Chris@49: return *this; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: arma_inline Chris@49: podarray::podarray(const uword new_n_elem) Chris@49: : n_elem(new_n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: init_cold(new_n_elem); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: podarray::podarray(const eT* X, const uword new_n_elem) Chris@49: : n_elem(new_n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: init_cold(new_n_elem); Chris@49: Chris@49: arrayops::copy( memptr(), X, new_n_elem ); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: template Chris@49: inline Chris@49: podarray::podarray(const Proxy& P) Chris@49: : n_elem(P.get_n_elem()) Chris@49: { Chris@49: arma_extra_debug_sigprint_this(this); Chris@49: Chris@49: const uword P_n_elem = P.get_n_elem(); Chris@49: Chris@49: init_cold(P_n_elem); Chris@49: Chris@49: eT* out_mem = (*this).memptr(); Chris@49: Chris@49: if(Proxy::prefer_at_accessor == false) Chris@49: { Chris@49: typename Proxy::ea_type A = P.get_ea(); Chris@49: Chris@49: uword i,j; Chris@49: for(i=0, j=1; j < P_n_elem; i+=2, j+=2) Chris@49: { Chris@49: const eT val_i = A[i]; Chris@49: const eT val_j = A[j]; Chris@49: Chris@49: out_mem[i] = val_i; Chris@49: out_mem[j] = val_j; Chris@49: } Chris@49: Chris@49: if(i < P_n_elem) Chris@49: { Chris@49: out_mem[i] = A[i]; Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: const uword P_n_rows = P.get_n_rows(); Chris@49: const uword P_n_cols = P.get_n_cols(); Chris@49: Chris@49: if(P_n_rows != 1) Chris@49: { Chris@49: uword count = 0; Chris@49: Chris@49: for(uword col=0; col < P_n_cols; ++col) Chris@49: for(uword row=0; row < P_n_rows; ++row, ++count) Chris@49: { Chris@49: out_mem[count] = P.at(row,col); Chris@49: } Chris@49: } Chris@49: else Chris@49: { Chris@49: for(uword col=0; col < P_n_cols; ++col) Chris@49: { Chris@49: out_mem[col] = P.at(0,col); Chris@49: } Chris@49: } Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: podarray::operator[] (const uword i) const Chris@49: { Chris@49: return mem[i]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT& Chris@49: podarray::operator[] (const uword i) Chris@49: { Chris@49: return access::rw(mem[i]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT Chris@49: podarray::operator() (const uword i) const Chris@49: { Chris@49: arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds"); Chris@49: Chris@49: return mem[i]; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT& Chris@49: podarray::operator() (const uword i) Chris@49: { Chris@49: arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds"); Chris@49: Chris@49: return access::rw(mem[i]); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: podarray::set_min_size(const uword min_n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(min_n_elem > n_elem) Chris@49: { Chris@49: init_warm(min_n_elem); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: podarray::set_size(const uword new_n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: init_warm(new_n_elem); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: podarray::reset() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: init_warm(0); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: podarray::fill(const eT val) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: arrayops::inplace_set(memptr(), val, n_elem); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: podarray::zeros() Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: fill(eT(0)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: podarray::zeros(const uword new_n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: init_warm(new_n_elem); Chris@49: Chris@49: fill(eT(0)); Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: eT* Chris@49: podarray::memptr() Chris@49: { Chris@49: return mem; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_inline Chris@49: const eT* Chris@49: podarray::memptr() const Chris@49: { Chris@49: return mem; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: podarray::copy_row(const Mat& A, const uword row) Chris@49: { Chris@49: const uword cols = A.n_cols; Chris@49: Chris@49: // note: this function assumes that the podarray has been set to the correct size beforehand Chris@49: eT* out = memptr(); Chris@49: Chris@49: switch(cols) Chris@49: { Chris@49: default: Chris@49: { Chris@49: uword i,j; Chris@49: for(i=0, j=1; j < cols; i+=2, j+=2) Chris@49: { Chris@49: const eT tmp_i = A.at(row, i); Chris@49: const eT tmp_j = A.at(row, j); Chris@49: Chris@49: out[i] = tmp_i; Chris@49: out[j] = tmp_j; Chris@49: } Chris@49: Chris@49: if(i < cols) Chris@49: { Chris@49: out[i] = A.at(row, i); Chris@49: } Chris@49: } Chris@49: break; Chris@49: Chris@49: case 8: out[7] = A.at(row, 7); Chris@49: case 7: out[6] = A.at(row, 6); Chris@49: case 6: out[5] = A.at(row, 5); Chris@49: case 5: out[4] = A.at(row, 4); Chris@49: case 4: out[3] = A.at(row, 3); Chris@49: case 3: out[2] = A.at(row, 2); Chris@49: case 2: out[1] = A.at(row, 1); Chris@49: case 1: out[0] = A.at(row, 0); Chris@49: case 0: ; Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: template Chris@49: arma_hot Chris@49: inline Chris@49: void Chris@49: podarray::init_cold(const uword new_n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(new_n_elem <= podarray_prealloc_n_elem::val ) Chris@49: { Chris@49: mem = mem_local; Chris@49: } Chris@49: else Chris@49: { Chris@49: mem = memory::acquire(new_n_elem); Chris@49: Chris@49: arma_check_bad_alloc( (mem == 0), "arma::podarray: out of memory" ); Chris@49: } Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: template Chris@49: inline Chris@49: void Chris@49: podarray::init_warm(const uword new_n_elem) Chris@49: { Chris@49: arma_extra_debug_sigprint(); Chris@49: Chris@49: if(n_elem == new_n_elem) Chris@49: { Chris@49: return; Chris@49: } Chris@49: Chris@49: if(n_elem > podarray_prealloc_n_elem::val ) Chris@49: { Chris@49: memory::release( mem ); Chris@49: } Chris@49: Chris@49: if(new_n_elem <= podarray_prealloc_n_elem::val ) Chris@49: { Chris@49: mem = mem_local; Chris@49: } Chris@49: else Chris@49: { Chris@49: mem = memory::acquire(new_n_elem); Chris@49: Chris@49: arma_check_bad_alloc( (mem == 0), "arma::podarray: out of memory" ); Chris@49: } Chris@49: Chris@49: access::rw(n_elem) = new_n_elem; Chris@49: } Chris@49: Chris@49: Chris@49: Chris@49: //! @}