]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/qvm/vec_mat_operations.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / qvm / vec_mat_operations.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_A61EC088D31511DFA59D2B03E0D72085\r
7#define UUID_A61EC088D31511DFA59D2B03E0D72085\r
8\r
9#include <boost/qvm/vec_mat_operations2.hpp>\r
10#include <boost/qvm/vec_mat_operations3.hpp>\r
11#include <boost/qvm/vec_mat_operations4.hpp>\r
12\r
13namespace\r
14boost\r
15 {\r
16 namespace\r
17 qvm\r
18 {\r
19 ////////////////////////////////////////////////\r
20\r
21 namespace\r
22 qvm_detail\r
23 {\r
24 template <int M,int N>\r
25 struct\r
26 mul_mv_defined\r
27 {\r
28 static bool const value=false;\r
29 };\r
30 }\r
31\r
32 template <class A,class B>\r
33 BOOST_QVM_INLINE_OPERATIONS\r
34 typename lazy_enable_if_c<\r
35 is_mat<A>::value && is_vec<B>::value &&\r
36 mat_traits<A>::cols==vec_traits<B>::dim &&\r
37 !qvm_detail::mul_mv_defined<mat_traits<A>::rows,mat_traits<A>::cols>::value,\r
38 deduce_vec2<A,B,mat_traits<A>::rows> >::type\r
39 operator*( A const & a, B const & b )\r
40 {\r
41 typedef typename deduce_vec2<A,B,mat_traits<A>::rows>::type R;\r
42 R r;\r
43 for( int i=0; i<mat_traits<A>::rows; ++i )\r
44 {\r
45 typedef typename vec_traits<R>::scalar_type Tr;\r
46 Tr x(scalar_traits<Tr>::value(0));\r
47 for( int j=0; j<mat_traits<A>::cols; ++j )\r
48 x += mat_traits<A>::read_element_idx(i,j,a)*vec_traits<B>::read_element_idx(j,b);\r
49 vec_traits<R>::write_element_idx(i,r) = x;\r
50 }\r
51 return r;\r
52 }\r
53\r
54 namespace\r
55 qvm_detail\r
56 {\r
57 template <int M,int N>\r
58 struct\r
59 mul_vm_defined\r
60 {\r
61 static bool const value=false;\r
62 };\r
63 }\r
64\r
65 template <class A,class B>\r
66 BOOST_QVM_INLINE_OPERATIONS\r
67 typename lazy_enable_if_c<\r
68 is_vec<A>::value && is_mat<B>::value &&\r
69 vec_traits<A>::dim==mat_traits<B>::rows &&\r
70 !qvm_detail::mul_vm_defined<mat_traits<B>::rows,mat_traits<B>::cols>::value,\r
71 deduce_vec2<A,B,mat_traits<B>::cols> >::type\r
72 operator*( A const & a, B const & b )\r
73 {\r
74 typedef typename deduce_vec2<A,B,mat_traits<B>::cols>::type R;\r
75 R r;\r
76 for( int i=0; i<mat_traits<B>::cols; ++i )\r
77 {\r
78 typedef typename vec_traits<R>::scalar_type Tr;\r
79 Tr x(scalar_traits<Tr>::value(0));\r
80 for( int j=0; j<mat_traits<B>::rows; ++j )\r
81 x += vec_traits<A>::read_element_idx(j,a)*mat_traits<B>::read_element_idx(j,i,b);\r
82 vec_traits<R>::write_element_idx(i,r) = x;\r
83 }\r
84 return r;\r
85 }\r
86\r
87 ////////////////////////////////////////////////\r
88\r
89 template <class A,class B>\r
90 BOOST_QVM_INLINE_OPERATIONS\r
91 typename lazy_enable_if_c<\r
92 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 &&\r
93 vec_traits<B>::dim==3,\r
94 deduce_vec2<A,B,3> >::type\r
95 transform_point( A const & a, B const & b )\r
96 {\r
97 typedef typename mat_traits<A>::scalar_type Ta;\r
98 typedef typename vec_traits<B>::scalar_type Tb;\r
99 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);\r
100 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);\r
101 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);\r
102 Ta const a03 = mat_traits<A>::template read_element<0,3>(a);\r
103 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);\r
104 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);\r
105 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);\r
106 Ta const a13 = mat_traits<A>::template read_element<1,3>(a);\r
107 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);\r
108 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);\r
109 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);\r
110 Ta const a23 = mat_traits<A>::template read_element<2,3>(a);\r
111 Tb const b0 = vec_traits<B>::template read_element<0>(b);\r
112 Tb const b1 = vec_traits<B>::template read_element<1>(b);\r
113 Tb const b2 = vec_traits<B>::template read_element<2>(b);\r
114 typedef typename deduce_vec2<A,B,3>::type R;\r
115 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);\r
116 R r;\r
117 vec_traits<R>::template write_element<0>(r)=a00*b0+a01*b1+a02*b2+a03;\r
118 vec_traits<R>::template write_element<1>(r)=a10*b0+a11*b1+a12*b2+a13;\r
119 vec_traits<R>::template write_element<2>(r)=a20*b0+a21*b1+a22*b2+a23;\r
120 return r;\r
121 }\r
122\r
123 template <class A,class B>\r
124 BOOST_QVM_INLINE_OPERATIONS\r
125 typename lazy_enable_if_c<\r
126 mat_traits<A>::rows==4 && mat_traits<A>::cols==4 &&\r
127 vec_traits<B>::dim==3,\r
128 deduce_vec2<A,B,3> >::type\r
129 transform_vector( A const & a, B const & b )\r
130 {\r
131 typedef typename mat_traits<A>::scalar_type Ta;\r
132 typedef typename vec_traits<B>::scalar_type Tb;\r
133 Ta const a00 = mat_traits<A>::template read_element<0,0>(a);\r
134 Ta const a01 = mat_traits<A>::template read_element<0,1>(a);\r
135 Ta const a02 = mat_traits<A>::template read_element<0,2>(a);\r
136 Ta const a10 = mat_traits<A>::template read_element<1,0>(a);\r
137 Ta const a11 = mat_traits<A>::template read_element<1,1>(a);\r
138 Ta const a12 = mat_traits<A>::template read_element<1,2>(a);\r
139 Ta const a20 = mat_traits<A>::template read_element<2,0>(a);\r
140 Ta const a21 = mat_traits<A>::template read_element<2,1>(a);\r
141 Ta const a22 = mat_traits<A>::template read_element<2,2>(a);\r
142 Tb const b0 = vec_traits<B>::template read_element<0>(b);\r
143 Tb const b1 = vec_traits<B>::template read_element<1>(b);\r
144 Tb const b2 = vec_traits<B>::template read_element<2>(b);\r
145 typedef typename deduce_vec2<A,B,3>::type R;\r
146 BOOST_QVM_STATIC_ASSERT(vec_traits<R>::dim==3);\r
147 R r;\r
148 vec_traits<R>::template write_element<0>(r)=a00*b0+a01*b1+a02*b2;\r
149 vec_traits<R>::template write_element<1>(r)=a10*b0+a11*b1+a12*b2;\r
150 vec_traits<R>::template write_element<2>(r)=a20*b0+a21*b1+a22*b2;\r
151 return r;\r
152 }\r
153\r
154 ////////////////////////////////////////////////\r
155\r
156 namespace\r
157 sfinae\r
158 {\r
159 using ::boost::qvm::operator*;\r
160 using ::boost::qvm::transform_point;\r
161 using ::boost::qvm::transform_vector;\r
162 }\r
163\r
164 ////////////////////////////////////////////////\r
165 }\r
166 }\r
167\r
168#endif\r