annotate armadillo-3.900.4/include/armadillo_bits/podarray_meat.hpp @ 84:55a047986812 tip

Update library URI so as not to be document-local
author Chris Cannam
date Wed, 22 Apr 2020 14:21:57 +0100
parents 1ec0e2823891
children
rev   line source
Chris@49 1 // Copyright (C) 2008-2012 NICTA (www.nicta.com.au)
Chris@49 2 // Copyright (C) 2008-2012 Conrad Sanderson
Chris@49 3 //
Chris@49 4 // This Source Code Form is subject to the terms of the Mozilla Public
Chris@49 5 // License, v. 2.0. If a copy of the MPL was not distributed with this
Chris@49 6 // file, You can obtain one at http://mozilla.org/MPL/2.0/.
Chris@49 7
Chris@49 8
Chris@49 9 //! \addtogroup podarray
Chris@49 10 //! @{
Chris@49 11
Chris@49 12
Chris@49 13 template<typename eT>
Chris@49 14 arma_hot
Chris@49 15 inline
Chris@49 16 podarray<eT>::~podarray()
Chris@49 17 {
Chris@49 18 arma_extra_debug_sigprint_this(this);
Chris@49 19
Chris@49 20 if(n_elem > podarray_prealloc_n_elem::val )
Chris@49 21 {
Chris@49 22 memory::release( mem );
Chris@49 23 }
Chris@49 24 }
Chris@49 25
Chris@49 26
Chris@49 27
Chris@49 28 template<typename eT>
Chris@49 29 inline
Chris@49 30 podarray<eT>::podarray()
Chris@49 31 : n_elem(0)
Chris@49 32 , mem (0)
Chris@49 33 {
Chris@49 34 arma_extra_debug_sigprint_this(this);
Chris@49 35 }
Chris@49 36
Chris@49 37
Chris@49 38
Chris@49 39 template<typename eT>
Chris@49 40 inline
Chris@49 41 podarray<eT>::podarray(const podarray& x)
Chris@49 42 : n_elem(x.n_elem)
Chris@49 43 {
Chris@49 44 arma_extra_debug_sigprint();
Chris@49 45
Chris@49 46 const uword x_n_elem = x.n_elem;
Chris@49 47
Chris@49 48 init_cold(x_n_elem);
Chris@49 49
Chris@49 50 arrayops::copy( memptr(), x.memptr(), x_n_elem );
Chris@49 51 }
Chris@49 52
Chris@49 53
Chris@49 54
Chris@49 55 template<typename eT>
Chris@49 56 inline
Chris@49 57 const podarray<eT>&
Chris@49 58 podarray<eT>::operator=(const podarray& x)
Chris@49 59 {
Chris@49 60 arma_extra_debug_sigprint();
Chris@49 61
Chris@49 62 if(this != &x)
Chris@49 63 {
Chris@49 64 const uword x_n_elem = x.n_elem;
Chris@49 65
Chris@49 66 init_warm(x_n_elem);
Chris@49 67
Chris@49 68 arrayops::copy( memptr(), x.memptr(), x_n_elem );
Chris@49 69 }
Chris@49 70
Chris@49 71 return *this;
Chris@49 72 }
Chris@49 73
Chris@49 74
Chris@49 75
Chris@49 76 template<typename eT>
Chris@49 77 arma_hot
Chris@49 78 arma_inline
Chris@49 79 podarray<eT>::podarray(const uword new_n_elem)
Chris@49 80 : n_elem(new_n_elem)
Chris@49 81 {
Chris@49 82 arma_extra_debug_sigprint_this(this);
Chris@49 83
Chris@49 84 init_cold(new_n_elem);
Chris@49 85 }
Chris@49 86
Chris@49 87
Chris@49 88
Chris@49 89 template<typename eT>
Chris@49 90 arma_inline
Chris@49 91 podarray<eT>::podarray(const eT* X, const uword new_n_elem)
Chris@49 92 : n_elem(new_n_elem)
Chris@49 93 {
Chris@49 94 arma_extra_debug_sigprint_this(this);
Chris@49 95
Chris@49 96 init_cold(new_n_elem);
Chris@49 97
Chris@49 98 arrayops::copy( memptr(), X, new_n_elem );
Chris@49 99 }
Chris@49 100
Chris@49 101
Chris@49 102
Chris@49 103 template<typename eT>
Chris@49 104 template<typename T1>
Chris@49 105 inline
Chris@49 106 podarray<eT>::podarray(const Proxy<T1>& P)
Chris@49 107 : n_elem(P.get_n_elem())
Chris@49 108 {
Chris@49 109 arma_extra_debug_sigprint_this(this);
Chris@49 110
Chris@49 111 const uword P_n_elem = P.get_n_elem();
Chris@49 112
Chris@49 113 init_cold(P_n_elem);
Chris@49 114
Chris@49 115 eT* out_mem = (*this).memptr();
Chris@49 116
Chris@49 117 if(Proxy<T1>::prefer_at_accessor == false)
Chris@49 118 {
Chris@49 119 typename Proxy<T1>::ea_type A = P.get_ea();
Chris@49 120
Chris@49 121 uword i,j;
Chris@49 122 for(i=0, j=1; j < P_n_elem; i+=2, j+=2)
Chris@49 123 {
Chris@49 124 const eT val_i = A[i];
Chris@49 125 const eT val_j = A[j];
Chris@49 126
Chris@49 127 out_mem[i] = val_i;
Chris@49 128 out_mem[j] = val_j;
Chris@49 129 }
Chris@49 130
Chris@49 131 if(i < P_n_elem)
Chris@49 132 {
Chris@49 133 out_mem[i] = A[i];
Chris@49 134 }
Chris@49 135 }
Chris@49 136 else
Chris@49 137 {
Chris@49 138 const uword P_n_rows = P.get_n_rows();
Chris@49 139 const uword P_n_cols = P.get_n_cols();
Chris@49 140
Chris@49 141 if(P_n_rows != 1)
Chris@49 142 {
Chris@49 143 uword count = 0;
Chris@49 144
Chris@49 145 for(uword col=0; col < P_n_cols; ++col)
Chris@49 146 for(uword row=0; row < P_n_rows; ++row, ++count)
Chris@49 147 {
Chris@49 148 out_mem[count] = P.at(row,col);
Chris@49 149 }
Chris@49 150 }
Chris@49 151 else
Chris@49 152 {
Chris@49 153 for(uword col=0; col < P_n_cols; ++col)
Chris@49 154 {
Chris@49 155 out_mem[col] = P.at(0,col);
Chris@49 156 }
Chris@49 157 }
Chris@49 158 }
Chris@49 159 }
Chris@49 160
Chris@49 161
Chris@49 162
Chris@49 163 template<typename eT>
Chris@49 164 arma_inline
Chris@49 165 eT
Chris@49 166 podarray<eT>::operator[] (const uword i) const
Chris@49 167 {
Chris@49 168 return mem[i];
Chris@49 169 }
Chris@49 170
Chris@49 171
Chris@49 172
Chris@49 173 template<typename eT>
Chris@49 174 arma_inline
Chris@49 175 eT&
Chris@49 176 podarray<eT>::operator[] (const uword i)
Chris@49 177 {
Chris@49 178 return access::rw(mem[i]);
Chris@49 179 }
Chris@49 180
Chris@49 181
Chris@49 182
Chris@49 183 template<typename eT>
Chris@49 184 arma_inline
Chris@49 185 eT
Chris@49 186 podarray<eT>::operator() (const uword i) const
Chris@49 187 {
Chris@49 188 arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds");
Chris@49 189
Chris@49 190 return mem[i];
Chris@49 191 }
Chris@49 192
Chris@49 193
Chris@49 194
Chris@49 195 template<typename eT>
Chris@49 196 arma_inline
Chris@49 197 eT&
Chris@49 198 podarray<eT>::operator() (const uword i)
Chris@49 199 {
Chris@49 200 arma_debug_check( (i >= n_elem), "podarray::operator(): index out of bounds");
Chris@49 201
Chris@49 202 return access::rw(mem[i]);
Chris@49 203 }
Chris@49 204
Chris@49 205
Chris@49 206
Chris@49 207 template<typename eT>
Chris@49 208 inline
Chris@49 209 void
Chris@49 210 podarray<eT>::set_min_size(const uword min_n_elem)
Chris@49 211 {
Chris@49 212 arma_extra_debug_sigprint();
Chris@49 213
Chris@49 214 if(min_n_elem > n_elem)
Chris@49 215 {
Chris@49 216 init_warm(min_n_elem);
Chris@49 217 }
Chris@49 218 }
Chris@49 219
Chris@49 220
Chris@49 221
Chris@49 222 template<typename eT>
Chris@49 223 inline
Chris@49 224 void
Chris@49 225 podarray<eT>::set_size(const uword new_n_elem)
Chris@49 226 {
Chris@49 227 arma_extra_debug_sigprint();
Chris@49 228
Chris@49 229 init_warm(new_n_elem);
Chris@49 230 }
Chris@49 231
Chris@49 232
Chris@49 233
Chris@49 234 template<typename eT>
Chris@49 235 inline
Chris@49 236 void
Chris@49 237 podarray<eT>::reset()
Chris@49 238 {
Chris@49 239 arma_extra_debug_sigprint();
Chris@49 240
Chris@49 241 init_warm(0);
Chris@49 242 }
Chris@49 243
Chris@49 244
Chris@49 245
Chris@49 246 template<typename eT>
Chris@49 247 inline
Chris@49 248 void
Chris@49 249 podarray<eT>::fill(const eT val)
Chris@49 250 {
Chris@49 251 arma_extra_debug_sigprint();
Chris@49 252
Chris@49 253 arrayops::inplace_set(memptr(), val, n_elem);
Chris@49 254 }
Chris@49 255
Chris@49 256
Chris@49 257
Chris@49 258 template<typename eT>
Chris@49 259 inline
Chris@49 260 void
Chris@49 261 podarray<eT>::zeros()
Chris@49 262 {
Chris@49 263 arma_extra_debug_sigprint();
Chris@49 264
Chris@49 265 fill(eT(0));
Chris@49 266 }
Chris@49 267
Chris@49 268
Chris@49 269
Chris@49 270 template<typename eT>
Chris@49 271 inline
Chris@49 272 void
Chris@49 273 podarray<eT>::zeros(const uword new_n_elem)
Chris@49 274 {
Chris@49 275 arma_extra_debug_sigprint();
Chris@49 276
Chris@49 277 init_warm(new_n_elem);
Chris@49 278
Chris@49 279 fill(eT(0));
Chris@49 280 }
Chris@49 281
Chris@49 282
Chris@49 283
Chris@49 284 template<typename eT>
Chris@49 285 arma_inline
Chris@49 286 eT*
Chris@49 287 podarray<eT>::memptr()
Chris@49 288 {
Chris@49 289 return mem;
Chris@49 290 }
Chris@49 291
Chris@49 292
Chris@49 293
Chris@49 294 template<typename eT>
Chris@49 295 arma_inline
Chris@49 296 const eT*
Chris@49 297 podarray<eT>::memptr() const
Chris@49 298 {
Chris@49 299 return mem;
Chris@49 300 }
Chris@49 301
Chris@49 302
Chris@49 303
Chris@49 304 template<typename eT>
Chris@49 305 arma_hot
Chris@49 306 inline
Chris@49 307 void
Chris@49 308 podarray<eT>::copy_row(const Mat<eT>& A, const uword row)
Chris@49 309 {
Chris@49 310 const uword cols = A.n_cols;
Chris@49 311
Chris@49 312 // note: this function assumes that the podarray has been set to the correct size beforehand
Chris@49 313 eT* out = memptr();
Chris@49 314
Chris@49 315 switch(cols)
Chris@49 316 {
Chris@49 317 default:
Chris@49 318 {
Chris@49 319 uword i,j;
Chris@49 320 for(i=0, j=1; j < cols; i+=2, j+=2)
Chris@49 321 {
Chris@49 322 const eT tmp_i = A.at(row, i);
Chris@49 323 const eT tmp_j = A.at(row, j);
Chris@49 324
Chris@49 325 out[i] = tmp_i;
Chris@49 326 out[j] = tmp_j;
Chris@49 327 }
Chris@49 328
Chris@49 329 if(i < cols)
Chris@49 330 {
Chris@49 331 out[i] = A.at(row, i);
Chris@49 332 }
Chris@49 333 }
Chris@49 334 break;
Chris@49 335
Chris@49 336 case 8: out[7] = A.at(row, 7);
Chris@49 337 case 7: out[6] = A.at(row, 6);
Chris@49 338 case 6: out[5] = A.at(row, 5);
Chris@49 339 case 5: out[4] = A.at(row, 4);
Chris@49 340 case 4: out[3] = A.at(row, 3);
Chris@49 341 case 3: out[2] = A.at(row, 2);
Chris@49 342 case 2: out[1] = A.at(row, 1);
Chris@49 343 case 1: out[0] = A.at(row, 0);
Chris@49 344 case 0: ;
Chris@49 345 }
Chris@49 346 }
Chris@49 347
Chris@49 348
Chris@49 349 template<typename eT>
Chris@49 350 arma_hot
Chris@49 351 inline
Chris@49 352 void
Chris@49 353 podarray<eT>::init_cold(const uword new_n_elem)
Chris@49 354 {
Chris@49 355 arma_extra_debug_sigprint();
Chris@49 356
Chris@49 357 if(new_n_elem <= podarray_prealloc_n_elem::val )
Chris@49 358 {
Chris@49 359 mem = mem_local;
Chris@49 360 }
Chris@49 361 else
Chris@49 362 {
Chris@49 363 mem = memory::acquire<eT>(new_n_elem);
Chris@49 364
Chris@49 365 arma_check_bad_alloc( (mem == 0), "arma::podarray: out of memory" );
Chris@49 366 }
Chris@49 367 }
Chris@49 368
Chris@49 369
Chris@49 370
Chris@49 371 template<typename eT>
Chris@49 372 inline
Chris@49 373 void
Chris@49 374 podarray<eT>::init_warm(const uword new_n_elem)
Chris@49 375 {
Chris@49 376 arma_extra_debug_sigprint();
Chris@49 377
Chris@49 378 if(n_elem == new_n_elem)
Chris@49 379 {
Chris@49 380 return;
Chris@49 381 }
Chris@49 382
Chris@49 383 if(n_elem > podarray_prealloc_n_elem::val )
Chris@49 384 {
Chris@49 385 memory::release( mem );
Chris@49 386 }
Chris@49 387
Chris@49 388 if(new_n_elem <= podarray_prealloc_n_elem::val )
Chris@49 389 {
Chris@49 390 mem = mem_local;
Chris@49 391 }
Chris@49 392 else
Chris@49 393 {
Chris@49 394 mem = memory::acquire<eT>(new_n_elem);
Chris@49 395
Chris@49 396 arma_check_bad_alloc( (mem == 0), "arma::podarray: out of memory" );
Chris@49 397 }
Chris@49 398
Chris@49 399 access::rw(n_elem) = new_n_elem;
Chris@49 400 }
Chris@49 401
Chris@49 402
Chris@49 403
Chris@49 404 //! @}