]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | // Copyright 2008-2022 Emil Dotchevski and Reverge Studios, Inc. |
2 | // Copyright 2018 agate-pris | |
92f5a8d4 TL |
3 | |
4 | //Distributed under the Boost Software License, Version 1.0. (See accompanying | |
5 | //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
6 | ||
1e59de90 TL |
7 | #ifdef BOOST_QVM_TEST_SINGLE_HEADER |
8 | # include BOOST_QVM_TEST_SINGLE_HEADER | |
9 | #else | |
10 | # include <boost/qvm/vec_register.hpp> | |
11 | #endif | |
12 | ||
92f5a8d4 | 13 | #include <boost/core/lightweight_test.hpp> |
92f5a8d4 TL |
14 | |
15 | struct v2 | |
16 | { | |
17 | float x; | |
18 | float y; | |
19 | }; | |
20 | ||
21 | struct v3 : v2 | |
22 | { | |
23 | float z; | |
24 | }; | |
25 | ||
26 | struct v4 : v3 | |
27 | { | |
28 | float w; | |
29 | }; | |
30 | ||
31 | struct v2r | |
32 | { | |
33 | float xr; | |
34 | float yr; | |
35 | }; | |
36 | ||
37 | struct v3r : v2r | |
38 | { | |
39 | float zr; | |
40 | }; | |
41 | ||
42 | struct v4r : v3r | |
43 | { | |
44 | float wr; | |
45 | }; | |
46 | ||
47 | struct v2rw : v2, v2r { }; | |
48 | struct v3rw : v3, v3r { }; | |
49 | struct v4rw : v4, v4r { }; | |
50 | ||
51 | BOOST_QVM_REGISTER_VEC_2(v2, float, x, y) | |
52 | BOOST_QVM_REGISTER_VEC_3(v3, float, x, y, z) | |
53 | BOOST_QVM_REGISTER_VEC_4(v4, float, x, y, z, w) | |
54 | ||
55 | BOOST_QVM_REGISTER_VEC_2_READ(v2r, float, xr, yr) | |
56 | BOOST_QVM_REGISTER_VEC_3_READ(v3r, float, xr, yr, zr) | |
57 | BOOST_QVM_REGISTER_VEC_4_READ(v4r, float, xr, yr, zr, wr) | |
58 | ||
59 | BOOST_QVM_REGISTER_VEC_2_READ_WRITE(v2rw, float, xr, yr, x, y) | |
60 | BOOST_QVM_REGISTER_VEC_3_READ_WRITE(v3rw, float, xr, yr, zr, x, y, z) | |
61 | BOOST_QVM_REGISTER_VEC_4_READ_WRITE(v4rw, float, xr, yr, zr, wr, x, y, z, w) | |
62 | ||
63 | int main() | |
64 | { | |
65 | using namespace boost::qvm; | |
66 | ||
67 | v2 v_v2; | |
68 | v3 v_v3; | |
69 | v4 v_v4; | |
70 | v2r v_v2r; | |
71 | v3r v_v3r; | |
72 | v4r v_v4r; | |
73 | v2rw v_v2rw; | |
74 | v3rw v_v3rw; | |
75 | v4rw v_v4rw; | |
76 | ||
77 | v_v2.x = 41.f; | |
78 | v_v3.x = 42.f; | |
79 | v_v4.x = 43.f; | |
80 | v_v2.y = 44.f; | |
81 | v_v3.y = 45.f; | |
82 | v_v4.y = 46.f; | |
83 | v_v3.z = 47.f; | |
84 | v_v4.z = 48.f; | |
85 | v_v4.w = 49.f; | |
86 | ||
87 | v_v2r.xr = 51.f; | |
88 | v_v3r.xr = 52.f; | |
89 | v_v4r.xr = 53.f; | |
90 | v_v2r.yr = 54.f; | |
91 | v_v3r.yr = 55.f; | |
92 | v_v4r.yr = 56.f; | |
93 | v_v3r.zr = 57.f; | |
94 | v_v4r.zr = 58.f; | |
95 | v_v4r.wr = 59.f; | |
96 | ||
97 | v_v2rw.x = 61.f; | |
98 | v_v3rw.x = 62.f; | |
99 | v_v4rw.x = 63.f; | |
100 | v_v2rw.y = 64.f; | |
101 | v_v3rw.y = 65.f; | |
102 | v_v4rw.y = 66.f; | |
103 | v_v3rw.z = 67.f; | |
104 | v_v4rw.z = 68.f; | |
105 | v_v4rw.w = 69.f; | |
106 | ||
107 | v_v2rw.xr = 71.f; | |
108 | v_v3rw.xr = 72.f; | |
109 | v_v4rw.xr = 73.f; | |
110 | v_v2rw.yr = 74.f; | |
111 | v_v3rw.yr = 75.f; | |
112 | v_v4rw.yr = 76.f; | |
113 | v_v3rw.zr = 77.f; | |
114 | v_v4rw.zr = 78.f; | |
115 | v_v4rw.wr = 79.f; | |
116 | ||
117 | BOOST_TEST(vec_traits<v2 >::read_element<0>(v_v2 ) == v_v2 .x ); | |
118 | BOOST_TEST(vec_traits<v3 >::read_element<0>(v_v3 ) == v_v3 .x ); | |
119 | BOOST_TEST(vec_traits<v4 >::read_element<0>(v_v4 ) == v_v4 .x ); | |
120 | BOOST_TEST(vec_traits<v2r >::read_element<0>(v_v2r ) == v_v2r .xr); | |
121 | BOOST_TEST(vec_traits<v3r >::read_element<0>(v_v3r ) == v_v3r .xr); | |
122 | BOOST_TEST(vec_traits<v4r >::read_element<0>(v_v4r ) == v_v4r .xr); | |
123 | BOOST_TEST(vec_traits<v2rw>::read_element<0>(v_v2rw) == v_v2rw.xr); | |
124 | BOOST_TEST(vec_traits<v3rw>::read_element<0>(v_v3rw) == v_v3rw.xr); | |
125 | BOOST_TEST(vec_traits<v4rw>::read_element<0>(v_v4rw) == v_v4rw.xr); | |
126 | BOOST_TEST(vec_traits<v2 >::read_element<1>(v_v2 ) == v_v2 .y ); | |
127 | BOOST_TEST(vec_traits<v3 >::read_element<1>(v_v3 ) == v_v3 .y ); | |
128 | BOOST_TEST(vec_traits<v4 >::read_element<1>(v_v4 ) == v_v4 .y ); | |
129 | BOOST_TEST(vec_traits<v2r >::read_element<1>(v_v2r ) == v_v2r .yr); | |
130 | BOOST_TEST(vec_traits<v3r >::read_element<1>(v_v3r ) == v_v3r .yr); | |
131 | BOOST_TEST(vec_traits<v4r >::read_element<1>(v_v4r ) == v_v4r .yr); | |
132 | BOOST_TEST(vec_traits<v2rw>::read_element<1>(v_v2rw) == v_v2rw.yr); | |
133 | BOOST_TEST(vec_traits<v3rw>::read_element<1>(v_v3rw) == v_v3rw.yr); | |
134 | BOOST_TEST(vec_traits<v4rw>::read_element<1>(v_v4rw) == v_v4rw.yr); | |
135 | BOOST_TEST(vec_traits<v3 >::read_element<2>(v_v3 ) == v_v3 .z ); | |
136 | BOOST_TEST(vec_traits<v4 >::read_element<2>(v_v4 ) == v_v4 .z ); | |
137 | BOOST_TEST(vec_traits<v3r >::read_element<2>(v_v3r ) == v_v3r .zr); | |
138 | BOOST_TEST(vec_traits<v4r >::read_element<2>(v_v4r ) == v_v4r .zr); | |
139 | BOOST_TEST(vec_traits<v3rw>::read_element<2>(v_v3rw) == v_v3rw.zr); | |
140 | BOOST_TEST(vec_traits<v4rw>::read_element<2>(v_v4rw) == v_v4rw.zr); | |
141 | BOOST_TEST(vec_traits<v4 >::read_element<3>(v_v4 ) == v_v4 .w ); | |
142 | BOOST_TEST(vec_traits<v4r >::read_element<3>(v_v4r ) == v_v4r .wr); | |
143 | BOOST_TEST(vec_traits<v4rw>::read_element<3>(v_v4rw) == v_v4rw.wr); | |
144 | ||
145 | BOOST_TEST(vec_traits<v2 >::read_element_idx(0, v_v2 ) == v_v2 .x ); | |
146 | BOOST_TEST(vec_traits<v3 >::read_element_idx(0, v_v3 ) == v_v3 .x ); | |
147 | BOOST_TEST(vec_traits<v4 >::read_element_idx(0, v_v4 ) == v_v4 .x ); | |
148 | BOOST_TEST(vec_traits<v2r >::read_element_idx(0, v_v2r ) == v_v2r .xr); | |
149 | BOOST_TEST(vec_traits<v3r >::read_element_idx(0, v_v3r ) == v_v3r .xr); | |
150 | BOOST_TEST(vec_traits<v4r >::read_element_idx(0, v_v4r ) == v_v4r .xr); | |
151 | BOOST_TEST(vec_traits<v2rw>::read_element_idx(0, v_v2rw) == v_v2rw.xr); | |
152 | BOOST_TEST(vec_traits<v3rw>::read_element_idx(0, v_v3rw) == v_v3rw.xr); | |
153 | BOOST_TEST(vec_traits<v4rw>::read_element_idx(0, v_v4rw) == v_v4rw.xr); | |
154 | BOOST_TEST(vec_traits<v2 >::read_element_idx(1, v_v2 ) == v_v2 .y ); | |
155 | BOOST_TEST(vec_traits<v3 >::read_element_idx(1, v_v3 ) == v_v3 .y ); | |
156 | BOOST_TEST(vec_traits<v4 >::read_element_idx(1, v_v4 ) == v_v4 .y ); | |
157 | BOOST_TEST(vec_traits<v2r >::read_element_idx(1, v_v2r ) == v_v2r .yr); | |
158 | BOOST_TEST(vec_traits<v3r >::read_element_idx(1, v_v3r ) == v_v3r .yr); | |
159 | BOOST_TEST(vec_traits<v4r >::read_element_idx(1, v_v4r ) == v_v4r .yr); | |
160 | BOOST_TEST(vec_traits<v2rw>::read_element_idx(1, v_v2rw) == v_v2rw.yr); | |
161 | BOOST_TEST(vec_traits<v3rw>::read_element_idx(1, v_v3rw) == v_v3rw.yr); | |
162 | BOOST_TEST(vec_traits<v4rw>::read_element_idx(1, v_v4rw) == v_v4rw.yr); | |
163 | BOOST_TEST(vec_traits<v3 >::read_element_idx(2, v_v3 ) == v_v3 .z ); | |
164 | BOOST_TEST(vec_traits<v4 >::read_element_idx(2, v_v4 ) == v_v4 .z ); | |
165 | BOOST_TEST(vec_traits<v3r >::read_element_idx(2, v_v3r ) == v_v3r .zr); | |
166 | BOOST_TEST(vec_traits<v4r >::read_element_idx(2, v_v4r ) == v_v4r .zr); | |
167 | BOOST_TEST(vec_traits<v3rw>::read_element_idx(2, v_v3rw) == v_v3rw.zr); | |
168 | BOOST_TEST(vec_traits<v4rw>::read_element_idx(2, v_v4rw) == v_v4rw.zr); | |
169 | BOOST_TEST(vec_traits<v4 >::read_element_idx(3, v_v4 ) == v_v4 .w ); | |
170 | BOOST_TEST(vec_traits<v4r >::read_element_idx(3, v_v4r ) == v_v4r .wr); | |
171 | BOOST_TEST(vec_traits<v4rw>::read_element_idx(3, v_v4rw) == v_v4rw.wr); | |
172 | ||
173 | BOOST_TEST(&vec_traits<v2 >::write_element<0>(v_v2 ) == &v_v2 .x ); | |
174 | BOOST_TEST(&vec_traits<v3 >::write_element<0>(v_v3 ) == &v_v3 .x ); | |
175 | BOOST_TEST(&vec_traits<v4 >::write_element<0>(v_v4 ) == &v_v4 .x ); | |
176 | BOOST_TEST_NOT(&vec_traits<v2rw>::write_element<0>(v_v2rw) == &v_v2rw.xr); | |
177 | BOOST_TEST_NOT(&vec_traits<v3rw>::write_element<0>(v_v3rw) == &v_v3rw.xr); | |
178 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<0>(v_v4rw) == &v_v4rw.xr); | |
179 | BOOST_TEST(&vec_traits<v2rw>::write_element<0>(v_v2rw) == &v_v2rw.x ); | |
180 | BOOST_TEST(&vec_traits<v3rw>::write_element<0>(v_v3rw) == &v_v3rw.x ); | |
181 | BOOST_TEST(&vec_traits<v4rw>::write_element<0>(v_v4rw) == &v_v4rw.x ); | |
182 | BOOST_TEST(&vec_traits<v2 >::write_element<1>(v_v2 ) == &v_v2 .y ); | |
183 | BOOST_TEST(&vec_traits<v3 >::write_element<1>(v_v3 ) == &v_v3 .y ); | |
184 | BOOST_TEST(&vec_traits<v4 >::write_element<1>(v_v4 ) == &v_v4 .y ); | |
185 | BOOST_TEST_NOT(&vec_traits<v2rw>::write_element<1>(v_v2rw) == &v_v2rw.yr); | |
186 | BOOST_TEST_NOT(&vec_traits<v3rw>::write_element<1>(v_v3rw) == &v_v3rw.yr); | |
187 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<1>(v_v4rw) == &v_v4rw.yr); | |
188 | BOOST_TEST(&vec_traits<v2rw>::write_element<1>(v_v2rw) == &v_v2rw.y ); | |
189 | BOOST_TEST(&vec_traits<v3rw>::write_element<1>(v_v3rw) == &v_v3rw.y ); | |
190 | BOOST_TEST(&vec_traits<v4rw>::write_element<1>(v_v4rw) == &v_v4rw.y ); | |
191 | BOOST_TEST(&vec_traits<v3 >::write_element<2>(v_v3 ) == &v_v3 .z ); | |
192 | BOOST_TEST(&vec_traits<v4 >::write_element<2>(v_v4 ) == &v_v4 .z ); | |
193 | BOOST_TEST_NOT(&vec_traits<v3rw>::write_element<2>(v_v3rw) == &v_v3rw.zr); | |
194 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<2>(v_v4rw) == &v_v4rw.zr); | |
195 | BOOST_TEST(&vec_traits<v3rw>::write_element<2>(v_v3rw) == &v_v3rw.z ); | |
196 | BOOST_TEST(&vec_traits<v4rw>::write_element<2>(v_v4rw) == &v_v4rw.z ); | |
197 | BOOST_TEST(&vec_traits<v4 >::write_element<3>(v_v4 ) == &v_v4 .w ); | |
198 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element<3>(v_v4rw) == &v_v4rw.wr); | |
199 | BOOST_TEST(&vec_traits<v4rw>::write_element<3>(v_v4rw) == &v_v4rw.w ); | |
200 | ||
201 | BOOST_TEST(&vec_traits<v2 >::write_element_idx(0, v_v2 ) == &v_v2 .x ); | |
202 | BOOST_TEST(&vec_traits<v3 >::write_element_idx(0, v_v3 ) == &v_v3 .x ); | |
203 | BOOST_TEST(&vec_traits<v4 >::write_element_idx(0, v_v4 ) == &v_v4 .x ); | |
204 | BOOST_TEST_NOT(&vec_traits<v2rw>::write_element_idx(0, v_v2rw) == &v_v2rw.xr); | |
205 | BOOST_TEST_NOT(&vec_traits<v3rw>::write_element_idx(0, v_v3rw) == &v_v3rw.xr); | |
206 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(0, v_v4rw) == &v_v4rw.xr); | |
207 | BOOST_TEST(&vec_traits<v2rw>::write_element_idx(0, v_v2rw) == &v_v2rw.x ); | |
208 | BOOST_TEST(&vec_traits<v3rw>::write_element_idx(0, v_v3rw) == &v_v3rw.x ); | |
209 | BOOST_TEST(&vec_traits<v4rw>::write_element_idx(0, v_v4rw) == &v_v4rw.x ); | |
210 | BOOST_TEST(&vec_traits<v2 >::write_element_idx(1, v_v2 ) == &v_v2 .y ); | |
211 | BOOST_TEST(&vec_traits<v3 >::write_element_idx(1, v_v3 ) == &v_v3 .y ); | |
212 | BOOST_TEST(&vec_traits<v4 >::write_element_idx(1, v_v4 ) == &v_v4 .y ); | |
213 | BOOST_TEST_NOT(&vec_traits<v2rw>::write_element_idx(1, v_v2rw) == &v_v2rw.yr); | |
214 | BOOST_TEST_NOT(&vec_traits<v3rw>::write_element_idx(1, v_v3rw) == &v_v3rw.yr); | |
215 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(1, v_v4rw) == &v_v4rw.yr); | |
216 | BOOST_TEST(&vec_traits<v2rw>::write_element_idx(1, v_v2rw) == &v_v2rw.y ); | |
217 | BOOST_TEST(&vec_traits<v3rw>::write_element_idx(1, v_v3rw) == &v_v3rw.y ); | |
218 | BOOST_TEST(&vec_traits<v4rw>::write_element_idx(1, v_v4rw) == &v_v4rw.y ); | |
219 | BOOST_TEST(&vec_traits<v3 >::write_element_idx(2, v_v3 ) == &v_v3 .z ); | |
220 | BOOST_TEST(&vec_traits<v4 >::write_element_idx(2, v_v4 ) == &v_v4 .z ); | |
221 | BOOST_TEST_NOT(&vec_traits<v3rw>::write_element_idx(2, v_v3rw) == &v_v3rw.zr); | |
222 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(2, v_v4rw) == &v_v4rw.zr); | |
223 | BOOST_TEST(&vec_traits<v3rw>::write_element_idx(2, v_v3rw) == &v_v3rw.z ); | |
224 | BOOST_TEST(&vec_traits<v4rw>::write_element_idx(2, v_v4rw) == &v_v4rw.z ); | |
225 | BOOST_TEST(&vec_traits<v4 >::write_element_idx(3, v_v4 ) == &v_v4 .w ); | |
226 | BOOST_TEST_NOT(&vec_traits<v4rw>::write_element_idx(3, v_v4rw) == &v_v4rw.wr); | |
227 | BOOST_TEST(&vec_traits<v4rw>::write_element_idx(3, v_v4rw) == &v_v4rw.w ); | |
228 | ||
229 | return boost::report_errors(); | |
230 | } |