deduce_quat.hpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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_435FA7E8196311E0A176DE6BDFD72085
  5. #define UUID_435FA7E8196311E0A176DE6BDFD72085
  6. #include <boost/qvm/deduce_scalar.hpp>
  7. #include <boost/qvm/quat_traits.hpp>
  8. #include <boost/qvm/static_assert.hpp>
  9. namespace
  10. boost
  11. {
  12. namespace
  13. qvm
  14. {
  15. template <class T>
  16. struct quat;
  17. template <class Q>
  18. struct
  19. deduce_quat
  20. {
  21. BOOST_QVM_STATIC_ASSERT(is_quat<Q>::value);
  22. typedef Q type;
  23. };
  24. namespace
  25. qvm_detail
  26. {
  27. template <class A,class B,
  28. bool QA=is_quat<A>::value,
  29. bool QB=is_quat<B>::value>
  30. struct
  31. deduce_quat2_default
  32. {
  33. typedef quat<
  34. typename deduce_scalar<
  35. typename scalar<A>::type,
  36. typename scalar<B>::type>::type> type;
  37. };
  38. template <class Q>
  39. struct
  40. deduce_quat2_default<Q,Q,true,true>
  41. {
  42. typedef Q type;
  43. };
  44. }
  45. template <class A,class B>
  46. struct
  47. deduce_quat2
  48. {
  49. BOOST_QVM_STATIC_ASSERT(is_quat<A>::value || is_quat<B>::value);
  50. typedef typename qvm_detail::deduce_quat2_default<A,B>::type type;
  51. };
  52. }
  53. }
  54. #endif