mat_assign.hpp 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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_47136D2C385411E7BA27D3B681262D2E
  5. #define UUID_47136D2C385411E7BA27D3B681262D2E
  6. #include <boost/qvm/gen/mat_assign2.hpp>
  7. #include <boost/qvm/gen/mat_assign3.hpp>
  8. #include <boost/qvm/gen/mat_assign4.hpp>
  9. namespace
  10. boost
  11. {
  12. namespace
  13. qvm
  14. {
  15. namespace
  16. qvm_detail
  17. {
  18. template <int M,int N>
  19. struct
  20. assign_mm_defined
  21. {
  22. static bool const value=false;
  23. };
  24. template <int I,int N>
  25. struct
  26. copy_matrix_elements
  27. {
  28. template <class A,class B>
  29. static
  30. BOOST_QVM_INLINE_CRITICAL
  31. void
  32. f( A & a, B const & b )
  33. {
  34. mat_traits<A>::template write_element<I/mat_traits<A>::cols,I%mat_traits<A>::cols>(a) =
  35. mat_traits<B>::template read_element<I/mat_traits<B>::cols,I%mat_traits<B>::cols>(b);
  36. copy_matrix_elements<I+1,N>::f(a,b);
  37. }
  38. };
  39. template <int N>
  40. struct
  41. copy_matrix_elements<N,N>
  42. {
  43. template <class A,class B>
  44. static
  45. BOOST_QVM_INLINE_CRITICAL
  46. void
  47. f( A &, B const & )
  48. {
  49. }
  50. };
  51. }
  52. template <class A,class B>
  53. BOOST_QVM_INLINE_TRIVIAL
  54. typename boost::enable_if_c<
  55. is_mat<A>::value && is_mat<B>::value &&
  56. mat_traits<A>::rows==mat_traits<B>::rows &&
  57. mat_traits<A>::cols==mat_traits<B>::cols &&
  58. !qvm_detail::assign_mm_defined<mat_traits<A>::rows,mat_traits<A>::cols>::value,
  59. A &>::type
  60. assign( A & a, B const & b )
  61. {
  62. qvm_detail::copy_matrix_elements<0,mat_traits<A>::rows*mat_traits<A>::cols>::f(a,b);
  63. return a;
  64. }
  65. }
  66. }
  67. #endif