Fix compilation with Clang on MacOS.
[qt:qtlocation.git] / src / positioning / qdoublevector2d_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 QDOUBLEVECTOR2D_P_H
43 #define QDOUBLEVECTOR2D_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 <QVector2D>
58 #endif
59
60 #include "qpositioningglobal.h"
61 #include <QtCore/qmetatype.h>
62 #include <QPointF>
63
64 QT_BEGIN_NAMESPACE
65
66 class QDoubleVector3D;
67
68 class Q_POSITIONING_EXPORT_PRIVATE QDoubleVector2D
69 {
70 public:
71     Q_DECL_CONSTEXPR inline QDoubleVector2D();
72     Q_DECL_CONSTEXPR inline QDoubleVector2D(double xpos, double ypos);
73     Q_DECL_CONSTEXPR explicit inline QDoubleVector2D(const QPointF &p);
74     explicit QDoubleVector2D(const QDoubleVector3D &vector);
75 #ifdef QT_BUILD_LOCATION_LIB
76     Q_DECL_CONSTEXPR explicit inline QDoubleVector2D(const QVector2D &vector) : xp(vector.x()), yp(vector.y()) {}
77     Q_DECL_CONSTEXPR inline operator QVector2D() const { return QVector2D(xp, yp); }
78 #endif
79
80     Q_DECL_CONSTEXPR inline double manhattanLength() const;
81     inline bool isNull() const;
82
83     Q_DECL_CONSTEXPR inline double x() const;
84     Q_DECL_CONSTEXPR inline double y() const;
85
86     inline void setX(double x);
87     inline void setY(double y);
88
89     double length() const;
90     Q_DECL_CONSTEXPR inline double lengthSquared() const;
91
92     QDoubleVector2D normalized() const;
93     void normalize();
94
95     inline QDoubleVector2D &operator+=(const QDoubleVector2D &vector);
96     inline QDoubleVector2D &operator-=(const QDoubleVector2D &vector);
97     inline QDoubleVector2D &operator*=(double factor);
98     inline QDoubleVector2D &operator*=(const QDoubleVector2D &vector);
99     inline QDoubleVector2D &operator/=(double divisor);
100
101     Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
102     { return v1.xp * v2.xp + v1.yp * v2.yp; }
103
104
105     friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
106     friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
107     friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
108     friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
109     friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector);
110     friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor);
111     friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
112     friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector);
113     friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor);
114
115     friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
116
117     QDoubleVector3D toVector3D() const;
118     Q_DECL_CONSTEXPR inline QPointF toPointF() const;
119
120 private:
121     double xp, yp;
122
123     friend class QDoubleVector3D;
124 };
125
126 Q_DECLARE_TYPEINFO(QDoubleVector2D, Q_MOVABLE_TYPE);
127
128 Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D() : xp(0.0), yp(0.0) {}
129
130 Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(double xpos, double ypos) : xp(xpos), yp(ypos) {}
131
132 Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(const QPointF &p) : xp(p.x()), yp(p.y()) { }
133
134 Q_DECL_CONSTEXPR inline double QDoubleVector2D::manhattanLength() const
135 {
136     return qAbs(x())+qAbs(y());
137 }
138
139 inline bool QDoubleVector2D::isNull() const
140 {
141     return qIsNull(xp) && qIsNull(yp);
142 }
143
144 Q_DECL_CONSTEXPR inline double QDoubleVector2D::x() const { return xp; }
145 Q_DECL_CONSTEXPR inline double QDoubleVector2D::y() const { return yp; }
146
147 inline void QDoubleVector2D::setX(double aX) { xp = aX; }
148 inline void QDoubleVector2D::setY(double aY) { yp = aY; }
149
150 Q_DECL_CONSTEXPR inline double QDoubleVector2D::lengthSquared() const
151 { return xp * xp + yp * yp; }
152
153 inline QDoubleVector2D &QDoubleVector2D::operator+=(const QDoubleVector2D &vector)
154 {
155     xp += vector.xp;
156     yp += vector.yp;
157     return *this;
158 }
159
160 inline QDoubleVector2D &QDoubleVector2D::operator-=(const QDoubleVector2D &vector)
161 {
162     xp -= vector.xp;
163     yp -= vector.yp;
164     return *this;
165 }
166
167 inline QDoubleVector2D &QDoubleVector2D::operator*=(double factor)
168 {
169     xp *= factor;
170     yp *= factor;
171     return *this;
172 }
173
174 inline QDoubleVector2D &QDoubleVector2D::operator*=(const QDoubleVector2D &vector)
175 {
176     xp *= vector.xp;
177     yp *= vector.yp;
178     return *this;
179 }
180
181 inline QDoubleVector2D &QDoubleVector2D::operator/=(double divisor)
182 {
183     xp /= divisor;
184     yp /= divisor;
185     return *this;
186 }
187
188 Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
189 {
190     return v1.xp == v2.xp && v1.yp == v2.yp;
191 }
192
193 Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
194 {
195     return v1.xp != v2.xp || v1.yp != v2.yp;
196 }
197
198 Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
199 {
200     return QDoubleVector2D(v1.xp + v2.xp, v1.yp + v2.yp);
201 }
202
203 Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
204 {
205     return QDoubleVector2D(v1.xp - v2.xp, v1.yp - v2.yp);
206 }
207
208 Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector)
209 {
210     return QDoubleVector2D(vector.xp * factor, vector.yp * factor);
211 }
212
213 Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor)
214 {
215     return QDoubleVector2D(vector.xp * factor, vector.yp * factor);
216 }
217
218 Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
219 {
220     return QDoubleVector2D(v1.xp * v2.xp, v1.yp * v2.yp);
221 }
222
223 Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector)
224 {
225     return QDoubleVector2D(-vector.xp, -vector.yp);
226 }
227
228 Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor)
229 {
230     return QDoubleVector2D(vector.xp / divisor, vector.yp / divisor);
231 }
232
233 Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
234 {
235     return qFuzzyCompare(v1.xp, v2.xp) && qFuzzyCompare(v1.yp, v2.yp);
236 }
237
238 Q_DECL_CONSTEXPR inline QPointF QDoubleVector2D::toPointF() const
239 {
240     return QPointF(qreal(xp), qreal(yp));
241 }
242
243 #ifndef QT_NO_DEBUG_STREAM
244 QDebug operator<<(QDebug dbg, const QDoubleVector2D &vector);
245 #endif
246
247 #ifndef QT_NO_DATASTREAM
248 QDataStream &operator<<(QDataStream &, const QDoubleVector2D &);
249 QDataStream &operator>>(QDataStream &, QDoubleVector2D &);
250 #endif
251
252 QT_END_NAMESPACE
253
254 #endif