]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/qvm/quat_access.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / qvm / quat_access.hpp
CommitLineData
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_8AC84A2217C411E0A7AF3A1BDFD72085\r
7#define UUID_8AC84A2217C411E0A7AF3A1BDFD72085\r
8\r
9#include <boost/qvm/inline.hpp>\r
10#include <boost/qvm/quat_traits.hpp>\r
11#include <boost/qvm/deduce_vec.hpp>\r
12#include <boost/qvm/static_assert.hpp>\r
13#include <boost/qvm/enable_if.hpp>\r
14\r
15namespace\r
16boost\r
17 {\r
18 namespace\r
19 qvm\r
20 {\r
21 ////////////////////////////////////////////////\r
22\r
23 namespace\r
24 qvm_detail\r
25 {\r
26 template <class Q>\r
27 struct\r
28 quat_v_\r
29 {\r
30 template <class R>\r
31 operator R() const\r
32 {\r
33 R r;\r
34 assign(r,*this);\r
35 return r;\r
36 }\r
37\r
38 private:\r
39\r
40 quat_v_( quat_v_ const & );\r
41 quat_v_ const & operator=( quat_v_ const & );\r
42 ~quat_v_();\r
43 };\r
44 }\r
45\r
46 template <class V>\r
47 struct vec_traits;\r
48\r
49 template <class Q>\r
50 struct\r
51 vec_traits< qvm_detail::quat_v_<Q> >\r
52 {\r
53 typedef qvm_detail::quat_v_<Q> this_vector;\r
54 typedef typename quat_traits<Q>::scalar_type scalar_type;\r
55 static int const dim=3;\r
56\r
57 template <int I>\r
58 BOOST_QVM_INLINE_CRITICAL\r
59 static\r
60 scalar_type\r
61 read_element( this_vector const & q )\r
62 {\r
63 BOOST_QVM_STATIC_ASSERT(I>=0);\r
64 BOOST_QVM_STATIC_ASSERT(I<dim);\r
65 return quat_traits<Q>::template read_element<I+1>( reinterpret_cast<Q const &>(q) );\r
66 }\r
67\r
68 template <int I>\r
69 BOOST_QVM_INLINE_CRITICAL\r
70 static\r
71 scalar_type &\r
72 write_element( this_vector & q )\r
73 {\r
74 BOOST_QVM_STATIC_ASSERT(I>=0);\r
75 BOOST_QVM_STATIC_ASSERT(I<dim);\r
76 return quat_traits<Q>::template write_element<I+1>( reinterpret_cast<Q &>(q) );\r
77 }\r
78 };\r
79\r
80 template <class Q,int D>\r
81 struct\r
82 deduce_vec<qvm_detail::quat_v_<Q>,D>\r
83 {\r
84 typedef vec<typename quat_traits<Q>::scalar_type,D> type;\r
85 };\r
86\r
87 template <class Q,int D>\r
88 struct\r
89 deduce_vec2<qvm_detail::quat_v_<Q>,qvm_detail::quat_v_<Q>,D>\r
90 {\r
91 typedef vec<typename quat_traits<Q>::scalar_type,D> type;\r
92 };\r
93\r
94 template <class Q>\r
95 BOOST_QVM_INLINE_TRIVIAL\r
96 typename enable_if_c<\r
97 is_quat<Q>::value,\r
98 qvm_detail::quat_v_<Q> const &>::type\r
99 V( Q const & a )\r
100 {\r
101 return reinterpret_cast<qvm_detail::quat_v_<Q> const &>(a);\r
102 }\r
103\r
104 template <class Q>\r
105 BOOST_QVM_INLINE_TRIVIAL\r
106 typename enable_if_c<\r
107 is_quat<Q>::value,\r
108 qvm_detail::quat_v_<Q> &>::type\r
109 V( Q & a )\r
110 {\r
111 return reinterpret_cast<qvm_detail::quat_v_<Q> &>(a);\r
112 }\r
113\r
114 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type>::type S( Q const & a ) { return quat_traits<Q>::template read_element<0>(a); }\r
115 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type>::type X( Q const & a ) { return quat_traits<Q>::template read_element<1>(a); }\r
116 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type>::type Y( Q const & a ) { return quat_traits<Q>::template read_element<2>(a); }\r
117 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type>::type Z( Q const & a ) { return quat_traits<Q>::template read_element<3>(a); }\r
118\r
119 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type &>::type S( Q & a ) { return quat_traits<Q>::template write_element<0>(a); }\r
120 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type &>::type X( Q & a ) { return quat_traits<Q>::template write_element<1>(a); }\r
121 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type &>::type Y( Q & a ) { return quat_traits<Q>::template write_element<2>(a); }\r
122 template <class Q> BOOST_QVM_INLINE_TRIVIAL typename enable_if_c<is_quat<Q>::value,typename quat_traits<Q>::scalar_type &>::type Z( Q & a ) { return quat_traits<Q>::template write_element<3>(a); }\r
123\r
124 ////////////////////////////////////////////////\r
125 }\r
126 }\r
127\r
128#endif\r