summaryrefslogtreecommitdiffstats
path: root/src/gui/math3d/qvectornd.h
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2020-12-01 14:07:26 +0100
committerEdward Welbourne <edward.welbourne@qt.io>2021-02-04 17:18:51 +0100
commit7a738daa97436478a21b5dd31ba2312b2cb2df41 (patch)
tree9e4a536302e2c0b212f99031bb017dfb7961effe /src/gui/math3d/qvectornd.h
parent96ef1769c18d90053e48176c22a594e03f1d6e38 (diff)
Make explicit that we expect co-ordinates to be finite
The various spatial-vector, line, point, region and margin types have all long taken for granted that their co-ordinates are finite and, in particular, not NaN. Make this expectation explicit in the documentation. Added assertions where (chiefly) noexcept and (where the assertion would be a simple qIsFinite() call) constexpr didn't preclude doing so. Also assert against zero divisors that would lead to non-finite results. Make minor clean-ups to docs in the process. QMarginsF had several methods whose declaration, definition and docs weren't consistent in their parameter names. Task-number: QTBUG-89010 Change-Id: I601a830959d13a73dcb17ce31a1202a1486c8f7f Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'src/gui/math3d/qvectornd.h')
-rw-r--r--src/gui/math3d/qvectornd.h30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/gui/math3d/qvectornd.h b/src/gui/math3d/qvectornd.h
index 8d2789338c..153f3743d8 100644
--- a/src/gui/math3d/qvectornd.h
+++ b/src/gui/math3d/qvectornd.h
@@ -147,11 +147,14 @@ QT_WARNING_POP
constexpr friend inline QVector2D operator/(QVector2D vector, float divisor)
{
+ Q_ASSERT(divisor < 0 || divisor > 0);
return QVector2D(vector.v[0] / divisor, vector.v[1] / divisor);
}
constexpr friend inline QVector2D operator/(QVector2D vector, QVector2D divisor)
{
+ Q_ASSERT(divisor.v[0] < 0 || divisor.v[0] > 0);
+ Q_ASSERT(divisor.v[1] < 0 || divisor.v[1] > 0);
return QVector2D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1]);
}
@@ -288,12 +291,17 @@ QT_WARNING_POP
constexpr friend inline QVector3D operator/(QVector3D vector, float divisor)
{
+ Q_ASSERT(divisor < 0 || divisor > 0);
return QVector3D(vector.v[0] / divisor, vector.v[1] / divisor, vector.v[2] / divisor);
}
constexpr friend inline QVector3D operator/(QVector3D vector, QVector3D divisor)
{
- return QVector3D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1], vector.v[2] / divisor.v[2]);
+ Q_ASSERT(divisor.v[0] > 0 || divisor.v[0] < 0);
+ Q_ASSERT(divisor.v[1] > 0 || divisor.v[1] < 0);
+ Q_ASSERT(divisor.v[2] > 0 || divisor.v[2] < 0);
+ return QVector3D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1],
+ vector.v[2] / divisor.v[2]);
}
friend Q_GUI_EXPORT bool qFuzzyCompare(QVector3D v1, QVector3D v2) noexcept;
@@ -422,12 +430,18 @@ QT_WARNING_POP
constexpr friend inline QVector4D operator/(QVector4D vector, float divisor)
{
+ Q_ASSERT(divisor < 0 || divisor > 0);
return QVector4D(vector.v[0] / divisor, vector.v[1] / divisor, vector.v[2] / divisor, vector.v[3] / divisor);
}
constexpr friend inline QVector4D operator/(QVector4D vector, QVector4D divisor)
{
- return QVector4D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1], vector.v[2] / divisor.v[2], vector.v[3] / divisor.v[3]);
+ Q_ASSERT(divisor.v[0] > 0 || divisor.v[0] < 0);
+ Q_ASSERT(divisor.v[1] > 0 || divisor.v[1] < 0);
+ Q_ASSERT(divisor.v[2] > 0 || divisor.v[2] < 0);
+ Q_ASSERT(divisor.v[3] > 0 || divisor.v[3] < 0);
+ return QVector4D(vector.v[0] / divisor.v[0], vector.v[1] / divisor.v[1],
+ vector.v[2] / divisor.v[2], vector.v[3] / divisor.v[3]);
}
friend Q_GUI_EXPORT bool qFuzzyCompare(QVector4D v1, QVector4D v2) noexcept;
@@ -576,6 +590,7 @@ constexpr inline QVector2D &QVector2D::operator*=(QVector2D vector) noexcept
constexpr inline QVector2D &QVector2D::operator/=(float divisor)
{
+ Q_ASSERT(divisor < 0 || divisor > 0);
v[0] /= divisor;
v[1] /= divisor;
return *this;
@@ -583,6 +598,8 @@ constexpr inline QVector2D &QVector2D::operator/=(float divisor)
constexpr inline QVector2D &QVector2D::operator/=(QVector2D vector)
{
+ Q_ASSERT(vector.v[0] > 0 || vector.v[0] < 0);
+ Q_ASSERT(vector.v[1] > 0 || vector.v[1] < 0);
v[0] /= vector.v[0];
v[1] /= vector.v[1];
return *this;
@@ -736,6 +753,7 @@ constexpr inline QVector3D &QVector3D::operator*=(QVector3D vector) noexcept
constexpr inline QVector3D &QVector3D::operator/=(float divisor)
{
+ Q_ASSERT(divisor < 0 || divisor > 0);
v[0] /= divisor;
v[1] /= divisor;
v[2] /= divisor;
@@ -744,6 +762,9 @@ constexpr inline QVector3D &QVector3D::operator/=(float divisor)
constexpr inline QVector3D &QVector3D::operator/=(QVector3D vector)
{
+ Q_ASSERT(vector.v[0] > 0 || vector.v[0] < 0);
+ Q_ASSERT(vector.v[1] > 0 || vector.v[1] < 0);
+ Q_ASSERT(vector.v[2] > 0 || vector.v[2] < 0);
v[0] /= vector.v[0];
v[1] /= vector.v[1];
v[2] /= vector.v[2];
@@ -947,6 +968,7 @@ constexpr inline QVector4D &QVector4D::operator*=(QVector4D vector) noexcept
constexpr inline QVector4D &QVector4D::operator/=(float divisor)
{
+ Q_ASSERT(divisor < 0 || divisor > 0);
v[0] /= divisor;
v[1] /= divisor;
v[2] /= divisor;
@@ -956,6 +978,10 @@ constexpr inline QVector4D &QVector4D::operator/=(float divisor)
constexpr inline QVector4D &QVector4D::operator/=(QVector4D vector)
{
+ Q_ASSERT(vector.v[0] > 0 || vector.v[0] < 0);
+ Q_ASSERT(vector.v[1] > 0 || vector.v[1] < 0);
+ Q_ASSERT(vector.v[2] > 0 || vector.v[2] < 0);
+ Q_ASSERT(vector.v[3] > 0 || vector.v[3] < 0);
v[0] /= vector.v[0];
v[1] /= vector.v[1];
v[2] /= vector.v[2];