]>
Commit | Line | Data |
---|---|---|
b32b8144 FG |
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 |