Imported Upstream version 1.63.0
[platform/upstream/boost.git] / boost / qvm / vec_index.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_7FF8E2E00E5411E2AB79F7FE6188709B\r
7 #define UUID_7FF8E2E00E5411E2AB79F7FE6188709B\r
8 \r
9 #include <boost/qvm/vec_traits.hpp>\r
10 #include <boost/qvm/inline.hpp>\r
11 #include <boost/qvm/assert.hpp>\r
12 #include <boost/qvm/enable_if.hpp>\r
13 #include <boost/qvm/error.hpp>\r
14 #include <boost/exception/info.hpp>\r
15 \r
16 namespace\r
17 boost\r
18     {\r
19     namespace\r
20     qvm\r
21         {\r
22         ////////////////////////////////////////////////\r
23 \r
24         namespace\r
25         qvm_detail\r
26             {\r
27             template <int D>\r
28             struct\r
29             vec_index_read_defined\r
30                 {\r
31                 static bool const value=false;\r
32                 };\r
33 \r
34             template <int I,int N>\r
35             struct\r
36             vector_r\r
37                 {\r
38                 template <class A>\r
39                 static\r
40                 BOOST_QVM_INLINE_CRITICAL\r
41                 typename vec_traits<A>::scalar_type\r
42                 read_element_idx( A const & a, int i )\r
43                     {\r
44                     return I==i?\r
45                         vec_traits<A>::template read_element<I>(a) :\r
46                         vector_r<I+1,N>::read_element_idx(a,i);\r
47                     }\r
48                 };\r
49 \r
50             template <int N>\r
51             struct\r
52             vector_r<N,N>\r
53                 {\r
54                 template <class A>\r
55                 static\r
56                 BOOST_QVM_INLINE_TRIVIAL\r
57                 typename vec_traits<A>::scalar_type\r
58                 read_element_idx( A const & a, int )\r
59                     {\r
60                     BOOST_QVM_ASSERT(0);\r
61                     return vec_traits<A>::template read_element<0>(a);\r
62                     }\r
63                 };\r
64             }\r
65 \r
66         template <class A>\r
67         BOOST_QVM_INLINE_TRIVIAL\r
68         typename boost::enable_if_c<\r
69             is_vec<A>::value &&\r
70             !qvm_detail::vec_index_read_defined<vec_traits<A>::dim>::value,\r
71             typename vec_traits<A>::scalar_type>::type\r
72         vec_index_read( A const & a, int i )\r
73             {\r
74             return qvm_detail::vector_r<0,vec_traits<A>::dim>::read_element_idx(a,i);\r
75             }\r
76 \r
77         ////////////////////////////////////////////////\r
78 \r
79         namespace\r
80         qvm_detail\r
81             {\r
82             template <int D>\r
83             struct\r
84             vec_index_write_defined\r
85                 {\r
86                 static bool const value=false;\r
87                 };\r
88 \r
89             template <int I,int N>\r
90             struct\r
91             vector_w\r
92                 {\r
93                 template <class A>\r
94                 static\r
95                 BOOST_QVM_INLINE_CRITICAL\r
96                 typename vec_traits<A>::scalar_type &\r
97                 write_element_idx( A & a, int i )\r
98                     {\r
99                     return I==i?\r
100                         vec_traits<A>::template write_element<I>(a) :\r
101                         vector_w<I+1,N>::write_element_idx(a,i);\r
102                     }\r
103                 };\r
104 \r
105             template <int N>\r
106             struct\r
107             vector_w<N,N>\r
108                 {\r
109                 template <class A>\r
110                 static\r
111                 BOOST_QVM_INLINE_TRIVIAL\r
112                 typename vec_traits<A>::scalar_type &\r
113                 write_element_idx( A & a, int )\r
114                     {\r
115                     BOOST_QVM_ASSERT(0);\r
116                     return vec_traits<A>::template write_element<0>(a);\r
117                     }\r
118                 };\r
119             }\r
120 \r
121         template <class A>\r
122         BOOST_QVM_INLINE_TRIVIAL\r
123         typename boost::enable_if_c<\r
124             is_vec<A>::value &&\r
125             !qvm_detail::vec_index_write_defined<vec_traits<A>::dim>::value,\r
126             typename vec_traits<A>::scalar_type &>::type\r
127         vec_index_write( A & a, int i )\r
128             {\r
129             return qvm_detail::vector_w<0,vec_traits<A>::dim>::write_element_idx(a,i);\r
130             }\r
131 \r
132         ////////////////////////////////////////////////\r
133 \r
134         namespace\r
135         sfinae\r
136             {\r
137             using ::boost::qvm::vec_index_read;\r
138             using ::boost::qvm::vec_index_write;\r
139             }\r
140 \r
141         ////////////////////////////////////////////////\r
142         }\r
143     }\r
144 \r
145 #endif\r