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