From ca0bbe79fbc0c65a9cc238c4850a7c5f1f6a84c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 25 Nov 2012 01:35:29 +0100 Subject: [PATCH] Debug output and configuration parser for Type enum. --- src/Test/CMakeLists.txt | 1 + src/Test/TypeTraitsTest.cpp | 47 ++++++++++++++++++++++++++++ src/Test/TypeTraitsTest.h | 32 +++++++++++++++++++ src/TypeTraits.cpp | 61 +++++++++++++++++++++++++++++++++++++ src/TypeTraits.h | 26 ++++++++++++++++ 5 files changed, 167 insertions(+) create mode 100644 src/Test/TypeTraitsTest.cpp create mode 100644 src/Test/TypeTraitsTest.h diff --git a/src/Test/CMakeLists.txt b/src/Test/CMakeLists.txt index e7950f7f4..d46a463fb 100644 --- a/src/Test/CMakeLists.txt +++ b/src/Test/CMakeLists.txt @@ -1,5 +1,6 @@ corrade_add_test2(ColorTest ColorTest.cpp LIBRARIES MagnumMathTestLib) corrade_add_test2(ResourceManagerTest ResourceManagerTest.cpp LIBRARIES MagnumTestLib) corrade_add_test2(SwizzleTest SwizzleTest.cpp LIBRARIES MagnumMathTestLib) +corrade_add_test2(TypeTraitsTest TypeTraitsTest.cpp LIBRARIES Magnum) set_target_properties(ResourceManagerTest PROPERTIES COMPILE_FLAGS -DCORRADE_GRACEFUL_ASSERT) diff --git a/src/Test/TypeTraitsTest.cpp b/src/Test/TypeTraitsTest.cpp new file mode 100644 index 000000000..521e16019 --- /dev/null +++ b/src/Test/TypeTraitsTest.cpp @@ -0,0 +1,47 @@ +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include "TypeTraitsTest.h" + +#include + +#include "TypeTraits.h" + +CORRADE_TEST_MAIN(Magnum::Test::TypeTraitsTest) + +using namespace Corrade::Utility; + +namespace Magnum { namespace Test { + +TypeTraitsTest::TypeTraitsTest() { + addTests(&TypeTraitsTest::debug, + &TypeTraitsTest::configuration); +} + +void TypeTraitsTest::debug() { + std::ostringstream o; + Debug(&o) << Type::UnsignedShort; + CORRADE_COMPARE(o.str(), "Type::UnsignedShort\n"); +} + +void TypeTraitsTest::configuration() { + Configuration c; + + c.setValue("type", Type::Byte); + CORRADE_COMPARE(c.value("type"), "Byte"); + CORRADE_COMPARE(c.value("type"), Type::Byte); +} + +}} diff --git a/src/Test/TypeTraitsTest.h b/src/Test/TypeTraitsTest.h new file mode 100644 index 000000000..2f634f50c --- /dev/null +++ b/src/Test/TypeTraitsTest.h @@ -0,0 +1,32 @@ +#ifndef Magnum_Test_TypeTraitsTest_h +#define Magnum_Test_TypeTraitsTest_h +/* + Copyright © 2010, 2011, 2012 Vladimír Vondruš + + This file is part of Magnum. + + Magnum is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License version 3 + only, as published by the Free Software Foundation. + + Magnum is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License version 3 for more details. +*/ + +#include + +namespace Magnum { namespace Test { + +class TypeTraitsTest: public Corrade::TestSuite::Tester { + public: + TypeTraitsTest(); + + void debug(); + void configuration(); +}; + +}} + +#endif diff --git a/src/TypeTraits.cpp b/src/TypeTraits.cpp index 4dad71afe..2d598de4a 100644 --- a/src/TypeTraits.cpp +++ b/src/TypeTraits.cpp @@ -16,6 +16,7 @@ #include "TypeTraits.h" #include +#include using namespace std; @@ -67,4 +68,64 @@ bool TypeInfo::isIntegral(Type type) { } } +#ifndef DOXYGEN_GENERATING_OUTPUT +Debug operator<<(Debug debug, Type value) { + switch(value) { + #define _c(value) case Type::value: return debug << "Type::" #value; + _c(UnsignedByte) + _c(Byte) + _c(UnsignedShort) + _c(Short) + _c(UnsignedInt) + _c(Int) + _c(Float) + #ifndef MAGNUM_TARGET_GLES + _c(Double) + #endif + #undef _c + } + + return debug << "Type::(invalid)"; } +#endif + +} + +namespace Corrade { namespace Utility { + +std::string ConfigurationValue::toString(Magnum::Type value, ConfigurationValueFlags) { + switch(value) { + #define _c(value) case Magnum::Type::value: return #value; + _c(UnsignedByte) + _c(Byte) + _c(UnsignedShort) + _c(Short) + _c(UnsignedInt) + _c(Int) + _c(Float) + #ifndef MAGNUM_TARGET_GLES + _c(Double) + #endif + #undef _c + } + + return ""; +} + +Magnum::Type ConfigurationValue::fromString(const std::string& stringValue, ConfigurationValueFlags) { + #define _c(value) if(stringValue == #value) return Magnum::Type::value; + _c(UnsignedByte) + _c(Byte) + _c(UnsignedShort) + _c(Short) + _c(UnsignedInt) + _c(Int) + #ifndef MAGNUM_TARGET_GLES + _c(Double) + #endif + #undef _c + + return Magnum::Type::Float; +} + +}} diff --git a/src/TypeTraits.h b/src/TypeTraits.h index 49e75e871..c6f878e61 100644 --- a/src/TypeTraits.h +++ b/src/TypeTraits.h @@ -19,6 +19,8 @@ * @brief Enum Magnum::Type, class Magnum::TypeOf, Magnum::TypeInfo, Magnum::TypeTraits */ +#include + #include "Math/MathTypeTraits.h" #include "AbstractImage.h" @@ -114,6 +116,9 @@ enum class Type: GLenum { #endif }; +/** @debugoperator{Magnum::TypeInfo} */ +Debug MAGNUM_EXPORT operator<<(Debug debug, Type value); + /** @brief Class for converting Type enum values to types @@ -340,4 +345,25 @@ template struct TypeTraits>: TypeTraits struct MAGNUM_EXPORT ConfigurationValue { + /** + * @brief Writes enum value as string + * + * If the value is invalid, returns empty string. + */ + static std::string toString(Magnum::Type value, ConfigurationValueFlags); + + /** + * @brief Reads enum value as string + * + * If the value is invalid, returns @ref Magnum::Type "Magnum::Type::Float". + */ + static Magnum::Type fromString(const std::string& stringValue, ConfigurationValueFlags); +}; + +}} + #endif