Developer Documentation
VectorT.hh
1 /* ========================================================================= *
2  * *
3  * OpenMesh *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openmesh.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenMesh. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40  * ========================================================================= */
41 
42 
43 /*===========================================================================*\
44  * *
45  * $Revision$ *
46  * $Date$ *
47  * *
48 \*===========================================================================*/
49 
50 
51 //=============================================================================
52 //
53 // CLASS VectorT
54 //
55 //=============================================================================
56 
57 // Don't parse this header file with doxygen since
58 // for some reason (obviously due to a bug in doxygen,
59 // bugreport: https://bugzilla.gnome.org/show_bug.cgi?id=629182)
60 // macro expansion and preprocessor defines
61 // don't work properly.
62 
63 #if ((defined(_MSC_VER) && (_MSC_VER >= 1900)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)) && !defined(OPENMESH_VECTOR_LEGACY)
64 #include "Vector11T.hh"
65 #else
66 #ifndef DOXYGEN
67 
68 #ifndef OPENMESH_VECTOR_HH
69 #define OPENMESH_VECTOR_HH
70 
71 
72 //== INCLUDES =================================================================
73 
75 #include <ostream>
76 #include <cmath>
77 #include <cassert>
78 #include <cstring>
79 
80 #if defined(__GNUC__) && defined(__SSE__)
81 #include <xmmintrin.h>
82 #endif
83 
84 //== NAMESPACES ===============================================================
85 
86 
87 namespace OpenMesh {
88 
89 
90 //== CLASS DEFINITION =========================================================
91 
92 
102 template<typename Scalar, int N> class VectorDataT {
103  public:
104  Scalar values_[N];
105 };
106 
107 
108 #if defined(__GNUC__) && defined(__SSE__)
109 
111 template<> class VectorDataT<float, 4> {
112  public:
113  union {
114  __m128 m128;
115  float values_[4];
116  };
117 };
118 
119 #endif
120 
121 
122 
123 
124 //== CLASS DEFINITION =========================================================
125 
126 
127 #define DIM N
128 #define TEMPLATE_HEADER template <typename Scalar, int N>
129 #define CLASSNAME VectorT
130 #define DERIVED VectorDataT<Scalar,N>
131 #define unroll(expr) for (int i=0; i<N; ++i) expr(i)
132 
138 #include "VectorT_inc.hh"
139 
140 #undef DIM
141 #undef TEMPLATE_HEADER
142 #undef CLASSNAME
143 #undef DERIVED
144 #undef unroll
145 
146 
147 
148 
149 //== PARTIAL TEMPLATE SPECIALIZATIONS =========================================
150 #if OM_PARTIAL_SPECIALIZATION
151 
152 
153 #define TEMPLATE_HEADER template <typename Scalar>
154 #define CLASSNAME VectorT<Scalar,DIM>
155 #define DERIVED VectorDataT<Scalar,DIM>
156 
157 
158 #define DIM 2
159 #define unroll(expr) expr(0) expr(1)
160 #define unroll_comb(expr, op) expr(0) op expr(1)
161 #define unroll_csv(expr) expr(0), expr(1)
162 #include "VectorT_inc.hh"
163 #undef DIM
164 #undef unroll
165 #undef unroll_comb
166 #undef unroll_csv
168 
169 #define DIM 3
170 #define unroll(expr) expr(0) expr(1) expr(2)
171 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2)
172 #define unroll_csv(expr) expr(0), expr(1), expr(2)
173 #include "VectorT_inc.hh"
174 #undef DIM
175 #undef unroll
176 #undef unroll_comb
177 #undef unroll_csv
179 
180 #define DIM 4
181 #define unroll(expr) expr(0) expr(1) expr(2) expr(3)
182 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3)
183 #define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3)
184 #include "VectorT_inc.hh"
185 #undef DIM
186 #undef unroll
187 #undef unroll_comb
188 #undef unroll_csv
189 
190 #define DIM 5
191 #define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4)
192 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4)
193 #define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4)
194 #include "VectorT_inc.hh"
195 #undef DIM
196 #undef unroll
197 #undef unroll_comb
198 #undef unroll_csv
199 
200 #define DIM 6
201 #define unroll(expr) expr(0) expr(1) expr(2) expr(3) expr(4) expr(5)
202 #define unroll_comb(expr, op) expr(0) op expr(1) op expr(2) op expr(3) op expr(4) op expr(5)
203 #define unroll_csv(expr) expr(0), expr(1), expr(2), expr(3), expr(4), expr(5)
204 #include "VectorT_inc.hh"
205 #undef DIM
206 #undef unroll
207 #undef unroll_comb
208 #undef unroll_csv
209 
210 
211 #undef TEMPLATE_HEADER
212 #undef CLASSNAME
213 #undef DERIVED
214 
215 
217 
218 //== FULL TEMPLATE SPECIALIZATIONS ============================================
219 #else
220 
222 template<>
223 inline VectorT<float,3>
225 {
226  return
227  VectorT<float,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
228  values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
229  values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
230 }
231 
232 
234 template<>
235 inline VectorT<double,3>
237 {
238  return
239  VectorT<double,3>(values_[1]*_rhs.values_[2]-values_[2]*_rhs.values_[1],
240  values_[2]*_rhs.values_[0]-values_[0]*_rhs.values_[2],
241  values_[0]*_rhs.values_[1]-values_[1]*_rhs.values_[0]);
242 }
243 
244 #endif
245 
246 
247 
248 //== GLOBAL FUNCTIONS =========================================================
249 
250 
253 template<typename Scalar1, typename Scalar2,int N>
254 inline VectorT<Scalar1,N> operator*(Scalar2 _s, const VectorT<Scalar1,N>& _v) {
255  return _v*_s;
256 }
257 
258 
261 template<typename Scalar, int N>
262 inline Scalar
263 dot(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
264  return (_v1 | _v2);
265 }
266 
267 
270 template<typename Scalar, int N>
271 inline VectorT<Scalar,N>
272 cross(const VectorT<Scalar,N>& _v1, const VectorT<Scalar,N>& _v2) {
273  return (_v1 % _v2);
274 }
275 
276 
277 
278 
279 //== TYPEDEFS =================================================================
280 
294 typedef VectorT<float,1> Vec1f;
296 typedef VectorT<double,1> Vec1d;
297 
311 typedef VectorT<float,2> Vec2f;
313 typedef VectorT<double,2> Vec2d;
314 
328 typedef VectorT<float,3> Vec3f;
330 typedef VectorT<double,3> Vec3d;
332 typedef VectorT<bool,3> Vec3b;
333 
347 typedef VectorT<float,4> Vec4f;
350 
364 typedef VectorT<float, 5> Vec5f;
366 typedef VectorT<double, 5> Vec5d;
367 
381 typedef VectorT<float,6> Vec6f;
383 typedef VectorT<double,6> Vec6d;
384 
385 
386 //=============================================================================
387 } // namespace OpenMesh
388 //=============================================================================
389 
390 
391 #endif // OPENMESH_VECTOR_HH defined
392 //=============================================================================
393 #endif // DOXYGEN
394 #endif // C++11
VectorT< unsigned int, 1 > Vec1ui
Definition: Vector11T.hh:733
VectorT< double, 4 > Vec4d
Definition: Vector11T.hh:790
VectorT< signed char, 5 > Vec5c
Definition: Vector11T.hh:793
VectorT< unsigned int, 4 > Vec4ui
Definition: Vector11T.hh:786
VectorT< unsigned short int, 3 > Vec3us
Definition: Vector11T.hh:763
VectorT< signed short int, 1 > Vec1s
Definition: Vector11T.hh:727
VectorT< Scalar1, N > operator*(Scalar2 _s, const VectorT< Scalar1, N > &_v)
Definition: VectorT.hh:254
VectorT< signed char, 1 > Vec1c
Definition: Vector11T.hh:723
VectorT< signed short int, 2 > Vec2s
Definition: Vector11T.hh:744
VectorT< signed char, 3 > Vec3c
Definition: Vector11T.hh:757
VectorT< signed short int, 6 > Vec6s
Definition: Vector11T.hh:814
VectorT< unsigned short int, 6 > Vec6us
Definition: Vector11T.hh:816
VectorT< unsigned short int, 4 > Vec4us
Definition: Vector11T.hh:782
VectorT< signed short int, 3 > Vec3s
Definition: Vector11T.hh:761
VectorT< double, 6 > Vec6d
Definition: Vector11T.hh:824
VectorT< float, 1 > Vec1f
Definition: Vector11T.hh:735
VectorT< double, 2 > Vec2d
Definition: Vector11T.hh:754
VectorT< unsigned short int, 1 > Vec1us
Definition: Vector11T.hh:729
VectorT< float, 4 > Vec4f
Definition: Vector11T.hh:788
VectorT< unsigned short int, 2 > Vec2us
Definition: Vector11T.hh:746
VectorT< Scalar, N > cross(const VectorT< Scalar, N > &_v1, const VectorT< Scalar, N > &_v2)
Definition: VectorT.hh:272
VectorT< float, 2 > Vec2f
Definition: Vector11T.hh:752
VectorT< signed int, 1 > Vec1i
Definition: Vector11T.hh:731
VectorT< signed int, 4 > Vec4i
Definition: Vector11T.hh:784
VectorT< unsigned int, 6 > Vec6ui
Definition: Vector11T.hh:820
VectorT< unsigned char, 4 > Vec4uc
Definition: Vector11T.hh:778
VectorT< signed char, 4 > Vec4c
Definition: Vector11T.hh:776
VectorT< signed char, 6 > Vec6c
Definition: Vector11T.hh:810
VectorT< double, 5 > Vec5d
Definition: Vector11T.hh:807
VectorT< double, 3 > Vec3d
Definition: Vector11T.hh:771
VectorT< unsigned int, 2 > Vec2ui
Definition: Vector11T.hh:750
VectorT< unsigned int, 5 > Vec5ui
Definition: Vector11T.hh:803
VectorT< signed int, 5 > Vec5i
Definition: Vector11T.hh:801
VectorT< double, 1 > Vec1d
Definition: Vector11T.hh:737
VectorT< float, 5 > Vec5f
Definition: Vector11T.hh:805
VectorT< float, 3 > Vec3f
Definition: Vector11T.hh:769
VectorT< unsigned short int, 5 > Vec5us
Definition: Vector11T.hh:799
VectorT< unsigned char, 5 > Vec5uc
Definition: Vector11T.hh:795
VectorT< unsigned char, 2 > Vec2uc
Definition: Vector11T.hh:742
VectorT< signed short int, 5 > Vec5s
Definition: Vector11T.hh:797
VectorT< signed char, 2 > Vec2c
Definition: Vector11T.hh:740
Scalar dot(const VectorT< Scalar, N > &_v1, const VectorT< Scalar, N > &_v2)
Definition: VectorT.hh:263
VectorT< unsigned int, 3 > Vec3ui
Definition: Vector11T.hh:767
VectorT< signed int, 2 > Vec2i
Definition: Vector11T.hh:748
VectorT< signed int, 6 > Vec6i
Definition: Vector11T.hh:818
VectorT< float, 6 > Vec6f
Definition: Vector11T.hh:822
VectorT< unsigned char, 6 > Vec6uc
Definition: Vector11T.hh:812
VectorT< bool, 3 > Vec3b
Definition: Vector11T.hh:773
VectorT< signed int, 3 > Vec3i
Definition: Vector11T.hh:765
VectorT< signed short int, 4 > Vec4s
Definition: Vector11T.hh:780
VectorT< unsigned char, 1 > Vec1uc
Definition: Vector11T.hh:725
VectorT< unsigned char, 3 > Vec3uc
Definition: Vector11T.hh:759
auto operator%(const VectorT< OtherScalar, DIM > &_rhs) const -> typename std::enable_if< DIM==3, VectorT< decltype((*this)[0]*_rhs[0]-(*this)[0]*_rhs[0]), DIM >>::type
Definition: Vector11T.hh:367