Mercurial > hg > segmenter-vamp-plugin
diff armadillo-2.4.4/include/armadillo_bits/podarray_meat.hpp @ 0:8b6102e2a9b0
Armadillo Library
author | maxzanoni76 <max.zanoni@eecs.qmul.ac.uk> |
---|---|
date | Wed, 11 Apr 2012 09:27:06 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/armadillo-2.4.4/include/armadillo_bits/podarray_meat.hpp Wed Apr 11 09:27:06 2012 +0100 @@ -0,0 +1,323 @@ +// Copyright (C) 2008-2010 NICTA (www.nicta.com.au) +// Copyright (C) 2008-2010 Conrad Sanderson +// +// This file is part of the Armadillo C++ library. +// It is provided without any warranty of fitness +// for any purpose. You can redistribute this file +// and/or modify it under the terms of the GNU +// Lesser General Public License (LGPL) as published +// by the Free Software Foundation, either version 3 +// of the License or (at your option) any later version. +// (see http://www.opensource.org/licenses for more info) + + +//! \addtogroup podarray +//! @{ + + +template<typename eT> +inline +podarray<eT>::~podarray() + { + arma_extra_debug_sigprint_this(this); + + if(n_elem > sizeof(mem_local)/sizeof(eT) ) + { + delete [] mem; + } + + if(arma_config::debug == true) + { + access::rw(n_elem) = 0; + access::rw(mem) = 0; + } + } + + + +template<typename eT> +inline +podarray<eT>::podarray() + : n_elem(0) + , mem (0) + { + arma_extra_debug_sigprint_this(this); + } + + + +template<typename eT> +inline +podarray<eT>::podarray(const podarray& x) + : n_elem(0) + , mem (0) + { + arma_extra_debug_sigprint(); + + this->operator=(x); + } + + + +template<typename eT> +inline +const podarray<eT>& +podarray<eT>::operator=(const podarray& x) + { + arma_extra_debug_sigprint(); + + if(this != &x) + { + init(x.n_elem); + + arrayops::copy( memptr(), x.memptr(), n_elem ); + } + + return *this; + } + + + +template<typename eT> +arma_inline +podarray<eT>::podarray(const uword new_n_elem) + : n_elem(0) + , mem (0) + { + arma_extra_debug_sigprint_this(this); + + init(new_n_elem); + } + + + +template<typename eT> +arma_inline +podarray<eT>::podarray(const eT* X, const uword new_n_elem) + : n_elem(0) + , mem (0) + { + arma_extra_debug_sigprint_this(this); + + init(new_n_elem); + + arrayops::copy( memptr(), X, new_n_elem ); + } + + + +template<typename eT> +arma_inline +eT +podarray<eT>::operator[] (const uword i) const + { + return mem[i]; + } + + + +template<typename eT> +arma_inline +eT& +podarray<eT>::operator[] (const uword i) + { + return access::rw(mem[i]); + } + + + +template<typename eT> +arma_inline +eT +podarray<eT>::operator() (const uword i) const + { + arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds"); + return mem[i]; + } + + + +template<typename eT> +arma_inline +eT& +podarray<eT>::operator() (const uword i) + { + arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds"); + return access::rw(mem[i]); + } + + + +template<typename eT> +inline +void +podarray<eT>::set_size(const uword new_n_elem) + { + arma_extra_debug_sigprint(); + + init(new_n_elem); + } + + + +template<typename eT> +inline +void +podarray<eT>::reset() + { + arma_extra_debug_sigprint(); + + init(0); + } + + + +template<typename eT> +inline +void +podarray<eT>::fill(const eT val) + { + arma_extra_debug_sigprint(); + + arrayops::inplace_set(memptr(), val, n_elem); + } + + + +template<typename eT> +inline +void +podarray<eT>::zeros() + { + arma_extra_debug_sigprint(); + + fill(eT(0)); + } + + + +template<typename eT> +inline +void +podarray<eT>::zeros(const uword new_n_elem) + { + arma_extra_debug_sigprint(); + + init(new_n_elem); + fill(eT(0)); + } + + + +template<typename eT> +arma_inline +eT* +podarray<eT>::memptr() + { + return const_cast<eT*>(mem); + } + + + +template<typename eT> +arma_inline +const eT* +podarray<eT>::memptr() const + { + return mem; + } + + + +template<typename eT> +arma_hot +inline +void +podarray<eT>::copy_row(const Mat<eT>& A, const uword row) + { + const uword cols = A.n_cols; + + // note: this function assumes that the podarray has been set to the correct size beforehand + eT* out = memptr(); + + switch(cols) + { + default: + { + uword i,j; + for(i=0, j=1; j < cols; i+=2, j+=2) + { + const eT tmp_i = A.at(row, i); + const eT tmp_j = A.at(row, j); + + out[i] = tmp_i; + out[j] = tmp_j; + } + + if(i < cols) + { + out[i] = A.at(row, i); + } + } + break; + + case 8: + out[7] = A.at(row, 7); + + case 7: + out[6] = A.at(row, 6); + + case 6: + out[5] = A.at(row, 5); + + case 5: + out[4] = A.at(row, 4); + + case 4: + out[3] = A.at(row, 3); + + case 3: + out[2] = A.at(row, 2); + + case 2: + out[1] = A.at(row, 1); + + case 1: + out[0] = A.at(row, 0); + } + } + + + +template<typename eT> +inline +void +podarray<eT>::init(const uword new_n_elem) + { + arma_extra_debug_sigprint(); + + if(n_elem == new_n_elem) + { + return; + } + + if(n_elem > sizeof(mem_local)/sizeof(eT) ) + { + delete [] mem; + } + + if(new_n_elem <= sizeof(mem_local)/sizeof(eT) ) + { + access::rw(mem) = mem_local; + } + else + { + access::rw(mem) = new eT[new_n_elem]; + } + + access::rw(n_elem) = new_n_elem; + } + + + +//! @}