summaryrefslogtreecommitdiffstats
path: root/src/gui/math3d/qvector2d.h
diff options
context:
space:
mode:
authorGiuseppe D'Angelo <giuseppe.dangelo@kdab.com>2020-02-06 00:58:22 +0100
committerLars Knoll <lars.knoll@qt.io>2020-11-19 12:28:45 +0100
commit5a61c88e1fee77db5c99837bf2d59630777b671a (patch)
treebcf98c37a00d69c3c1f0084115bf9094f23f9998 /src/gui/math3d/qvector2d.h
parentb4c17476129e07dd3bf52c6aac8a51cf30c2dd3a (diff)
Clean up QVector2D/3D/4D
In random order: * Remove code marked for removal in Qt 6. * Inline as much as possible. This should give us a massive speed boost in some simple operations where the function call overhead as much as the cost of body of the function itself (lengthSquared, dotProduct, etc.). * Plaster constexpr and noexcept, as much as possible; follow Lakos' rule. * Unexport the classes; selectively export only the symbols still defined out of line. * Add [[nodiscard]] to any non-trivial mathematical operation (e.g. calculate the length). * To avoid circular dependencies, centralize their implementation in one file. Leave the existing headers for compatibility with existing #include statements. * Change all the signatures of the classes' members to take QVectorND, QPointF, etc. objects by value, not by const ref. Usage in other classes (e.g. QMatrix4x4) has not been adjusted. Change-Id: Iaf5a4b5289fcdf704e77656793390b8e772e94a5 Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/gui/math3d/qvector2d.h')
-rw-r--r--src/gui/math3d/qvector2d.h249
1 files changed, 4 insertions, 245 deletions
diff --git a/src/gui/math3d/qvector2d.h b/src/gui/math3d/qvector2d.h
index b24f4df949..fc42579918 100644
--- a/src/gui/math3d/qvector2d.h
+++ b/src/gui/math3d/qvector2d.h
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
+** Copyright (C) 2020 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtGui module of the Qt Toolkit.
@@ -37,250 +38,8 @@
**
****************************************************************************/
-#ifndef QVECTOR2D_H
-#define QVECTOR2D_H
-
-#include <QtGui/qtguiglobal.h>
-#include <QtCore/qpoint.h>
-#include <QtCore/qmetatype.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QVector3D;
-class QVector4D;
-class QVariant;
-
-#ifndef QT_NO_VECTOR2D
-
-class Q_GUI_EXPORT QVector2D
-{
-public:
- constexpr QVector2D();
- explicit QVector2D(Qt::Initialization) {}
- constexpr QVector2D(float xpos, float ypos);
- constexpr explicit QVector2D(const QPoint& point);
- constexpr explicit QVector2D(const QPointF& point);
-#ifndef QT_NO_VECTOR3D
- explicit QVector2D(const QVector3D& vector);
-#endif
-#ifndef QT_NO_VECTOR4D
- explicit QVector2D(const QVector4D& vector);
-#endif
-
- bool isNull() const;
-
- constexpr float x() const;
- constexpr float y() const;
-
- void setX(float x);
- void setY(float y);
-
- float &operator[](int i);
- float operator[](int i) const;
-
- float length() const;
- float lengthSquared() const; //In Qt 6 convert to inline and constexpr
-
- [[nodiscard]] QVector2D normalized() const;
- void normalize();
-
- float distanceToPoint(const QVector2D &point) const;
- float distanceToLine(const QVector2D& point, const QVector2D& direction) const;
-
- QVector2D &operator+=(const QVector2D &vector);
- QVector2D &operator-=(const QVector2D &vector);
- QVector2D &operator*=(float factor);
- QVector2D &operator*=(const QVector2D &vector);
- QVector2D &operator/=(float divisor);
- inline QVector2D &operator/=(const QVector2D &vector);
-
- static float dotProduct(const QVector2D& v1, const QVector2D& v2); //In Qt 6 convert to inline and constexpr
-
-QT_WARNING_PUSH
-QT_WARNING_DISABLE_FLOAT_COMPARE
- constexpr friend inline bool operator==(const QVector2D &v1, const QVector2D &v2) noexcept
- {
- return v1.v[0] == v2.v[0] && v1.v[1] == v2.v[1];
- }
-
- constexpr friend inline bool operator!=(const QVector2D &v1, const QVector2D &v2) noexcept
- {
- return v1.v[0] != v2.v[0] || v1.v[1] != v2.v[1];
- }
-QT_WARNING_POP
-
- constexpr friend inline const QVector2D operator+(const QVector2D &v1, const QVector2D &v2);
- constexpr friend inline const QVector2D operator-(const QVector2D &v1, const QVector2D &v2);
- constexpr friend inline const QVector2D operator*(float factor, const QVector2D &vector);
- constexpr friend inline const QVector2D operator*(const QVector2D &vector, float factor);
- constexpr friend inline const QVector2D operator*(const QVector2D &v1, const QVector2D &v2);
- constexpr friend inline const QVector2D operator-(const QVector2D &vector);
- constexpr friend inline const QVector2D operator/(const QVector2D &vector, float divisor);
- constexpr friend inline const QVector2D operator/(const QVector2D &vector, const QVector2D &divisor);
-
- constexpr friend inline bool qFuzzyCompare(const QVector2D& v1, const QVector2D& v2);
-
-#ifndef QT_NO_VECTOR3D
- QVector3D toVector3D() const;
-#endif
-#ifndef QT_NO_VECTOR4D
- QVector4D toVector4D() const;
-#endif
-
- constexpr QPoint toPoint() const;
- constexpr QPointF toPointF() const;
-
- operator QVariant() const;
-
-private:
- float v[2];
-
- friend class QVector3D;
- friend class QVector4D;
-};
-
-Q_DECLARE_TYPEINFO(QVector2D, Q_PRIMITIVE_TYPE);
-
-constexpr inline QVector2D::QVector2D() : v{0.0f, 0.0f} {}
-
-constexpr inline QVector2D::QVector2D(float xpos, float ypos) : v{xpos, ypos} {}
-
-constexpr inline QVector2D::QVector2D(const QPoint& point) : v{float(point.x()), float(point.y())} {}
-
-constexpr inline QVector2D::QVector2D(const QPointF& point) : v{float(point.x()), float(point.y())} {}
-
-inline bool QVector2D::isNull() const
-{
- return qIsNull(v[0]) && qIsNull(v[1]);
-}
-
-constexpr inline float QVector2D::x() const { return v[0]; }
-constexpr inline float QVector2D::y() const { return v[1]; }
-
-inline void QVector2D::setX(float aX) { v[0] = aX; }
-inline void QVector2D::setY(float aY) { v[1] = aY; }
-
-inline float &QVector2D::operator[](int i)
-{
- Q_ASSERT(uint(i) < 2u);
- return v[i];
-}
-
-inline float QVector2D::operator[](int i) const
-{
- Q_ASSERT(uint(i) < 2u);
- return v[i];
-}
-
-inline QVector2D &QVector2D::operator+=(const QVector2D &vector)
-{
- v[0] += vector.v[0];
- v[1] += vector.v[1];
- return *this;
-}
-
-inline QVector2D &QVector2D::operator-=(const QVector2D &vector)
-{
- v[0] -= vector.v[0];
- v[1] -= vector.v[1];
- return *this;
-}
-
-inline QVector2D &QVector2D::operator*=(float factor)
-{
- v[0] *= factor;
- v[1] *= factor;
- return *this;
-}
-
-inline QVector2D &QVector2D::operator*=(const QVector2D &vector)
-{
- v[0] *= vector.v[0];
- v[1] *= vector.v[1];
- return *this;
-}
-
-inline QVector2D &QVector2D::operator/=(float divisor)
-{
- v[0] /= divisor;
- v[1] /= divisor;
- return *this;
-}
-
-inline QVector2D &QVector2D::operator/=(const QVector2D &vector)
-{
- v[0] /= vector.v[0];
- v[1] /= vector.v[1];
- return *this;
-}
-
-constexpr inline const QVector2D operator+(const QVector2D &v1, const QVector2D &v2)
-{
- return QVector2D(v1.v[0] + v2.v[0], v1.v[1] + v2.v[1]);
-}
-
-constexpr inline const QVector2D operator-(const QVector2D &v1, const QVector2D &v2)
-{
- return QVector2D(v1.v[0] - v2.v[0], v1.v[1] - v2.v[1]);
-}
-
-constexpr inline const QVector2D operator*(float factor, const QVector2D &vector)
-{
- return QVector2D(vector.v[0] * factor, vector.v[1] * factor);
-}
-
-constexpr inline const QVector2D operator*(const QVector2D &vector, float factor)
-{
- return QVector2D(vector.v[0] * factor, vector.v[1] * factor);
-}
-
-constexpr inline const QVector2D operator*(const QVector2D &v1, const QVector2D &v2)
-{
- return QVector2D(v1.v[0] * v2.v[0], v1.v[1] * v2.v[1]);
-}
-
-constexpr inline const QVector2D operator-(const QVector2D &vector)
-{
- return QVector2D(-vector.v[0], -vector.v[1]);
-}
-
-constexpr inline const QVector2D operator/(const QVector2D &vector, float divisor)
-{
- return QVector2D(vector.v[0] / divisor, vector.v[1] / divisor);
-}
-
-constexpr inline const QVector2D operator/(const QVector2D &vector, const QVector2D &divisor)
-{
- return QVector2D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1]);
-}
-
-constexpr inline bool qFuzzyCompare(const QVector2D& v1, const QVector2D& v2)
-{
- return qFuzzyCompare(v1.v[0], v2.v[0]) && qFuzzyCompare(v1.v[1], v2.v[1]);
-}
-
-constexpr inline QPoint QVector2D::toPoint() const
-{
- return QPoint(qRound(v[0]), qRound(v[1]));
-}
-
-constexpr inline QPointF QVector2D::toPointF() const
-{
- return QPointF(qreal(v[0]), qreal(v[1]));
-}
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_GUI_EXPORT QDebug operator<<(QDebug dbg, const QVector2D &vector);
-#endif
-
-#ifndef QT_NO_DATASTREAM
-Q_GUI_EXPORT QDataStream &operator<<(QDataStream &, const QVector2D &);
-Q_GUI_EXPORT QDataStream &operator>>(QDataStream &, QVector2D &);
-#endif
-
-#endif
-
-QT_END_NAMESPACE
+#include <QtGui/qvectornd.h>
+#if 0
+#pragma qt_sync_stop_processing
#endif