Browse Source

Vk: parsing Version from configuration.

Needed so I can implement --magnum-vulkan-version.
pull/234/head
Vladimír Vondruš 6 years ago
parent
commit
b7b466d49a
  1. 38
      src/Magnum/Vk/Test/VersionTest.cpp
  2. 25
      src/Magnum/Vk/Version.cpp
  3. 20
      src/Magnum/Vk/Version.h

38
src/Magnum/Vk/Test/VersionTest.cpp

@ -25,6 +25,7 @@
#include <sstream>
#include <Corrade/TestSuite/Tester.h>
#include <Corrade/Utility/Configuration.h>
#include <Corrade/Utility/DebugStl.h>
#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"), Version::Vk11);
/* Errors */
c.setValue("version", "");
CORRADE_COMPARE(c.value<Version>("version"), Version::None);
c.setValue("version", "1");
CORRADE_COMPARE(c.value<Version>("version"), Version::None);
c.setValue("version", "1.");
CORRADE_COMPARE(c.value<Version>("version"), Version::None);
c.setValue("version", ".1");
CORRADE_COMPARE(c.value<Version>("version"), Version::None);
/* Leading spaces */
c.setValue("version", " 12. 5");
CORRADE_COMPARE(c.value<Version>("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"), version(12, 5));
c.setValue("version", "12.5 ");
CORRADE_COMPARE(c.value<Version>("version"), version(12, 5));
}
}
}}}}
CORRADE_TEST_MAIN(Magnum::Vk::Test::VersionTest)

25
src/Magnum/Vk/Version.cpp

@ -25,6 +25,8 @@
#include "Version.h"
#include <cstdlib>
#include <Corrade/Containers/StringView.h>
#include <Corrade/Utility/Debug.h>
#include "Magnum/Vk/Result.h"
@ -49,3 +51,26 @@ Version enumerateInstanceVersion() {
}
}}
namespace Corrade { namespace Utility {
using namespace Magnum;
Vk::Version ConfigurationValue<Vk::Version>::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);
}
}}

20
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 `<major>.<minor>`, returns
@ref Magnum::Vk::Version::None on error. Saving a value to string is not
implemented.
*/
template<> struct ConfigurationValue<Magnum::Vk::Version> {
ConfigurationValue() = delete;
#ifndef DOXYGEN_GENERATING_OUTPUT
MAGNUM_VK_EXPORT static Magnum::Vk::Version fromString(const Containers::StringView& stringValue, ConfigurationValueFlags);
#endif
};
}}
#endif

Loading…
Cancel
Save