$search
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