vec_assign.hpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #ifndef BOOST_QVM_DETAIL_VEC_ASSIGN_HPP_INCLUDED
  2. #define BOOST_QVM_DETAIL_VEC_ASSIGN_HPP_INCLUDED
  3. // Copyright 2008-2022 Emil Dotchevski and Reverge Studios, Inc.
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/qvm/gen/vec_assign2.hpp>
  7. #include <boost/qvm/gen/vec_assign3.hpp>
  8. #include <boost/qvm/gen/vec_assign4.hpp>
  9. namespace boost { namespace qvm {
  10. namespace
  11. qvm_detail
  12. {
  13. template <int D>
  14. struct
  15. assign_vv_defined
  16. {
  17. static bool const value=false;
  18. };
  19. template <int I,int N>
  20. struct
  21. copy_vector_elements
  22. {
  23. template <class A,class B>
  24. static
  25. BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
  26. typename enable_if_c<
  27. vec_write_element_ref<A>::value,
  28. void>::type
  29. f( A & a, B const & b )
  30. {
  31. vec_traits<A>::template write_element<I>(a) = vec_traits<B>::template read_element<I>(b);
  32. copy_vector_elements<I+1,N>::f(a,b);
  33. }
  34. template <class A,class B>
  35. static
  36. BOOST_QVM_CONSTEXPR BOOST_QVM_INLINE_CRITICAL
  37. typename enable_if_c<
  38. !vec_write_element_ref<A>::value,
  39. void>::type
  40. f( A & a, B const & b )
  41. {
  42. vec_traits<A>::template write_element<I>(a, vec_traits<B>::template read_element<I>(b));
  43. copy_vector_elements<I+1,N>::f(a,b);
  44. }
  45. };
  46. template <int N>
  47. struct
  48. copy_vector_elements<N,N>
  49. {
  50. template <class A,class B>
  51. static
  52. void
  53. f( A &, B const & )
  54. {
  55. }
  56. };
  57. }
  58. template <class A,class B>
  59. inline
  60. typename enable_if_c<
  61. is_vec<A>::value && is_vec<B>::value &&
  62. vec_traits<A>::dim==vec_traits<B>::dim &&
  63. !qvm_detail::assign_vv_defined<vec_traits<A>::dim>::value,
  64. A &>::type
  65. assign( A & a, B const & b )
  66. {
  67. qvm_detail::copy_vector_elements<0,vec_traits<A>::dim>::f(a,b);
  68. return a;
  69. }
  70. } }
  71. #endif