diff --git a/src/Magnum/TextureTools/Atlas.cpp b/src/Magnum/TextureTools/Atlas.cpp index 23c66b45a..5cf8076d5 100644 --- a/src/Magnum/TextureTools/Atlas.cpp +++ b/src/Magnum/TextureTools/Atlas.cpp @@ -214,6 +214,8 @@ AtlasLandfill::AtlasLandfill(const Vector3i& size):_state{InPlaceInit} { AtlasLandfill::AtlasLandfill(const Vector2i& size): AtlasLandfill{{size, 1}} {} +AtlasLandfill::AtlasLandfill(NoCreateT) noexcept {} + AtlasLandfill::AtlasLandfill(AtlasLandfill&&) noexcept = default; AtlasLandfill::~AtlasLandfill() = default; diff --git a/src/Magnum/TextureTools/Atlas.h b/src/Magnum/TextureTools/Atlas.h index f9c69f5f4..6b86a13be 100644 --- a/src/Magnum/TextureTools/Atlas.h +++ b/src/Magnum/TextureTools/Atlas.h @@ -226,6 +226,20 @@ class MAGNUM_TEXTURETOOLS_EXPORT AtlasLandfill { */ explicit AtlasLandfill(const Vector2i& size); + /** + * @brief Construct without creating the internal state + * @m_since_latest + * + * The constructed instance is equivalent to moved-from state, i.e. no + * APIs can be safely called on the object. Useful in cases where you + * will overwrite the instance later anyway. Move another object over + * it to make it useful. + * + * Note that this is a low-level and a potentially dangerous API, see + * the documentation of @ref NoCreate for alternatives. + */ + explicit AtlasLandfill(NoCreateT) noexcept; + /** @brief Copying is not allowed */ AtlasLandfill(const AtlasLandfill&) = delete; diff --git a/src/Magnum/TextureTools/Test/AtlasTest.cpp b/src/Magnum/TextureTools/Test/AtlasTest.cpp index 26fac2954..4bdcda760 100644 --- a/src/Magnum/TextureTools/Test/AtlasTest.cpp +++ b/src/Magnum/TextureTools/Test/AtlasTest.cpp @@ -53,6 +53,7 @@ struct AtlasTest: TestSuite::Tester { void landfillConstruct(); void landfillConstructInvalidSize(); + void landfillConstructNoCreate(); void landfillConstructCopy(); void landfillConstructMove(); @@ -504,6 +505,7 @@ AtlasTest::AtlasTest() { &AtlasTest::landfillConstruct, &AtlasTest::landfillConstructInvalidSize, + &AtlasTest::landfillConstructNoCreate, &AtlasTest::landfillConstructCopy, &AtlasTest::landfillConstructMove, @@ -614,6 +616,16 @@ void AtlasTest::landfillConstructInvalidSize() { TestSuite::Compare::String); } +void AtlasTest::landfillConstructNoCreate() { + AtlasLandfill a{NoCreate}; + + /* Shouldn't crash */ + CORRADE_VERIFY(true); + + /* Implicit construction is not allowed */ + CORRADE_VERIFY(!std::is_convertible::value); +} + void AtlasTest::landfillConstructCopy() { CORRADE_VERIFY(!std::is_copy_constructible{}); CORRADE_VERIFY(!std::is_copy_assignable{});