diff --git a/src/Magnum/Vk/Test/VersionTest.cpp b/src/Magnum/Vk/Test/VersionTest.cpp index dd7d8ebef..87230dc57 100644 --- a/src/Magnum/Vk/Test/VersionTest.cpp +++ b/src/Magnum/Vk/Test/VersionTest.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include "Magnum/Magnum.h" @@ -41,6 +42,8 @@ struct VersionTest: TestSuite::Tester { void comparison(); void debug(); + + void configuration(); }; VersionTest::VersionTest() { @@ -48,7 +51,9 @@ VersionTest::VersionTest() { &VersionTest::packingMagnumVersion, &VersionTest::comparison, - &VersionTest::debug}); + &VersionTest::debug, + + &VersionTest::configuration}); } void VersionTest::packing() { @@ -128,6 +133,37 @@ void VersionTest::debug() { CORRADE_COMPARE(out.str(), "Vulkan 1.2 Vulkan 1.5.789 Vulkan 1023.1023.4095 20.6\n"); } +void VersionTest::configuration() { + Utility::Configuration c; + + /* The ideal thing */ + c.setValue("version", "1.1"); + CORRADE_COMPARE(c.value("version"), Version::Vk11); + + /* Errors */ + c.setValue("version", ""); + CORRADE_COMPARE(c.value("version"), Version::None); + c.setValue("version", "1"); + CORRADE_COMPARE(c.value("version"), Version::None); + c.setValue("version", "1."); + CORRADE_COMPARE(c.value("version"), Version::None); + c.setValue("version", ".1"); + CORRADE_COMPARE(c.value("version"), Version::None); + + /* Leading spaces */ + c.setValue("version", " 12. 5"); + CORRADE_COMPARE(c.value("version"), version(12, 5)); + + /* Trailing spaces */ + { + CORRADE_EXPECT_FAIL("Parsing of trailing spaces not implemented yet."); + c.setValue("version", "12 .5"); + CORRADE_COMPARE(c.value("version"), version(12, 5)); + c.setValue("version", "12.5 "); + CORRADE_COMPARE(c.value("version"), version(12, 5)); + } +} + }}}} CORRADE_TEST_MAIN(Magnum::Vk::Test::VersionTest) diff --git a/src/Magnum/Vk/Version.cpp b/src/Magnum/Vk/Version.cpp index 1ae1dae7a..d189a5320 100644 --- a/src/Magnum/Vk/Version.cpp +++ b/src/Magnum/Vk/Version.cpp @@ -25,6 +25,8 @@ #include "Version.h" +#include +#include #include #include "Magnum/Vk/Result.h" @@ -49,3 +51,26 @@ Version enumerateInstanceVersion() { } }} + +namespace Corrade { namespace Utility { + +using namespace Magnum; + +Vk::Version ConfigurationValue::fromString(const Containers::StringView& stringValue, ConfigurationValueFlags) { + /** @todo trim the string first, once Utility::String::trim() works for + views */ + CORRADE_INTERNAL_ASSERT(stringValue.flags() & Containers::StringViewFlag::NullTerminated); + + char* end; + const UnsignedInt major = std::strtoull(stringValue.data(), &end, 10); + if(end == stringValue.begin() || end == stringValue.end() || *end != '.' || end + 1 == stringValue.end()) + return Vk::Version::None; + + const UnsignedInt minor = std::strtoull(end + 1, &end, 10); + if(end != stringValue.end()) + return Vk::Version::None; + + return Vk::version(major, minor); +} + +}} diff --git a/src/Magnum/Vk/Version.h b/src/Magnum/Vk/Version.h index 79fa57a37..09e665823 100644 --- a/src/Magnum/Vk/Version.h +++ b/src/Magnum/Vk/Version.h @@ -147,4 +147,24 @@ MAGNUM_VK_EXPORT Version enumerateInstanceVersion(); }} +namespace Corrade { namespace Utility { + +/** +@configurationvalue{Magnum::Vk::Version} +@m_since_latest + +Parses a value in the form of `.`, returns +@ref Magnum::Vk::Version::None on error. Saving a value to string is not +implemented. +*/ +template<> struct ConfigurationValue { + ConfigurationValue() = delete; + + #ifndef DOXYGEN_GENERATING_OUTPUT + MAGNUM_VK_EXPORT static Magnum::Vk::Version fromString(const Containers::StringView& stringValue, ConfigurationValueFlags); + #endif +}; + +}} + #endif