1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUVECTOR_HPP
2*35238bceSAndroid Build Coastguard Worker #define _TCUVECTOR_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Tester Core
5*35238bceSAndroid Build Coastguard Worker * ----------------------------------------
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker *
9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker *
15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker *
21*35238bceSAndroid Build Coastguard Worker *//*!
22*35238bceSAndroid Build Coastguard Worker * \file
23*35238bceSAndroid Build Coastguard Worker * \brief Generic vector template.
24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker
26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "tcuVectorType.hpp"
28*35238bceSAndroid Build Coastguard Worker #include "deInt32.h"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker #include <ostream>
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker namespace tcu
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker // Accessor proxy class for Vectors.
36*35238bceSAndroid Build Coastguard Worker template <typename T, int VecSize, int Size>
37*35238bceSAndroid Build Coastguard Worker class VecAccess
38*35238bceSAndroid Build Coastguard Worker {
39*35238bceSAndroid Build Coastguard Worker public:
40*35238bceSAndroid Build Coastguard Worker explicit VecAccess(Vector<T, VecSize> &v, int x, int y);
41*35238bceSAndroid Build Coastguard Worker explicit VecAccess(Vector<T, VecSize> &v, int x, int y, int z);
42*35238bceSAndroid Build Coastguard Worker explicit VecAccess(Vector<T, VecSize> &v, int x, int y, int z, int w);
43*35238bceSAndroid Build Coastguard Worker
44*35238bceSAndroid Build Coastguard Worker VecAccess &operator=(const Vector<T, Size> &v);
45*35238bceSAndroid Build Coastguard Worker
46*35238bceSAndroid Build Coastguard Worker operator Vector<T, Size>(void) const;
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker private:
49*35238bceSAndroid Build Coastguard Worker Vector<T, VecSize> &m_vector;
50*35238bceSAndroid Build Coastguard Worker int m_index[Size];
51*35238bceSAndroid Build Coastguard Worker };
52*35238bceSAndroid Build Coastguard Worker
53*35238bceSAndroid Build Coastguard Worker template <typename T, int VecSize, int Size>
VecAccess(Vector<T,VecSize> & v,int x,int y)54*35238bceSAndroid Build Coastguard Worker VecAccess<T, VecSize, Size>::VecAccess(Vector<T, VecSize> &v, int x, int y) : m_vector(v)
55*35238bceSAndroid Build Coastguard Worker {
56*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size == 2);
57*35238bceSAndroid Build Coastguard Worker m_index[0] = x;
58*35238bceSAndroid Build Coastguard Worker m_index[1] = y;
59*35238bceSAndroid Build Coastguard Worker }
60*35238bceSAndroid Build Coastguard Worker
61*35238bceSAndroid Build Coastguard Worker template <typename T, int VecSize, int Size>
VecAccess(Vector<T,VecSize> & v,int x,int y,int z)62*35238bceSAndroid Build Coastguard Worker VecAccess<T, VecSize, Size>::VecAccess(Vector<T, VecSize> &v, int x, int y, int z) : m_vector(v)
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size == 3);
65*35238bceSAndroid Build Coastguard Worker m_index[0] = x;
66*35238bceSAndroid Build Coastguard Worker m_index[1] = y;
67*35238bceSAndroid Build Coastguard Worker m_index[2] = z;
68*35238bceSAndroid Build Coastguard Worker }
69*35238bceSAndroid Build Coastguard Worker
70*35238bceSAndroid Build Coastguard Worker template <typename T, int VecSize, int Size>
VecAccess(Vector<T,VecSize> & v,int x,int y,int z,int w)71*35238bceSAndroid Build Coastguard Worker VecAccess<T, VecSize, Size>::VecAccess(Vector<T, VecSize> &v, int x, int y, int z, int w) : m_vector(v)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size == 4);
74*35238bceSAndroid Build Coastguard Worker m_index[0] = x;
75*35238bceSAndroid Build Coastguard Worker m_index[1] = y;
76*35238bceSAndroid Build Coastguard Worker m_index[2] = z;
77*35238bceSAndroid Build Coastguard Worker m_index[3] = w;
78*35238bceSAndroid Build Coastguard Worker }
79*35238bceSAndroid Build Coastguard Worker
80*35238bceSAndroid Build Coastguard Worker template <typename T, int VecSize, int Size>
operator =(const Vector<T,Size> & v)81*35238bceSAndroid Build Coastguard Worker VecAccess<T, VecSize, Size> &VecAccess<T, VecSize, Size>::operator=(const Vector<T, Size> &v)
82*35238bceSAndroid Build Coastguard Worker {
83*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
84*35238bceSAndroid Build Coastguard Worker m_vector.m_data[m_index[i]] = v.m_data[i];
85*35238bceSAndroid Build Coastguard Worker return *this;
86*35238bceSAndroid Build Coastguard Worker }
87*35238bceSAndroid Build Coastguard Worker
88*35238bceSAndroid Build Coastguard Worker // Vector class.
89*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
90*35238bceSAndroid Build Coastguard Worker class Vector
91*35238bceSAndroid Build Coastguard Worker {
92*35238bceSAndroid Build Coastguard Worker public:
93*35238bceSAndroid Build Coastguard Worker typedef T Element;
94*35238bceSAndroid Build Coastguard Worker enum
95*35238bceSAndroid Build Coastguard Worker {
96*35238bceSAndroid Build Coastguard Worker SIZE = Size,
97*35238bceSAndroid Build Coastguard Worker };
98*35238bceSAndroid Build Coastguard Worker
99*35238bceSAndroid Build Coastguard Worker T m_data[Size];
100*35238bceSAndroid Build Coastguard Worker
101*35238bceSAndroid Build Coastguard Worker // Constructors.
102*35238bceSAndroid Build Coastguard Worker explicit Vector(void);
103*35238bceSAndroid Build Coastguard Worker explicit Vector(T s_); // replicate
104*35238bceSAndroid Build Coastguard Worker Vector(T x_, T y_);
105*35238bceSAndroid Build Coastguard Worker Vector(T x_, T y_, T z_);
106*35238bceSAndroid Build Coastguard Worker Vector(T x_, T y_, T z_, T w_);
107*35238bceSAndroid Build Coastguard Worker Vector(const Vector<T, Size> &v);
108*35238bceSAndroid Build Coastguard Worker Vector(const T (&v)[Size]);
109*35238bceSAndroid Build Coastguard Worker
getPtr(void) const110*35238bceSAndroid Build Coastguard Worker const T *getPtr(void) const
111*35238bceSAndroid Build Coastguard Worker {
112*35238bceSAndroid Build Coastguard Worker return &m_data[0];
113*35238bceSAndroid Build Coastguard Worker }
getPtr(void)114*35238bceSAndroid Build Coastguard Worker T *getPtr(void)
115*35238bceSAndroid Build Coastguard Worker {
116*35238bceSAndroid Build Coastguard Worker return &m_data[0];
117*35238bceSAndroid Build Coastguard Worker }
118*35238bceSAndroid Build Coastguard Worker
119*35238bceSAndroid Build Coastguard Worker // Read-only access.
x(void) const120*35238bceSAndroid Build Coastguard Worker T x(void) const
121*35238bceSAndroid Build Coastguard Worker {
122*35238bceSAndroid Build Coastguard Worker return m_data[0];
123*35238bceSAndroid Build Coastguard Worker }
y(void) const124*35238bceSAndroid Build Coastguard Worker T y(void) const
125*35238bceSAndroid Build Coastguard Worker {
126*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size >= 2);
127*35238bceSAndroid Build Coastguard Worker return m_data[1];
128*35238bceSAndroid Build Coastguard Worker }
z(void) const129*35238bceSAndroid Build Coastguard Worker T z(void) const
130*35238bceSAndroid Build Coastguard Worker {
131*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size >= 3);
132*35238bceSAndroid Build Coastguard Worker return m_data[2];
133*35238bceSAndroid Build Coastguard Worker }
w(void) const134*35238bceSAndroid Build Coastguard Worker T w(void) const
135*35238bceSAndroid Build Coastguard Worker {
136*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size >= 4);
137*35238bceSAndroid Build Coastguard Worker return m_data[3];
138*35238bceSAndroid Build Coastguard Worker }
139*35238bceSAndroid Build Coastguard Worker
140*35238bceSAndroid Build Coastguard Worker // Read-write access.
x(void)141*35238bceSAndroid Build Coastguard Worker T &x(void)
142*35238bceSAndroid Build Coastguard Worker {
143*35238bceSAndroid Build Coastguard Worker return m_data[0];
144*35238bceSAndroid Build Coastguard Worker }
y(void)145*35238bceSAndroid Build Coastguard Worker T &y(void)
146*35238bceSAndroid Build Coastguard Worker {
147*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size >= 2);
148*35238bceSAndroid Build Coastguard Worker return m_data[1];
149*35238bceSAndroid Build Coastguard Worker }
z(void)150*35238bceSAndroid Build Coastguard Worker T &z(void)
151*35238bceSAndroid Build Coastguard Worker {
152*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size >= 3);
153*35238bceSAndroid Build Coastguard Worker return m_data[2];
154*35238bceSAndroid Build Coastguard Worker }
w(void)155*35238bceSAndroid Build Coastguard Worker T &w(void)
156*35238bceSAndroid Build Coastguard Worker {
157*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size >= 4);
158*35238bceSAndroid Build Coastguard Worker return m_data[3];
159*35238bceSAndroid Build Coastguard Worker }
160*35238bceSAndroid Build Coastguard Worker
161*35238bceSAndroid Build Coastguard Worker // Writable accessors.
xy(void)162*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 2> xy(void)
163*35238bceSAndroid Build Coastguard Worker {
164*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 2);
165*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 2>(*this, 0, 1);
166*35238bceSAndroid Build Coastguard Worker }
xz(void)167*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 2> xz(void)
168*35238bceSAndroid Build Coastguard Worker {
169*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 2);
170*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 2>(*this, 0, 2);
171*35238bceSAndroid Build Coastguard Worker }
xw(void)172*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 2> xw(void)
173*35238bceSAndroid Build Coastguard Worker {
174*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 2);
175*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 2>(*this, 0, 3);
176*35238bceSAndroid Build Coastguard Worker }
yz(void)177*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 2> yz(void)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 2);
180*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 2>(*this, 1, 2);
181*35238bceSAndroid Build Coastguard Worker }
yw(void)182*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 2> yw(void)
183*35238bceSAndroid Build Coastguard Worker {
184*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 2);
185*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 2>(*this, 1, 3);
186*35238bceSAndroid Build Coastguard Worker }
zw(void)187*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 2> zw(void)
188*35238bceSAndroid Build Coastguard Worker {
189*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 2);
190*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 2>(*this, 2, 3);
191*35238bceSAndroid Build Coastguard Worker }
xyz(void)192*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 3> xyz(void)
193*35238bceSAndroid Build Coastguard Worker {
194*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 3);
195*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 3>(*this, 0, 1, 2);
196*35238bceSAndroid Build Coastguard Worker }
xyw(void)197*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 3> xyw(void)
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 3);
200*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 3>(*this, 0, 1, 3);
201*35238bceSAndroid Build Coastguard Worker }
xzw(void)202*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 3> xzw(void)
203*35238bceSAndroid Build Coastguard Worker {
204*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 3);
205*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 3>(*this, 0, 2, 3);
206*35238bceSAndroid Build Coastguard Worker }
zyx(void)207*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 3> zyx(void)
208*35238bceSAndroid Build Coastguard Worker {
209*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 3);
210*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 3>(*this, 2, 1, 0);
211*35238bceSAndroid Build Coastguard Worker }
yzw(void)212*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 3> yzw(void)
213*35238bceSAndroid Build Coastguard Worker {
214*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 3);
215*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 3>(*this, 1, 2, 3);
216*35238bceSAndroid Build Coastguard Worker }
wzy(void)217*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 3> wzy(void)
218*35238bceSAndroid Build Coastguard Worker {
219*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 3);
220*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 3>(*this, 3, 2, 1);
221*35238bceSAndroid Build Coastguard Worker }
xyzw(void)222*35238bceSAndroid Build Coastguard Worker VecAccess<T, Size, 4> xyzw(void)
223*35238bceSAndroid Build Coastguard Worker {
224*35238bceSAndroid Build Coastguard Worker DE_ASSERT(Size >= 4);
225*35238bceSAndroid Build Coastguard Worker return VecAccess<T, Size, 4>(*this, 0, 1, 2, 3);
226*35238bceSAndroid Build Coastguard Worker }
227*35238bceSAndroid Build Coastguard Worker
228*35238bceSAndroid Build Coastguard Worker // Swizzles.
swizzle(int a) const229*35238bceSAndroid Build Coastguard Worker Vector<T, 1> swizzle(int a) const
230*35238bceSAndroid Build Coastguard Worker {
231*35238bceSAndroid Build Coastguard Worker DE_ASSERT(a >= 0 && a < Size);
232*35238bceSAndroid Build Coastguard Worker return Vector<T, 1>(m_data[a]);
233*35238bceSAndroid Build Coastguard Worker }
swizzle(int a,int b) const234*35238bceSAndroid Build Coastguard Worker Vector<T, 2> swizzle(int a, int b) const
235*35238bceSAndroid Build Coastguard Worker {
236*35238bceSAndroid Build Coastguard Worker DE_ASSERT(a >= 0 && a < Size);
237*35238bceSAndroid Build Coastguard Worker DE_ASSERT(b >= 0 && b < Size);
238*35238bceSAndroid Build Coastguard Worker return Vector<T, 2>(m_data[a], m_data[b]);
239*35238bceSAndroid Build Coastguard Worker }
swizzle(int a,int b,int c) const240*35238bceSAndroid Build Coastguard Worker Vector<T, 3> swizzle(int a, int b, int c) const
241*35238bceSAndroid Build Coastguard Worker {
242*35238bceSAndroid Build Coastguard Worker DE_ASSERT(a >= 0 && a < Size);
243*35238bceSAndroid Build Coastguard Worker DE_ASSERT(b >= 0 && b < Size);
244*35238bceSAndroid Build Coastguard Worker DE_ASSERT(c >= 0 && c < Size);
245*35238bceSAndroid Build Coastguard Worker return Vector<T, 3>(m_data[a], m_data[b], m_data[c]);
246*35238bceSAndroid Build Coastguard Worker }
swizzle(int a,int b,int c,int d) const247*35238bceSAndroid Build Coastguard Worker Vector<T, 4> swizzle(int a, int b, int c, int d) const
248*35238bceSAndroid Build Coastguard Worker {
249*35238bceSAndroid Build Coastguard Worker DE_ASSERT(a >= 0 && a < Size);
250*35238bceSAndroid Build Coastguard Worker DE_ASSERT(b >= 0 && b < Size);
251*35238bceSAndroid Build Coastguard Worker DE_ASSERT(c >= 0 && c < Size);
252*35238bceSAndroid Build Coastguard Worker DE_ASSERT(d >= 0 && d < Size);
253*35238bceSAndroid Build Coastguard Worker return Vector<T, 4>(m_data[a], m_data[b], m_data[c], m_data[d]);
254*35238bceSAndroid Build Coastguard Worker }
255*35238bceSAndroid Build Coastguard Worker
asFloat(void) const256*35238bceSAndroid Build Coastguard Worker Vector<float, Size> asFloat(void) const
257*35238bceSAndroid Build Coastguard Worker {
258*35238bceSAndroid Build Coastguard Worker return cast<float>();
259*35238bceSAndroid Build Coastguard Worker }
asInt(void) const260*35238bceSAndroid Build Coastguard Worker Vector<int, Size> asInt(void) const
261*35238bceSAndroid Build Coastguard Worker {
262*35238bceSAndroid Build Coastguard Worker return cast<int>();
263*35238bceSAndroid Build Coastguard Worker }
asUint(void) const264*35238bceSAndroid Build Coastguard Worker Vector<uint32_t, Size> asUint(void) const
265*35238bceSAndroid Build Coastguard Worker {
266*35238bceSAndroid Build Coastguard Worker return cast<uint32_t>();
267*35238bceSAndroid Build Coastguard Worker }
asBool(void) const268*35238bceSAndroid Build Coastguard Worker Vector<bool, Size> asBool(void) const
269*35238bceSAndroid Build Coastguard Worker {
270*35238bceSAndroid Build Coastguard Worker return cast<bool>();
271*35238bceSAndroid Build Coastguard Worker }
272*35238bceSAndroid Build Coastguard Worker
273*35238bceSAndroid Build Coastguard Worker // Operators.
274*35238bceSAndroid Build Coastguard Worker Vector<T, Size> &operator+=(const Vector<T, Size> &v);
275*35238bceSAndroid Build Coastguard Worker Vector<T, Size> &operator-=(const Vector<T, Size> &v);
276*35238bceSAndroid Build Coastguard Worker Vector<T, Size> &operator=(const Vector<T, Size> &v);
277*35238bceSAndroid Build Coastguard Worker
operator [](int ndx) const278*35238bceSAndroid Build Coastguard Worker const T &operator[](int ndx) const
279*35238bceSAndroid Build Coastguard Worker {
280*35238bceSAndroid Build Coastguard Worker DE_ASSERT(de::inBounds(ndx, 0, Size));
281*35238bceSAndroid Build Coastguard Worker return m_data[ndx];
282*35238bceSAndroid Build Coastguard Worker }
operator [](int ndx)283*35238bceSAndroid Build Coastguard Worker T &operator[](int ndx)
284*35238bceSAndroid Build Coastguard Worker {
285*35238bceSAndroid Build Coastguard Worker DE_ASSERT(de::inBounds(ndx, 0, Size));
286*35238bceSAndroid Build Coastguard Worker return m_data[ndx];
287*35238bceSAndroid Build Coastguard Worker }
288*35238bceSAndroid Build Coastguard Worker
operator ==(const Vector<T,Size> & v) const289*35238bceSAndroid Build Coastguard Worker bool operator==(const Vector<T, Size> &v) const
290*35238bceSAndroid Build Coastguard Worker {
291*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
292*35238bceSAndroid Build Coastguard Worker if (m_data[i] != v.m_data[i])
293*35238bceSAndroid Build Coastguard Worker return false;
294*35238bceSAndroid Build Coastguard Worker return true;
295*35238bceSAndroid Build Coastguard Worker }
operator !=(const Vector<T,Size> & v) const296*35238bceSAndroid Build Coastguard Worker bool operator!=(const Vector<T, Size> &v) const
297*35238bceSAndroid Build Coastguard Worker {
298*35238bceSAndroid Build Coastguard Worker return !(*this == v);
299*35238bceSAndroid Build Coastguard Worker }
300*35238bceSAndroid Build Coastguard Worker
301*35238bceSAndroid Build Coastguard Worker // Miscellaneous conversions.
302*35238bceSAndroid Build Coastguard Worker template <typename NewT>
303*35238bceSAndroid Build Coastguard Worker Vector<NewT, Size> cast(void) const;
304*35238bceSAndroid Build Coastguard Worker
305*35238bceSAndroid Build Coastguard Worker template <typename NewT>
306*35238bceSAndroid Build Coastguard Worker Vector<NewT, Size> bitCast(void) const;
307*35238bceSAndroid Build Coastguard Worker
308*35238bceSAndroid Build Coastguard Worker template <int NewSize>
309*35238bceSAndroid Build Coastguard Worker Vector<T, NewSize> toWidth(void) const;
310*35238bceSAndroid Build Coastguard Worker } DE_WARN_UNUSED_TYPE;
311*35238bceSAndroid Build Coastguard Worker
312*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
Vector(void)313*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size>::Vector(void)
314*35238bceSAndroid Build Coastguard Worker {
315*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
316*35238bceSAndroid Build Coastguard Worker m_data[i] = T();
317*35238bceSAndroid Build Coastguard Worker }
318*35238bceSAndroid Build Coastguard Worker
319*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
Vector(T s)320*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size>::Vector(T s)
321*35238bceSAndroid Build Coastguard Worker {
322*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
323*35238bceSAndroid Build Coastguard Worker m_data[i] = s;
324*35238bceSAndroid Build Coastguard Worker }
325*35238bceSAndroid Build Coastguard Worker
326*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
Vector(T x_,T y_)327*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size>::Vector(T x_, T y_)
328*35238bceSAndroid Build Coastguard Worker {
329*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size == 2);
330*35238bceSAndroid Build Coastguard Worker m_data[0] = x_;
331*35238bceSAndroid Build Coastguard Worker m_data[1] = y_;
332*35238bceSAndroid Build Coastguard Worker }
333*35238bceSAndroid Build Coastguard Worker
334*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
Vector(T x_,T y_,T z_)335*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size>::Vector(T x_, T y_, T z_)
336*35238bceSAndroid Build Coastguard Worker {
337*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size == 3);
338*35238bceSAndroid Build Coastguard Worker m_data[0] = x_;
339*35238bceSAndroid Build Coastguard Worker m_data[1] = y_;
340*35238bceSAndroid Build Coastguard Worker m_data[2] = z_;
341*35238bceSAndroid Build Coastguard Worker }
342*35238bceSAndroid Build Coastguard Worker
343*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
Vector(T x_,T y_,T z_,T w_)344*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size>::Vector(T x_, T y_, T z_, T w_)
345*35238bceSAndroid Build Coastguard Worker {
346*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(Size == 4);
347*35238bceSAndroid Build Coastguard Worker m_data[0] = x_;
348*35238bceSAndroid Build Coastguard Worker m_data[1] = y_;
349*35238bceSAndroid Build Coastguard Worker m_data[2] = z_;
350*35238bceSAndroid Build Coastguard Worker m_data[3] = w_;
351*35238bceSAndroid Build Coastguard Worker }
352*35238bceSAndroid Build Coastguard Worker
353*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
Vector(const Vector<T,Size> & v)354*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size>::Vector(const Vector<T, Size> &v)
355*35238bceSAndroid Build Coastguard Worker {
356*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
357*35238bceSAndroid Build Coastguard Worker m_data[i] = v.m_data[i];
358*35238bceSAndroid Build Coastguard Worker }
359*35238bceSAndroid Build Coastguard Worker
360*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator =(const Vector<T,Size> & v)361*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> &Vector<T, Size>::operator=(const Vector<T, Size> &v)
362*35238bceSAndroid Build Coastguard Worker {
363*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
364*35238bceSAndroid Build Coastguard Worker m_data[i] = v.m_data[i];
365*35238bceSAndroid Build Coastguard Worker return *this;
366*35238bceSAndroid Build Coastguard Worker }
367*35238bceSAndroid Build Coastguard Worker
368*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
Vector(const T (& v)[Size])369*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size>::Vector(const T (&v)[Size])
370*35238bceSAndroid Build Coastguard Worker {
371*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
372*35238bceSAndroid Build Coastguard Worker m_data[i] = v[i];
373*35238bceSAndroid Build Coastguard Worker }
374*35238bceSAndroid Build Coastguard Worker
375*35238bceSAndroid Build Coastguard Worker // VecAccess to Vector cast.
376*35238bceSAndroid Build Coastguard Worker template <typename T, int VecSize, int Size>
operator Vector<T,Size>(void) const377*35238bceSAndroid Build Coastguard Worker VecAccess<T, VecSize, Size>::operator Vector<T, Size>(void) const
378*35238bceSAndroid Build Coastguard Worker {
379*35238bceSAndroid Build Coastguard Worker Vector<T, Size> vec;
380*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
381*35238bceSAndroid Build Coastguard Worker vec.m_data[i] = m_vector.m_data[m_index[i]];
382*35238bceSAndroid Build Coastguard Worker return vec;
383*35238bceSAndroid Build Coastguard Worker }
384*35238bceSAndroid Build Coastguard Worker
385*35238bceSAndroid Build Coastguard Worker // Type cast.
386*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
387*35238bceSAndroid Build Coastguard Worker template <typename NewT>
cast(void) const388*35238bceSAndroid Build Coastguard Worker inline Vector<NewT, Size> Vector<T, Size>::cast(void) const
389*35238bceSAndroid Build Coastguard Worker {
390*35238bceSAndroid Build Coastguard Worker Vector<NewT, Size> res;
391*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
392*35238bceSAndroid Build Coastguard Worker res.m_data[i] = NewT(m_data[i]);
393*35238bceSAndroid Build Coastguard Worker return res;
394*35238bceSAndroid Build Coastguard Worker }
395*35238bceSAndroid Build Coastguard Worker
396*35238bceSAndroid Build Coastguard Worker // Bit-exact reinterpret cast.
397*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
398*35238bceSAndroid Build Coastguard Worker template <typename NewT>
bitCast(void) const399*35238bceSAndroid Build Coastguard Worker inline Vector<NewT, Size> Vector<T, Size>::bitCast(void) const
400*35238bceSAndroid Build Coastguard Worker {
401*35238bceSAndroid Build Coastguard Worker Vector<NewT, Size> res;
402*35238bceSAndroid Build Coastguard Worker DE_STATIC_ASSERT(sizeof(res.m_data) == sizeof(m_data));
403*35238bceSAndroid Build Coastguard Worker memcpy(res.m_data, m_data, sizeof(m_data));
404*35238bceSAndroid Build Coastguard Worker return res;
405*35238bceSAndroid Build Coastguard Worker }
406*35238bceSAndroid Build Coastguard Worker
407*35238bceSAndroid Build Coastguard Worker // Size cast.
408*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
409*35238bceSAndroid Build Coastguard Worker template <int NewSize>
toWidth(void) const410*35238bceSAndroid Build Coastguard Worker inline Vector<T, NewSize> Vector<T, Size>::toWidth(void) const
411*35238bceSAndroid Build Coastguard Worker {
412*35238bceSAndroid Build Coastguard Worker Vector<T, NewSize> res;
413*35238bceSAndroid Build Coastguard Worker int i;
414*35238bceSAndroid Build Coastguard Worker for (i = 0; i < deMin32(Size, NewSize); i++)
415*35238bceSAndroid Build Coastguard Worker res.m_data[i] = m_data[i];
416*35238bceSAndroid Build Coastguard Worker for (; i < NewSize; i++)
417*35238bceSAndroid Build Coastguard Worker res.m_data[i] = T(0);
418*35238bceSAndroid Build Coastguard Worker return res;
419*35238bceSAndroid Build Coastguard Worker }
420*35238bceSAndroid Build Coastguard Worker
421*35238bceSAndroid Build Coastguard Worker // Operators.
422*35238bceSAndroid Build Coastguard Worker
423*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator -(const Vector<T,Size> & a)424*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator-(const Vector<T, Size> &a)
425*35238bceSAndroid Build Coastguard Worker {
426*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
427*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
428*35238bceSAndroid Build Coastguard Worker res.m_data[i] = -a.m_data[i];
429*35238bceSAndroid Build Coastguard Worker return res;
430*35238bceSAndroid Build Coastguard Worker }
431*35238bceSAndroid Build Coastguard Worker
432*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator +(const Vector<T,Size> & a,const Vector<T,Size> & b)433*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator+(const Vector<T, Size> &a, const Vector<T, Size> &b)
434*35238bceSAndroid Build Coastguard Worker {
435*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
436*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
437*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] + b.m_data[i];
438*35238bceSAndroid Build Coastguard Worker return res;
439*35238bceSAndroid Build Coastguard Worker }
440*35238bceSAndroid Build Coastguard Worker
441*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator -(const Vector<T,Size> & a,const Vector<T,Size> & b)442*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator-(const Vector<T, Size> &a, const Vector<T, Size> &b)
443*35238bceSAndroid Build Coastguard Worker {
444*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
445*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
446*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] - b.m_data[i];
447*35238bceSAndroid Build Coastguard Worker return res;
448*35238bceSAndroid Build Coastguard Worker }
449*35238bceSAndroid Build Coastguard Worker
450*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator *(const Vector<T,Size> & a,const Vector<T,Size> & b)451*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator*(const Vector<T, Size> &a, const Vector<T, Size> &b)
452*35238bceSAndroid Build Coastguard Worker {
453*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
454*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
455*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] * b.m_data[i];
456*35238bceSAndroid Build Coastguard Worker return res;
457*35238bceSAndroid Build Coastguard Worker }
458*35238bceSAndroid Build Coastguard Worker
459*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator /(const Vector<T,Size> & a,const Vector<T,Size> & b)460*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator/(const Vector<T, Size> &a, const Vector<T, Size> &b)
461*35238bceSAndroid Build Coastguard Worker {
462*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
463*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
464*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] / b.m_data[i];
465*35238bceSAndroid Build Coastguard Worker return res;
466*35238bceSAndroid Build Coastguard Worker }
467*35238bceSAndroid Build Coastguard Worker
468*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator <<(const Vector<T,Size> & a,const Vector<T,Size> & b)469*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator<<(const Vector<T, Size> &a, const Vector<T, Size> &b)
470*35238bceSAndroid Build Coastguard Worker {
471*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
472*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
473*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] << b.m_data[i];
474*35238bceSAndroid Build Coastguard Worker return res;
475*35238bceSAndroid Build Coastguard Worker }
476*35238bceSAndroid Build Coastguard Worker
477*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator >>(const Vector<T,Size> & a,const Vector<T,Size> & b)478*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator>>(const Vector<T, Size> &a, const Vector<T, Size> &b)
479*35238bceSAndroid Build Coastguard Worker {
480*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
481*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
482*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] >> b.m_data[i];
483*35238bceSAndroid Build Coastguard Worker return res;
484*35238bceSAndroid Build Coastguard Worker }
485*35238bceSAndroid Build Coastguard Worker
486*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator *(T s,const Vector<T,Size> & a)487*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator*(T s, const Vector<T, Size> &a)
488*35238bceSAndroid Build Coastguard Worker {
489*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
490*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
491*35238bceSAndroid Build Coastguard Worker res.m_data[i] = s * a.m_data[i];
492*35238bceSAndroid Build Coastguard Worker return res;
493*35238bceSAndroid Build Coastguard Worker }
494*35238bceSAndroid Build Coastguard Worker
495*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator +(T s,const Vector<T,Size> & a)496*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator+(T s, const Vector<T, Size> &a)
497*35238bceSAndroid Build Coastguard Worker {
498*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
499*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
500*35238bceSAndroid Build Coastguard Worker res.m_data[i] = s + a.m_data[i];
501*35238bceSAndroid Build Coastguard Worker return res;
502*35238bceSAndroid Build Coastguard Worker }
503*35238bceSAndroid Build Coastguard Worker
504*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator -(T s,const Vector<T,Size> & a)505*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator-(T s, const Vector<T, Size> &a)
506*35238bceSAndroid Build Coastguard Worker {
507*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
508*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
509*35238bceSAndroid Build Coastguard Worker res.m_data[i] = s - a.m_data[i];
510*35238bceSAndroid Build Coastguard Worker return res;
511*35238bceSAndroid Build Coastguard Worker }
512*35238bceSAndroid Build Coastguard Worker
513*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator -(const Vector<T,Size> & a,T s)514*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator-(const Vector<T, Size> &a, T s)
515*35238bceSAndroid Build Coastguard Worker {
516*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
517*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
518*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] - s;
519*35238bceSAndroid Build Coastguard Worker return res;
520*35238bceSAndroid Build Coastguard Worker }
521*35238bceSAndroid Build Coastguard Worker
522*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator /(T s,const Vector<T,Size> & a)523*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator/(T s, const Vector<T, Size> &a)
524*35238bceSAndroid Build Coastguard Worker {
525*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
526*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
527*35238bceSAndroid Build Coastguard Worker res.m_data[i] = s / a.m_data[i];
528*35238bceSAndroid Build Coastguard Worker return res;
529*35238bceSAndroid Build Coastguard Worker }
530*35238bceSAndroid Build Coastguard Worker
531*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator *(const Vector<T,Size> & a,T s)532*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator*(const Vector<T, Size> &a, T s)
533*35238bceSAndroid Build Coastguard Worker {
534*35238bceSAndroid Build Coastguard Worker return s * a;
535*35238bceSAndroid Build Coastguard Worker }
536*35238bceSAndroid Build Coastguard Worker
537*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator +(const Vector<T,Size> & a,T s)538*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator+(const Vector<T, Size> &a, T s)
539*35238bceSAndroid Build Coastguard Worker {
540*35238bceSAndroid Build Coastguard Worker return s + a;
541*35238bceSAndroid Build Coastguard Worker }
542*35238bceSAndroid Build Coastguard Worker
543*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator /(const Vector<T,Size> & a,T s)544*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> operator/(const Vector<T, Size> &a, T s)
545*35238bceSAndroid Build Coastguard Worker {
546*35238bceSAndroid Build Coastguard Worker Vector<T, Size> res;
547*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
548*35238bceSAndroid Build Coastguard Worker res.m_data[i] = a.m_data[i] / s;
549*35238bceSAndroid Build Coastguard Worker return res;
550*35238bceSAndroid Build Coastguard Worker }
551*35238bceSAndroid Build Coastguard Worker
552*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator +=(const Vector<T,Size> & v)553*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> &Vector<T, Size>::operator+=(const Vector<T, Size> &v)
554*35238bceSAndroid Build Coastguard Worker {
555*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
556*35238bceSAndroid Build Coastguard Worker m_data[i] += v.m_data[i];
557*35238bceSAndroid Build Coastguard Worker return *this;
558*35238bceSAndroid Build Coastguard Worker }
559*35238bceSAndroid Build Coastguard Worker
560*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator -=(const Vector<T,Size> & v)561*35238bceSAndroid Build Coastguard Worker inline Vector<T, Size> &Vector<T, Size>::operator-=(const Vector<T, Size> &v)
562*35238bceSAndroid Build Coastguard Worker {
563*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
564*35238bceSAndroid Build Coastguard Worker m_data[i] -= v.m_data[i];
565*35238bceSAndroid Build Coastguard Worker return *this;
566*35238bceSAndroid Build Coastguard Worker }
567*35238bceSAndroid Build Coastguard Worker
568*35238bceSAndroid Build Coastguard Worker // Stream operator.
569*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
operator <<(std::ostream & stream,const tcu::Vector<T,Size> & vec)570*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &stream, const tcu::Vector<T, Size> &vec)
571*35238bceSAndroid Build Coastguard Worker {
572*35238bceSAndroid Build Coastguard Worker stream << "(";
573*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < Size; i++)
574*35238bceSAndroid Build Coastguard Worker {
575*35238bceSAndroid Build Coastguard Worker if (i != 0)
576*35238bceSAndroid Build Coastguard Worker stream << ", ";
577*35238bceSAndroid Build Coastguard Worker stream << vec.m_data[i];
578*35238bceSAndroid Build Coastguard Worker }
579*35238bceSAndroid Build Coastguard Worker stream << ")";
580*35238bceSAndroid Build Coastguard Worker return stream;
581*35238bceSAndroid Build Coastguard Worker }
582*35238bceSAndroid Build Coastguard Worker
583*35238bceSAndroid Build Coastguard Worker } // namespace tcu
584*35238bceSAndroid Build Coastguard Worker
585*35238bceSAndroid Build Coastguard Worker #endif // _TCUVECTOR_HPP
586