vec_traits_defaults.hpp 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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_DFFD61ACC72311E6955FFF1F07624D53
  5. #define UUID_DFFD61ACC72311E6955FFF1F07624D53
  6. #include <boost/qvm/inline.hpp>
  7. #include <boost/qvm/assert.hpp>
  8. namespace
  9. boost
  10. {
  11. namespace
  12. qvm
  13. {
  14. template <class>
  15. struct vec_traits;
  16. namespace
  17. qvm_detail
  18. {
  19. template <int I,int N>
  20. struct
  21. vector_w
  22. {
  23. template <class A>
  24. static
  25. BOOST_QVM_INLINE_CRITICAL
  26. typename vec_traits<A>::scalar_type &
  27. write_element_idx( int i, A & a )
  28. {
  29. return I==i?
  30. vec_traits<A>::template write_element<I>(a) :
  31. vector_w<I+1,N>::write_element_idx(i,a);
  32. }
  33. };
  34. template <int N>
  35. struct
  36. vector_w<N,N>
  37. {
  38. template <class A>
  39. static
  40. BOOST_QVM_INLINE_TRIVIAL
  41. typename vec_traits<A>::scalar_type &
  42. write_element_idx( int, A & a )
  43. {
  44. BOOST_QVM_ASSERT(0);
  45. return vec_traits<A>::template write_element<0>(a);
  46. }
  47. };
  48. }
  49. template <class VecType,class ScalarType,int Dim>
  50. struct
  51. vec_traits_defaults
  52. {
  53. typedef VecType vec_type;
  54. typedef ScalarType scalar_type;
  55. static int const dim=Dim;
  56. template <int I>
  57. static
  58. BOOST_QVM_INLINE_CRITICAL
  59. scalar_type
  60. read_element( vec_type const & x )
  61. {
  62. return vec_traits<vec_type>::template write_element<I>(const_cast<vec_type &>(x));
  63. }
  64. static
  65. BOOST_QVM_INLINE_CRITICAL
  66. scalar_type
  67. read_element_idx( int i, vec_type const & x )
  68. {
  69. return vec_traits<vec_type>::write_element_idx(i,const_cast<vec_type &>(x));
  70. }
  71. protected:
  72. static
  73. BOOST_QVM_INLINE_TRIVIAL
  74. scalar_type &
  75. write_element_idx( int i, vec_type & m )
  76. {
  77. return qvm_detail::vector_w<0,vec_traits<vec_type>::dim>::write_element_idx(i,m);
  78. }
  79. };
  80. }
  81. }
  82. #endif