summaryrefslogtreecommitdiff
path: root/src/positioning
diff options
context:
space:
mode:
authorAlex Blasche <alexander.blasche@digia.com>2013-11-14 16:01:26 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-11-20 11:22:40 +0100
commit9e1a01b2050cf844027df670cedeab1423a10db8 (patch)
tree8c6aa842383a245c8d0db7589bd39e54363280f4 /src/positioning
parentb066db2208c976a66f08fbae33e37de94da9c89b (diff)
downloadqtlocation-9e1a01b2050cf844027df670cedeab1423a10db8.tar.gz
Add constexpr to Vector classes
This turns code like QDoublVector2D(1,1) into a compile-time expression when using a C++11 compiler. Since these classes are private some member functions were converted into inlines to make maximum use of constexpr. Keyword inline was added where function declaration was not exhibiting the keyword but the declaration was using it. Under certain circumstances this can prevent potential export/import issues on some compilers. Change-Id: I1b35b03942c5939fbafe2819fc875ef96eacaf02 Reviewed-by: Marc Mutz <marc.mutz@kdab.com> Reviewed-by: Alex Blasche <alexander.blasche@digia.com>
Diffstat (limited to 'src/positioning')
-rw-r--r--src/positioning/qdoublevector2d.cpp20
-rw-r--r--src/positioning/qdoublevector2d_p.h103
-rw-r--r--src/positioning/qdoublevector3d.cpp43
-rw-r--r--src/positioning/qdoublevector3d_p.h129
4 files changed, 138 insertions, 157 deletions
diff --git a/src/positioning/qdoublevector2d.cpp b/src/positioning/qdoublevector2d.cpp
index 304bfe72..b9d707e2 100644
--- a/src/positioning/qdoublevector2d.cpp
+++ b/src/positioning/qdoublevector2d.cpp
@@ -47,10 +47,9 @@
QT_BEGIN_NAMESPACE
-QDoubleVector2D::QDoubleVector2D(const QDoubleVector3D &vector)
+QDoubleVector2D::QDoubleVector2D(const QDoubleVector3D &vector) :
+ xp(vector.xp), yp(vector.yp)
{
- xp = vector.xp;
- yp = vector.yp;
}
double QDoubleVector2D::length() const
@@ -58,11 +57,6 @@ double QDoubleVector2D::length() const
return qSqrt(xp * xp + yp * yp);
}
-double QDoubleVector2D::lengthSquared() const
-{
- return xp * xp + yp * yp;
-}
-
QDoubleVector2D QDoubleVector2D::normalized() const
{
// Need some extra precision if the length is very small.
@@ -90,21 +84,11 @@ void QDoubleVector2D::normalize()
yp /= len;
}
-double QDoubleVector2D::dotProduct(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
-{
- return v1.xp * v2.xp + v1.yp * v2.yp;
-}
-
QDoubleVector3D QDoubleVector2D::toVector3D() const
{
return QDoubleVector3D(xp, yp, 0.0);
}
-QPointF QDoubleVector2D::toPointF() const
-{
- return QPointF(qreal(xp), qreal(yp));
-}
-
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QDoubleVector2D &vector)
diff --git a/src/positioning/qdoublevector2d_p.h b/src/positioning/qdoublevector2d_p.h
index 74a0fb18..760100c2 100644
--- a/src/positioning/qdoublevector2d_p.h
+++ b/src/positioning/qdoublevector2d_p.h
@@ -68,52 +68,52 @@ class QDoubleVector3D;
class Q_POSITIONING_EXPORT_PRIVATE QDoubleVector2D
{
public:
- QDoubleVector2D();
- QDoubleVector2D(double xpos, double ypos);
- explicit QDoubleVector2D(const QPointF &p);
+ Q_DECL_CONSTEXPR inline QDoubleVector2D();
+ Q_DECL_CONSTEXPR inline QDoubleVector2D(double xpos, double ypos);
+ Q_DECL_CONSTEXPR explicit inline QDoubleVector2D(const QPointF &p);
explicit QDoubleVector2D(const QDoubleVector3D &vector);
#ifdef QT_BUILD_LOCATION_LIB
- explicit QDoubleVector2D(const QVector2D &vector) : xp(vector.x()), yp(vector.y()) {}
- operator QVector2D() const { return QVector2D(xp, yp); }
+ Q_DECL_CONSTEXPR explicit inline QDoubleVector2D(const QVector2D &vector) : xp(vector.x()), yp(vector.y()) {}
+ Q_DECL_CONSTEXPR inline operator QVector2D() const { return QVector2D(xp, yp); }
#endif
- inline double manhattanLength() const;
- bool isNull() const;
+ Q_DECL_CONSTEXPR inline double manhattanLength() const;
+ inline bool isNull() const;
- double x() const;
- double y() const;
+ Q_DECL_CONSTEXPR inline double x() const;
+ Q_DECL_CONSTEXPR inline double y() const;
- void setX(double x);
- void setY(double y);
+ inline void setX(double x);
+ inline void setY(double y);
double length() const;
- double lengthSquared() const;
+ Q_DECL_CONSTEXPR inline double lengthSquared() const;
QDoubleVector2D normalized() const;
void normalize();
- QDoubleVector2D &operator+=(const QDoubleVector2D &vector);
- QDoubleVector2D &operator-=(const QDoubleVector2D &vector);
- QDoubleVector2D &operator*=(double factor);
- QDoubleVector2D &operator*=(const QDoubleVector2D &vector);
- QDoubleVector2D &operator/=(double divisor);
+ inline QDoubleVector2D &operator+=(const QDoubleVector2D &vector);
+ inline QDoubleVector2D &operator-=(const QDoubleVector2D &vector);
+ inline QDoubleVector2D &operator*=(double factor);
+ inline QDoubleVector2D &operator*=(const QDoubleVector2D &vector);
+ inline QDoubleVector2D &operator/=(double divisor);
- static double dotProduct(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
+ Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
- friend inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
- friend inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
- friend inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
- friend inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
- friend inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector);
- friend inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor);
- friend inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
- friend inline const QDoubleVector2D operator-(const QDoubleVector2D &vector);
- friend inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor);
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor);
- friend inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
+ friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2);
QDoubleVector3D toVector3D() const;
- QPointF toPointF() const;
+ Q_DECL_CONSTEXPR inline QPointF toPointF() const;
private:
double xp, yp;
@@ -123,13 +123,13 @@ private:
Q_DECLARE_TYPEINFO(QDoubleVector2D, Q_MOVABLE_TYPE);
-inline QDoubleVector2D::QDoubleVector2D() : xp(0.0), yp(0.0) {}
+Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D() : xp(0.0), yp(0.0) {}
-inline QDoubleVector2D::QDoubleVector2D(double xpos, double ypos) : xp(xpos), yp(ypos) {}
+Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(double xpos, double ypos) : xp(xpos), yp(ypos) {}
-inline QDoubleVector2D::QDoubleVector2D(const QPointF &p) : xp(p.x()), yp(p.y()) { }
+Q_DECL_CONSTEXPR inline QDoubleVector2D::QDoubleVector2D(const QPointF &p) : xp(p.x()), yp(p.y()) { }
-inline double QDoubleVector2D::manhattanLength() const
+Q_DECL_CONSTEXPR inline double QDoubleVector2D::manhattanLength() const
{
return qAbs(x())+qAbs(y());
}
@@ -139,12 +139,15 @@ inline bool QDoubleVector2D::isNull() const
return qIsNull(xp) && qIsNull(yp);
}
-inline double QDoubleVector2D::x() const { return double(xp); }
-inline double QDoubleVector2D::y() const { return double(yp); }
+Q_DECL_CONSTEXPR inline double QDoubleVector2D::x() const { return xp; }
+Q_DECL_CONSTEXPR inline double QDoubleVector2D::y() const { return yp; }
inline void QDoubleVector2D::setX(double aX) { xp = aX; }
inline void QDoubleVector2D::setY(double aY) { yp = aY; }
+Q_DECL_CONSTEXPR inline double QDoubleVector2D::lengthSquared() const
+{ return xp * xp + yp * yp; }
+
inline QDoubleVector2D &QDoubleVector2D::operator+=(const QDoubleVector2D &vector)
{
xp += vector.xp;
@@ -180,56 +183,66 @@ inline QDoubleVector2D &QDoubleVector2D::operator/=(double divisor)
return *this;
}
-inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
+Q_DECL_CONSTEXPR inline double QDoubleVector2D::dotProduct(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
+{
+ return v1.xp * v2.xp + v1.yp * v2.yp;
+}
+
+Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
{
return v1.xp == v2.xp && v1.yp == v2.yp;
}
-inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
+Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
{
return v1.xp != v2.xp || v1.yp != v2.yp;
}
-inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
+Q_DECL_CONSTEXPR inline const QDoubleVector2D operator+(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
{
return QDoubleVector2D(v1.xp + v2.xp, v1.yp + v2.yp);
}
-inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
+Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
{
return QDoubleVector2D(v1.xp - v2.xp, v1.yp - v2.yp);
}
-inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector)
+Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(double factor, const QDoubleVector2D &vector)
{
return QDoubleVector2D(vector.xp * factor, vector.yp * factor);
}
-inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor)
+Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &vector, double factor)
{
return QDoubleVector2D(vector.xp * factor, vector.yp * factor);
}
-inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
+Q_DECL_CONSTEXPR inline const QDoubleVector2D operator*(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
{
return QDoubleVector2D(v1.xp * v2.xp, v1.yp * v2.yp);
}
-inline const QDoubleVector2D operator-(const QDoubleVector2D &vector)
+Q_DECL_CONSTEXPR inline const QDoubleVector2D operator-(const QDoubleVector2D &vector)
{
return QDoubleVector2D(-vector.xp, -vector.yp);
}
-inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor)
+Q_DECL_CONSTEXPR inline const QDoubleVector2D operator/(const QDoubleVector2D &vector, double divisor)
{
return QDoubleVector2D(vector.xp / divisor, vector.yp / divisor);
}
-inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
+Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector2D &v1, const QDoubleVector2D &v2)
{
return qFuzzyCompare(v1.xp, v2.xp) && qFuzzyCompare(v1.yp, v2.yp);
}
+Q_DECL_CONSTEXPR inline QPointF QDoubleVector2D::toPointF() const
+{
+ return QPointF(qreal(xp), qreal(yp));
+}
+
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QDoubleVector2D &vector);
#endif
diff --git a/src/positioning/qdoublevector3d.cpp b/src/positioning/qdoublevector3d.cpp
index c4e2cf61..621a2ec5 100644
--- a/src/positioning/qdoublevector3d.cpp
+++ b/src/positioning/qdoublevector3d.cpp
@@ -40,27 +40,12 @@
****************************************************************************/
#include "qdoublevector3d_p.h"
-#include "qdoublevector2d_p.h"
#include <QtCore/qdatastream.h>
#include <QtCore/qmath.h>
#include <QtCore/qdebug.h>
QT_BEGIN_NAMESPACE
-QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &vector)
-{
- xp = vector.xp;
- yp = vector.yp;
- zp = 0.0;
-}
-
-QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &vector, double zpos)
-{
- xp = vector.xp;
- yp = vector.yp;
- zp = zpos;
-}
-
QDoubleVector3D QDoubleVector3D::normalized() const
{
// Need some extra precision if the length is very small.
@@ -91,18 +76,6 @@ void QDoubleVector3D::normalize()
zp /= len;
}
-double QDoubleVector3D::dotProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
-{
- return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp;
-}
-
-QDoubleVector3D QDoubleVector3D::crossProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
-{
- return QDoubleVector3D(v1.yp * v2.zp - v1.zp * v2.yp,
- v1.zp * v2.xp - v1.xp * v2.zp,
- v1.xp * v2.yp - v1.yp * v2.xp);
-}
-
QDoubleVector3D QDoubleVector3D::normal(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
{
return crossProduct(v1, v2).normalized();
@@ -115,12 +88,6 @@ QDoubleVector3D QDoubleVector3D::normal
}
double QDoubleVector3D::distanceToPlane
- (const QDoubleVector3D &plane, const QDoubleVector3D &normal) const
-{
- return dotProduct(*this - plane, normal);
-}
-
-double QDoubleVector3D::distanceToPlane
(const QDoubleVector3D &plane1, const QDoubleVector3D &plane2, const QDoubleVector3D &plane3) const
{
QDoubleVector3D n = normal(plane2 - plane1, plane3 - plane1);
@@ -136,21 +103,11 @@ double QDoubleVector3D::distanceToLine
return (*this - p).length();
}
-QDoubleVector2D QDoubleVector3D::toVector2D() const
-{
- return QDoubleVector2D(xp, yp);
-}
-
double QDoubleVector3D::length() const
{
return qSqrt(xp * xp + yp * yp + zp * zp);
}
-double QDoubleVector3D::lengthSquared() const
-{
- return xp * xp + yp * yp + zp * zp;
-}
-
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QDoubleVector3D &vector)
diff --git a/src/positioning/qdoublevector3d_p.h b/src/positioning/qdoublevector3d_p.h
index c2033d34..68e6475d 100644
--- a/src/positioning/qdoublevector3d_p.h
+++ b/src/positioning/qdoublevector3d_p.h
@@ -58,52 +58,51 @@
#endif
#include "qpositioningglobal.h"
+#include "qdoublevector2d_p.h"
#include <QtCore/qmetatype.h>
QT_BEGIN_NAMESPACE
-class QDoubleVector2D;
-
class Q_POSITIONING_EXPORT_PRIVATE QDoubleVector3D
{
public:
- QDoubleVector3D();
- QDoubleVector3D(double xpos, double ypos, double zpos);
- QDoubleVector3D(const QDoubleVector2D &vector);
- QDoubleVector3D(const QDoubleVector2D &vector, double zpos);
+ Q_DECL_CONSTEXPR inline QDoubleVector3D();
+ Q_DECL_CONSTEXPR inline QDoubleVector3D(double xpos, double ypos, double zpos);
+ Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector);
+ Q_DECL_CONSTEXPR inline QDoubleVector3D(const QDoubleVector2D &vector, double zpos);
#ifdef QT_BUILD_LOCATION_LIB
- explicit QDoubleVector3D(const QVector3D &vector) : xp(vector.x()), yp(vector.y()), zp(vector.z()) {}
- operator QVector3D() const { return QVector3D(xp, yp, zp); }
+ Q_DECL_CONSTEXPR explicit inline QDoubleVector3D(const QVector3D &vector) : xp(vector.x()), yp(vector.y()), zp(vector.z()) {}
+ Q_DECL_CONSTEXPR inline operator QVector3D() const { return QVector3D(xp, yp, zp); }
#endif
- bool isNull() const;
+ inline bool isNull() const;
- double x() const;
- double y() const;
- double z() const;
+ Q_DECL_CONSTEXPR inline double x() const;
+ Q_DECL_CONSTEXPR inline double y() const;
+ Q_DECL_CONSTEXPR inline double z() const;
- void setX(double x);
- void setY(double y);
- void setZ(double z);
+ inline void setX(double x);
+ inline void setY(double y);
+ inline void setZ(double z);
- double get(int i) const;
- void set(int i, double value);
+ inline double get(int i) const;
+ inline void set(int i, double value);
double length() const;
- double lengthSquared() const;
+ Q_DECL_CONSTEXPR inline double lengthSquared() const;
QDoubleVector3D normalized() const;
void normalize();
- QDoubleVector3D &operator+=(const QDoubleVector3D &vector);
- QDoubleVector3D &operator-=(const QDoubleVector3D &vector);
- QDoubleVector3D &operator*=(double factor);
- QDoubleVector3D &operator*=(const QDoubleVector3D &vector);
- QDoubleVector3D &operator/=(double divisor);
+ inline QDoubleVector3D &operator+=(const QDoubleVector3D &vector);
+ inline QDoubleVector3D &operator-=(const QDoubleVector3D &vector);
+ inline QDoubleVector3D &operator*=(double factor);
+ inline QDoubleVector3D &operator*=(const QDoubleVector3D &vector);
+ inline QDoubleVector3D &operator/=(double divisor);
- static double dotProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
- static QDoubleVector3D crossProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ Q_DECL_CONSTEXPR static inline double dotProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ Q_DECL_CONSTEXPR static inline QDoubleVector3D crossProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
static QDoubleVector3D normal(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
static QDoubleVector3D normal
(const QDoubleVector3D &v1, const QDoubleVector3D &v2, const QDoubleVector3D &v3);
@@ -112,19 +111,19 @@ public:
double distanceToPlane(const QDoubleVector3D &plane1, const QDoubleVector3D &plane2, const QDoubleVector3D &plane3) const;
double distanceToLine(const QDoubleVector3D &point, const QDoubleVector3D &direction) const;
- friend inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
- friend inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
- friend inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
- friend inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
- friend inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector);
- friend inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor);
- friend const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
- friend inline const QDoubleVector3D operator-(const QDoubleVector3D &vector);
- friend inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor);
+ friend Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ friend Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector);
+ friend Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor);
- friend inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
+ friend Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2);
- QDoubleVector2D toVector2D() const;
+ Q_DECL_CONSTEXPR inline QDoubleVector2D toVector2D() const;
private:
double xp, yp, zp;
@@ -134,18 +133,28 @@ private:
Q_DECLARE_TYPEINFO(QDoubleVector3D, Q_MOVABLE_TYPE);
-inline QDoubleVector3D::QDoubleVector3D() : xp(0.0), yp(0.0), zp(0.0) {}
+Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D() : xp(0.0), yp(0.0), zp(0.0) {}
+
+Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {}
-inline QDoubleVector3D::QDoubleVector3D(double xpos, double ypos, double zpos) : xp(xpos), yp(ypos), zp(zpos) {}
+Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v)
+ : xp(v.xp), yp(v.yp), zp(0.0) {}
+
+Q_DECL_CONSTEXPR inline QDoubleVector3D::QDoubleVector3D(const QDoubleVector2D &v, double zpos)
+ : xp(v.xp), yp(v.yp), zp(zpos) {}
inline bool QDoubleVector3D::isNull() const
{
return qIsNull(xp) && qIsNull(yp) && qIsNull(zp);
}
-inline double QDoubleVector3D::x() const { return xp; }
-inline double QDoubleVector3D::y() const { return yp; }
-inline double QDoubleVector3D::z() const { return zp; }
+Q_DECL_CONSTEXPR inline double QDoubleVector3D::x() const { return xp; }
+Q_DECL_CONSTEXPR inline double QDoubleVector3D::y() const { return yp; }
+Q_DECL_CONSTEXPR inline double QDoubleVector3D::z() const { return zp; }
+
+Q_DECL_CONSTEXPR inline double QDoubleVector3D::lengthSquared() const
+{ return xp * xp + yp * yp + zp * zp; }
+
inline void QDoubleVector3D::setX(double aX) { xp = aX; }
inline void QDoubleVector3D::setY(double aY) { yp = aY; }
@@ -222,58 +231,76 @@ inline QDoubleVector3D &QDoubleVector3D::operator/=(double divisor)
return *this;
}
-inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+Q_DECL_CONSTEXPR inline double QDoubleVector3D::dotProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+{
+ return v1.xp * v2.xp + v1.yp * v2.yp + v1.zp * v2.zp;
+}
+
+Q_DECL_CONSTEXPR inline QDoubleVector3D QDoubleVector3D::crossProduct(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+{
+ return QDoubleVector3D(v1.yp * v2.zp - v1.zp * v2.yp,
+ v1.zp * v2.xp - v1.xp * v2.zp,
+ v1.xp * v2.yp - v1.yp * v2.xp);
+}
+
+Q_DECL_CONSTEXPR inline bool operator==(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
{
return v1.xp == v2.xp && v1.yp == v2.yp && v1.zp == v2.zp;
}
-inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+Q_DECL_CONSTEXPR inline bool operator!=(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
{
return v1.xp != v2.xp || v1.yp != v2.yp || v1.zp != v2.zp;
}
-inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+Q_DECL_CONSTEXPR inline const QDoubleVector3D operator+(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
{
return QDoubleVector3D(v1.xp + v2.xp, v1.yp + v2.yp, v1.zp + v2.zp);
}
-inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
{
return QDoubleVector3D(v1.xp - v2.xp, v1.yp - v2.yp, v1.zp - v2.zp);
}
-inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector)
+Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(double factor, const QDoubleVector3D &vector)
{
return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor);
}
-inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor)
+Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &vector, double factor)
{
return QDoubleVector3D(vector.xp * factor, vector.yp * factor, vector.zp * factor);
}
-inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+Q_DECL_CONSTEXPR inline const QDoubleVector3D operator*(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
{
return QDoubleVector3D(v1.xp * v2.xp, v1.yp * v2.yp, v1.zp * v2.zp);
}
-inline const QDoubleVector3D operator-(const QDoubleVector3D &vector)
+Q_DECL_CONSTEXPR inline const QDoubleVector3D operator-(const QDoubleVector3D &vector)
{
return QDoubleVector3D(-vector.xp, -vector.yp, -vector.zp);
}
-inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor)
+Q_DECL_CONSTEXPR inline const QDoubleVector3D operator/(const QDoubleVector3D &vector, double divisor)
{
return QDoubleVector3D(vector.xp / divisor, vector.yp / divisor, vector.zp / divisor);
}
-inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
+Q_DECL_CONSTEXPR inline bool qFuzzyCompare(const QDoubleVector3D &v1, const QDoubleVector3D &v2)
{
return qFuzzyCompare(v1.xp, v2.xp) &&
qFuzzyCompare(v1.yp, v2.yp) &&
qFuzzyCompare(v1.zp, v2.zp);
}
+Q_DECL_CONSTEXPR inline QDoubleVector2D QDoubleVector3D::toVector2D() const
+{
+ return QDoubleVector2D(xp, yp);
+}
+
+
#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QDoubleVector3D &vector);
#endif