1 //Copyright (c) 2008-2017 Emil Dotchevski and Reverge Studios, Inc. 2 3 //Distributed under the Boost Software License, Version 1.0. (See accompanying 4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef BOOST_QVM_48D38F75E6D91D2AE5C0F72B78818744 7 #define BOOST_QVM_48D38F75E6D91D2AE5C0F72B78818744 8 9 //This file was generated by a program. Do not edit manually. 10 11 #include <boost/qvm/deduce_vec.hpp> 12 #include <boost/qvm/enable_if.hpp> 13 #include <boost/qvm/inline.hpp> 14 #include <boost/qvm/mat_traits.hpp> 15 #include <boost/qvm/vec_traits.hpp> 16 17 namespace 18 boost 19 { 20 namespace 21 qvm 22 { 23 template <class A,class B> 24 BOOST_QVM_INLINE_OPERATIONS 25 typename lazy_enable_if_c< 26 mat_traits<A>::rows==2 && mat_traits<A>::cols==2 && 27 vec_traits<B>::dim==2, 28 deduce_vec2<A,B,2> >::type operator *(A const & a,B const & b)29 operator*( A const & a, B const & b ) 30 { 31 typedef typename mat_traits<A>::scalar_type Ta; 32 typedef typename vec_traits<B>::scalar_type Tb; 33 Ta const a00 = mat_traits<A>::template read_element<0,0>(a); 34 Ta const a01 = mat_traits<A>::template read_element<0,1>(a); 35 Ta const a10 = mat_traits<A>::template read_element<1,0>(a); 36 Ta const a11 = mat_traits<A>::template read_element<1,1>(a); 37 Tb const b0 = vec_traits<B>::template read_element<0>(b); 38 Tb const b1 = vec_traits<B>::template read_element<1>(b); 39 typedef typename deduce_vec2<A,B,2>::type R; 40 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==2); 41 R r; 42 vec_traits<R>::template write_element<0>(r)=a00*b0+a01*b1; 43 vec_traits<R>::template write_element<1>(r)=a10*b0+a11*b1; 44 return r; 45 } 46 47 namespace 48 sfinae 49 { 50 using ::boost::qvm::operator*; 51 } 52 53 namespace 54 qvm_detail 55 { 56 template <int R,int C> 57 struct mul_mv_defined; 58 59 template <> 60 struct 61 mul_mv_defined<2,2> 62 { 63 static bool const value=true; 64 }; 65 } 66 67 template <class A,class B> 68 BOOST_QVM_INLINE_OPERATIONS 69 typename lazy_enable_if_c< 70 mat_traits<B>::rows==2 && mat_traits<B>::cols==2 && 71 vec_traits<A>::dim==2, 72 deduce_vec2<A,B,2> >::type operator *(A const & a,B const & b)73 operator*( A const & a, B const & b ) 74 { 75 typedef typename vec_traits<A>::scalar_type Ta; 76 typedef typename mat_traits<B>::scalar_type Tb; 77 Ta const a0 = vec_traits<A>::template read_element<0>(a); 78 Ta const a1 = vec_traits<A>::template read_element<1>(a); 79 Tb const b00 = mat_traits<B>::template read_element<0,0>(b); 80 Tb const b01 = mat_traits<B>::template read_element<0,1>(b); 81 Tb const b10 = mat_traits<B>::template read_element<1,0>(b); 82 Tb const b11 = mat_traits<B>::template read_element<1,1>(b); 83 typedef typename deduce_vec2<A,B,2>::type R; 84 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==2); 85 R r; 86 vec_traits<R>::template write_element<0>(r)=a0*b00+a1*b10; 87 vec_traits<R>::template write_element<1>(r)=a0*b01+a1*b11; 88 return r; 89 } 90 91 namespace 92 sfinae 93 { 94 using ::boost::qvm::operator*; 95 } 96 97 namespace 98 qvm_detail 99 { 100 template <int R,int C> 101 struct mul_vm_defined; 102 103 template <> 104 struct 105 mul_vm_defined<2,2> 106 { 107 static bool const value=true; 108 }; 109 } 110 111 } 112 } 113 114 #endif 115