Fix compilation with Clang on MacOS.
[qt:qtlocation.git] / src / positioning / qdoublevector3d_p.h
1 /****************************************************************************
2 **
3 ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtPositioning module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #ifndef QDOUBLEVECTOR3D_P_H
43 #define QDOUBLEVECTOR3D_P_H
44
45 //
46 //  W A R N I N G
47 //  -------------
48 //
49 // This file is not part of the Qt API.  It exists purely as an
50 // implementation detail.  This header file may change from version to
51 // version without notice, or even be removed.
52 //
53 // We mean it.
54 //
55
56 #ifdef QT_BUILD_LOCATION_LIB
57 #include <QVector3D>
58 #endif
59
60 #include "qpositioningglobal.h"
61 #include "qdoublevector2d_p.h"
62 #include <QtCore/qmetatype.h>
63
64 QT_BEGIN_NAMESPACE
65
66 class Q_POSITIONING_EXPORT_PRIVATE QDoubleVector3D
67 {
68 public:
69     Q_DECL_CONSTEXPR inline QDoubleVector3D();
70     Q_DECL_CONSTEXPR inline QDoubleVector3D(double xpos, double ypos, double zpos);
71     Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector);
72     Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector, double zpos);
73
74 #ifdef QT_BUILD_LOCATION_LIB
75     Q_DECL_CONSTEXPR explicit inline QDoubleVector3D(const QVector3D &vector) : xp(vector.x()), yp(vector.y()), zp(vector.z()) {}
76     Q_DECL_CONSTEXPR inline operator QVector3D() const { return QVector3D(xp, yp, zp); }
77 #endif
78
79     inline bool isNull() const;
80
81     Q_DECL_CONSTEXPR inline double x() const;
82     Q_DECL_CONSTEXPR inline double y() const;
83     Q_DECL_CONSTEXPR inline double z() const;
84
85     inline void setX(double x);
86     inline void setY(double y);
87     inline void setZ(double z);
88
89     inline double get(int i) const;
90     inline void set(int i, double value);
91
92     double length() const;
93     Q_DECL_CONSTEXPR inline double lengthSquared() const;
94
95     QDoubleVector3D normalized() const;
96     void normalize();
97
98     inline QDoubleVector3D &operator+=(const QDoubleVector3D &vector);
99     inline QDoubleVector3D &operator-=(const QDoubleVector3D &vector);
100     inline QDoubleVector3D &operator*=(double factor);
101     inline QDoubleVector3D &operator*=(const QDoubleVector3D &vector);
102     inline QDoubleVector3D &operator/=(double divisor);
103
104     Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
105     { return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp; }
106
107     Q_DECL_CONSTEXPR static inline QDoubleVector3D crossProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
108     { return QDoubleVector3D(v1.yp * v2.zp - v1.zp * v2.yp,
109                     v1.zp * v2.xp - v1.xp * v2.zp,
110                     v1.xp * v2.yp - v1.yp * v2.xp); }
111
112     static QDoubleVector3D normal(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
113     static QDoubleVector3D normal
114         (const QDoubleVector3D &v1, const QDoubleVector3D &v2, const QDoubleVector3D &v3);
115
116     double distanceToPlane(const QDoubleVector3D &plane, const QDoubleVector3D &normal) const;
117     double distanceToPlane(const QDoubleVector3D &plane1, const QDoubleVector3D &plane2, const QDoubleVector3D &plane3) const;
118     double distanceToLine(const QDoubleVector3D &point, const QDoubleVector3D &direction) const;
119
120     friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
121     friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
122     friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
123     friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
124     friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector);
125     friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor);
126     friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
127     friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector);
128     friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor);
129
130     friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
131
132     Q_DECL_CONSTEXPR inline QDoubleVector2D toVector2D() const;
133
134 private:
135     double xp, yp, zp;
136
137     friend class QDoubleVector2D;
138 };
139
140 Q_DECLARE_TYPEINFO(QDoubleVector3D, Q_MOVABLE_TYPE);
141
142 Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D() : xp(0.0), yp(0.0), zp(0.0) {}
143
144 Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {}
145
146 Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v)
147     : xp(v.xp), yp(v.yp), zp(0.0) {}
148
149 Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v, double zpos)
150     : xp(v.xp), yp(v.yp), zp(zpos) {}
151
152 inline bool QDoubleVector3D::isNull() const
153 {
154     return qIsNull(xp) && qIsNull(yp) && qIsNull(zp);
155 }
156
157 Q_DECL_CONSTEXPR inline double QDoubleVector3D::x() const { return xp; }
158 Q_DECL_CONSTEXPR inline double QDoubleVector3D::y() const { return yp; }
159 Q_DECL_CONSTEXPR inline double QDoubleVector3D::z() const { return zp; }
160
161 Q_DECL_CONSTEXPR inline double QDoubleVector3D::lengthSquared() const
162 { return xp * xp + yp * yp + zp * zp; }
163
164
165 inline void QDoubleVector3D::setX(double aX) { xp = aX; }
166 inline void QDoubleVector3D::setY(double aY) { yp = aY; }
167 inline void QDoubleVector3D::setZ(double aZ) { zp = aZ; }
168
169 inline double QDoubleVector3D::get(int i) const
170 {
171     switch (i) {
172     case 0:
173         return xp;
174     case 1:
175         return yp;
176     case 2:
177         return zp;
178     default:
179         return 0.0;
180     }
181 }
182
183 inline void QDoubleVector3D::set(int i, double value)
184 {
185     switch (i) {
186     case 0:
187         xp = value;
188         break;
189     case 1:
190         yp = value;
191         break;
192     case 2:
193         zp = value;
194         break;
195     default:
196         break;
197     }
198 }
199
200 inline QDoubleVector3D &QDoubleVector3D::operator+=(const QDoubleVector3D &vector)
201 {
202     xp += vector.xp;
203     yp += vector.yp;
204     zp += vector.zp;
205     return *this;
206 }
207
208 inline QDoubleVector3D &QDoubleVector3D::operator-=(const QDoubleVector3D &vector)
209 {
210     xp -= vector.xp;
211     yp -= vector.yp;
212     zp -= vector.zp;
213     return *this;
214 }
215
216 inline QDoubleVector3D &QDoubleVector3D::operator*=(double factor)
217 {
218     xp *= factor;
219     yp *= factor;
220     zp *= factor;
221     return *this;
222 }
223
224 inline QDoubleVector3D &QDoubleVector3D::operator*=(const QDoubleVector3D &vector)
225 {
226     xp *= vector.xp;
227     yp *= vector.yp;
228     zp *= vector.zp;
229     return *this;
230 }
231
232 inline QDoubleVector3D &QDoubleVector3D::operator/=(double divisor)
233 {
234     xp /= divisor;
235     yp /= divisor;
236     zp /= divisor;
237     return *this;
238 }
239
240 Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
241 {
242     return v1.xp == v2.xp && v1.yp == v2.yp && v1.zp == v2.zp;
243 }
244
245 Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
246 {
247     return v1.xp != v2.xp || v1.yp != v2.yp || v1.zp != v2.zp;
248 }
249
250 Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
251 {
252     return QDoubleVector3D(v1.xp + v2.xp, v1.yp + v2.yp, v1.zp + v2.zp);
253 }
254
255 Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
256 {
257     return QDoubleVector3D(v1.xp - v2.xp, v1.yp - v2.yp, v1.zp - v2.zp);
258 }
259
260 Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector)
261 {
262     return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor);
263 }
264
265 Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor)
266 {
267     return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor);
268 }
269
270 Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
271 {
272     return QDoubleVector3D(v1.xp * v2.xp, v1.yp * v2.yp, v1.zp * v2.zp);
273 }
274
275 Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector)
276 {
277     return QDoubleVector3D(-vector.xp, -vector.yp, -vector.zp);
278 }
279
280 Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor)
281 {
282     return QDoubleVector3D(vector.xp / divisor, vector.yp / divisor, vector.zp / divisor);
283 }
284
285 Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
286 {
287     return qFuzzyCompare(v1.xp, v2.xp) &&
288            qFuzzyCompare(v1.yp, v2.yp) &&
289            qFuzzyCompare(v1.zp, v2.zp);
290 }
291
292 Q_DECL_CONSTEXPR inline QDoubleVector2D QDoubleVector3D::toVector2D() const
293 {
294     return QDoubleVector2D(xp, yp);
295 }
296
297
298 #ifndef QT_NO_DEBUG_STREAM
299 QDebug operator<<(QDebug dbg, const QDoubleVector3D &vector);
300 #endif
301
302 #ifndef QT_NO_DATASTREAM
303 QDataStream &operator<<(QDataStream &, const QDoubleVector3D &);
304 QDataStream &operator>>(QDataStream &, QDoubleVector3D &);
305 #endif
306
307 QT_END_NAMESPACE
308
309 #endif