00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00016
00017
00018
00019 template<typename T1>
00020 class Proxy
00021 {
00022 public:
00023 inline Proxy(const T1& A)
00024 {
00025 arma_type_check(( is_arma_type<T1>::value == false ));
00026 }
00027 };
00028
00029
00030
00031
00032
00033
00034 template<typename eT>
00035 class Proxy< Mat<eT> >
00036 {
00037 public:
00038
00039 typedef eT elem_type;
00040 typedef typename get_pod_type<elem_type>::result pod_type;
00041 typedef Mat<eT> stored_type;
00042 typedef const eT* ea_type;
00043
00044 static const bool prefer_at_accessor = false;
00045 static const bool has_subview = false;
00046
00047 arma_aligned const Mat<eT>& Q;
00048
00049 inline explicit Proxy(const Mat<eT>& A)
00050 : Q(A)
00051 {
00052 arma_extra_debug_sigprint();
00053 }
00054
00055 arma_inline uword get_n_rows() const { return Q.n_rows; }
00056 arma_inline uword get_n_cols() const { return Q.n_cols; }
00057 arma_inline uword get_n_elem() const { return Q.n_elem; }
00058
00059 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00060 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00061
00062 arma_inline ea_type get_ea() const { return Q.memptr(); }
00063 arma_inline bool is_alias(const Mat<eT>& X) const { return (&Q == &X); }
00064 };
00065
00066
00067
00068 template<typename eT>
00069 class Proxy< Col<eT> >
00070 {
00071 public:
00072
00073 typedef eT elem_type;
00074 typedef typename get_pod_type<elem_type>::result pod_type;
00075 typedef Col<eT> stored_type;
00076 typedef const eT* ea_type;
00077
00078 static const bool prefer_at_accessor = false;
00079 static const bool has_subview = false;
00080
00081 arma_aligned const Col<eT>& Q;
00082
00083 inline explicit Proxy(const Col<eT>& A)
00084 : Q(A)
00085 {
00086 arma_extra_debug_sigprint();
00087 }
00088
00089 arma_inline uword get_n_rows() const { return Q.n_rows; }
00090 arma_inline uword get_n_cols() const { return 1; }
00091 arma_inline uword get_n_elem() const { return Q.n_elem; }
00092
00093 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00094 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00095
00096 arma_inline ea_type get_ea() const { return Q.memptr(); }
00097 arma_inline bool is_alias(const Mat<eT>& X) const { return (&Q == &X); }
00098 };
00099
00100
00101
00102 template<typename eT>
00103 class Proxy< Row<eT> >
00104 {
00105 public:
00106
00107 typedef eT elem_type;
00108 typedef typename get_pod_type<elem_type>::result pod_type;
00109 typedef Row<eT> stored_type;
00110 typedef const eT* ea_type;
00111
00112 static const bool prefer_at_accessor = false;
00113 static const bool has_subview = false;
00114
00115 arma_aligned const Row<eT>& Q;
00116
00117 inline explicit Proxy(const Row<eT>& A)
00118 : Q(A)
00119 {
00120 arma_extra_debug_sigprint();
00121 }
00122
00123 arma_inline uword get_n_rows() const { return 1; }
00124 arma_inline uword get_n_cols() const { return Q.n_cols; }
00125 arma_inline uword get_n_elem() const { return Q.n_elem; }
00126
00127 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00128 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00129
00130 arma_inline ea_type get_ea() const { return Q.memptr(); }
00131 arma_inline bool is_alias(const Mat<eT>& X) const { return (&Q == &X); }
00132 };
00133
00134
00135
00136 template<typename eT, typename gen_type>
00137 class Proxy< Gen<eT, gen_type > >
00138 {
00139 public:
00140
00141 typedef eT elem_type;
00142 typedef typename get_pod_type<elem_type>::result pod_type;
00143 typedef Gen<eT, gen_type> stored_type;
00144 typedef const Gen<eT, gen_type>& ea_type;
00145
00146 static const bool prefer_at_accessor = Gen<eT, gen_type>::prefer_at_accessor;
00147 static const bool has_subview = false;
00148
00149 arma_aligned const Gen<eT, gen_type>& Q;
00150
00151 inline explicit Proxy(const Gen<eT, gen_type>& A)
00152 : Q(A)
00153 {
00154 arma_extra_debug_sigprint();
00155 }
00156
00157 arma_inline uword get_n_rows() const { return Q.n_rows; }
00158 arma_inline uword get_n_cols() const { return Q.n_cols; }
00159 arma_inline uword get_n_elem() const { return Q.n_rows*Q.n_cols; }
00160
00161 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00162 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00163
00164 arma_inline ea_type get_ea() const { return Q; }
00165 arma_inline bool is_alias(const Mat<elem_type>&) const { return false; }
00166 };
00167
00168
00169
00170 template<typename T1, typename op_type>
00171 class Proxy< Op<T1, op_type> >
00172 {
00173 public:
00174
00175 typedef typename T1::elem_type elem_type;
00176 typedef typename get_pod_type<elem_type>::result pod_type;
00177 typedef Mat<elem_type> stored_type;
00178 typedef const elem_type* ea_type;
00179
00180 static const bool prefer_at_accessor = false;
00181 static const bool has_subview = false;
00182
00183 arma_aligned const Mat<elem_type> Q;
00184
00185 inline explicit Proxy(const Op<T1, op_type>& A)
00186 : Q(A)
00187 {
00188 arma_extra_debug_sigprint();
00189 }
00190
00191 arma_inline uword get_n_rows() const { return Q.n_rows; }
00192 arma_inline uword get_n_cols() const { return Q.n_cols; }
00193 arma_inline uword get_n_elem() const { return Q.n_elem; }
00194
00195 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00196 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00197
00198 arma_inline ea_type get_ea() const { return Q.memptr(); }
00199 arma_inline bool is_alias(const Mat<elem_type>&) const { return false; }
00200 };
00201
00202
00203
00204 template<typename T1, typename T2, typename glue_type>
00205 class Proxy< Glue<T1, T2, glue_type> >
00206 {
00207 public:
00208
00209 typedef typename T1::elem_type elem_type;
00210 typedef typename get_pod_type<elem_type>::result pod_type;
00211 typedef Mat<elem_type> stored_type;
00212 typedef const elem_type* ea_type;
00213
00214 static const bool prefer_at_accessor = false;
00215 static const bool has_subview = false;
00216
00217 arma_aligned const Mat<elem_type> Q;
00218
00219 inline explicit Proxy(const Glue<T1, T2, glue_type>& A)
00220 : Q(A)
00221 {
00222 arma_extra_debug_sigprint();
00223 }
00224
00225 arma_inline uword get_n_rows() const { return Q.n_rows; }
00226 arma_inline uword get_n_cols() const { return Q.n_cols; }
00227 arma_inline uword get_n_elem() const { return Q.n_elem; }
00228
00229 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00230 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00231
00232 arma_inline ea_type get_ea() const { return Q.memptr(); }
00233 arma_inline bool is_alias(const Mat<elem_type>&) const { return false; }
00234 };
00235
00236
00237
00238 template<typename eT>
00239 class Proxy< subview<eT> >
00240 {
00241 public:
00242
00243 typedef eT elem_type;
00244 typedef typename get_pod_type<elem_type>::result pod_type;
00245 typedef subview<eT> stored_type;
00246 typedef const subview<eT>& ea_type;
00247
00248 static const bool prefer_at_accessor = true;
00249 static const bool has_subview = true;
00250
00251 arma_aligned const subview<eT>& Q;
00252
00253 inline explicit Proxy(const subview<eT>& A)
00254 : Q(A)
00255 {
00256 arma_extra_debug_sigprint();
00257 }
00258
00259 arma_inline uword get_n_rows() const { return Q.n_rows; }
00260 arma_inline uword get_n_cols() const { return Q.n_cols; }
00261 arma_inline uword get_n_elem() const { return Q.n_elem; }
00262
00263 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00264 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00265
00266 arma_inline ea_type get_ea() const { return Q; }
00267 arma_inline bool is_alias(const Mat<eT>& X) const { return (&(Q.m) == &X); }
00268 };
00269
00270
00271
00272 template<typename eT, typename T1>
00273 class Proxy< subview_elem1<eT,T1> >
00274 {
00275 public:
00276
00277 typedef eT elem_type;
00278 typedef typename get_pod_type<elem_type>::result pod_type;
00279 typedef Mat<eT> stored_type;
00280 typedef const eT* ea_type;
00281
00282 static const bool prefer_at_accessor = false;
00283 static const bool has_subview = false;
00284
00285 arma_aligned const Mat<eT> Q;
00286
00287 inline explicit Proxy(const subview_elem1<eT,T1>& A)
00288 : Q(A)
00289 {
00290 arma_extra_debug_sigprint();
00291 }
00292
00293 arma_inline uword get_n_rows() const { return Q.n_rows; }
00294 arma_inline uword get_n_cols() const { return 1; }
00295 arma_inline uword get_n_elem() const { return Q.n_elem; }
00296
00297 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00298 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00299
00300 arma_inline ea_type get_ea() const { return Q.memptr(); }
00301 arma_inline bool is_alias(const Mat<eT>&) const { return false; }
00302 };
00303
00304
00305
00306 template<typename eT>
00307 class Proxy< diagview<eT> >
00308 {
00309 public:
00310
00311 typedef eT elem_type;
00312 typedef typename get_pod_type<elem_type>::result pod_type;
00313 typedef diagview<eT> stored_type;
00314 typedef const diagview<eT>& ea_type;
00315
00316 static const bool prefer_at_accessor = false;
00317 static const bool has_subview = true;
00318
00319 arma_aligned const diagview<eT>& Q;
00320
00321 inline explicit Proxy(const diagview<eT>& A)
00322 : Q(A)
00323 {
00324 arma_extra_debug_sigprint();
00325 }
00326
00327 arma_inline uword get_n_rows() const { return Q.n_rows; }
00328 arma_inline uword get_n_cols() const { return 1; }
00329 arma_inline uword get_n_elem() const { return Q.n_elem; }
00330
00331 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00332 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00333
00334 arma_inline ea_type get_ea() const { return Q; }
00335 arma_inline bool is_alias(const Mat<eT>& X) const { return (&(Q.m) == &X); }
00336 };
00337
00338
00339
00340
00341 template<typename T1, typename eop_type>
00342 class Proxy< eOp<T1, eop_type > >
00343 {
00344 public:
00345
00346 typedef typename T1::elem_type elem_type;
00347 typedef typename get_pod_type<elem_type>::result pod_type;
00348 typedef eOp<T1, eop_type> stored_type;
00349 typedef const eOp<T1, eop_type>& ea_type;
00350
00351 static const bool prefer_at_accessor = eOp<T1, eop_type>::prefer_at_accessor;
00352 static const bool has_subview = eOp<T1, eop_type>::has_subview;
00353
00354 arma_aligned const eOp<T1, eop_type>& Q;
00355
00356 inline explicit Proxy(const eOp<T1, eop_type>& A)
00357 : Q(A)
00358 {
00359 arma_extra_debug_sigprint();
00360 }
00361
00362 arma_inline uword get_n_rows() const { return Q.get_n_rows(); }
00363 arma_inline uword get_n_cols() const { return Q.get_n_cols(); }
00364 arma_inline uword get_n_elem() const { return Q.get_n_elem(); }
00365
00366 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00367 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00368
00369 arma_inline ea_type get_ea() const { return Q; }
00370 arma_inline bool is_alias(const Mat<elem_type>& X) const { return Q.P.is_alias(X); }
00371 };
00372
00373
00374
00375 template<typename T1, typename T2, typename eglue_type>
00376 class Proxy< eGlue<T1, T2, eglue_type > >
00377 {
00378 public:
00379
00380 typedef typename T1::elem_type elem_type;
00381 typedef typename get_pod_type<elem_type>::result pod_type;
00382 typedef eGlue<T1, T2, eglue_type> stored_type;
00383 typedef const eGlue<T1, T2, eglue_type>& ea_type;
00384
00385 static const bool prefer_at_accessor = eGlue<T1, T2, eglue_type>::prefer_at_accessor;
00386 static const bool has_subview = eGlue<T1, T2, eglue_type>::has_subview;
00387
00388 arma_aligned const eGlue<T1, T2, eglue_type>& Q;
00389
00390 inline explicit Proxy(const eGlue<T1, T2, eglue_type>& A)
00391 : Q(A)
00392 {
00393 arma_extra_debug_sigprint();
00394 }
00395
00396 arma_inline uword get_n_rows() const { return Q.get_n_rows(); }
00397 arma_inline uword get_n_cols() const { return Q.get_n_cols(); }
00398 arma_inline uword get_n_elem() const { return Q.get_n_elem(); }
00399
00400 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00401 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row, col); }
00402
00403 arma_inline ea_type get_ea() const { return Q; }
00404 arma_inline bool is_alias(const Mat<elem_type>& X) const { return (Q.P1.is_alias(X) || Q.P2.is_alias(X)); }
00405 };
00406
00407
00408
00409 template<typename out_eT, typename T1, typename op_type>
00410 class Proxy< mtOp<out_eT, T1, op_type> >
00411 {
00412 public:
00413
00414 typedef out_eT elem_type;
00415 typedef typename get_pod_type<out_eT>::result pod_type;
00416 typedef Mat<out_eT> stored_type;
00417 typedef const elem_type* ea_type;
00418
00419 static const bool prefer_at_accessor = false;
00420 static const bool has_subview = false;
00421
00422 arma_aligned const Mat<out_eT> Q;
00423
00424 inline explicit Proxy(const mtOp<out_eT, T1, op_type>& A)
00425 : Q(A)
00426 {
00427 arma_extra_debug_sigprint();
00428 }
00429
00430 arma_inline uword get_n_rows() const { return Q.n_rows; }
00431 arma_inline uword get_n_cols() const { return Q.n_cols; }
00432 arma_inline uword get_n_elem() const { return Q.n_elem; }
00433
00434 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00435 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row,col); }
00436
00437 arma_inline ea_type get_ea() const { return Q.memptr(); }
00438 arma_inline bool is_alias(const Mat<out_eT>&) const { return false; }
00439 };
00440
00441
00442
00443 template<typename out_eT, typename T1, typename T2, typename glue_type>
00444 class Proxy< mtGlue<out_eT, T1, T2, glue_type > >
00445 {
00446 public:
00447
00448 typedef out_eT elem_type;
00449 typedef typename get_pod_type<out_eT>::result pod_type;
00450 typedef Mat<out_eT> stored_type;
00451 typedef const elem_type* ea_type;
00452
00453 static const bool prefer_at_accessor = false;
00454 static const bool has_subview = false;
00455
00456 arma_aligned const Mat<out_eT> Q;
00457
00458 inline explicit Proxy(const mtGlue<out_eT, T1, T2, glue_type>& A)
00459 : Q(A)
00460 {
00461 arma_extra_debug_sigprint();
00462 }
00463
00464 arma_inline uword get_n_rows() const { return Q.n_rows; }
00465 arma_inline uword get_n_cols() const { return Q.n_cols; }
00466 arma_inline uword get_n_elem() const { return Q.n_elem; }
00467
00468 arma_inline elem_type operator[] (const uword i) const { return Q[i]; }
00469 arma_inline elem_type at (const uword row, const uword col) const { return Q.at(row,col); }
00470
00471 arma_inline ea_type get_ea() const { return Q.memptr(); }
00472 arma_inline bool is_alias(const Mat<out_eT>&) const { return false; }
00473 };
00474
00475
00476