deduce_mat.hpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
  2. //Distributed under the Boost Software License, Version 1.0. (See accompanying
  3. //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #ifndef UUID_C5DC682E196211E0A4C1686BDFD72085
  5. #define UUID_C5DC682E196211E0A4C1686BDFD72085
  6. #include <boost/qvm/deduce_scalar.hpp>
  7. #include <boost/qvm/mat_traits.hpp>
  8. #include <boost/qvm/static_assert.hpp>
  9. namespace
  10. boost
  11. {
  12. namespace
  13. qvm
  14. {
  15. template <class T,int Rows,int Cols>
  16. struct mat;
  17. namespace
  18. qvm_detail
  19. {
  20. template <class M,int R,int C,
  21. int MR=mat_traits<M>::rows,
  22. int MC=mat_traits<M>::cols>
  23. struct
  24. deduce_mat_default
  25. {
  26. BOOST_QVM_STATIC_ASSERT(is_mat<M>::value);
  27. typedef mat<typename mat_traits<M>::scalar_type,R,C> type;
  28. };
  29. template <class M,int R,int C>
  30. struct
  31. deduce_mat_default<M,R,C,R,C>
  32. {
  33. BOOST_QVM_STATIC_ASSERT(is_mat<M>::value);
  34. typedef M type;
  35. };
  36. }
  37. template <class Type,int Rows=mat_traits<Type>::rows,int Cols=mat_traits<Type>::cols>
  38. struct
  39. deduce_mat
  40. {
  41. BOOST_QVM_STATIC_ASSERT(is_mat<Type>::value);
  42. typedef typename qvm_detail::deduce_mat_default<Type,Rows,Cols>::type type;
  43. };
  44. namespace
  45. qvm_detail
  46. {
  47. template <class A,class B,int R,int C,
  48. bool VA=is_mat<A>::value,
  49. bool VB=is_mat<B>::value,
  50. int AR=mat_traits<A>::rows,
  51. int AC=mat_traits<A>::cols,
  52. int BR=mat_traits<B>::rows,
  53. int BC=mat_traits<B>::cols>
  54. struct
  55. deduce_m2_default
  56. {
  57. typedef mat<
  58. typename deduce_scalar<
  59. typename scalar<A>::type,
  60. typename scalar<B>::type>::type,
  61. R,C> type;
  62. };
  63. template <class M,int R,int C>
  64. struct
  65. deduce_m2_default<M,M,R,C,true,true,R,C,R,C>
  66. {
  67. typedef M type;
  68. };
  69. }
  70. template <class A,class B,int R,int C>
  71. struct
  72. deduce_mat2
  73. {
  74. BOOST_QVM_STATIC_ASSERT(is_mat<A>::value || is_mat<B>::value);
  75. typedef typename qvm_detail::deduce_m2_default<A,B,R,C>::type type;
  76. };
  77. }
  78. }
  79. #endif