From bbc98746e44bf6badc010a24a7cbaae5984fab25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Wed, 30 Jan 2013 17:07:54 +0100 Subject: [PATCH] Math: properly testing all constexpr methods in Vector. Fixed conversion constructor, as pointer chasings are not allowed in constexpr functions. --- src/Math/Test/VectorTest.cpp | 32 ++++++++++++++++++++++++++++++++ src/Math/Vector.h | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Math/Test/VectorTest.cpp b/src/Math/Test/VectorTest.cpp index 66ade42a7..a07b3d345 100644 --- a/src/Math/Test/VectorTest.cpp +++ b/src/Math/Test/VectorTest.cpp @@ -33,6 +33,8 @@ class VectorTest: public Corrade::TestSuite::Tester { void constructConversion(); void data(); + void constExpressions(); + void negative(); void addSubtract(); void multiplyDivide(); @@ -73,6 +75,8 @@ VectorTest::VectorTest() { &VectorTest::constructConversion, &VectorTest::data, + &VectorTest::constExpressions, + &VectorTest::negative, &VectorTest::addSubtract, &VectorTest::multiplyDivide, @@ -141,6 +145,34 @@ void VectorTest::data() { CORRADE_COMPARE(vector, Vector4(4.0f, 5.0f, 1.0f, 1.5f)); } +void VectorTest::constExpressions() { + /* Default constructor */ + constexpr Vector4 a; + CORRADE_COMPARE(a, Vector4(0.0f, 0.0f, 0.0f, 0.0f)); + + /* Value constructor */ + constexpr Vector4 b(1.0f, 3.5f, 4.0f, -2.7f); + CORRADE_COMPARE(b, Vector4(1.0f, 3.5f, 4.0f, -2.7f)); + + /* One-value constructor */ + constexpr Vector4 c(7.0f); + CORRADE_COMPARE(c, Vector4(7.0f, 7.0f, 7.0f, 7.0f)); + + /* Conversion constructor */ + constexpr Vector4i d(b); + CORRADE_COMPARE(d, Vector4i(1, 3, 4, -2)); + + /* Copy constructor */ + constexpr Vector4 e(b); + CORRADE_COMPARE(e, Vector4(1.0f, 3.5f, 4.0f, -2.7f)); + + /* Data access, pointer chasings, i.e. *(b.data()[3]), are not possible */ + constexpr float f = b[3]; + constexpr float g = *b.data(); + CORRADE_COMPARE(f, -2.7f); + CORRADE_COMPARE(g, 1.0f); +} + void VectorTest::compare() { CORRADE_VERIFY(Vector4(1.0f, -3.5f, 5.0f, -10.0f) == Vector4(1.0f + MathTypeTraits::epsilon()/2, -3.5f, 5.0f, -10.0f)); CORRADE_VERIFY(Vector4(1.0f, -1.0f, 5.0f, -10.0f) != Vector4(1.0f, -1.0f + MathTypeTraits::epsilon()*2, 5.0f, -10.0f)); diff --git a/src/Math/Vector.h b/src/Math/Vector.h index ee5b1c30b..11f2a0b54 100644 --- a/src/Math/Vector.h +++ b/src/Math/Vector.h @@ -513,7 +513,7 @@ template class Vector { private: /* Implementation for Vector::Vector(const Vector&) */ - template inline constexpr explicit Vector(Implementation::Sequence, const Vector& vector): _data{T(vector.data()[sequence])...} {} + template inline constexpr explicit Vector(Implementation::Sequence, const Vector& vector): _data{T(vector._data[sequence])...} {} /* Implementation for Vector::Vector(U) */ template inline constexpr explicit Vector(Implementation::Sequence, T value): _data{Implementation::repeat(value, sequence)...} {}