podarray_meat.hpp
Go to the documentation of this file.
00001 // Copyright (C) 2008-2010 NICTA (www.nicta.com.au)
00002 // Copyright (C) 2008-2010 Conrad Sanderson
00003 // 
00004 // This file is part of the Armadillo C++ library.
00005 // It is provided without any warranty of fitness
00006 // for any purpose. You can redistribute this file
00007 // and/or modify it under the terms of the GNU
00008 // Lesser General Public License (LGPL) as published
00009 // by the Free Software Foundation, either version 3
00010 // of the License or (at your option) any later version.
00011 // (see http://www.opensource.org/licenses for more info)
00012 
00013 
00016 
00017 
00018 template<typename eT>
00019 inline
00020 podarray<eT>::~podarray()
00021   {
00022   arma_extra_debug_sigprint_this(this);
00023   
00024   if(n_elem > sizeof(mem_local)/sizeof(eT) )
00025     {
00026     delete [] mem;
00027     }
00028   
00029   if(arma_config::debug == true)
00030     {
00031     access::rw(n_elem) = 0;
00032     access::rw(mem)    = 0;
00033     }
00034   }
00035 
00036 
00037 
00038 template<typename eT>
00039 inline
00040 podarray<eT>::podarray()
00041   : n_elem(0)
00042   , mem   (0)
00043   {
00044   arma_extra_debug_sigprint_this(this);
00045   }
00046   
00047   
00048 
00049 template<typename eT>
00050 inline
00051 podarray<eT>::podarray(const podarray& x)
00052   : n_elem(0)
00053   , mem   (0)
00054   {
00055   arma_extra_debug_sigprint();
00056   
00057   this->operator=(x);
00058   }
00059   
00060   
00061   
00062 template<typename eT>
00063 inline
00064 const podarray<eT>&
00065 podarray<eT>::operator=(const podarray& x)
00066   {
00067   arma_extra_debug_sigprint();
00068   
00069   if(this != &x)
00070     {
00071     init(x.n_elem);
00072     
00073     arrayops::copy( memptr(), x.memptr(), n_elem );
00074     }
00075   
00076   return *this;
00077   }
00078 
00079 
00080 
00081 template<typename eT>
00082 arma_inline
00083 podarray<eT>::podarray(const uword new_n_elem)
00084   : n_elem(0)
00085   , mem   (0)
00086   {
00087   arma_extra_debug_sigprint_this(this);
00088   
00089   init(new_n_elem);
00090   }
00091 
00092 
00093 
00094 template<typename eT>
00095 arma_inline
00096 podarray<eT>::podarray(const eT* X, const uword new_n_elem)
00097   : n_elem(0)
00098   , mem   (0)
00099   {
00100   arma_extra_debug_sigprint_this(this);
00101   
00102   init(new_n_elem);
00103   
00104   arrayops::copy( memptr(), X, new_n_elem );
00105   }
00106 
00107 
00108 
00109 template<typename eT>
00110 arma_inline
00111 eT
00112 podarray<eT>::operator[] (const uword i) const
00113   {
00114   return mem[i];
00115   }
00116 
00117 
00118 
00119 template<typename eT>
00120 arma_inline
00121 eT&
00122 podarray<eT>::operator[] (const uword i)
00123   {
00124   return access::rw(mem[i]);
00125   }
00126   
00127   
00128   
00129 template<typename eT>
00130 arma_inline
00131 eT
00132 podarray<eT>::operator() (const uword i) const
00133   {
00134   arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds");
00135   return mem[i];
00136   }
00137 
00138 
00139 
00140 template<typename eT>
00141 arma_inline
00142 eT&
00143 podarray<eT>::operator() (const uword i)
00144   {
00145   arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds");
00146   return access::rw(mem[i]);
00147   }
00148 
00149 
00150 
00151 template<typename eT>
00152 inline
00153 void
00154 podarray<eT>::set_size(const uword new_n_elem)
00155   {
00156   arma_extra_debug_sigprint();
00157   
00158   init(new_n_elem);
00159   }
00160 
00161 
00162 
00163 template<typename eT>
00164 inline
00165 void
00166 podarray<eT>::reset()
00167   {
00168   arma_extra_debug_sigprint();
00169   
00170   init(0);
00171   }
00172 
00173 
00174 
00175 template<typename eT>
00176 inline
00177 void
00178 podarray<eT>::fill(const eT val)
00179   {
00180   arma_extra_debug_sigprint();
00181   
00182   arrayops::inplace_set(memptr(), val, n_elem);
00183   }
00184 
00185 
00186 
00187 template<typename eT>
00188 inline
00189 void
00190 podarray<eT>::zeros()
00191   {
00192   arma_extra_debug_sigprint();
00193   
00194   fill(eT(0));
00195   }
00196 
00197 
00198 
00199 template<typename eT>
00200 inline
00201 void
00202 podarray<eT>::zeros(const uword new_n_elem)
00203   {
00204   arma_extra_debug_sigprint();
00205   
00206   init(new_n_elem);
00207   fill(eT(0));
00208   }
00209 
00210 
00211 
00212 template<typename eT>
00213 arma_inline
00214 eT*
00215 podarray<eT>::memptr()
00216   {
00217   return const_cast<eT*>(mem);
00218   }
00219   
00220   
00221 
00222 template<typename eT>
00223 arma_inline
00224 const eT*
00225 podarray<eT>::memptr() const
00226   {
00227   return mem;
00228   }
00229 
00230 
00231 
00232 template<typename eT>
00233 arma_hot
00234 inline
00235 void
00236 podarray<eT>::copy_row(const Mat<eT>& A, const uword row)
00237   {
00238   const uword cols = A.n_cols;
00239   
00240   // note: this function assumes that the podarray has been set to the correct size beforehand
00241   eT* out = memptr();
00242   
00243   switch(cols)
00244     {
00245     default:
00246       {
00247       uword i,j;
00248       for(i=0, j=1; j < cols; i+=2, j+=2)
00249         {
00250         const eT tmp_i = A.at(row, i);
00251         const eT tmp_j = A.at(row, j);
00252         
00253         out[i] = tmp_i;
00254         out[j] = tmp_j;
00255         }
00256       
00257       if(i < cols)
00258         {
00259         out[i] = A.at(row, i);
00260         }
00261       }
00262       break;
00263     
00264     case 8:
00265       out[7] = A.at(row, 7);
00266 
00267     case 7:
00268       out[6] = A.at(row, 6);
00269 
00270     case 6:
00271       out[5] = A.at(row, 5);
00272 
00273     case 5:
00274       out[4] = A.at(row, 4);
00275 
00276     case 4:
00277       out[3] = A.at(row, 3);
00278 
00279     case 3:
00280       out[2] = A.at(row, 2);
00281 
00282     case 2:
00283       out[1] = A.at(row, 1);
00284 
00285     case 1:
00286       out[0] = A.at(row, 0);
00287     }
00288   }
00289   
00290 
00291 
00292 template<typename eT>
00293 inline
00294 void
00295 podarray<eT>::init(const uword new_n_elem)
00296   {
00297   arma_extra_debug_sigprint();
00298   
00299   if(n_elem == new_n_elem)
00300     {
00301     return;
00302     }
00303     
00304   if(n_elem > sizeof(mem_local)/sizeof(eT) )
00305     {
00306     delete [] mem;
00307     }
00308   
00309   if(new_n_elem <= sizeof(mem_local)/sizeof(eT) )
00310     {
00311     access::rw(mem) = mem_local;
00312     }
00313   else
00314     {
00315     access::rw(mem) = new eT[new_n_elem];
00316     }
00317   
00318   access::rw(n_elem) = new_n_elem;
00319   }
00320 
00321 
00322 


armadillo_matrix
Author(s): Conrad Sanderson - NICTA (www.nicta.com.au), (Wrapper by Sjoerd van den Dries)
autogenerated on Tue Jan 7 2014 11:42:05