Browse Source

Math: ability to create Dual with ZeroInit tag.

It does slightly different things than the implicit constructor for some
types.
pull/175/merge
Vladimír Vondruš 10 years ago
parent
commit
844bfcce5a
  1. 9
      src/Magnum/Math/Dual.h
  2. 12
      src/Magnum/Math/Test/DualTest.cpp

9
src/Magnum/Math/Dual.h

@ -59,6 +59,15 @@ template<class T> class Dual {
*/
constexpr /*implicit*/ Dual() noexcept: _real{}, _dual{} {}
/** @brief Construct zero-initialized dual number */
#ifdef DOXYGEN_GENERATING_OUTPUT
constexpr /*implicit*/ Dual(ZeroInitT) noexcept;
#else
/* MSVC 2015 can't handle {} instead of ::value */
template<class U = T, class = typename std::enable_if<std::is_pod<U>::value>::type> constexpr /*implicit*/ Dual(ZeroInitT) noexcept: _real{}, _dual{} {}
template<class U = T, class V = T, class = typename std::enable_if<std::is_constructible<U, ZeroInitT>::value>::type> constexpr /*implicit*/ Dual(ZeroInitT) noexcept: _real{ZeroInit}, _dual{ZeroInit} {}
#endif
/** @brief Construct without initializing the contents */
#ifdef DOXYGEN_GENERATING_OUTPUT
explicit Dual(NoInitT) noexcept;

12
src/Magnum/Math/Test/DualTest.cpp

@ -37,6 +37,7 @@ struct DualTest: Corrade::TestSuite::Tester {
void construct();
void constructDefault();
void constructZero();
void constructNoInit();
void constructConversion();
void constructCopy();
@ -73,6 +74,7 @@ using namespace Literals;
DualTest::DualTest() {
addTests({&DualTest::construct,
&DualTest::constructDefault,
&DualTest::constructZero,
&DualTest::constructNoInit,
&DualTest::constructConversion,
&DualTest::constructCopy,
@ -120,6 +122,16 @@ void DualTest::constructDefault() {
CORRADE_VERIFY(std::is_nothrow_default_constructible<Dual>::value);
}
void DualTest::constructZero() {
constexpr Dual a{ZeroInit};
constexpr Math::Dual<Math::Quaternion<Float>> b{ZeroInit};
CORRADE_COMPARE(a, Dual(0.0f, 0.0f));
CORRADE_COMPARE(b, Math::Dual<Math::Quaternion<Float>>({{0.0f, 0.0f, 0.0f}, 0.0f}, {{0.0f, 0.0f, 0.0f}, 0.0f}));
CORRADE_VERIFY((std::is_nothrow_constructible<Dual, ZeroInitT>::value));
CORRADE_VERIFY((std::is_nothrow_constructible<Math::Dual<Math::Quaternion<Float>>, ZeroInitT>::value));
}
void DualTest::constructNoInit() {
Dual a{2.0f, -7.5f};
Math::Dual<Math::Quaternion<Float>> b{{{3.0f, 0.1f, 1.0f}, 1.0f}, {{0.1f, 0.0f, 1.0f}, 0.3f}};

Loading…
Cancel
Save