Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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
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