$search
00001 // Copyright (C) 2008-2011 NICTA (www.nicta.com.au) 00002 // Copyright (C) 2008-2011 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 T1> 00019 struct get_pod_type 00020 { typedef T1 result; }; 00021 00022 template<typename T2> 00023 struct get_pod_type< std::complex<T2> > 00024 { typedef T2 result; }; 00025 00026 00027 00028 template<typename T> 00029 struct is_Mat_only 00030 { static const bool value = false; }; 00031 00032 template<typename eT> 00033 struct is_Mat_only< Mat<eT> > 00034 { static const bool value = true; }; 00035 00036 00037 00038 template<typename T> 00039 struct is_Mat 00040 { static const bool value = false; }; 00041 00042 template<typename eT> 00043 struct is_Mat< Mat<eT> > 00044 { static const bool value = true; }; 00045 00046 template<typename eT> 00047 struct is_Mat< Row<eT> > 00048 { static const bool value = true; }; 00049 00050 template<typename eT> 00051 struct is_Mat< Col<eT> > 00052 { static const bool value = true; }; 00053 00054 00055 00056 template<typename T> 00057 struct is_Row 00058 { static const bool value = false; }; 00059 00060 template<typename eT> 00061 struct is_Row< Row<eT> > 00062 { static const bool value = true; }; 00063 00064 00065 00066 template<typename T> 00067 struct is_Col 00068 { static const bool value = false; }; 00069 00070 template<typename eT> 00071 struct is_Col< Col<eT> > 00072 { static const bool value = true; }; 00073 00074 00075 00076 00077 00078 00079 template<typename T> 00080 struct is_subview 00081 { static const bool value = false; }; 00082 00083 template<typename eT> 00084 struct is_subview< subview<eT> > 00085 { static const bool value = true; }; 00086 00087 00088 template<typename T> 00089 struct is_diagview 00090 { static const bool value = false; }; 00091 00092 template<typename eT> 00093 struct is_diagview< diagview<eT> > 00094 { static const bool value = true; }; 00095 00096 00097 // 00098 // 00099 // 00100 00101 00102 00103 template<typename T> 00104 struct is_Cube 00105 { static const bool value = false; }; 00106 00107 template<typename eT> 00108 struct is_Cube< Cube<eT> > 00109 { static const bool value = true; }; 00110 00111 template<typename T> 00112 struct is_subview_cube 00113 { static const bool value = false; }; 00114 00115 template<typename eT> 00116 struct is_subview_cube< subview_cube<eT> > 00117 { static const bool value = true; }; 00118 00119 00120 00121 // 00122 // 00123 // 00124 00125 00126 template<typename T> 00127 struct is_Gen 00128 { static const bool value = false; }; 00129 00130 template<typename eT, typename gen_type> 00131 struct is_Gen< Gen<eT,gen_type> > 00132 { static const bool value = true; }; 00133 00134 00135 template<typename T> 00136 struct is_Op 00137 { static const bool value = false; }; 00138 00139 template<typename T1, typename op_type> 00140 struct is_Op< Op<T1,op_type> > 00141 { static const bool value = true; }; 00142 00143 00144 template<typename T> 00145 struct is_eOp 00146 { static const bool value = false; }; 00147 00148 template<typename T1, typename eop_type> 00149 struct is_eOp< eOp<T1,eop_type> > 00150 { static const bool value = true; }; 00151 00152 00153 template<typename T> 00154 struct is_mtOp 00155 { static const bool value = false; }; 00156 00157 template<typename eT, typename T1, typename op_type> 00158 struct is_mtOp< mtOp<eT, T1, op_type> > 00159 { static const bool value = true; }; 00160 00161 00162 template<typename T> 00163 struct is_Glue 00164 { static const bool value = false; }; 00165 00166 template<typename T1, typename T2, typename glue_type> 00167 struct is_Glue< Glue<T1,T2,glue_type> > 00168 { static const bool value = true; }; 00169 00170 00171 template<typename T> 00172 struct is_eGlue 00173 { static const bool value = false; }; 00174 00175 template<typename T1, typename T2, typename eglue_type> 00176 struct is_eGlue< eGlue<T1,T2,eglue_type> > 00177 { static const bool value = true; }; 00178 00179 00180 template<typename T> 00181 struct is_mtGlue 00182 { static const bool value = false; }; 00183 00184 template<typename eT, typename T1, typename T2, typename glue_type> 00185 struct is_mtGlue< mtGlue<eT, T1, T2, glue_type> > 00186 { static const bool value = true; }; 00187 00188 00189 // 00190 // 00191 00192 00193 template<typename T> 00194 struct is_glue_times 00195 { static const bool value = false; }; 00196 00197 template<typename T1, typename T2> 00198 struct is_glue_times< Glue<T1,T2,glue_times> > 00199 { static const bool value = true; }; 00200 00201 00202 template<typename T> 00203 struct is_glue_times_diag 00204 { static const bool value = false; }; 00205 00206 template<typename T1, typename T2> 00207 struct is_glue_times_diag< Glue<T1,T2,glue_times_diag> > 00208 { static const bool value = true; }; 00209 00210 00211 template<typename T> 00212 struct is_op_diagmat 00213 { static const bool value = false; }; 00214 00215 template<typename T1> 00216 struct is_op_diagmat< Op<T1,op_diagmat> > 00217 { static const bool value = true; }; 00218 00219 00220 // 00221 // 00222 00223 00224 template<typename T> 00225 struct is_GenCube 00226 { static const bool value = false; }; 00227 00228 template<typename eT, typename gen_type> 00229 struct is_GenCube< GenCube<eT,gen_type> > 00230 { static const bool value = true; }; 00231 00232 00233 template<typename T> 00234 struct is_OpCube 00235 { static const bool value = false; }; 00236 00237 template<typename T1, typename op_type> 00238 struct is_OpCube< OpCube<T1,op_type> > 00239 { static const bool value = true; }; 00240 00241 00242 template<typename T> 00243 struct is_eOpCube 00244 { static const bool value = false; }; 00245 00246 template<typename T1, typename eop_type> 00247 struct is_eOpCube< eOpCube<T1,eop_type> > 00248 { static const bool value = true; }; 00249 00250 00251 template<typename T> 00252 struct is_mtOpCube 00253 { static const bool value = false; }; 00254 00255 template<typename eT, typename T1, typename op_type> 00256 struct is_mtOpCube< mtOpCube<eT, T1, op_type> > 00257 { static const bool value = true; }; 00258 00259 00260 template<typename T> 00261 struct is_GlueCube 00262 { static const bool value = false; }; 00263 00264 template<typename T1, typename T2, typename glue_type> 00265 struct is_GlueCube< GlueCube<T1,T2,glue_type> > 00266 { static const bool value = true; }; 00267 00268 00269 template<typename T> 00270 struct is_eGlueCube 00271 { static const bool value = false; }; 00272 00273 template<typename T1, typename T2, typename eglue_type> 00274 struct is_eGlueCube< eGlueCube<T1,T2,eglue_type> > 00275 { static const bool value = true; }; 00276 00277 00278 template<typename T> 00279 struct is_mtGlueCube 00280 { static const bool value = false; }; 00281 00282 template<typename eT, typename T1, typename T2, typename glue_type> 00283 struct is_mtGlueCube< mtGlueCube<eT, T1, T2, glue_type> > 00284 { static const bool value = true; }; 00285 00286 00287 // 00288 // 00289 // 00290 00291 00292 template<typename T> 00293 struct is_op_rel 00294 { static const bool value = false; }; 00295 00296 template<typename out_eT, typename T1> 00297 struct is_op_rel< mtOp<out_eT, T1, op_rel_lt_pre> > 00298 { static const bool value = true; }; 00299 00300 template<typename out_eT, typename T1> 00301 struct is_op_rel< mtOp<out_eT, T1, op_rel_lt_post> > 00302 { static const bool value = true; }; 00303 00304 template<typename out_eT, typename T1> 00305 struct is_op_rel< mtOp<out_eT, T1, op_rel_gt_pre> > 00306 { static const bool value = true; }; 00307 00308 template<typename out_eT, typename T1> 00309 struct is_op_rel< mtOp<out_eT, T1, op_rel_gt_post> > 00310 { static const bool value = true; }; 00311 00312 template<typename out_eT, typename T1> 00313 struct is_op_rel< mtOp<out_eT, T1, op_rel_lteq_pre> > 00314 { static const bool value = true; }; 00315 00316 template<typename out_eT, typename T1> 00317 struct is_op_rel< mtOp<out_eT, T1, op_rel_lteq_post> > 00318 { static const bool value = true; }; 00319 00320 template<typename out_eT, typename T1> 00321 struct is_op_rel< mtOp<out_eT, T1, op_rel_gteq_pre> > 00322 { static const bool value = true; }; 00323 00324 template<typename out_eT, typename T1> 00325 struct is_op_rel< mtOp<out_eT, T1, op_rel_gteq_post> > 00326 { static const bool value = true; }; 00327 00328 template<typename out_eT, typename T1> 00329 struct is_op_rel< mtOp<out_eT, T1, op_rel_eq> > 00330 { static const bool value = true; }; 00331 00332 template<typename out_eT, typename T1> 00333 struct is_op_rel< mtOp<out_eT, T1, op_rel_noteq> > 00334 { static const bool value = true; }; 00335 00336 00337 00338 // 00339 // 00340 // 00341 00342 00343 00344 template<typename T1> 00345 struct is_arma_type 00346 { 00347 static const bool value 00348 = is_Mat<T1>::value 00349 || is_Gen<T1>::value 00350 || is_Op<T1>::value 00351 || is_eOp<T1>::value 00352 || is_mtOp<T1>::value 00353 || is_Glue<T1>::value 00354 || is_eGlue<T1>::value 00355 || is_mtGlue<T1>::value 00356 || is_subview<T1>::value 00357 || is_diagview<T1>::value 00358 ; 00359 }; 00360 00361 00362 00363 template<typename T1> 00364 struct is_arma_cube_type 00365 { 00366 static const bool value 00367 = is_Cube<T1>::value 00368 || is_GenCube<T1>::value 00369 || is_OpCube<T1>::value 00370 || is_eOpCube<T1>::value 00371 || is_mtOpCube<T1>::value 00372 || is_GlueCube<T1>::value 00373 || is_eGlueCube<T1>::value 00374 || is_mtGlueCube<T1>::value 00375 || is_subview_cube<T1>::value 00376 ; 00377 }; 00378 00379 00380 00381 // 00382 // 00383 // 00384 00385 00386 template<typename T1, typename T2> 00387 struct is_same_type 00388 { static const bool value = false; }; 00389 00390 00391 template<typename T1> 00392 struct is_same_type<T1,T1> 00393 { static const bool value = true; }; 00394 00395 00396 00397 // 00398 // 00399 // 00400 00401 00402 template<typename T1> 00403 struct is_u8 00404 { static const bool value = false; }; 00405 00406 template<> 00407 struct is_u8<u8> 00408 { static const bool value = true; }; 00409 00410 00411 00412 template<typename T1> 00413 struct is_s8 00414 { static const bool value = false; }; 00415 00416 template<> 00417 struct is_s8<s8> 00418 { static const bool value = true; }; 00419 00420 00421 00422 template<typename T1> 00423 struct is_u16 00424 { static const bool value = false; }; 00425 00426 template<> 00427 struct is_u16<u16> 00428 { static const bool value = true; }; 00429 00430 00431 00432 template<typename T1> 00433 struct is_s16 00434 { static const bool value = false; }; 00435 00436 template<> 00437 struct is_s16<s16> 00438 { static const bool value = true; }; 00439 00440 00441 00442 template<typename T1> 00443 struct is_u32 00444 { static const bool value = false; }; 00445 00446 template<> 00447 struct is_u32<u32> 00448 { static const bool value = true; }; 00449 00450 00451 00452 template<typename T1> 00453 struct is_s32 00454 { static const bool value = false; }; 00455 00456 template<> 00457 struct is_s32<s32> 00458 { static const bool value = true; }; 00459 00460 00461 00462 #if defined(ARMA_64BIT_WORD) 00463 template<typename T1> 00464 struct is_u64 00465 { static const bool value = false; }; 00466 00467 template<> 00468 struct is_u64<u64> 00469 { static const bool value = true; }; 00470 00471 00472 template<typename T1> 00473 struct is_s64 00474 { static const bool value = false; }; 00475 00476 template<> 00477 struct is_s64<s64> 00478 { static const bool value = true; }; 00479 #endif 00480 00481 00482 00483 template<typename T1> 00484 struct is_uword 00485 { static const bool value = false; }; 00486 00487 template<> 00488 struct is_uword<uword> 00489 { static const bool value = true; }; 00490 00491 00492 00493 template<typename T1> 00494 struct is_sword 00495 { static const bool value = false; }; 00496 00497 template<> 00498 struct is_sword<sword> 00499 { static const bool value = true; }; 00500 00501 00502 00503 template<typename T1> 00504 struct is_float 00505 { static const bool value = false; }; 00506 00507 template<> 00508 struct is_float<float> 00509 { static const bool value = true; }; 00510 00511 00512 00513 template<typename T1> 00514 struct is_double 00515 { static const bool value = false; }; 00516 00517 template<> 00518 struct is_double<double> 00519 { static const bool value = true; }; 00520 00521 00522 00523 template<typename T1> 00524 struct is_complex 00525 { static const bool value = false; }; 00526 00527 // template<> 00528 template<typename eT> 00529 struct is_complex< std::complex<eT> > 00530 { static const bool value = true; }; 00531 00532 00533 00534 template<typename T1> 00535 struct is_complex_float 00536 { static const bool value = false; }; 00537 00538 template<> 00539 struct is_complex_float< std::complex<float> > 00540 { static const bool value = true; }; 00541 00542 00543 00544 template<typename T1> 00545 struct is_complex_double 00546 { static const bool value = false; }; 00547 00548 template<> 00549 struct is_complex_double< std::complex<double> > 00550 { static const bool value = true; }; 00551 00552 00553 00554 00556 template<typename T1> 00557 struct is_supported_complex 00558 { static const bool value = false; }; 00559 00560 //template<> 00561 template<typename eT> 00562 struct is_supported_complex< std::complex<eT> > 00563 { static const bool value = ( sizeof(std::complex<eT>) == 2*sizeof(eT) ); }; 00564 00565 00566 00567 template<typename T1> 00568 struct is_supported_complex_float 00569 { static const bool value = false; }; 00570 00571 template<> 00572 struct is_supported_complex_float< std::complex<float> > 00573 { static const bool value = ( sizeof(std::complex<float>) == 2*sizeof(float) ); }; 00574 00575 00576 00577 template<typename T1> 00578 struct is_supported_complex_double 00579 { static const bool value = false; }; 00580 00581 template<> 00582 struct is_supported_complex_double< std::complex<double> > 00583 { static const bool value = ( sizeof(std::complex<double>) == 2*sizeof(double) ); }; 00584 00585 00586 00587 template<typename T1> 00588 struct is_supported_elem_type 00589 { 00590 static const bool value = \ 00591 is_u8<T1>::value || 00592 is_s8<T1>::value || 00593 is_u16<T1>::value || 00594 is_s16<T1>::value || 00595 is_u32<T1>::value || 00596 is_s32<T1>::value || 00597 #if defined(ARMA_64BIT_WORD) 00598 is_u64<T1>::value || 00599 is_s64<T1>::value || 00600 #endif 00601 is_float<T1>::value || 00602 is_double<T1>::value || 00603 is_supported_complex_float<T1>::value || 00604 is_supported_complex_double<T1>::value; 00605 }; 00606 00607 00608 00609 template<typename T1> 00610 struct is_supported_blas_type 00611 { 00612 static const bool value = \ 00613 is_float<T1>::value || 00614 is_double<T1>::value || 00615 is_supported_complex_float<T1>::value || 00616 is_supported_complex_double<T1>::value; 00617 }; 00618 00619 00620 00621 template<typename T> 00622 struct is_signed 00623 { 00624 static const bool value = true; 00625 }; 00626 00627 00628 template<> struct is_signed<u8> { static const bool value = false; }; 00629 template<> struct is_signed<u16> { static const bool value = false; }; 00630 template<> struct is_signed<u32> { static const bool value = false; }; 00631 #if defined(ARMA_64BIT_WORD) 00632 template<> struct is_signed<u64> { static const bool value = false; }; 00633 #endif 00634 00635 00636 template<typename T> 00637 struct is_non_integral 00638 { 00639 static const bool value = false; 00640 }; 00641 00642 00643 template<> struct is_non_integral< float > { static const bool value = true; }; 00644 template<> struct is_non_integral< double > { static const bool value = true; }; 00645 template<> struct is_non_integral< std::complex<float> > { static const bool value = true; }; 00646 template<> struct is_non_integral< std::complex<double> > { static const bool value = true; }; 00647 00648 00649 00650 00651 // 00652 00653 class arma_junk_class; 00654 00655 template<typename T1, typename T2> 00656 struct force_different_type 00657 { 00658 typedef T1 T1_result; 00659 typedef T2 T2_result; 00660 }; 00661 00662 00663 template<typename T1> 00664 struct force_different_type<T1,T1> 00665 { 00666 typedef T1 T1_result; 00667 typedef arma_junk_class T2_result; 00668 }; 00669 00670 00671