From fcd38cabc78342019aab0a7e3171f75cec4cf136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 10 Nov 2019 21:13:37 +0100 Subject: [PATCH] Trade: new enum for describing data ownership. Will be used for MeshData that don't own the memory. --- src/Magnum/Trade/CMakeLists.txt | 2 + src/Magnum/Trade/Data.cpp | 53 +++++++++++++++++ src/Magnum/Trade/Data.h | 87 ++++++++++++++++++++++++++++ src/Magnum/Trade/Test/CMakeLists.txt | 1 + src/Magnum/Trade/Test/DataTest.cpp | 62 ++++++++++++++++++++ src/Magnum/Trade/Trade.h | 9 ++- 6 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 src/Magnum/Trade/Data.cpp create mode 100644 src/Magnum/Trade/Data.h create mode 100644 src/Magnum/Trade/Test/DataTest.cpp diff --git a/src/Magnum/Trade/CMakeLists.txt b/src/Magnum/Trade/CMakeLists.txt index fc21d1d78..28afc0091 100644 --- a/src/Magnum/Trade/CMakeLists.txt +++ b/src/Magnum/Trade/CMakeLists.txt @@ -27,6 +27,7 @@ find_package(Corrade REQUIRED PluginManager) set(MagnumTrade_SRCS AbstractMaterialData.cpp + Data.cpp LightData.cpp MeshData2D.cpp MeshData3D.cpp @@ -52,6 +53,7 @@ set(MagnumTrade_HEADERS AbstractMaterialData.h AnimationData.h CameraData.h + Data.h ImageData.h LightData.h MeshData.h diff --git a/src/Magnum/Trade/Data.cpp b/src/Magnum/Trade/Data.cpp new file mode 100644 index 000000000..a0bc474e2 --- /dev/null +++ b/src/Magnum/Trade/Data.cpp @@ -0,0 +1,53 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include "Data.h" + +#include + +namespace Magnum { namespace Trade { + +Debug& operator<<(Debug& debug, const DataFlag value) { + debug << "Trade::DataFlag" << Debug::nospace; + + switch(value) { + /* LCOV_EXCL_START */ + #define _c(v) case DataFlag::v: return debug << "::" #v; + _c(Owned) + _c(Mutable) + #undef _c + /* LCOV_EXCL_STOP */ + } + + return debug << "(" << Debug::nospace << reinterpret_cast(UnsignedByte(value)) << Debug::nospace << ")"; +} + +Debug& operator<<(Debug& debug, const DataFlags value) { + return Containers::enumSetDebugOutput(debug, value, "Trade::DataFlags{}", { + DataFlag::Owned, + DataFlag::Mutable}); +} + +}} diff --git a/src/Magnum/Trade/Data.h b/src/Magnum/Trade/Data.h new file mode 100644 index 000000000..9f2abcaf5 --- /dev/null +++ b/src/Magnum/Trade/Data.h @@ -0,0 +1,87 @@ +#ifndef Magnum_Trade_Data_h +#define Magnum_Trade_Data_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +/** @file + * @brief Enum @ref Magnum::Trade::DataFlag, enum set @ref Magnum::Trade::DataFlags + * @m_since_latest + */ + +#include + +#include "Magnum/Magnum.h" +#include "Magnum/Trade/visibility.h" + +namespace Magnum { namespace Trade { + +/** +@brief Data flag +@m_since_latest + +@see @ref DataFlags, @ref MeshData::dataFlags() +*/ +enum class DataFlag: UnsignedByte { + /** + * Data are owned by the instance. If this flag is not set, the instance + * might be for example referencing a memory-mapped file or a constant + * memory. + */ + Owned = 1 << 0, + + /** + * Data are mutable. If this flag is not set, the instance might be for + * example referencing a readonly memory-mapped file or a constant memory. + */ + Mutable = 2 << 0 + + /** @todo owned by importer, owned by the GPU, ... */ +}; + +/** +@debugoperatorenum{DataFlag} +@m_since_latest +*/ +MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, DataFlag value); + +/** +@brief Data flags +@m_since_latest + +@see @ref MeshData::dataFlags() +*/ +typedef Containers::EnumSet DataFlags; + +CORRADE_ENUMSET_OPERATORS(DataFlags) + +/** +@debugoperatorenum{DataFlags} +@m_since_latest +*/ +MAGNUM_TRADE_EXPORT Debug& operator<<(Debug& debug, DataFlags value); + +}} + +#endif diff --git a/src/Magnum/Trade/Test/CMakeLists.txt b/src/Magnum/Trade/Test/CMakeLists.txt index fc781c5c1..2c9177347 100644 --- a/src/Magnum/Trade/Test/CMakeLists.txt +++ b/src/Magnum/Trade/Test/CMakeLists.txt @@ -44,6 +44,7 @@ target_include_directories(TradeAbstractImporterTest PRIVATE ${CMAKE_CURRENT_BIN corrade_add_test(TradeAnimationDataTest AnimationDataTest.cpp LIBRARIES MagnumTradeTestLib) corrade_add_test(TradeCameraDataTest CameraDataTest.cpp LIBRARIES MagnumTradeTestLib) +corrade_add_test(TradeDataTest DataTest.cpp LIBRARIES MagnumTrade) corrade_add_test(TradeImageDataTest ImageDataTest.cpp LIBRARIES MagnumTradeTestLib) corrade_add_test(TradeLightDataTest LightDataTest.cpp LIBRARIES MagnumTrade) corrade_add_test(TradeMaterialDataTest MaterialDataTest.cpp LIBRARIES MagnumTradeTestLib) diff --git a/src/Magnum/Trade/Test/DataTest.cpp b/src/Magnum/Trade/Test/DataTest.cpp new file mode 100644 index 000000000..e1253d498 --- /dev/null +++ b/src/Magnum/Trade/Test/DataTest.cpp @@ -0,0 +1,62 @@ +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include +#include +#include + +#include "Magnum/Trade/Data.h" + +namespace Magnum { namespace Trade { namespace Test { namespace { + +struct DataTest: TestSuite::Tester { + explicit DataTest(); + + void debugDataFlag(); + void debugDataFlags(); +}; + +DataTest::DataTest() { + addTests({&DataTest::debugDataFlag, + &DataTest::debugDataFlags}); +} + +void DataTest::debugDataFlag() { + std::ostringstream out; + + Debug{&out} << DataFlag::Owned << DataFlag(0xf0); + CORRADE_COMPARE(out.str(), "Trade::DataFlag::Owned Trade::DataFlag(0xf0)\n"); +} + +void DataTest::debugDataFlags() { + std::ostringstream out; + + Debug{&out} << (DataFlag::Owned|DataFlag::Mutable) << DataFlags{}; + CORRADE_COMPARE(out.str(), "Trade::DataFlag::Owned|Trade::DataFlag::Mutable Trade::DataFlags{}\n"); +} + +}}}} + +CORRADE_TEST_MAIN(Magnum::Trade::Test::DataTest) diff --git a/src/Magnum/Trade/Trade.h b/src/Magnum/Trade/Trade.h index 0803127ac..36c16f70b 100644 --- a/src/Magnum/Trade/Trade.h +++ b/src/Magnum/Trade/Trade.h @@ -29,12 +29,12 @@ * @brief Forward declarations for the @ref Magnum::Trade namespace */ -#include "Magnum/Types.h" +#include + +#include "Magnum/Magnum.h" #ifdef MAGNUM_BUILD_DEPRECATED #include - -#include "Magnum/Magnum.h" #endif namespace Magnum { namespace Trade { @@ -59,6 +59,9 @@ class AnimationData; enum class CameraType: UnsignedByte; class CameraData; +enum class DataFlag: UnsignedByte; +typedef Containers::EnumSet DataFlags; + template class ImageData; typedef ImageData<1> ImageData1D; typedef ImageData<2> ImageData2D;