Imported Upstream version 1.64.0
[platform/upstream/boost.git] / boost / qvm / vec_traits_defaults.hpp
1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.\r
2 \r
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying\r
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\r
5 \r
6 #ifndef UUID_DFFD61ACC72311E6955FFF1F07624D53\r
7 #define UUID_DFFD61ACC72311E6955FFF1F07624D53\r
8 \r
9 #include <boost/qvm/inline.hpp>\r
10 #include <boost/qvm/assert.hpp>\r
11 \r
12 namespace\r
13 boost\r
14     {\r
15     namespace\r
16     qvm\r
17         {\r
18         template <class>\r
19         struct vec_traits;\r
20 \r
21         namespace\r
22         qvm_detail\r
23             {\r
24             template <int I,int N>\r
25             struct\r
26             vector_w\r
27                 {\r
28                 template <class A>\r
29                 static\r
30                 BOOST_QVM_INLINE_CRITICAL\r
31                 typename vec_traits<A>::scalar_type &\r
32                 write_element_idx( int i, A & a )\r
33                     {\r
34                     return I==i?\r
35                         vec_traits<A>::template write_element<I>(a) :\r
36                         vector_w<I+1,N>::write_element_idx(i,a);\r
37                     }\r
38                 };\r
39 \r
40             template <int N>\r
41             struct\r
42             vector_w<N,N>\r
43                 {\r
44                 template <class A>\r
45                 static\r
46                 BOOST_QVM_INLINE_TRIVIAL\r
47                 typename vec_traits<A>::scalar_type &\r
48                 write_element_idx( int, A & a )\r
49                     {\r
50                     BOOST_QVM_ASSERT(0);\r
51                     return vec_traits<A>::template write_element<0>(a);\r
52                     }\r
53                 };\r
54             }\r
55 \r
56         template <class VecType,class ScalarType,int Dim>\r
57         struct\r
58         vec_traits_defaults\r
59             {\r
60             typedef VecType vec_type;\r
61             typedef ScalarType scalar_type;\r
62             static int const dim=Dim;\r
63 \r
64             template <int I>\r
65             static\r
66             BOOST_QVM_INLINE_CRITICAL\r
67             scalar_type\r
68             read_element( vec_type const & x )\r
69                 {\r
70                 return vec_traits<vec_type>::template write_element<I>(const_cast<vec_type &>(x));\r
71                 }\r
72 \r
73             static\r
74             BOOST_QVM_INLINE_CRITICAL\r
75             scalar_type\r
76             read_element_idx( int i, vec_type const & x )\r
77                 {\r
78                 return vec_traits<vec_type>::write_element_idx(i,const_cast<vec_type &>(x));\r
79                 }\r
80 \r
81             protected:\r
82 \r
83             static\r
84             BOOST_QVM_INLINE_TRIVIAL\r
85             scalar_type &\r
86             write_element_idx( int i, vec_type & m )\r
87                 {\r
88                 return qvm_detail::vector_w<0,vec_traits<vec_type>::dim>::write_element_idx(i,m);\r
89                 }\r
90             };\r
91         }\r
92     }\r
93 \r
94 #endif\r