From 3344c372d17679b16ba30bd977e738cf8b656eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 14 Mar 2022 21:47:32 +0100 Subject: [PATCH] Trade: port AbstractImporter away from std::string. Except for file callbacks, for these I have another change planned for zero-copy import and it would be unwise to break stuff twice, providing two sets of backwards compatibility wrappers. The image / scene converter plugins went through a similar change earlier already and the shader converters were made sane since the very beginning. OTOH audio importers and text stuff are scheduled for merging with Trade or a larger rework anyway, so I didn't see any point in updating those. It's mostly a trivial change, except that returned String instances are now also checked for non-default deleters same as Arrays because yes, wow such flexibility compared to STL strings. Same was done for ShaderTools::AbstractConverter already anyway, so nothing unheard-of either. The importer plugin interface version is bumped as this likely breaks ABI in a nasty way that would lead to crashes. --- doc/changelog.dox | 9 +- src/Magnum/Trade/AbstractImporter.cpp | 237 +++++--- src/Magnum/Trade/AbstractImporter.h | 249 ++++---- .../Trade/Test/AbstractImporterTest.cpp | 534 +++++++++++++++--- .../AnyImageImporter/AnyImageImporter.cpp | 4 +- .../AnyImageImporter/AnyImageImporter.h | 2 +- .../AnySceneImporter/AnySceneImporter.cpp | 60 +- .../AnySceneImporter/AnySceneImporter.h | 58 +- src/MagnumPlugins/ObjImporter/ObjImporter.cpp | 10 +- src/MagnumPlugins/ObjImporter/ObjImporter.h | 6 +- src/MagnumPlugins/TgaImporter/TgaImporter.cpp | 2 +- 11 files changed, 799 insertions(+), 372 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index f2335a65e..167bb3871 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -787,6 +787,13 @@ See also: @ref MAGNUM_BUILD_DEPRECATED is enabled, the returned type acts as a @ref Corrade::Containers::Optional but has (deprecated) implicit conversion to a @ref Corrade::Containers::Pointer to avoid breaking user code. +- All @ref Trade::AbstractImporter APIs that used to take or return a + @ref std::string are ported to use @relativeref{Corrade,Containers::StringView} + or @relativeref{Corrade,Containers::String} instead. If + @ref MAGNUM_BUILD_DEPRECATED is enabled, implicit conversion from and to a + @ref std::string is provided by including the + @ref Corrade/Containers/StringStl.h header. Include it explicitly in your + code if you want to keep using a @ref std::string. - @ref Trade::AbstractImporter::doOpenData() taking an array view is deprecated in favor of the more flexible signature that takes a r-value @relativeref{Corrade,Containers::Array} @@ -1286,7 +1293,7 @@ Released 2020-06-27, tagged as Equivalent APIs are exposed in both @ref Trade::ImageData and @ref Trade::MeshData as well. See @ref Trade-AnimationData-usage-mutable for more information. -- New convenience @ref Trade::AbstractImporter::material(const std::string&) +- New convenience @cpp Trade::AbstractImporter::material(const std::string&) @ce etc. APIs allowing to directly get a data using a string name - @ref Trade::PhongMaterialData now supports both color and texture instead of just one or the other, can reference normal textures as well and diff --git a/src/Magnum/Trade/AbstractImporter.cpp b/src/Magnum/Trade/AbstractImporter.cpp index 9a32e1096..37be3e00e 100644 --- a/src/Magnum/Trade/AbstractImporter.cpp +++ b/src/Magnum/Trade/AbstractImporter.cpp @@ -25,6 +25,7 @@ #include "AbstractImporter.h" +#include /** @todo remove once file callbacks are -free */ #include #include #include @@ -32,7 +33,6 @@ #include /** @todo remove once file callbacks are -free */ #include #include -#include /** @todo remove once AbstractImporter is -free */ #include #include "Magnum/FileCallback.h" @@ -48,8 +48,10 @@ #include "Magnum/Trade/TextureData.h" #ifdef MAGNUM_BUILD_DEPRECATED +#include /* for object2DName() etc., not going to change those */ #include #include +#include /* for errors in object2DForName() etc. */ /* This is a header-only tool, meaning no link-time dependency on SceneTools */ /** @todo once this compat is dropped, drop the header-only implementation */ @@ -89,7 +91,7 @@ using namespace Containers::Literals; Containers::StringView AbstractImporter::pluginInterface() { return /* [interface] */ -"cz.mosra.magnum.Trade.AbstractImporter/0.4"_s +"cz.mosra.magnum.Trade.AbstractImporter/0.5"_s /* [interface] */ ; } @@ -198,7 +200,7 @@ bool AbstractImporter::openMemory(Containers::ArrayView memory) { return isOpened(); } -bool AbstractImporter::openState(const void* state, const std::string& filePath) { +bool AbstractImporter::openState(const void* const state, const Containers::StringView filePath) { CORRADE_ASSERT(features() & ImporterFeature::OpenState, "Trade::AbstractImporter::openState(): feature not supported", {}); @@ -207,11 +209,15 @@ bool AbstractImporter::openState(const void* state, const std::string& filePath) return isOpened(); } -void AbstractImporter::doOpenState(const void*, const std::string&) { +bool AbstractImporter::openState(const void* const state) { + return openState(state, {}); +} + +void AbstractImporter::doOpenState(const void*, const Containers::StringView) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::openState(): feature advertised but not implemented", ); } -bool AbstractImporter::openFile(const std::string& filename) { +bool AbstractImporter::openFile(const Containers::StringView filename) { close(); /* If file loading callbacks are not set or the importer supports handling @@ -253,7 +259,7 @@ bool AbstractImporter::openFile(const std::string& filename) { return isOpened(); } -void AbstractImporter::doOpenFile(const std::string& filename) { +void AbstractImporter::doOpenFile(const Containers::StringView filename) { CORRADE_ASSERT(features() & ImporterFeature::OpenData, "Trade::AbstractImporter::openFile(): not implemented", ); /* If callbacks are set, use them. This is the same implementation as in @@ -310,7 +316,7 @@ UnsignedLong AbstractImporter::objectCount() const { UnsignedLong AbstractImporter::doObjectCount() const { return 0; } -Int AbstractImporter::sceneForName(const std::string& name) { +Int AbstractImporter::sceneForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::sceneForName(): no file opened", -1); const Int id = doSceneForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doSceneCount(), @@ -318,9 +324,9 @@ Int AbstractImporter::sceneForName(const std::string& name) { return id; } -Int AbstractImporter::doSceneForName(const std::string&) { return -1; } +Int AbstractImporter::doSceneForName(Containers::StringView) { return -1; } -Long AbstractImporter::objectForName(const std::string& name) { +Long AbstractImporter::objectForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::objectForName(): no file opened", {}); const Long id = doObjectForName(name); CORRADE_ASSERT(id == -1 || UnsignedLong(id) < doObjectCount(), @@ -328,23 +334,29 @@ Long AbstractImporter::objectForName(const std::string& name) { return id; } -Long AbstractImporter::doObjectForName(const std::string&) { return -1; } +Long AbstractImporter::doObjectForName(Containers::StringView) { return -1; } -std::string AbstractImporter::sceneName(const UnsignedInt id) { +Containers::String AbstractImporter::sceneName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::sceneName(): no file opened", {}); CORRADE_ASSERT(id < doSceneCount(), "Trade::AbstractImporter::sceneName(): index" << id << "out of range for" << doSceneCount() << "entries", {}); - return doSceneName(id); + Containers::String name = doSceneName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::sceneName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doSceneName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doSceneName(UnsignedInt) { return {}; } -std::string AbstractImporter::objectName(const UnsignedLong id) { +Containers::String AbstractImporter::objectName(const UnsignedLong id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::objectName(): no file opened", {}); CORRADE_ASSERT(id < doObjectCount(), "Trade::AbstractImporter::objectName(): index" << id << "out of range for" << doObjectCount() << "entries", {}); - return doObjectName(id); + Containers::String name = doObjectName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::objectName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doObjectName(UnsignedLong) { return {}; } +Containers::String AbstractImporter::doObjectName(UnsignedLong) { return {}; } Containers::Optional AbstractImporter::scene(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::scene(): no file opened", {}); @@ -361,7 +373,7 @@ Containers::Optional AbstractImporter::doScene(UnsignedInt) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::scene(): not implemented", {}); } -Containers::Optional AbstractImporter::scene(const std::string& name) { +Containers::Optional AbstractImporter::scene(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::scene(): no file opened", {}); const Int id = doSceneForName(name); if(id == -1) { @@ -371,24 +383,27 @@ Containers::Optional AbstractImporter::scene(const std::string& name) return scene(id); /* not doScene(), so we get the range checks also */ } -SceneField AbstractImporter::sceneFieldForName(const std::string& name) { +SceneField AbstractImporter::sceneFieldForName(const Containers::StringView name) { const SceneField out = doSceneFieldForName(name); CORRADE_ASSERT(out == SceneField{} || isSceneFieldCustom(out), "Trade::AbstractImporter::sceneFieldForName(): implementation-returned" << out << "is neither custom nor invalid", {}); return out; } -SceneField AbstractImporter::doSceneFieldForName(const std::string&) { +SceneField AbstractImporter::doSceneFieldForName(const Containers::StringView) { return {}; } -std::string AbstractImporter::sceneFieldName(SceneField name) { +Containers::String AbstractImporter::sceneFieldName(SceneField name) { CORRADE_ASSERT(isSceneFieldCustom(name), "Trade::AbstractImporter::sceneFieldName():" << name << "is not custom", {}); - return doSceneFieldName(sceneFieldCustom(name)); + Containers::String out = doSceneFieldName(sceneFieldCustom(name)); + CORRADE_ASSERT(out.isSmall() || !out.deleter(), + "Trade::AbstractImporter::sceneFieldName(): implementation is not allowed to use a custom String deleter", {}); + return out; } -std::string AbstractImporter::doSceneFieldName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doSceneFieldName(UnsignedInt) { return {}; } UnsignedInt AbstractImporter::animationCount() const { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::animationCount(): no file opened", {}); @@ -397,7 +412,7 @@ UnsignedInt AbstractImporter::animationCount() const { UnsignedInt AbstractImporter::doAnimationCount() const { return 0; } -Int AbstractImporter::animationForName(const std::string& name) { +Int AbstractImporter::animationForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::animationForName(): no file opened", {}); const Int id = doAnimationForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doAnimationCount(), @@ -405,15 +420,18 @@ Int AbstractImporter::animationForName(const std::string& name) { return id; } -Int AbstractImporter::doAnimationForName(const std::string&) { return -1; } +Int AbstractImporter::doAnimationForName(Containers::StringView) { return -1; } -std::string AbstractImporter::animationName(const UnsignedInt id) { +Containers::String AbstractImporter::animationName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::animationName(): no file opened", {}); CORRADE_ASSERT(id < doAnimationCount(), "Trade::AbstractImporter::animationName(): index" << id << "out of range for" << doAnimationCount() << "entries", {}); - return doAnimationName(id); + Containers::String name = doAnimationName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::animationName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doAnimationName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doAnimationName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::animation(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::animation(): no file opened", {}); @@ -430,7 +448,7 @@ Containers::Optional AbstractImporter::doAnimation(UnsignedInt) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::animation(): not implemented", {}); } -Containers::Optional AbstractImporter::animation(const std::string& name) { +Containers::Optional AbstractImporter::animation(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::animation(): no file opened", {}); const Int id = doAnimationForName(name); if(id == -1) { @@ -447,7 +465,7 @@ UnsignedInt AbstractImporter::lightCount() const { UnsignedInt AbstractImporter::doLightCount() const { return 0; } -Int AbstractImporter::lightForName(const std::string& name) { +Int AbstractImporter::lightForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::lightForName(): no file opened", {}); const Int id = doLightForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doLightCount(), @@ -455,15 +473,18 @@ Int AbstractImporter::lightForName(const std::string& name) { return id; } -Int AbstractImporter::doLightForName(const std::string&) { return -1; } +Int AbstractImporter::doLightForName(Containers::StringView) { return -1; } -std::string AbstractImporter::lightName(const UnsignedInt id) { +Containers::String AbstractImporter::lightName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::lightName(): no file opened", {}); CORRADE_ASSERT(id < doLightCount(), "Trade::AbstractImporter::lightName(): index" << id << "out of range for" << doLightCount() << "entries", {}); - return doLightName(id); + Containers::String name = doLightName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::lightName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doLightName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doLightName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::light(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::light(): no file opened", {}); @@ -475,7 +496,7 @@ Containers::Optional AbstractImporter::doLight(UnsignedInt) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::light(): not implemented", {}); } -Containers::Optional AbstractImporter::light(const std::string& name) { +Containers::Optional AbstractImporter::light(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::light(): no file opened", {}); const Int id = doLightForName(name); if(id == -1) { @@ -492,7 +513,7 @@ UnsignedInt AbstractImporter::cameraCount() const { UnsignedInt AbstractImporter::doCameraCount() const { return 0; } -Int AbstractImporter::cameraForName(const std::string& name) { +Int AbstractImporter::cameraForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::cameraForName(): no file opened", {}); const Int id = doCameraForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doCameraCount(), @@ -500,15 +521,18 @@ Int AbstractImporter::cameraForName(const std::string& name) { return id; } -Int AbstractImporter::doCameraForName(const std::string&) { return -1; } +Int AbstractImporter::doCameraForName(Containers::StringView) { return -1; } -std::string AbstractImporter::cameraName(const UnsignedInt id) { +Containers::String AbstractImporter::cameraName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::cameraName(): no file opened", {}); CORRADE_ASSERT(id < doCameraCount(), "Trade::AbstractImporter::cameraName(): index" << id << "out of range for" << doCameraCount() << "entries", {}); - return doCameraName(id); + Containers::String name = doCameraName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::cameraName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doCameraName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doCameraName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::camera(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::camera(): no file opened", {}); @@ -520,7 +544,7 @@ Containers::Optional AbstractImporter::doCamera(UnsignedInt) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::camera(): not implemented", {}); } -Containers::Optional AbstractImporter::camera(const std::string& name) { +Containers::Optional AbstractImporter::camera(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::camera(): no file opened", {}); const Int id = doCameraForName(name); if(id == -1) { @@ -951,7 +975,7 @@ UnsignedInt AbstractImporter::skin2DCount() const { UnsignedInt AbstractImporter::doSkin2DCount() const { return 0; } -Int AbstractImporter::skin2DForName(const std::string& name) { +Int AbstractImporter::skin2DForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin2DForName(): no file opened", {}); const Int id = doSkin2DForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doSkin2DCount(), @@ -959,15 +983,18 @@ Int AbstractImporter::skin2DForName(const std::string& name) { return id; } -Int AbstractImporter::doSkin2DForName(const std::string&) { return -1; } +Int AbstractImporter::doSkin2DForName(Containers::StringView) { return -1; } -std::string AbstractImporter::skin2DName(const UnsignedInt id) { +Containers::String AbstractImporter::skin2DName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin2DName(): no file opened", {}); CORRADE_ASSERT(id < doSkin2DCount(), "Trade::AbstractImporter::skin2DName(): index" << id << "out of range for" << doSkin2DCount() << "entries", {}); - return doSkin2DName(id); + Containers::String name = doSkin2DName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::skin2DName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doSkin2DName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doSkin2DName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::skin2D(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin2D(): no file opened", {}); @@ -984,7 +1011,7 @@ Containers::Optional AbstractImporter::doSkin2D(UnsignedInt) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::skin2D(): not implemented", {}); } -Containers::Optional AbstractImporter::skin2D(const std::string& name) { +Containers::Optional AbstractImporter::skin2D(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin2D(): no file opened", {}); const Int id = doSkin2DForName(name); if(id == -1) { @@ -1001,7 +1028,7 @@ UnsignedInt AbstractImporter::skin3DCount() const { UnsignedInt AbstractImporter::doSkin3DCount() const { return 0; } -Int AbstractImporter::skin3DForName(const std::string& name) { +Int AbstractImporter::skin3DForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin3DForName(): no file opened", {}); const Int id = doSkin3DForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doSkin3DCount(), @@ -1009,15 +1036,18 @@ Int AbstractImporter::skin3DForName(const std::string& name) { return id; } -Int AbstractImporter::doSkin3DForName(const std::string&) { return -1; } +Int AbstractImporter::doSkin3DForName(Containers::StringView) { return -1; } -std::string AbstractImporter::skin3DName(const UnsignedInt id) { +Containers::String AbstractImporter::skin3DName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin3DName(): no file opened", {}); CORRADE_ASSERT(id < doSkin3DCount(), "Trade::AbstractImporter::skin3DName(): index" << id << "out of range for" << doSkin3DCount() << "entries", {}); - return doSkin3DName(id); + Containers::String name = doSkin3DName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::skin3DName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doSkin3DName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doSkin3DName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::skin3D(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin3D(): no file opened", {}); @@ -1034,7 +1064,7 @@ Containers::Optional AbstractImporter::doSkin3D(UnsignedInt) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::skin3D(): not implemented", {}); } -Containers::Optional AbstractImporter::skin3D(const std::string& name) { +Containers::Optional AbstractImporter::skin3D(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::skin3D(): no file opened", {}); const Int id = doSkin3DForName(name); if(id == -1) { @@ -1061,7 +1091,7 @@ UnsignedInt AbstractImporter::meshLevelCount(const UnsignedInt id) { UnsignedInt AbstractImporter::doMeshLevelCount(UnsignedInt) { return 1; } -Int AbstractImporter::meshForName(const std::string& name) { +Int AbstractImporter::meshForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::meshForName(): no file opened", {}); const Int id = doMeshForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doMeshCount(), @@ -1069,15 +1099,18 @@ Int AbstractImporter::meshForName(const std::string& name) { return id; } -Int AbstractImporter::doMeshForName(const std::string&) { return -1; } +Int AbstractImporter::doMeshForName(Containers::StringView) { return -1; } -std::string AbstractImporter::meshName(const UnsignedInt id) { +Containers::String AbstractImporter::meshName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::meshName(): no file opened", {}); CORRADE_ASSERT(id < doMeshCount(), "Trade::AbstractImporter::meshName(): index" << id << "out of range for" << doMeshCount() << "entries", {}); - return doMeshName(id); + Containers::String name = doMeshName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::meshName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doMeshName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doMeshName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::mesh(const UnsignedInt id, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh(): no file opened", {}); @@ -1106,7 +1139,7 @@ Containers::Optional AbstractImporter::doMesh(UnsignedInt, UnsignedInt CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::mesh(): not implemented", {}); } -Containers::Optional AbstractImporter::mesh(const std::string& name, const UnsignedInt level) { +Containers::Optional AbstractImporter::mesh(const Containers::StringView name, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::mesh(): no file opened", {}); const Int id = doMeshForName(name); if(id == -1) { @@ -1116,24 +1149,27 @@ Containers::Optional AbstractImporter::mesh(const std::string& name, c return mesh(id, level); /* not doMesh(), so we get the checks also */ } -MeshAttribute AbstractImporter::meshAttributeForName(const std::string& name) { +MeshAttribute AbstractImporter::meshAttributeForName(const Containers::StringView name) { const MeshAttribute out = doMeshAttributeForName(name); CORRADE_ASSERT(out == MeshAttribute{} || isMeshAttributeCustom(out), "Trade::AbstractImporter::meshAttributeForName(): implementation-returned" << out << "is neither custom nor invalid", {}); return out; } -MeshAttribute AbstractImporter::doMeshAttributeForName(const std::string&) { +MeshAttribute AbstractImporter::doMeshAttributeForName(Containers::StringView) { return {}; } -std::string AbstractImporter::meshAttributeName(MeshAttribute name) { +Containers::String AbstractImporter::meshAttributeName(MeshAttribute name) { CORRADE_ASSERT(isMeshAttributeCustom(name), "Trade::AbstractImporter::meshAttributeName():" << name << "is not custom", {}); - return doMeshAttributeName(meshAttributeCustom(name)); + Containers::String out = doMeshAttributeName(meshAttributeCustom(name)); + CORRADE_ASSERT(out.isSmall() || !out.deleter(), + "Trade::AbstractImporter::meshAttributeName(): implementation is not allowed to use a custom String deleter", {}); + return out; } -std::string AbstractImporter::doMeshAttributeName(UnsignedShort) { return {}; } +Containers::String AbstractImporter::doMeshAttributeName(UnsignedShort) { return {}; } #ifdef MAGNUM_BUILD_DEPRECATED UnsignedInt AbstractImporter::mesh2DCount() const { @@ -1232,7 +1268,7 @@ UnsignedInt AbstractImporter::materialCount() const { UnsignedInt AbstractImporter::doMaterialCount() const { return 0; } -Int AbstractImporter::materialForName(const std::string& name) { +Int AbstractImporter::materialForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::materialForName(): no file opened", {}); const Int id = doMaterialForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doMaterialCount(), @@ -1240,15 +1276,18 @@ Int AbstractImporter::materialForName(const std::string& name) { return id; } -Int AbstractImporter::doMaterialForName(const std::string&) { return -1; } +Int AbstractImporter::doMaterialForName(Containers::StringView) { return -1; } -std::string AbstractImporter::materialName(const UnsignedInt id) { +Containers::String AbstractImporter::materialName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::materialName(): no file opened", {}); CORRADE_ASSERT(id < doMaterialCount(), "Trade::AbstractImporter::materialName(): index" << id << "out of range for" << doMaterialCount() << "entries", {}); - return doMaterialName(id); + Containers::String name = doMaterialName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::materialName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doMaterialName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doMaterialName(UnsignedInt) { return {}; } #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT) Containers::Optional @@ -1282,7 +1321,7 @@ Containers::Optional #else Implementation::OptionalButAlsoPointer #endif -AbstractImporter::material(const std::string& name) { +AbstractImporter::material(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::material(): no file opened", {}); const Int id = doMaterialForName(name); if(id == -1) { @@ -1299,7 +1338,7 @@ UnsignedInt AbstractImporter::textureCount() const { UnsignedInt AbstractImporter::doTextureCount() const { return 0; } -Int AbstractImporter::textureForName(const std::string& name) { +Int AbstractImporter::textureForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::textureForName(): no file opened", {}); const Int id = doTextureForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doTextureCount(), @@ -1307,15 +1346,18 @@ Int AbstractImporter::textureForName(const std::string& name) { return id; } -Int AbstractImporter::doTextureForName(const std::string&) { return -1; } +Int AbstractImporter::doTextureForName(Containers::StringView) { return -1; } -std::string AbstractImporter::textureName(const UnsignedInt id) { +Containers::String AbstractImporter::textureName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::textureName(): no file opened", {}); CORRADE_ASSERT(id < doTextureCount(), "Trade::AbstractImporter::textureName(): index" << id << "out of range for" << doTextureCount() << "entries", {}); - return doTextureName(id); + Containers::String name = doTextureName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::textureName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doTextureName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doTextureName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::texture(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::texture(): no file opened", {}); @@ -1327,7 +1369,7 @@ Containers::Optional AbstractImporter::doTexture(UnsignedInt) { CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::texture(): not implemented", {}); } -Containers::Optional AbstractImporter::texture(const std::string& name) { +Containers::Optional AbstractImporter::texture(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::texture(): no file opened", {}); const Int id = doTextureForName(name); if(id == -1) { @@ -1354,7 +1396,7 @@ UnsignedInt AbstractImporter::image1DLevelCount(const UnsignedInt id) { UnsignedInt AbstractImporter::doImage1DLevelCount(UnsignedInt) { return 1; } -Int AbstractImporter::image1DForName(const std::string& name) { +Int AbstractImporter::image1DForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1DForName(): no file opened", {}); const Int id = doImage1DForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doImage1DCount(), @@ -1362,15 +1404,18 @@ Int AbstractImporter::image1DForName(const std::string& name) { return id; } -Int AbstractImporter::doImage1DForName(const std::string&) { return -1; } +Int AbstractImporter::doImage1DForName(Containers::StringView) { return -1; } -std::string AbstractImporter::image1DName(const UnsignedInt id) { +Containers::String AbstractImporter::image1DName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1DName(): no file opened", {}); CORRADE_ASSERT(id < doImage1DCount(), "Trade::AbstractImporter::image1DName(): index" << id << "out of range for" << doImage1DCount() << "entries", {}); - return doImage1DName(id); + Containers::String name = doImage1DName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::image1DName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doImage1DName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doImage1DName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::image1D(const UnsignedInt id, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1D(): no file opened", {}); @@ -1396,7 +1441,7 @@ Containers::Optional AbstractImporter::doImage1D(UnsignedInt, Unsig CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::image1D(): not implemented", {}); } -Containers::Optional AbstractImporter::image1D(const std::string& name, const UnsignedInt level) { +Containers::Optional AbstractImporter::image1D(const Containers::StringView name, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image1D(): no file opened", {}); const Int id = doImage1DForName(name); if(id == -1) { @@ -1424,7 +1469,7 @@ UnsignedInt AbstractImporter::image2DLevelCount(const UnsignedInt id) { UnsignedInt AbstractImporter::doImage2DLevelCount(UnsignedInt) { return 1; } -Int AbstractImporter::image2DForName(const std::string& name) { +Int AbstractImporter::image2DForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2DForName(): no file opened", {}); const Int id = doImage2DForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doImage2DCount(), @@ -1432,15 +1477,18 @@ Int AbstractImporter::image2DForName(const std::string& name) { return id; } -Int AbstractImporter::doImage2DForName(const std::string&) { return -1; } +Int AbstractImporter::doImage2DForName(Containers::StringView) { return -1; } -std::string AbstractImporter::image2DName(const UnsignedInt id) { +Containers::String AbstractImporter::image2DName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2DName(): no file opened", {}); CORRADE_ASSERT(id < doImage2DCount(), "Trade::AbstractImporter::image2DName(): index" << id << "out of range for" << doImage2DCount() << "entries", {}); - return doImage2DName(id); + Containers::String name = doImage2DName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::image2DName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doImage2DName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doImage2DName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::image2D(const UnsignedInt id, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2D(): no file opened", {}); @@ -1466,7 +1514,7 @@ Containers::Optional AbstractImporter::doImage2D(UnsignedInt, Unsig CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::image2D(): not implemented", {}); } -Containers::Optional AbstractImporter::image2D(const std::string& name, const UnsignedInt level) { +Containers::Optional AbstractImporter::image2D(const Containers::StringView name, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image2D(): no file opened", {}); const Int id = doImage2DForName(name); if(id == -1) { @@ -1494,7 +1542,7 @@ UnsignedInt AbstractImporter::image3DLevelCount(const UnsignedInt id) { UnsignedInt AbstractImporter::doImage3DLevelCount(UnsignedInt) { return 1; } -Int AbstractImporter::image3DForName(const std::string& name) { +Int AbstractImporter::image3DForName(const Containers::StringView name) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3DForName(): no file opened", {}); const Int id = doImage3DForName(name); CORRADE_ASSERT(id == -1 || UnsignedInt(id) < doImage3DCount(), @@ -1502,15 +1550,18 @@ Int AbstractImporter::image3DForName(const std::string& name) { return id; } -Int AbstractImporter::doImage3DForName(const std::string&) { return -1; } +Int AbstractImporter::doImage3DForName(Containers::StringView) { return -1; } -std::string AbstractImporter::image3DName(const UnsignedInt id) { +Containers::String AbstractImporter::image3DName(const UnsignedInt id) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3DName(): no file opened", {}); CORRADE_ASSERT(id < doImage3DCount(), "Trade::AbstractImporter::image3DName(): index" << id << "out of range for" << doImage3DCount() << "entries", {}); - return doImage3DName(id); + Containers::String name = doImage3DName(id); + CORRADE_ASSERT(name.isSmall() || !name.deleter(), + "Trade::AbstractImporter::image3DName(): implementation is not allowed to use a custom String deleter", {}); + return name; } -std::string AbstractImporter::doImage3DName(UnsignedInt) { return {}; } +Containers::String AbstractImporter::doImage3DName(UnsignedInt) { return {}; } Containers::Optional AbstractImporter::image3D(const UnsignedInt id, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3D(): no file opened", {}); @@ -1536,7 +1587,7 @@ Containers::Optional AbstractImporter::doImage3D(UnsignedInt, Unsig CORRADE_ASSERT_UNREACHABLE("Trade::AbstractImporter::image3D(): not implemented", {}); } -Containers::Optional AbstractImporter::image3D(const std::string& name, const UnsignedInt level) { +Containers::Optional AbstractImporter::image3D(const Containers::StringView name, const UnsignedInt level) { CORRADE_ASSERT(isOpened(), "Trade::AbstractImporter::image3D(): no file opened", {}); const Int id = doImage3DForName(name); if(id == -1) { diff --git a/src/Magnum/Trade/AbstractImporter.h b/src/Magnum/Trade/AbstractImporter.h index 2f387fade..ac27f2c66 100644 --- a/src/Magnum/Trade/AbstractImporter.h +++ b/src/Magnum/Trade/AbstractImporter.h @@ -29,7 +29,6 @@ * @brief Class @ref Magnum::Trade::AbstractImporter, enum @ref Magnum::Trade::ImporterFeature, enum set @ref Magnum::Trade::ImporterFeatures */ -#include /** @todo remove once openState() doesn't have a default std::string argument */ #include #include @@ -38,6 +37,9 @@ #include "Magnum/Trade/visibility.h" #ifdef MAGNUM_BUILD_DEPRECATED +/* For APIs that used to take or return a std::string */ +#include + #include "Magnum/FileCallback.h" #endif @@ -286,33 +288,34 @@ the name to an IDs first. In that case the function will return an empty name doesn't exist. - Animation names can be retrieved using @ref animationName() and mapped to - an ID using @ref animationForName(), imported with @ref animation(const std::string&) + an ID using @ref animationForName(), imported with + @ref animation(Containers::StringView) - Camera names using @ref cameraName() & @ref cameraForName(), imported with - @ref camera(const std::string&) + @ref camera(Containers::StringView) - Image names using @ref image1DName() / @ref image2DName() / @ref image3DName() & @ref image1DForName() / @ref image2DForName() / @ref image3DForName(), imported with - @ref image1D(const std::string&, UnsignedInt) / - @ref image2D(const std::string&, UnsignedInt) / - @ref image3D(const std::string&, UnsignedInt) + @ref image1D(Containers::StringView, UnsignedInt) / + @ref image2D(Containers::StringView, UnsignedInt) / + @ref image3D(Containers::StringView, UnsignedInt) - Light names using @ref lightName() & @ref lightForName(), imported with - @ref light(const std::string&) + @ref light(Containers::StringView) - Material names using @ref materialName() & @ref materialForName(), imported - with @ref material(const std::string&) + with @ref material(Containers::StringView) - Mesh names using @ref meshName() & @ref meshForName(), imported with - @ref mesh(const std::string&, UnsignedInt). Meshes themselves can have + @ref mesh(Containers::StringView, UnsignedInt). Meshes themselves can have custom attributes, for which the name mapping can be retrieved using @ref meshAttributeName() and @ref meshAttributeForName(). - Scene and object names using @ref sceneName() / @ref objectName() & @ref sceneForName() / @ref objectForName(), imported with - @ref scene(const std::string&). Scenes themselves can have custom fields, - for which the name mapping can be retrieved using @ref sceneFieldName() and - @ref sceneFieldForName(). + @ref scene(Containers::StringView). Scenes themselves can have custom + fields, for which the name mapping can be retrieved using + @ref sceneFieldName() and @ref sceneFieldForName(). - Skin names using @ref skin2DName() / @ref skin3DName() & @ref skin2DForName() / @ref skin3DForName(), imported with - @ref skin2D(const std::string&) / @ref skin3D(const std::string&) + @ref skin2D(Containers::StringView) / @ref skin3D(Containers::StringView) - Texture names using @ref textureName() & @ref textureForName(), imported - with @ref texture(const std::string&) + with @ref texture(Containers::StringView) @subsection Trade-AbstractImporter-usage-state Internal importer state @@ -352,12 +355,13 @@ The `*Data` instances returned from various functions *by design* have no dependency on the importer instance and neither on the dynamic plugin module. In other words, you don't need to keep the importer instance (or the plugin manager instance) around in order to have the `*Data` instances valid. -Moreover, all @relativeref{Corrade,Containers::Array} instances returned -through @ref ImageData, @ref AnimationData, @ref MaterialData, @ref MeshData -and @ref SkinData are only allowed to have default deleters (or be non-owning -instances created from @relativeref{Corrade,Containers::ArrayView}) --- this is -to avoid potential dangling function pointer calls when destructing such -instances after the plugin module has been unloaded. +Moreover, all returned @ref Corrade::Containers::String instances and all @relativeref{Corrade,Containers::Array} instances returned through +@ref SceneData, @ref ImageData, @ref AnimationData, @ref MaterialData, +@ref MeshData and @ref SkinData are only allowed to have default deleters (or +be non-owning instances created from +@relativeref{Corrade,Containers::ArrayView}) --- this is to avoid potential +dangling function pointer calls when destructing such instances after the +plugin module has been unloaded. The only exception are various `importerState()` functions @ref Trade-AbstractImporter-usage-state "described above", but in that case the @@ -671,7 +675,12 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @see @ref features(), @ref openData(), @ref openMemory(), * @ref openFile() */ - bool openState(const void* state, const std::string& filePath = {}); + #ifdef DOXYGEN_GENERATING_OUTPUT + bool openState(const void* state, Containers::StringView filePath = {}); + #else + bool openState(const void* state, Containers::StringView filePath); + bool openState(const void* state); + #endif /** * @brief Open a file @@ -686,7 +695,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @see @ref features(), @ref openData(), @ref openMemory(), * @ref openState() */ - bool openFile(const std::string& filename); + bool openFile(Containers::StringView filename); /** * @brief Close currently opened file @@ -734,9 +743,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * no scene for given name exists * * Expects that a file is opened. - * @see @ref sceneName(), @ref scene(const std::string&) + * @see @ref sceneName(), @ref scene(Containers::StringView) */ - Int sceneForName(const std::string& name); + Int sceneForName(Containers::StringView name); /** * @brief Object ID for given name @@ -746,7 +755,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * object can be present in multiple scenes at the same time. * @see @ref objectName() */ - Long objectForName(const std::string& name); + Long objectForName(Containers::StringView name); /** * @brief Scene name @@ -756,7 +765,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * names, returns an empty string. Expects that a file is opened. * @see @ref sceneForName() */ - std::string sceneName(UnsignedInt id); + Containers::String sceneName(UnsignedInt id); /** * @brief Object name @@ -768,7 +777,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * Expects that a file is opened. * @see @ref objectForName() */ - std::string objectName(UnsignedLong id); + Containers::String objectName(UnsignedLong id); /** * @brief Scene @@ -776,7 +785,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given scene or @ref Containers::NullOpt if import failed. * Expects that a file is opened. - * @see @ref scene(const std::string&) + * @see @ref scene(Containers::StringView) */ Containers::Optional scene(UnsignedInt id); @@ -790,7 +799,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * otherwise propagates the result from @ref scene(UnsignedInt). * Expects that a file is opened. */ - Containers::Optional scene(const std::string& name); + Containers::Optional scene(Containers::StringView name); /** * @brief Scene field for given name @@ -803,7 +812,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * documentation of a particular importer for more information. * @see @ref isSceneFieldCustom() */ - SceneField sceneFieldForName(const std::string& name); + SceneField sceneFieldForName(Containers::StringView name); /** * @brief String name for given custom scene field @@ -818,7 +827,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * particular importer for more information. * @see @ref isSceneFieldCustom() */ - std::string sceneFieldName(SceneField name); + Containers::String sceneFieldName(SceneField name); /** * @brief Animation count @@ -833,9 +842,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @cpp -1 @ce if no animation for given name exists * * Expects that a file is opened. - * @see @ref animationName(), @ref animation(const std::string&) + * @see @ref animationName(), @ref animation(Containers::StringView) */ - Int animationForName(const std::string& name); + Int animationForName(Containers::StringView name); /** * @brief Animation name @@ -845,7 +854,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * importer doesn't support animation names, returns an empty string. * @see @ref animationForName() */ - std::string animationName(UnsignedInt id); + Containers::String animationName(UnsignedInt id); /** * @brief Animation @@ -853,7 +862,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given animation or @ref Containers::NullOpt if importing * failed. Expects that a file is opened. - * @see @ref animation(const std::string&) + * @see @ref animation(Containers::StringView) */ Containers::Optional animation(UnsignedInt id); @@ -867,7 +876,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref Containers::NullOpt, otherwise propagates the result from * @ref animation(UnsignedInt). Expects that a file is opened. */ - Containers::Optional animation(const std::string& name); + Containers::Optional animation(Containers::StringView name); /** * @brief Light count @@ -882,9 +891,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * no light for given name exists * * Expects that a file is opened. - * @see @ref lightName(), @ref light(const std::string&) + * @see @ref lightName(), @ref light(Containers::StringView) */ - Int lightForName(const std::string& name); + Int lightForName(Containers::StringView name); /** * @brief Light name @@ -894,7 +903,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * importer doesn't support light names, returns an empty string. * @see @ref lightForName() */ - std::string lightName(UnsignedInt id); + Containers::String lightName(UnsignedInt id); /** * @brief Light @@ -902,7 +911,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given light or @ref Containers::NullOpt if importing failed. * Expects that a file is opened. - * @see @ref light(const std::string&) + * @see @ref light(Containers::StringView) */ Containers::Optional light(UnsignedInt id); @@ -916,7 +925,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * otherwise propagates the result from @ref light(UnsignedInt). * Expects that a file is opened. */ - Containers::Optional light(const std::string& name); + Containers::Optional light(Containers::StringView name); /** * @brief Camera count @@ -931,9 +940,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * if no camera for given name exists * * Expects that a file is opened. - * @see @ref cameraName(), @ref camera(const std::string&) + * @see @ref cameraName(), @ref camera(Containers::StringView) */ - Int cameraForName(const std::string& name); + Int cameraForName(Containers::StringView name); /** * @brief Camera name @@ -943,7 +952,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * importer doesn't support camera names, returns an empty string. * @see @ref cameraForName() */ - std::string cameraName(UnsignedInt id); + Containers::String cameraName(UnsignedInt id); /** * @brief Camera @@ -951,7 +960,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given camera or @ref Containers::NullOpt if importing * failed. Expects that a file is opened. - * @see @ref camera(const std::string&) + * @see @ref camera(Containers::StringView) */ Containers::Optional camera(UnsignedInt id); @@ -965,7 +974,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref Containers::NullOpt, otherwise propagates the result from * @ref camera(UnsignedInt). Expects that a file is opened. */ - Containers::Optional camera(const std::string& name); + Containers::Optional camera(Containers::StringView name); #ifdef MAGNUM_BUILD_DEPRECATED /** @@ -1114,9 +1123,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @m_since_latest * * Expects that a file is opened. - * @see @ref skin2DName(), @ref skin2D(const std::string&) + * @see @ref skin2DName(), @ref skin2D(Containers::StringView) */ - Int skin2DForName(const std::string& name); + Int skin2DForName(Containers::StringView name); /** * @brief Two-dimensional skin name @@ -1127,7 +1136,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * returns an empty string. Expects that a file is opened. * @see @ref skin2DForName() */ - std::string skin2DName(UnsignedInt id); + Containers::String skin2DName(UnsignedInt id); /** * @brief Two-dimensional skin @@ -1136,7 +1145,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given skin or @ref Containers::NullOpt if importing failed. * Expects that a file is opened. - * @see @ref skin2D(const std::string&) + * @see @ref skin2D(Containers::StringView) */ Containers::Optional skin2D(UnsignedInt id); @@ -1150,7 +1159,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref Containers::NullOpt, otherwise propagates the result from * @ref skin2D(UnsignedInt). Expects that a file is opened. */ - Containers::Optional skin2D(const std::string& name); + Containers::Optional skin2D(Containers::StringView name); /** * @brief Three-dimensional skin count @@ -1167,9 +1176,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @m_since_latest * * Expects that a file is opened. - * @see @ref skin3DName(), @ref skin3D(const std::string&) + * @see @ref skin3DName(), @ref skin3D(Containers::StringView) */ - Int skin3DForName(const std::string& name); + Int skin3DForName(Containers::StringView name); /** * @brief Three-dimensional skin name @@ -1180,7 +1189,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * returns an empty string. Expects that a file is opened. * @see @ref skin3DForName() */ - std::string skin3DName(UnsignedInt id); + Containers::String skin3DName(UnsignedInt id); /** * @brief Three-dimensional skin @@ -1189,7 +1198,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given skin or @ref Containers::NullOpt if importing failed. * Expects that a file is opened. - * @see @ref skin3D(const std::string&) + * @see @ref skin3D(Containers::StringView) */ Containers::Optional skin3D(UnsignedInt id); @@ -1203,7 +1212,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref Containers::NullOpt, otherwise propagates the result from * @ref skin3D(UnsignedInt). Expects that a file is opened. */ - Containers::Optional skin3D(const std::string& name); + Containers::Optional skin3D(Containers::StringView name); /** * @brief Mesh count @@ -1231,9 +1240,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @m_since{2020,06} * * Expects that a file is opened. - * @see @ref meshName(), @ref mesh(const std::string&, UnsignedInt) + * @see @ref meshName(), @ref mesh(Containers::StringView, UnsignedInt) */ - Int meshForName(const std::string& name); + Int meshForName(Containers::StringView name); /** * @brief Mesh name @@ -1244,7 +1253,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * returns an empty string. Expects that a file is opened. * @see @ref meshForName() */ - std::string meshName(UnsignedInt id); + Containers::String meshName(UnsignedInt id); /** * @brief Mesh @@ -1257,7 +1266,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * largely left as importer-specific --- for example allowing access to * per-instance, per-face or per-edge data. Expects that a file is * opened. - * @see @ref mesh(const std::string&, UnsignedInt), + * @see @ref mesh(Containers::StringView, UnsignedInt), * @ref MeshPrimitive::Instances, @ref MeshPrimitive::Faces, * @ref MeshPrimitive::Edges */ @@ -1273,7 +1282,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref Containers::NullOpt, otherwise propagates the result from * @ref mesh(UnsignedInt, UnsignedInt). Expects that a file is opened. */ - Containers::Optional mesh(const std::string& name, UnsignedInt level = 0); + Containers::Optional mesh(Containers::StringView name, UnsignedInt level = 0); /** * @brief Mesh attribute for given name @@ -1286,7 +1295,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * see documentation of a particular importer for more information. * @see @ref isMeshAttributeCustom() */ - MeshAttribute meshAttributeForName(const std::string& name); + MeshAttribute meshAttributeForName(Containers::StringView name); /** * @brief String name for given custom mesh attribute @@ -1301,7 +1310,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * particular importer for more information. * @see @ref isMeshAttributeCustom() */ - std::string meshAttributeName(MeshAttribute name); + Containers::String meshAttributeName(MeshAttribute name); #ifdef MAGNUM_BUILD_DEPRECATED /** @@ -1400,7 +1409,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * Expects that a file is opened. * @see @ref materialName() */ - Int materialForName(const std::string& name); + Int materialForName(Containers::StringView name); /** * @brief Material name @@ -1408,9 +1417,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * If the material has no name or the importer doesn't support material * names, returns an empty string. Expects that a file is opened. - * @see @ref materialForName(), @ref material(const std::string&) + * @see @ref materialForName(), @ref material(Containers::StringView) */ - std::string materialName(UnsignedInt id); + Containers::String materialName(UnsignedInt id); /** * @brief Material @@ -1418,7 +1427,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given material or @ref Containers::NullOpt if importing * failed. Expects that a file is opened. - * @see @ref material(const std::string&) + * @see @ref material(Containers::StringView) */ #if !defined(MAGNUM_BUILD_DEPRECATED) || defined(DOXYGEN_GENERATING_OUTPUT) Containers::Optional @@ -1442,7 +1451,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi #else Implementation::OptionalButAlsoPointer #endif - material(const std::string& name); + material(Containers::StringView name); /** * @brief Texture count @@ -1457,9 +1466,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @cpp -1 @ce if no texture for given name exists * * Expects that a file is opened. - * @see @ref textureName(), @ref texture(const std::string&) + * @see @ref textureName(), @ref texture(Containers::StringView) */ - Int textureForName(const std::string& name); + Int textureForName(Containers::StringView name); /** * @brief Texture name @@ -1469,7 +1478,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * names, returns an empty string. Expects that a file is opened. * @see @ref textureForName() */ - std::string textureName(UnsignedInt id); + Containers::String textureName(UnsignedInt id); /** * @brief Texture @@ -1477,7 +1486,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given texture or @ref Containers::NullOpt if importing * failed. Expects that a file is opened. - * @see @ref texture(const std::string&) + * @see @ref texture(Containers::StringView) */ Containers::Optional texture(UnsignedInt id); @@ -1491,7 +1500,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref Containers::NullOpt, otherwise propagates the result from * @ref texture(UnsignedInt). Expects that a file is opened. */ - Containers::Optional texture(const std::string& name); + Containers::Optional texture(Containers::StringView name); /** * @brief One-dimensional image count @@ -1517,9 +1526,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * if no image for given name exists * * Expects that a file is opened. - * @see @ref image1DName(), @ref image1D(const std::string&, UnsignedInt) + * @see @ref image1DName(), @ref image1D(Containers::StringView, UnsignedInt) */ - Int image1DForName(const std::string& name); + Int image1DForName(Containers::StringView name); /** * @brief One-dimensional image name @@ -1529,7 +1538,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * names, returns an empty string. Expects that a file is opened. * @see @ref image1DForName() */ - std::string image1DName(UnsignedInt id); + Containers::String image1DName(UnsignedInt id); /** * @brief One-dimensional image @@ -1538,7 +1547,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given image or @ref Containers::NullOpt if importing failed. * Expects that a file is opened. - * @see @ref image1D(const std::string&, UnsignedInt) + * @see @ref image1D(Containers::StringView, UnsignedInt) */ Containers::Optional image1D(UnsignedInt id, UnsignedInt level = 0); @@ -1553,7 +1562,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref image1D(UnsignedInt, UnsignedInt). Expects that a file is * opened. */ - Containers::Optional image1D(const std::string& name, UnsignedInt level = 0); + Containers::Optional image1D(Containers::StringView name, UnsignedInt level = 0); /** * @brief Two-dimensional image count @@ -1579,9 +1588,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * if no image for given name exists * * Expects that a file is opened. - * @see @ref image2DName(), @ref image2D(const std::string&, UnsignedInt) + * @see @ref image2DName(), @ref image2D(Containers::StringView, UnsignedInt) */ - Int image2DForName(const std::string& name); + Int image2DForName(Containers::StringView name); /** * @brief Two-dimensional image name @@ -1591,7 +1600,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * names, returns an empty string. Expects that a file is opened. * @see @ref image2DForName() */ - std::string image2DName(UnsignedInt id); + Containers::String image2DName(UnsignedInt id); /** * @brief Two-dimensional image @@ -1600,7 +1609,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given image or @ref Containers::NullOpt if importing failed. * Expects that a file is opened. - * @see @ref image2D(const std::string&, UnsignedInt) + * @see @ref image2D(Containers::StringView, UnsignedInt) */ Containers::Optional image2D(UnsignedInt id, UnsignedInt level = 0); @@ -1615,7 +1624,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref image2D(UnsignedInt, UnsignedInt). Expects that a file is * opened. */ - Containers::Optional image2D(const std::string& name, UnsignedInt level = 0); + Containers::Optional image2D(Containers::StringView name, UnsignedInt level = 0); /** * @brief Three-dimensional image count @@ -1641,9 +1650,9 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * if no image for given name exists * * Expects that a file is opened. - * @see @ref image3DName(), @ref image3D(const std::string&, UnsignedInt) + * @see @ref image3DName(), @ref image3D(Containers::StringView, UnsignedInt) */ - Int image3DForName(const std::string& name); + Int image3DForName(Containers::StringView name); /** * @brief Three-dimensional image name @@ -1653,7 +1662,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * names, returns an empty string. Expects that a file is opened. * @see @ref image3DForName() */ - std::string image3DName(UnsignedInt id); + Containers::String image3DName(UnsignedInt id); /** * @brief Three-dimensional image @@ -1662,7 +1671,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Returns given image or @ref Containers::NullOpt if importing failed. * Expects that a file is opened. - * @see @ref image3D(const std::string&, UnsignedInt) + * @see @ref image3D(Containers::StringView, UnsignedInt) */ Containers::Optional image3D(UnsignedInt id, UnsignedInt level = 0); @@ -1677,7 +1686,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * @ref image3D(UnsignedInt, UnsignedInt). Expects that a file is * opened. */ - Containers::Optional image3D(const std::string& name, UnsignedInt level = 0); + Containers::Optional image3D(Containers::StringView name, UnsignedInt level = 0); /* Since 1.8.17, the original short-hand group closing doesn't work anymore. FFS. */ @@ -1718,7 +1727,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * supported --- instead, file is loaded though the callback and data * passed through to @ref doOpenData(). */ - virtual void doOpenFile(const std::string& filename); + virtual void doOpenFile(Containers::StringView filename); private: /** @brief Implementation for @ref features() */ @@ -1808,7 +1817,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi #endif /** @brief Implementation for @ref openState() */ - virtual void doOpenState(const void* state, const std::string& filePath); + virtual void doOpenState(const void* state, Containers::StringView filePath); /** @brief Implementation for @ref close() */ virtual void doClose() = 0; @@ -1848,28 +1857,28 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doSceneForName(const std::string& name); + virtual Int doSceneForName(Containers::StringView name); /** * @brief Implementation for @ref objectForName() * * Default implementation returns @cpp -1 @ce. */ - virtual Long doObjectForName(const std::string& name); + virtual Long doObjectForName(Containers::StringView name); /** * @brief Implementation for @ref sceneName() * * Default implementation returns an empty string. */ - virtual std::string doSceneName(UnsignedInt id); + virtual Containers::String doSceneName(UnsignedInt id); /** * @brief Implementation for @ref objectName() * * Default implementation returns an empty string. */ - virtual std::string doObjectName(UnsignedLong id); + virtual Containers::String doObjectName(UnsignedLong id); /** @brief Implementation for @ref scene() */ virtual Containers::Optional doScene(UnsignedInt id); @@ -1880,7 +1889,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns an invalid (zero) value. */ - virtual SceneField doSceneFieldForName(const std::string& name); + virtual SceneField doSceneFieldForName(Containers::StringView name); /** * @brief Implementation for @ref sceneFieldName() @@ -1889,7 +1898,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * Receives the custom ID extracted via @ref sceneFieldCustom(SceneField). * Default implementation returns an empty string. */ - virtual std::string doSceneFieldName(UnsignedInt name); + virtual Containers::String doSceneFieldName(UnsignedInt name); /** * @brief Implementation for @ref animationCount() @@ -1906,14 +1915,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doAnimationForName(const std::string& name); + virtual Int doAnimationForName(Containers::StringView name); /** * @brief Implementation for @ref animationName() * * Default implementation returns an empty string. */ - virtual std::string doAnimationName(UnsignedInt id); + virtual Containers::String doAnimationName(UnsignedInt id); /** @brief Implementation for @ref animation() */ virtual Containers::Optional doAnimation(UnsignedInt id); @@ -1933,14 +1942,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doLightForName(const std::string& name); + virtual Int doLightForName(Containers::StringView name); /** * @brief Implementation for @ref lightName() * * Default implementation returns an empty string. */ - virtual std::string doLightName(UnsignedInt id); + virtual Containers::String doLightName(UnsignedInt id); /** @brief Implementation for @ref light() */ virtual Containers::Optional doLight(UnsignedInt id); @@ -1960,14 +1969,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doCameraForName(const std::string& name); + virtual Int doCameraForName(Containers::StringView name); /** * @brief Implementation for @ref cameraName() * * Default implementation returns an empty string. */ - virtual std::string doCameraName(UnsignedInt id); + virtual Containers::String doCameraName(UnsignedInt id); /** @brief Implementation for @ref camera() */ virtual Containers::Optional doCamera(UnsignedInt id); @@ -2105,7 +2114,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doSkin2DForName(const std::string& name); + virtual Int doSkin2DForName(Containers::StringView name); /** * @brief Implementation for @ref skin2DName() @@ -2113,7 +2122,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns an empty string. */ - virtual std::string doSkin2DName(UnsignedInt id); + virtual Containers::String doSkin2DName(UnsignedInt id); /** * @brief Implementation for @ref skin2D() @@ -2138,7 +2147,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doSkin3DForName(const std::string& name); + virtual Int doSkin3DForName(Containers::StringView name); /** * @brief Implementation for @ref skin3DName() @@ -2146,7 +2155,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns an empty string. */ - virtual std::string doSkin3DName(UnsignedInt id); + virtual Containers::String doSkin3DName(UnsignedInt id); /** * @brief Implementation for @ref skin3D() @@ -2185,7 +2194,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doMeshForName(const std::string& name); + virtual Int doMeshForName(Containers::StringView name); /** * @brief Implementation for @ref meshName() @@ -2193,7 +2202,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns an empty string. */ - virtual std::string doMeshName(UnsignedInt id); + virtual Containers::String doMeshName(UnsignedInt id); /** * @brief Implementation for @ref mesh() @@ -2207,7 +2216,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns an invalid (zero) value. */ - virtual MeshAttribute doMeshAttributeForName(const std::string& name); + virtual MeshAttribute doMeshAttributeForName(Containers::StringView name); /** * @brief Implementation for @ref meshAttributeName() @@ -2216,7 +2225,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * Receives the custom ID extracted via @ref meshAttributeCustom(MeshAttribute). * Default implementation returns an empty string. */ - virtual std::string doMeshAttributeName(UnsignedShort name); + virtual Containers::String doMeshAttributeName(UnsignedShort name); #ifdef MAGNUM_BUILD_DEPRECATED /** @@ -2346,14 +2355,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doMaterialForName(const std::string& name); + virtual Int doMaterialForName(Containers::StringView name); /** * @brief Implementation for @ref materialName() * * Default implementation returns an empty string. */ - virtual std::string doMaterialName(UnsignedInt id); + virtual Containers::String doMaterialName(UnsignedInt id); /** @brief Implementation for @ref material() */ virtual Containers::Optional doMaterial(UnsignedInt id); @@ -2373,14 +2382,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doTextureForName(const std::string& name); + virtual Int doTextureForName(Containers::StringView name); /** * @brief Implementation for @ref textureName() * * Default implementation returns an empty string. */ - virtual std::string doTextureName(UnsignedInt id); + virtual Containers::String doTextureName(UnsignedInt id); /** @brief Implementation for @ref texture() */ virtual Containers::Optional doTexture(UnsignedInt id); @@ -2409,14 +2418,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doImage1DForName(const std::string& name); + virtual Int doImage1DForName(Containers::StringView name); /** * @brief Implementation for @ref image1DName() * * Default implementation returns an empty string. */ - virtual std::string doImage1DName(UnsignedInt id); + virtual Containers::String doImage1DName(UnsignedInt id); /** @brief Implementation for @ref image1D() */ virtual Containers::Optional doImage1D(UnsignedInt id, UnsignedInt level); @@ -2453,14 +2462,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doImage2DForName(const std::string& name); + virtual Int doImage2DForName(Containers::StringView name); /** * @brief Implementation for @ref image2DName() * * Default implementation returns an empty string. */ - virtual std::string doImage2DName(UnsignedInt id); + virtual Containers::String doImage2DName(UnsignedInt id); /** @brief Implementation for @ref image2D() */ virtual Containers::Optional doImage2D(UnsignedInt id, UnsignedInt level); @@ -2489,14 +2498,14 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi * * Default implementation returns @cpp -1 @ce. */ - virtual Int doImage3DForName(const std::string& name); + virtual Int doImage3DForName(Containers::StringView name); /** * @brief Implementation for @ref image3DName() * * Default implementation returns an empty string. */ - virtual std::string doImage3DName(UnsignedInt id); + virtual Containers::String doImage3DName(UnsignedInt id); /** @brief Implementation for @ref image3D() */ virtual Containers::Optional doImage3D(UnsignedInt id, UnsignedInt level); diff --git a/src/Magnum/Trade/Test/AbstractImporterTest.cpp b/src/Magnum/Trade/Test/AbstractImporterTest.cpp index e213de99b..cb858d650 100644 --- a/src/Magnum/Trade/Test/AbstractImporterTest.cpp +++ b/src/Magnum/Trade/Test/AbstractImporterTest.cpp @@ -27,7 +27,7 @@ #include #include #include -#include /** @todo remove once Debug is stream-free and AbstractImporter is -free */ +#include /** @todo remove once Debug is stream-free */ #include #include #include @@ -139,6 +139,8 @@ struct AbstractImporterTest: TestSuite::Tester { void objectForNameOutOfRange(); void sceneNameOutOfRange(); void objectNameOutOfRange(); + void sceneNameCustomDeleter(); + void objectNameCustomDeleter(); void sceneNotImplemented(); void sceneOutOfRange(); void sceneNonOwningDeleters(); @@ -148,11 +150,13 @@ struct AbstractImporterTest: TestSuite::Tester { void sceneFieldName(); void sceneFieldNameNotImplemented(); void sceneFieldNameNotCustom(); + void sceneFieldNameCustomDeleter(); void animation(); void animationNameNotImplemented(); void animationForNameOutOfRange(); void animationNameOutOfRange(); + void animationNameCustomDeleter(); void animationNotImplemented(); void animationOutOfRange(); void animationNonOwningDeleters(); @@ -164,6 +168,7 @@ struct AbstractImporterTest: TestSuite::Tester { void lightNameNotImplemented(); void lightForNameOutOfRange(); void lightNameOutOfRange(); + void lightNameCustomDeleter(); void lightNotImplemented(); void lightOutOfRange(); @@ -171,6 +176,7 @@ struct AbstractImporterTest: TestSuite::Tester { void cameraNameNotImplemented(); void cameraForNameOutOfRange(); void cameraNameOutOfRange(); + void cameraNameCustomDeleter(); void cameraNotImplemented(); void cameraOutOfRange(); @@ -208,6 +214,7 @@ struct AbstractImporterTest: TestSuite::Tester { void skin2DNameNotImplemented(); void skin2DForNameOutOfRange(); void skin2DNameOutOfRange(); + void skin2DNameCustomDeleter(); void skin2DNotImplemented(); void skin2DOutOfRange(); void skin2DNonOwningDeleters(); @@ -218,6 +225,7 @@ struct AbstractImporterTest: TestSuite::Tester { void skin3DNameNotImplemented(); void skin3DForNameOutOfRange(); void skin3DNameOutOfRange(); + void skin3DNameCustomDeleter(); void skin3DNotImplemented(); void skin3DOutOfRange(); void skin3DNonOwningDeleters(); @@ -234,6 +242,7 @@ struct AbstractImporterTest: TestSuite::Tester { void meshForNameOutOfRange(); void meshNameNotImplemented(); void meshNameOutOfRange(); + void meshNameCustomDeleter(); void meshNotImplemented(); void meshOutOfRange(); void meshLevelOutOfRange(); @@ -246,6 +255,7 @@ struct AbstractImporterTest: TestSuite::Tester { void meshAttributeName(); void meshAttributeNameNotImplemented(); void meshAttributeNameNotCustom(); + void meshAttributeNameCustomDeleter(); #ifdef MAGNUM_BUILD_DEPRECATED void mesh2D(); @@ -280,6 +290,7 @@ struct AbstractImporterTest: TestSuite::Tester { void materialForNameOutOfRange(); void materialNameNotImplemented(); void materialNameOutOfRange(); + void materialNameCustomDeleter(); void materialNotImplemented(); void materialOutOfRange(); void materialNonOwningDeleters(); @@ -290,6 +301,7 @@ struct AbstractImporterTest: TestSuite::Tester { void textureForNameOutOfRange(); void textureNameNotImplemented(); void textureNameOutOfRange(); + void textureNameCustomDeleter(); void textureNotImplemented(); void textureOutOfRange(); @@ -300,6 +312,7 @@ struct AbstractImporterTest: TestSuite::Tester { void image1DForNameOutOfRange(); void image1DNameNotImplemented(); void image1DNameOutOfRange(); + void image1DNameCustomDeleter(); void image1DNotImplemented(); void image1DOutOfRange(); void image1DLevelOutOfRange(); @@ -314,6 +327,7 @@ struct AbstractImporterTest: TestSuite::Tester { void image2DForNameOutOfRange(); void image2DNameNotImplemented(); void image2DNameOutOfRange(); + void image2DNameCustomDeleter(); void image2DNotImplemented(); void image2DOutOfRange(); void image2DLevelOutOfRange(); @@ -328,6 +342,7 @@ struct AbstractImporterTest: TestSuite::Tester { void image3DForNameOutOfRange(); void image3DNameNotImplemented(); void image3DNameOutOfRange(); + void image3DNameCustomDeleter(); void image3DNotImplemented(); void image3DOutOfRange(); void image3DLevelOutOfRange(); @@ -426,6 +441,8 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::objectNameNotImplemented, &AbstractImporterTest::sceneNameOutOfRange, &AbstractImporterTest::objectNameOutOfRange, + &AbstractImporterTest::sceneNameCustomDeleter, + &AbstractImporterTest::objectNameCustomDeleter, &AbstractImporterTest::sceneNotImplemented, &AbstractImporterTest::sceneOutOfRange, &AbstractImporterTest::sceneNonOwningDeleters, @@ -435,11 +452,13 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::sceneFieldName, &AbstractImporterTest::sceneFieldNameNotImplemented, &AbstractImporterTest::sceneFieldNameNotCustom, + &AbstractImporterTest::sceneFieldNameCustomDeleter, &AbstractImporterTest::animation, &AbstractImporterTest::animationForNameOutOfRange, &AbstractImporterTest::animationNameNotImplemented, &AbstractImporterTest::animationNameOutOfRange, + &AbstractImporterTest::animationNameCustomDeleter, &AbstractImporterTest::animationNotImplemented, &AbstractImporterTest::animationOutOfRange, &AbstractImporterTest::animationNonOwningDeleters, @@ -451,6 +470,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::lightForNameOutOfRange, &AbstractImporterTest::lightNameNotImplemented, &AbstractImporterTest::lightNameOutOfRange, + &AbstractImporterTest::lightNameCustomDeleter, &AbstractImporterTest::lightNotImplemented, &AbstractImporterTest::lightOutOfRange, @@ -458,6 +478,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::cameraForNameOutOfRange, &AbstractImporterTest::cameraNameNotImplemented, &AbstractImporterTest::cameraNameOutOfRange, + &AbstractImporterTest::cameraNameCustomDeleter, &AbstractImporterTest::cameraNotImplemented, &AbstractImporterTest::cameraOutOfRange}); @@ -501,6 +522,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::skin2DForNameOutOfRange, &AbstractImporterTest::skin2DNameNotImplemented, &AbstractImporterTest::skin2DNameOutOfRange, + &AbstractImporterTest::skin2DNameCustomDeleter, &AbstractImporterTest::skin2DNotImplemented, &AbstractImporterTest::skin2DOutOfRange, &AbstractImporterTest::skin2DNonOwningDeleters, @@ -511,6 +533,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::skin3DForNameOutOfRange, &AbstractImporterTest::skin3DNameNotImplemented, &AbstractImporterTest::skin3DNameOutOfRange, + &AbstractImporterTest::skin3DNameCustomDeleter, &AbstractImporterTest::skin3DNotImplemented, &AbstractImporterTest::skin3DOutOfRange, &AbstractImporterTest::skin3DNonOwningDeleters, @@ -527,6 +550,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::meshForNameOutOfRange, &AbstractImporterTest::meshNameNotImplemented, &AbstractImporterTest::meshNameOutOfRange, + &AbstractImporterTest::meshNameCustomDeleter, &AbstractImporterTest::meshNotImplemented, &AbstractImporterTest::meshOutOfRange, &AbstractImporterTest::meshLevelOutOfRange, @@ -539,6 +563,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::meshAttributeName, &AbstractImporterTest::meshAttributeNameNotImplemented, &AbstractImporterTest::meshAttributeNameNotCustom, + &AbstractImporterTest::meshAttributeNameCustomDeleter, #ifdef MAGNUM_BUILD_DEPRECATED &AbstractImporterTest::mesh2D, @@ -573,6 +598,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::materialForNameOutOfRange, &AbstractImporterTest::materialNameNotImplemented, &AbstractImporterTest::materialNameOutOfRange, + &AbstractImporterTest::materialNameCustomDeleter, &AbstractImporterTest::materialNotImplemented, &AbstractImporterTest::materialOutOfRange, &AbstractImporterTest::materialNonOwningDeleters, @@ -583,6 +609,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::textureForNameOutOfRange, &AbstractImporterTest::textureNameNotImplemented, &AbstractImporterTest::textureNameOutOfRange, + &AbstractImporterTest::textureNameCustomDeleter, &AbstractImporterTest::textureNotImplemented, &AbstractImporterTest::textureOutOfRange, @@ -593,6 +620,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::image1DForNameOutOfRange, &AbstractImporterTest::image1DNameNotImplemented, &AbstractImporterTest::image1DNameOutOfRange, + &AbstractImporterTest::image1DNameCustomDeleter, &AbstractImporterTest::image1DNotImplemented, &AbstractImporterTest::image1DOutOfRange, &AbstractImporterTest::image1DLevelOutOfRange, @@ -607,6 +635,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::image2DForNameOutOfRange, &AbstractImporterTest::image2DNameNotImplemented, &AbstractImporterTest::image2DNameOutOfRange, + &AbstractImporterTest::image2DNameCustomDeleter, &AbstractImporterTest::image2DNotImplemented, &AbstractImporterTest::image2DOutOfRange, &AbstractImporterTest::image2DLevelOutOfRange, @@ -621,6 +650,7 @@ AbstractImporterTest::AbstractImporterTest() { &AbstractImporterTest::image3DForNameOutOfRange, &AbstractImporterTest::image3DNameNotImplemented, &AbstractImporterTest::image3DNameOutOfRange, + &AbstractImporterTest::image3DNameCustomDeleter, &AbstractImporterTest::image3DNotImplemented, &AbstractImporterTest::image3DOutOfRange, &AbstractImporterTest::image3DLevelOutOfRange, @@ -1110,7 +1140,7 @@ void AbstractImporterTest::setFileCallbackOpenFileDirectly() { bool doIsOpened() const override { return _opened; } void doClose() override { _opened = false; } - void doOpenFile(const std::string& filename) override { + void doOpenFile(Containers::StringView filename) override { /* Called because FileCallback is supported */ CORRADE_COMPARE(filename, "file.dat"); CORRADE_VERIFY(fileCallback()); @@ -1144,7 +1174,7 @@ void AbstractImporterTest::setFileCallbackOpenFileThroughBaseImplementation() { bool doIsOpened() const override { return _opened; } void doClose() override { _opened = false; } - void doOpenFile(const std::string& filename) override { + void doOpenFile(Containers::StringView filename) override { CORRADE_COMPARE(filename, "file.dat"); CORRADE_VERIFY(fileCallback()); CORRADE_VERIFY(fileCallbackUserData()); @@ -1199,7 +1229,7 @@ void AbstractImporterTest::setFileCallbackOpenFileThroughBaseImplementationFaile bool doIsOpened() const override { return false; } void doClose() override {} - void doOpenFile(const std::string& filename) override { + void doOpenFile(Containers::StringView filename) override { openFileCalled = true; AbstractImporter::doOpenFile(filename); } @@ -1225,7 +1255,7 @@ void AbstractImporterTest::setFileCallbackOpenFileAsData() { bool doIsOpened() const override { return _opened; } void doClose() override { _opened = false; } - void doOpenFile(const std::string&) override { + void doOpenFile(Containers::StringView) override { openFileCalled = true; } @@ -1276,7 +1306,7 @@ void AbstractImporterTest::setFileCallbackOpenFileAsDataFailed() { bool doIsOpened() const override { return false; } void doClose() override {} - void doOpenFile(const std::string&) override { + void doOpenFile(Containers::StringView) override { openFileCalled = true; } @@ -1699,11 +1729,11 @@ void AbstractImporterTest::scene() { void doClose() override {} UnsignedInt doSceneCount() const override { return 8; } - Int doSceneForName(const std::string& name) override { + Int doSceneForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doSceneName(UnsignedInt id) override { + Containers::String doSceneName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -1736,11 +1766,11 @@ void AbstractImporterTest::object() { void doClose() override {} UnsignedLong doObjectCount() const override { return 8; } - Long doObjectForName(const std::string& name) override { + Long doObjectForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doObjectName(UnsignedLong id) override { + Containers::String doObjectName(UnsignedLong id) override { if(id == 7) return "eighth"; return {}; } @@ -1762,7 +1792,7 @@ void AbstractImporterTest::sceneForNameOutOfRange() { void doClose() override {} UnsignedInt doSceneCount() const override { return 8; } - Int doSceneForName(const std::string&) override { return 8; } + Int doSceneForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -1782,7 +1812,7 @@ void AbstractImporterTest::objectForNameOutOfRange() { void doClose() override {} UnsignedLong doObjectCount() const override { return 8; } - Long doObjectForName(const std::string&) override { return 8; } + Long doObjectForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -1893,11 +1923,11 @@ void AbstractImporterTest::sceneDeprecatedFallback2D() { UnsignedInt doSceneCount() const override { return 3; } UnsignedLong doObjectCount() const override { return 7; } - Long doObjectForName(const std::string& name) override { + Long doObjectForName(Containers::StringView name) override { if(name == "sixth") return 5; return -1; } - std::string doObjectName(UnsignedLong id) override { + Containers::String doObjectName(UnsignedLong id) override { if(id == 5) return "sixth"; return {}; } @@ -2165,11 +2195,11 @@ void AbstractImporterTest::sceneDeprecatedFallback3D() { UnsignedInt doSceneCount() const override { return 3; } UnsignedLong doObjectCount() const override { return 7; } - Long doObjectForName(const std::string& name) override { + Long doObjectForName(Containers::StringView name) override { if(name == "sixth") return 5; return -1; } - std::string doObjectName(UnsignedLong id) override { + Containers::String doObjectName(UnsignedLong id) override { if(id == 5) return "sixth"; return {}; } @@ -2786,7 +2816,7 @@ void AbstractImporterTest::sceneDeprecatedFallbackMultiFunctionObjects2D() { UnsignedInt doSceneCount() const override { return 4; } UnsignedLong doObjectCount() const override { return 63; } - std::string doObjectName(UnsignedLong id) override { + Containers::String doObjectName(UnsignedLong id) override { if(id == 1) return "object 1"; if(id == 15) return "object 15"; if(id == 23) return "object 23"; @@ -3068,7 +3098,7 @@ void AbstractImporterTest::sceneDeprecatedFallbackMultiFunctionObjects3D() { UnsignedInt doSceneCount() const override { return 4; } UnsignedLong doObjectCount() const override { return 63; } - std::string doObjectName(UnsignedLong id) override { + Containers::String doObjectName(UnsignedLong id) override { if(id == 1) return "object 1"; if(id == 15) return "object 15"; if(id == 23) return "object 23"; @@ -3309,11 +3339,11 @@ void AbstractImporterTest::sceneDeprecatedFallbackBoth2DAnd3DScene() { UnsignedInt doSceneCount() const override { return 2; } UnsignedLong doObjectCount() const override { return 7; } - Long doObjectForName(const std::string& name) override { + Long doObjectForName(Containers::StringView name) override { if(name == "sixth") return 5; return -1; } - std::string doObjectName(UnsignedLong id) override { + Containers::String doObjectName(UnsignedLong id) override { if(id == 5) return "sixth"; return {}; } @@ -3420,6 +3450,50 @@ void AbstractImporterTest::objectNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::objectName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::sceneNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doSceneCount() const override { return 1; } + Containers::String doSceneName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.sceneName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::sceneName(): implementation is not allowed to use a custom String deleter\n"); +} + +void AbstractImporterTest::objectNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedLong doObjectCount() const override { return 1; } + Containers::String doObjectName(UnsignedLong) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.objectName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::objectName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::sceneNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -3496,7 +3570,7 @@ void AbstractImporterTest::sceneCustomDataDeleter() { void doClose() override {} UnsignedInt doSceneCount() const override { return 1; } - Int doSceneForName(const std::string&) override { return 0; } + Int doSceneForName(Containers::StringView) override { return 0; } Containers::Optional doScene(UnsignedInt) override { return SceneData{SceneMappingType::UnsignedInt, 0, Containers::Array{data, 1, [](char*, std::size_t) {}}, @@ -3527,7 +3601,7 @@ void AbstractImporterTest::sceneCustomFieldDataDeleter() { void doClose() override {} UnsignedInt doSceneCount() const override { return 1; } - Int doSceneForName(const std::string&) override { return 0; } + Int doSceneForName(Containers::StringView) override { return 0; } Containers::Optional doScene(UnsignedInt) override { return SceneData{SceneMappingType::UnsignedInt, 0, nullptr, Containers::Array{&parents, 1, [](SceneFieldData*, std::size_t) {}}}; } @@ -3552,12 +3626,12 @@ void AbstractImporterTest::sceneFieldName() { bool doIsOpened() const override { return false; } void doClose() override {} - SceneField doSceneFieldForName(const std::string& name) override { + SceneField doSceneFieldForName(Containers::StringView name) override { if(name == "OctreeCell") return sceneFieldCustom(100037); return SceneField{}; } - std::string doSceneFieldName(UnsignedInt id) override { + Containers::String doSceneFieldName(UnsignedInt id) override { if(id == 100037) return "OctreeCell"; return ""; } @@ -3588,7 +3662,7 @@ void AbstractImporterTest::sceneFieldNameNotCustom() { bool doIsOpened() const override { return false; } void doClose() override {} - SceneField doSceneFieldForName(const std::string&) override { + SceneField doSceneFieldForName(Containers::StringView) override { return SceneField::Translation; } } importer; @@ -3602,6 +3676,27 @@ void AbstractImporterTest::sceneFieldNameNotCustom() { "Trade::AbstractImporter::sceneFieldName(): Trade::SceneField::Translation is not custom\n"); } +void AbstractImporterTest::sceneFieldNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + Containers::String doSceneFieldName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.sceneFieldName(sceneFieldCustom(0)); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::sceneFieldName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::animation() { struct: AbstractImporter { ImporterFeatures doFeatures() const override { return {}; } @@ -3609,11 +3704,11 @@ void AbstractImporterTest::animation() { void doClose() override {} UnsignedInt doAnimationCount() const override { return 8; } - Int doAnimationForName(const std::string& name) override { + Int doAnimationForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doAnimationName(UnsignedInt id) override { + Containers::String doAnimationName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -3654,7 +3749,7 @@ void AbstractImporterTest::animationForNameOutOfRange() { void doClose() override {} UnsignedInt doAnimationCount() const override { return 8; } - Int doAnimationForName(const std::string&) override { return 8; } + Int doAnimationForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -3695,6 +3790,28 @@ void AbstractImporterTest::animationNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::animationName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::animationNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doAnimationCount() const override { return 1; } + Containers::String doAnimationName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.animationName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::animationName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::animationNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -3787,7 +3904,7 @@ void AbstractImporterTest::animationCustomDataDeleter() { void doClose() override {} UnsignedInt doAnimationCount() const override { return 1; } - Int doAnimationForName(const std::string&) override { return 0; } + Int doAnimationForName(Containers::StringView) override { return 0; } Containers::Optional doAnimation(UnsignedInt) override { return AnimationData{Containers::Array{nullptr, 0, [](char*, std::size_t) {}}, nullptr}; } @@ -3814,7 +3931,7 @@ void AbstractImporterTest::animationCustomTrackDeleter() { void doClose() override {} UnsignedInt doAnimationCount() const override { return 1; } - Int doAnimationForName(const std::string&) override { return 0; } + Int doAnimationForName(Containers::StringView) override { return 0; } Containers::Optional doAnimation(UnsignedInt) override { return AnimationData{nullptr, Containers::Array{nullptr, 0, [](AnimationTrackData*, std::size_t) {}}}; } @@ -3837,11 +3954,11 @@ void AbstractImporterTest::light() { void doClose() override {} UnsignedInt doLightCount() const override { return 8; } - Int doLightForName(const std::string& name) override { + Int doLightForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doLightName(UnsignedInt id) override { + Containers::String doLightName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -3877,7 +3994,7 @@ void AbstractImporterTest::lightForNameOutOfRange() { void doClose() override {} UnsignedInt doLightCount() const override { return 8; } - Int doLightForName(const std::string&) override { return 8; } + Int doLightForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -3918,6 +4035,28 @@ void AbstractImporterTest::lightNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::lightName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::lightNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doLightCount() const override { return 1; } + Containers::String doLightName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.lightName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::lightName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::lightNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -3965,11 +4104,11 @@ void AbstractImporterTest::camera() { void doClose() override {} UnsignedInt doCameraCount() const override { return 8; } - Int doCameraForName(const std::string& name) override { + Int doCameraForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doCameraName(UnsignedInt id) override { + Containers::String doCameraName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -4005,7 +4144,7 @@ void AbstractImporterTest::cameraForNameOutOfRange() { void doClose() override {} UnsignedInt doCameraCount() const override { return 8; } - Int doCameraForName(const std::string&) override { return 8; } + Int doCameraForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -4046,6 +4185,28 @@ void AbstractImporterTest::cameraNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::cameraName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::cameraNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doCameraCount() const override { return 1; } + Containers::String doCameraName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.cameraName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::cameraName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::cameraNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -4655,11 +4816,11 @@ void AbstractImporterTest::skin2D() { void doClose() override {} UnsignedInt doSkin2DCount() const override { return 8; } - Int doSkin2DForName(const std::string& name) override { + Int doSkin2DForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doSkin2DName(UnsignedInt id) override { + Containers::String doSkin2DName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -4697,7 +4858,7 @@ void AbstractImporterTest::skin2DForNameOutOfRange() { void doClose() override {} UnsignedInt doSkin2DCount() const override { return 8; } - Int doSkin2DForName(const std::string&) override { return 8; } + Int doSkin2DForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -4738,6 +4899,28 @@ void AbstractImporterTest::skin2DNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::skin2DName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::skin2DNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doSkin2DCount() const override { return 1; } + Containers::String doSkin2DName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.skin2DName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::skin2DName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::skin2DNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -4785,7 +4968,7 @@ void AbstractImporterTest::skin2DNonOwningDeleters() { void doClose() override {} UnsignedInt doSkin2DCount() const override { return 1; } - Int doSkin2DForName(const std::string&) override { return 0; } + Int doSkin2DForName(Containers::StringView) override { return 0; } Containers::Optional doSkin2D(UnsignedInt) override { return SkinData2D{{}, jointData, {}, inverseBindMatrixData}; } @@ -4813,7 +4996,7 @@ void AbstractImporterTest::skin2DCustomJointDataDeleter() { void doClose() override {} UnsignedInt doSkin2DCount() const override { return 1; } - Int doSkin2DForName(const std::string&) override { return 0; } + Int doSkin2DForName(Containers::StringView) override { return 0; } Containers::Optional doSkin2D(UnsignedInt) override { return SkinData2D{Containers::Array{jointData, 1, [](UnsignedInt*, std::size_t){}}, Containers::Array{1}}; } @@ -4842,7 +5025,7 @@ void AbstractImporterTest::skin2DCustomInverseBindMatrixDataDeleter() { void doClose() override {} UnsignedInt doSkin2DCount() const override { return 1; } - Int doSkin2DForName(const std::string&) override { return 0; } + Int doSkin2DForName(Containers::StringView) override { return 0; } Containers::Optional doSkin2D(UnsignedInt) override { return SkinData2D{Containers::Array{1}, Containers::Array{inverseBindMatrixData, 1, [](Matrix3*, std::size_t){}}}; } @@ -4867,11 +5050,11 @@ void AbstractImporterTest::skin3D() { void doClose() override {} UnsignedInt doSkin3DCount() const override { return 8; } - Int doSkin3DForName(const std::string& name) override { + Int doSkin3DForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doSkin3DName(UnsignedInt id) override { + Containers::String doSkin3DName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -4909,7 +5092,7 @@ void AbstractImporterTest::skin3DForNameOutOfRange() { void doClose() override {} UnsignedInt doSkin3DCount() const override { return 8; } - Int doSkin3DForName(const std::string&) override { return 8; } + Int doSkin3DForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -4951,6 +5134,28 @@ void AbstractImporterTest::skin3DNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::skin3DName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::skin3DNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doSkin3DCount() const override { return 1; } + Containers::String doSkin3DName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.skin3DName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::skin3DName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::skin3DNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -4998,7 +5203,7 @@ void AbstractImporterTest::skin3DNonOwningDeleters() { void doClose() override {} UnsignedInt doSkin3DCount() const override { return 1; } - Int doSkin3DForName(const std::string&) override { return 0; } + Int doSkin3DForName(Containers::StringView) override { return 0; } Containers::Optional doSkin3D(UnsignedInt) override { return SkinData3D{{}, jointData, {}, inverseBindMatrixData}; } @@ -5026,7 +5231,7 @@ void AbstractImporterTest::skin3DCustomJointDataDeleter() { void doClose() override {} UnsignedInt doSkin3DCount() const override { return 1; } - Int doSkin3DForName(const std::string&) override { return 0; } + Int doSkin3DForName(Containers::StringView) override { return 0; } Containers::Optional doSkin3D(UnsignedInt) override { return SkinData3D{Containers::Array{jointData, 1, [](UnsignedInt*, std::size_t){}}, Containers::Array{1}}; } @@ -5055,7 +5260,7 @@ void AbstractImporterTest::skin3DCustomInverseBindMatrixDataDeleter() { void doClose() override {} UnsignedInt doSkin3DCount() const override { return 1; } - Int doSkin3DForName(const std::string&) override { return 0; } + Int doSkin3DForName(Containers::StringView) override { return 0; } Containers::Optional doSkin3D(UnsignedInt) override { return SkinData3D{Containers::Array{1}, Containers::Array{inverseBindMatrixData, 1, [](Matrix4*, std::size_t){}}}; } @@ -5084,11 +5289,11 @@ void AbstractImporterTest::mesh() { if(id == 7) return 3; return {}; } - Int doMeshForName(const std::string& name) override { + Int doMeshForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doMeshName(UnsignedInt id) override { + Containers::String doMeshName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -5123,11 +5328,11 @@ void AbstractImporterTest::meshDeprecatedFallback() { void doClose() override {} UnsignedInt doMeshCount() const override { return 8; } - Int doMeshForName(const std::string& name) override { + Int doMeshForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doMeshName(UnsignedInt id) override { + Containers::String doMeshName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -5196,7 +5401,7 @@ void AbstractImporterTest::meshLevelCountZero() { void doClose() override {} UnsignedInt doMeshCount() const override { return 8; } - Int doMeshForName(const std::string&) override { return 0; } + Int doMeshForName(Containers::StringView) override { return 0; } UnsignedInt doMeshLevelCount(UnsignedInt) override { return 0; } } importer; @@ -5224,7 +5429,7 @@ void AbstractImporterTest::meshForNameOutOfRange() { void doClose() override {} UnsignedInt doMeshCount() const override { return 8; } - Int doMeshForName(const std::string&) override { return 8; } + Int doMeshForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -5265,6 +5470,28 @@ void AbstractImporterTest::meshNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::meshName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::meshNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doMeshCount() const override { return 1; } + Containers::String doMeshName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.meshName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::meshName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::meshNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -5316,7 +5543,7 @@ void AbstractImporterTest::meshLevelOutOfRange() { void doClose() override {} UnsignedInt doMeshCount() const override { return 8; } - Int doMeshForName(const std::string&) override { return 0; } + Int doMeshForName(Containers::StringView) override { return 0; } UnsignedInt doMeshLevelCount(UnsignedInt) override { return 3; } } importer; @@ -5392,7 +5619,7 @@ void AbstractImporterTest::meshCustomIndexDataDeleter() { void doClose() override {} UnsignedInt doMeshCount() const override { return 1; } - Int doMeshForName(const std::string&) override { return 0; } + Int doMeshForName(Containers::StringView) override { return 0; } Containers::Optional doMesh(UnsignedInt, UnsignedInt) override { return MeshData{MeshPrimitive::Triangles, Containers::Array{data, 1, [](char*, std::size_t) {}}, MeshIndexData{MeshIndexType::UnsignedByte, data}, 1}; } @@ -5421,7 +5648,7 @@ void AbstractImporterTest::meshCustomVertexDataDeleter() { void doClose() override {} UnsignedInt doMeshCount() const override { return 1; } - Int doMeshForName(const std::string&) override { return 0; } + Int doMeshForName(Containers::StringView) override { return 0; } Containers::Optional doMesh(UnsignedInt, UnsignedInt) override { return MeshData{MeshPrimitive::Triangles, Containers::Array{nullptr, 0, [](char*, std::size_t) {}}, {MeshAttributeData{MeshAttribute::Position, VertexFormat::Vector3, nullptr}}}; } @@ -5448,7 +5675,7 @@ void AbstractImporterTest::meshCustomAttributesDeleter() { void doClose() override {} UnsignedInt doMeshCount() const override { return 1; } - Int doMeshForName(const std::string&) override { return 0; } + Int doMeshForName(Containers::StringView) override { return 0; } Containers::Optional doMesh(UnsignedInt, UnsignedInt) override { return MeshData{MeshPrimitive::Triangles, nullptr, Containers::Array{&positions, 1, [](MeshAttributeData*, std::size_t) {}}}; } @@ -5473,12 +5700,12 @@ void AbstractImporterTest::meshAttributeName() { bool doIsOpened() const override { return false; } void doClose() override {} - MeshAttribute doMeshAttributeForName(const std::string& name) override { + MeshAttribute doMeshAttributeForName(Containers::StringView name) override { if(name == "SMOOTH_GROUP_ID") return meshAttributeCustom(37); return MeshAttribute{}; } - std::string doMeshAttributeName(UnsignedShort id) override { + Containers::String doMeshAttributeName(UnsignedShort id) override { if(id == 37) return "SMOOTH_GROUP_ID"; return ""; } @@ -5509,7 +5736,7 @@ void AbstractImporterTest::meshAttributeNameNotCustom() { bool doIsOpened() const override { return false; } void doClose() override {} - MeshAttribute doMeshAttributeForName(const std::string&) override { + MeshAttribute doMeshAttributeForName(Containers::StringView) override { return MeshAttribute::Position; } } importer; @@ -5523,6 +5750,27 @@ void AbstractImporterTest::meshAttributeNameNotCustom() { "Trade::AbstractImporter::meshAttributeName(): Trade::MeshAttribute::Position is not custom\n"); } +void AbstractImporterTest::meshAttributeNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + Containers::String doMeshAttributeName(UnsignedShort) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.meshAttributeName(meshAttributeCustom(0)); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::meshAttributeName(): implementation is not allowed to use a custom String deleter\n"); +} + #ifdef MAGNUM_BUILD_DEPRECATED void AbstractImporterTest::mesh2D() { struct: AbstractImporter { @@ -5970,11 +6218,11 @@ void AbstractImporterTest::material() { void doClose() override {} UnsignedInt doMaterialCount() const override { return 8; } - Int doMaterialForName(const std::string& name) override { + Int doMaterialForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doMaterialName(UnsignedInt id) override { + Containers::String doMaterialName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -6007,7 +6255,7 @@ void AbstractImporterTest::materialDeprecatedFallback() { void doClose() override {} UnsignedInt doMaterialCount() const override { return 8; } - Int doMaterialForName(const std::string&) override { return 0; } + Int doMaterialForName(Containers::StringView) override { return 0; } /* Using a deprecated PhongMaterialData constructor to verify that propagating such instance works as well (array deleters etc.) */ Containers::Optional doMaterial(UnsignedInt) override { @@ -6052,7 +6300,7 @@ void AbstractImporterTest::materialForNameOutOfRange() { void doClose() override {} UnsignedInt doMaterialCount() const override { return 8; } - Int doMaterialForName(const std::string&) override { return 8; } + Int doMaterialForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -6093,6 +6341,28 @@ void AbstractImporterTest::materialNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::materialName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::materialNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doMaterialCount() const override { return 1; } + Containers::String doMaterialName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.materialName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::materialName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::materialNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -6167,7 +6437,7 @@ void AbstractImporterTest::materialCustomAttributeDataDeleter() { void doClose() override {} UnsignedInt doMaterialCount() const override { return 1; } - Int doMaterialForName(const std::string&) override { return 0; } + Int doMaterialForName(Containers::StringView) override { return 0; } Containers::Optional doMaterial(UnsignedInt) override { return MaterialData{{}, Containers::Array{attributeData, 1, [](MaterialAttributeData*, std::size_t) {}}}; } @@ -6198,7 +6468,7 @@ void AbstractImporterTest::materialCustomLayerDataDeleter() { void doClose() override {} UnsignedInt doMaterialCount() const override { return 1; } - Int doMaterialForName(const std::string&) override { return 0; } + Int doMaterialForName(Containers::StringView) override { return 0; } Containers::Optional doMaterial(UnsignedInt) override { return MaterialData{{}, nullptr, Containers::Array{layerData, 1, [](UnsignedInt*, std::size_t) {}}}; } @@ -6223,11 +6493,11 @@ void AbstractImporterTest::texture() { void doClose() override {} UnsignedInt doTextureCount() const override { return 8; } - Int doTextureForName(const std::string& name) override { + Int doTextureForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doTextureName(UnsignedInt id) override { + Containers::String doTextureName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -6263,7 +6533,7 @@ void AbstractImporterTest::textureForNameOutOfRange() { void doClose() override {} UnsignedInt doTextureCount() const override { return 8; } - Int doTextureForName(const std::string&) override { return 8; } + Int doTextureForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -6304,6 +6574,28 @@ void AbstractImporterTest::textureNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::textureName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::textureNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doTextureCount() const override { return 1; } + Containers::String doTextureName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.textureName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::textureName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::textureNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -6355,11 +6647,11 @@ void AbstractImporterTest::image1D() { if(id == 7) return 3; return {}; } - Int doImage1DForName(const std::string& name) override { + Int doImage1DForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doImage1DName(UnsignedInt id) override { + Containers::String doImage1DName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -6427,7 +6719,7 @@ void AbstractImporterTest::image1DLevelCountZero() { void doClose() override {} UnsignedInt doImage1DCount() const override { return 8; } - Int doImage1DForName(const std::string&) override { return 0; } + Int doImage1DForName(Containers::StringView) override { return 0; } UnsignedInt doImage1DLevelCount(UnsignedInt) override { return 0; } } importer; @@ -6455,7 +6747,7 @@ void AbstractImporterTest::image1DForNameOutOfRange() { void doClose() override {} UnsignedInt doImage1DCount() const override { return 8; } - Int doImage1DForName(const std::string&) override { return 8; } + Int doImage1DForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -6496,6 +6788,28 @@ void AbstractImporterTest::image1DNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::image1DName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::image1DNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doImage1DCount() const override { return 1; } + Containers::String doImage1DName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.image1DName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::image1DName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::image1DNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -6547,7 +6861,7 @@ void AbstractImporterTest::image1DLevelOutOfRange() { void doClose() override {} UnsignedInt doImage1DCount() const override { return 8; } - Int doImage1DForName(const std::string&) override { return 0; } + Int doImage1DForName(Containers::StringView) override { return 0; } UnsignedInt doImage1DLevelCount(UnsignedInt) override { return 3; } } importer; @@ -6609,7 +6923,7 @@ void AbstractImporterTest::image1DCustomDeleter() { void doClose() override {} UnsignedInt doImage1DCount() const override { return 1; } - Int doImage1DForName(const std::string&) override { return 0; } + Int doImage1DForName(Containers::StringView) override { return 0; } Containers::Optional doImage1D(UnsignedInt, UnsignedInt) override { return ImageData1D{PixelFormat::RGBA8Unorm, {}, Containers::Array{nullptr, 0, [](char*, std::size_t) {}}}; } @@ -6636,11 +6950,11 @@ void AbstractImporterTest::image2D() { if(id == 7) return 3; return {}; } - Int doImage2DForName(const std::string& name) override { + Int doImage2DForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doImage2DName(UnsignedInt id) override { + Containers::String doImage2DName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -6708,7 +7022,7 @@ void AbstractImporterTest::image2DLevelCountZero() { void doClose() override {} UnsignedInt doImage2DCount() const override { return 8; } - Int doImage2DForName(const std::string&) override { return 0; } + Int doImage2DForName(Containers::StringView) override { return 0; } UnsignedInt doImage2DLevelCount(UnsignedInt) override { return 0; } } importer; @@ -6736,7 +7050,7 @@ void AbstractImporterTest::image2DForNameOutOfRange() { void doClose() override {} UnsignedInt doImage2DCount() const override { return 8; } - Int doImage2DForName(const std::string&) override { return 8; } + Int doImage2DForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -6777,6 +7091,28 @@ void AbstractImporterTest::image2DNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::image2DName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::image2DNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doImage2DCount() const override { return 1; } + Containers::String doImage2DName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.image2DName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::image2DName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::image2DNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -6828,7 +7164,7 @@ void AbstractImporterTest::image2DLevelOutOfRange() { void doClose() override {} UnsignedInt doImage2DCount() const override { return 8; } - Int doImage2DForName(const std::string&) override { return 0; } + Int doImage2DForName(Containers::StringView) override { return 0; } UnsignedInt doImage2DLevelCount(UnsignedInt) override { return 3; } } importer; @@ -6890,7 +7226,7 @@ void AbstractImporterTest::image2DCustomDeleter() { void doClose() override {} UnsignedInt doImage2DCount() const override { return 1; } - Int doImage2DForName(const std::string&) override { return 0; } + Int doImage2DForName(Containers::StringView) override { return 0; } Containers::Optional doImage2D(UnsignedInt, UnsignedInt) override { return ImageData2D{PixelFormat::RGBA8Unorm, {}, Containers::Array{nullptr, 0, [](char*, std::size_t) {}}}; } @@ -6917,11 +7253,11 @@ void AbstractImporterTest::image3D() { if(id == 7) return 3; return {}; } - Int doImage3DForName(const std::string& name) override { + Int doImage3DForName(Containers::StringView name) override { if(name == "eighth") return 7; return -1; } - std::string doImage3DName(UnsignedInt id) override { + Containers::String doImage3DName(UnsignedInt id) override { if(id == 7) return "eighth"; return {}; } @@ -6958,7 +7294,7 @@ void AbstractImporterTest::image3DForNameOutOfRange() { void doClose() override {} UnsignedInt doImage3DCount() const override { return 8; } - Int doImage3DForName(const std::string&) override { return 8; } + Int doImage3DForName(Containers::StringView) override { return 8; } } importer; std::ostringstream out; @@ -7009,7 +7345,7 @@ void AbstractImporterTest::image3DLevelCountZero() { void doClose() override {} UnsignedInt doImage3DCount() const override { return 8; } - Int doImage3DForName(const std::string&) override { return 0; } + Int doImage3DForName(Containers::StringView) override { return 0; } UnsignedInt doImage3DLevelCount(UnsignedInt) override { return 0; } } importer; @@ -7058,6 +7394,28 @@ void AbstractImporterTest::image3DNameOutOfRange() { CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::image3DName(): index 8 out of range for 8 entries\n"); } +void AbstractImporterTest::image3DNameCustomDeleter() { + #ifdef CORRADE_NO_ASSERT + CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); + #endif + + struct: AbstractImporter { + ImporterFeatures doFeatures() const override { return {}; } + bool doIsOpened() const override { return true; } + void doClose() override {} + + UnsignedInt doImage3DCount() const override { return 1; } + Containers::String doImage3DName(UnsignedInt) override { + return Containers::String{"a", 1, [](char*, std::size_t) {}}; + } + } importer; + + std::ostringstream out; + Error redirectError{&out}; + importer.image3DName(0); + CORRADE_COMPARE(out.str(), "Trade::AbstractImporter::image3DName(): implementation is not allowed to use a custom String deleter\n"); +} + void AbstractImporterTest::image3DNotImplemented() { #ifdef CORRADE_NO_ASSERT CORRADE_SKIP("CORRADE_NO_ASSERT defined, can't test assertions"); @@ -7109,7 +7467,7 @@ void AbstractImporterTest::image3DLevelOutOfRange() { void doClose() override {} UnsignedInt doImage3DCount() const override { return 8; } - Int doImage3DForName(const std::string&) override { return 0; } + Int doImage3DForName(Containers::StringView) override { return 0; } UnsignedInt doImage3DLevelCount(UnsignedInt) override { return 3; } } importer; @@ -7171,7 +7529,7 @@ void AbstractImporterTest::image3DCustomDeleter() { void doClose() override {} UnsignedInt doImage3DCount() const override { return 1; } - Int doImage3DForName(const std::string&) override { return 0; } + Int doImage3DForName(Containers::StringView) override { return 0; } Containers::Optional doImage3D(UnsignedInt, UnsignedInt) override { return ImageData3D{PixelFormat::RGBA8Unorm, {}, Containers::Array{nullptr, 0, [](char*, std::size_t) {}}}; } diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp index f0078bcc8..4e473141f 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.cpp @@ -61,7 +61,7 @@ void AnyImageImporter::doClose() { _in = nullptr; } -void AnyImageImporter::doOpenFile(const std::string& filename) { +void AnyImageImporter::doOpenFile(const Containers::StringView filename) { CORRADE_INTERNAL_ASSERT(manager()); /* We don't detect any double extensions yet, so we can normalize just the @@ -291,4 +291,4 @@ Containers::Optional AnyImageImporter::doImage3D(const UnsignedInt }} CORRADE_PLUGIN_REGISTER(AnyImageImporter, Magnum::Trade::AnyImageImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.4") + "cz.mosra.magnum.Trade.AbstractImporter/0.5") diff --git a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h index d85a1a452..5d47b6097 100644 --- a/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h +++ b/src/MagnumPlugins/AnyImageImporter/AnyImageImporter.h @@ -179,7 +179,7 @@ class MAGNUM_ANYIMAGEIMPORTER_EXPORT AnyImageImporter: public AbstractImporter { MAGNUM_ANYIMAGEIMPORTER_LOCAL ImporterFeatures doFeatures() const override; MAGNUM_ANYIMAGEIMPORTER_LOCAL bool doIsOpened() const override; MAGNUM_ANYIMAGEIMPORTER_LOCAL void doClose() override; - MAGNUM_ANYIMAGEIMPORTER_LOCAL void doOpenFile(const std::string& filename) override; + MAGNUM_ANYIMAGEIMPORTER_LOCAL void doOpenFile(Containers::StringView filename) override; MAGNUM_ANYIMAGEIMPORTER_LOCAL void doOpenData(Containers::Array&& data, DataFlags dataFlags) override; MAGNUM_ANYIMAGEIMPORTER_LOCAL UnsignedInt doImage1DCount() const override; diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp index 9b2f2130d..14f19d533 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.cpp @@ -71,7 +71,7 @@ void AnySceneImporter::doClose() { _in = nullptr; } -void AnySceneImporter::doOpenFile(const std::string& filename) { +void AnySceneImporter::doOpenFile(const Containers::StringView filename) { CORRADE_INTERNAL_ASSERT(manager()); /** @todo lowercase only the extension, once Directory::split() is done */ @@ -171,28 +171,28 @@ void AnySceneImporter::doOpenFile(const std::string& filename) { } UnsignedInt AnySceneImporter::doAnimationCount() const { return _in->animationCount(); } -Int AnySceneImporter::doAnimationForName(const std::string& name) { return _in->animationForName(name); } -std::string AnySceneImporter::doAnimationName(const UnsignedInt id) { return _in->animationName(id); } +Int AnySceneImporter::doAnimationForName(const Containers::StringView name) { return _in->animationForName(name); } +Containers::String AnySceneImporter::doAnimationName(const UnsignedInt id) { return _in->animationName(id); } Containers::Optional AnySceneImporter::doAnimation(const UnsignedInt id) { return _in->animation(id); } Int AnySceneImporter::doDefaultScene() const { return _in->defaultScene(); } UnsignedInt AnySceneImporter::doSceneCount() const { return _in->sceneCount(); } UnsignedLong AnySceneImporter::doObjectCount() const { return _in->objectCount(); } -Int AnySceneImporter::doSceneForName(const std::string& name) { return _in->sceneForName(name); } -Long AnySceneImporter::doObjectForName(const std::string& name) { return _in->objectForName(name); } -std::string AnySceneImporter::doSceneName(const UnsignedInt id) { return _in->sceneName(id); } -std::string AnySceneImporter::doObjectName(const UnsignedLong id) { return _in->objectName(id); } +Int AnySceneImporter::doSceneForName(const Containers::StringView name) { return _in->sceneForName(name); } +Long AnySceneImporter::doObjectForName(const Containers::StringView name) { return _in->objectForName(name); } +Containers::String AnySceneImporter::doSceneName(const UnsignedInt id) { return _in->sceneName(id); } +Containers::String AnySceneImporter::doObjectName(const UnsignedLong id) { return _in->objectName(id); } Containers::Optional AnySceneImporter::doScene(const UnsignedInt id) { return _in->scene(id); } UnsignedInt AnySceneImporter::doLightCount() const { return _in->lightCount(); } -Int AnySceneImporter::doLightForName(const std::string& name) { return _in->lightForName(name); } -std::string AnySceneImporter::doLightName(const UnsignedInt id) { return _in->lightName(id); } +Int AnySceneImporter::doLightForName(const Containers::StringView name) { return _in->lightForName(name); } +Containers::String AnySceneImporter::doLightName(const UnsignedInt id) { return _in->lightName(id); } Containers::Optional AnySceneImporter::doLight(const UnsignedInt id) { return _in->light(id); } UnsignedInt AnySceneImporter::doCameraCount() const { return _in->cameraCount(); } -Int AnySceneImporter::doCameraForName(const std::string& name) { return _in->cameraForName(name); } -std::string AnySceneImporter::doCameraName(const UnsignedInt id) { return _in->cameraName(id); } +Int AnySceneImporter::doCameraForName(const Containers::StringView name) { return _in->cameraForName(name); } +Containers::String AnySceneImporter::doCameraName(const UnsignedInt id) { return _in->cameraName(id); } Containers::Optional AnySceneImporter::doCamera(const UnsignedInt id) { return _in->camera(id); } #ifdef MAGNUM_BUILD_DEPRECATED @@ -210,22 +210,22 @@ CORRADE_IGNORE_DEPRECATED_POP #endif UnsignedInt AnySceneImporter::doSkin2DCount() const { return _in->skin2DCount(); } -Int AnySceneImporter::doSkin2DForName(const std::string& name) { return _in->skin2DForName(name); } -std::string AnySceneImporter::doSkin2DName(const UnsignedInt id) { return _in->skin2DName(id); } +Int AnySceneImporter::doSkin2DForName(const Containers::StringView name) { return _in->skin2DForName(name); } +Containers::String AnySceneImporter::doSkin2DName(const UnsignedInt id) { return _in->skin2DName(id); } Containers::Optional AnySceneImporter::doSkin2D(const UnsignedInt id) { return _in->skin2D(id); } UnsignedInt AnySceneImporter::doSkin3DCount() const { return _in->skin3DCount(); } -Int AnySceneImporter::doSkin3DForName(const std::string& name) { return _in->skin3DForName(name); } -std::string AnySceneImporter::doSkin3DName(const UnsignedInt id) { return _in->skin3DName(id); } +Int AnySceneImporter::doSkin3DForName(const Containers::StringView name) { return _in->skin3DForName(name); } +Containers::String AnySceneImporter::doSkin3DName(const UnsignedInt id) { return _in->skin3DName(id); } Containers::Optional AnySceneImporter::doSkin3D(const UnsignedInt id) { return _in->skin3D(id); } UnsignedInt AnySceneImporter::doMeshCount() const { return _in->meshCount(); } -Int AnySceneImporter::doMeshForName(const std::string& name) { return _in->meshForName(name); } -std::string AnySceneImporter::doMeshName(const UnsignedInt id) { return _in->meshName(id); } +Int AnySceneImporter::doMeshForName(const Containers::StringView name) { return _in->meshForName(name); } +Containers::String AnySceneImporter::doMeshName(const UnsignedInt id) { return _in->meshName(id); } Containers::Optional AnySceneImporter::doMesh(const UnsignedInt id, const UnsignedInt level) { return _in->mesh(id, level); } -MeshAttribute AnySceneImporter::doMeshAttributeForName(const std::string& name) { return _in->meshAttributeForName(name); } -std::string AnySceneImporter::doMeshAttributeName(const UnsignedShort id) { return _in->meshAttributeName(meshAttributeCustom(id)); } +MeshAttribute AnySceneImporter::doMeshAttributeForName(const Containers::StringView name) { return _in->meshAttributeForName(name); } +Containers::String AnySceneImporter::doMeshAttributeName(const UnsignedShort id) { return _in->meshAttributeName(meshAttributeCustom(id)); } #ifdef MAGNUM_BUILD_DEPRECATED CORRADE_IGNORE_DEPRECATED_PUSH @@ -242,34 +242,34 @@ CORRADE_IGNORE_DEPRECATED_POP #endif UnsignedInt AnySceneImporter::doMaterialCount() const { return _in->materialCount(); } -Int AnySceneImporter::doMaterialForName(const std::string& name) { return _in->materialForName(name); } -std::string AnySceneImporter::doMaterialName(const UnsignedInt id) { return _in->materialName(id); } +Int AnySceneImporter::doMaterialForName(const Containers::StringView name) { return _in->materialForName(name); } +Containers::String AnySceneImporter::doMaterialName(const UnsignedInt id) { return _in->materialName(id); } Containers::Optional AnySceneImporter::doMaterial(const UnsignedInt id) { return _in->material(id); } UnsignedInt AnySceneImporter::doTextureCount() const { return _in->textureCount(); } -Int AnySceneImporter::doTextureForName(const std::string& name) { return _in->textureForName(name); } -std::string AnySceneImporter::doTextureName(const UnsignedInt id) { return _in->textureName(id); } +Int AnySceneImporter::doTextureForName(const Containers::StringView name) { return _in->textureForName(name); } +Containers::String AnySceneImporter::doTextureName(const UnsignedInt id) { return _in->textureName(id); } Containers::Optional AnySceneImporter::doTexture(const UnsignedInt id) { return _in->texture(id); } UnsignedInt AnySceneImporter::doImage1DCount() const { return _in->image1DCount(); } UnsignedInt AnySceneImporter::doImage1DLevelCount(UnsignedInt id) { return _in->image1DLevelCount(id); } -Int AnySceneImporter::doImage1DForName(const std::string& name) { return _in->image1DForName(name); } -std::string AnySceneImporter::doImage1DName(const UnsignedInt id) { return _in->image1DName(id); } +Int AnySceneImporter::doImage1DForName(const Containers::StringView name) { return _in->image1DForName(name); } +Containers::String AnySceneImporter::doImage1DName(const UnsignedInt id) { return _in->image1DName(id); } Containers::Optional AnySceneImporter::doImage1D(const UnsignedInt id, const UnsignedInt level) { return _in->image1D(id, level); } UnsignedInt AnySceneImporter::doImage2DCount() const { return _in->image2DCount(); } UnsignedInt AnySceneImporter::doImage2DLevelCount(UnsignedInt id) { return _in->image2DLevelCount(id); } -Int AnySceneImporter::doImage2DForName(const std::string& name) { return _in->image2DForName(name); } -std::string AnySceneImporter::doImage2DName(const UnsignedInt id) { return _in->image2DName(id); } +Int AnySceneImporter::doImage2DForName(const Containers::StringView name) { return _in->image2DForName(name); } +Containers::String AnySceneImporter::doImage2DName(const UnsignedInt id) { return _in->image2DName(id); } Containers::Optional AnySceneImporter::doImage2D(const UnsignedInt id, const UnsignedInt level) { return _in->image2D(id, level); } UnsignedInt AnySceneImporter::doImage3DCount() const { return _in->image3DCount(); } UnsignedInt AnySceneImporter::doImage3DLevelCount(UnsignedInt id) { return _in->image3DLevelCount(id); } -Int AnySceneImporter::doImage3DForName(const std::string& name) { return _in->image3DForName(name); } -std::string AnySceneImporter::doImage3DName(const UnsignedInt id) { return _in->image3DName(id); } +Int AnySceneImporter::doImage3DForName(const Containers::StringView name) { return _in->image3DForName(name); } +Containers::String AnySceneImporter::doImage3DName(const UnsignedInt id) { return _in->image3DName(id); } Containers::Optional AnySceneImporter::doImage3D(const UnsignedInt id, const UnsignedInt level) { return _in->image3D(id, level); } }} CORRADE_PLUGIN_REGISTER(AnySceneImporter, Magnum::Trade::AnySceneImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.4") + "cz.mosra.magnum.Trade.AbstractImporter/0.5") diff --git a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h index bb55a2c4d..33a5a88cb 100644 --- a/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h +++ b/src/MagnumPlugins/AnySceneImporter/AnySceneImporter.h @@ -159,31 +159,31 @@ class MAGNUM_ANYSCENEIMPORTER_EXPORT AnySceneImporter: public AbstractImporter { MAGNUM_ANYSCENEIMPORTER_LOCAL ImporterFeatures doFeatures() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL bool doIsOpened() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL void doClose() override; - MAGNUM_ANYSCENEIMPORTER_LOCAL void doOpenFile(const std::string& filename) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL void doOpenFile(Containers::StringView filename) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doAnimationCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doAnimationName(UnsignedInt id) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doAnimationForName(const std::string& name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doAnimationName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doAnimationForName(Containers::StringView name) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doAnimation(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Int doDefaultScene() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doSceneCount() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedLong doObjectCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doSceneForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Long doObjectForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doSceneName(UnsignedInt id) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doObjectName(UnsignedLong id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doSceneForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Long doObjectForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doSceneName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doObjectName(UnsignedLong id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doScene(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doLightCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doLightForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doLightName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doLightForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doLightName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doLight(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doCameraCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doCameraForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doCameraName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doCameraForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doCameraName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doCamera(UnsignedInt id) override; #ifdef MAGNUM_BUILD_DEPRECATED @@ -203,22 +203,22 @@ class MAGNUM_ANYSCENEIMPORTER_EXPORT AnySceneImporter: public AbstractImporter { #endif MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doSkin2DCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doSkin2DForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doSkin2DName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doSkin2DForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doSkin2DName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doSkin2D(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doSkin3DCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doSkin3DForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doSkin3DName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doSkin3DForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doSkin3DName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doSkin3D(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doMeshCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doMeshForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doMeshName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doMeshForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doMeshName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doMesh(UnsignedInt id, UnsignedInt level) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL MeshAttribute doMeshAttributeForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doMeshAttributeName(UnsignedShort id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL MeshAttribute doMeshAttributeForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doMeshAttributeName(UnsignedShort id) override; #ifdef MAGNUM_BUILD_DEPRECATED MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doMesh2DCount() const override; @@ -237,31 +237,31 @@ class MAGNUM_ANYSCENEIMPORTER_EXPORT AnySceneImporter: public AbstractImporter { #endif MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doMaterialCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doMaterialForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doMaterialName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doMaterialForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doMaterialName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doMaterial(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doTextureCount() const override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doTextureForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doTextureName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doTextureForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doTextureName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doTexture(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doImage1DCount() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doImage1DLevelCount(UnsignedInt id) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doImage1DForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doImage1DName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doImage1DForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doImage1DName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doImage1D(UnsignedInt id, UnsignedInt level) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doImage2DCount() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doImage2DLevelCount(UnsignedInt id) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doImage2DForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doImage2DName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doImage2DForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doImage2DName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doImage2D(UnsignedInt id, UnsignedInt level) override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doImage3DCount() const override; MAGNUM_ANYSCENEIMPORTER_LOCAL UnsignedInt doImage3DLevelCount(UnsignedInt id) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL Int doImage3DForName(const std::string& name) override; - MAGNUM_ANYSCENEIMPORTER_LOCAL std::string doImage3DName(UnsignedInt id) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Int doImage3DForName(Containers::StringView name) override; + MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::String doImage3DName(UnsignedInt id) override; MAGNUM_ANYSCENEIMPORTER_LOCAL Containers::Optional doImage3D(UnsignedInt id, UnsignedInt level) override; Containers::Pointer _in; diff --git a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp index 344c294aa..f7cf76bd5 100644 --- a/src/MagnumPlugins/ObjImporter/ObjImporter.cpp +++ b/src/MagnumPlugins/ObjImporter/ObjImporter.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include /** @todo remove once iostream is dropped */ #include #include @@ -94,7 +96,7 @@ void ObjImporter::doClose() { _file.reset(); } bool ObjImporter::doIsOpened() const { return !!_file; } -void ObjImporter::doOpenFile(const std::string& filename) { +void ObjImporter::doOpenFile(const Containers::StringView filename) { Containers::Pointer in{new std::ifstream{filename, std::ios::binary}}; if(!in->good()) { Error() << "Trade::ObjImporter::openFile(): cannot open file" << filename; @@ -209,12 +211,12 @@ void ObjImporter::parseMeshNames() { UnsignedInt ObjImporter::doMeshCount() const { return _file->meshes.size(); } -Int ObjImporter::doMeshForName(const std::string& name) { +Int ObjImporter::doMeshForName(const Containers::StringView name) { const auto it = _file->meshesForName.find(name); return it == _file->meshesForName.end() ? -1 : it->second; } -std::string ObjImporter::doMeshName(UnsignedInt id) { +Containers::String ObjImporter::doMeshName(UnsignedInt id) { return _file->meshNames[id]; } @@ -487,4 +489,4 @@ Containers::Optional ObjImporter::doMesh(UnsignedInt id, UnsignedInt) }} CORRADE_PLUGIN_REGISTER(ObjImporter, Magnum::Trade::ObjImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.4") + "cz.mosra.magnum.Trade.AbstractImporter/0.5") diff --git a/src/MagnumPlugins/ObjImporter/ObjImporter.h b/src/MagnumPlugins/ObjImporter/ObjImporter.h index fdbb76dcd..58cb77710 100644 --- a/src/MagnumPlugins/ObjImporter/ObjImporter.h +++ b/src/MagnumPlugins/ObjImporter/ObjImporter.h @@ -116,12 +116,12 @@ class MAGNUM_OBJIMPORTER_EXPORT ObjImporter: public AbstractImporter { MAGNUM_OBJIMPORTER_LOCAL bool doIsOpened() const override; MAGNUM_OBJIMPORTER_LOCAL void doOpenData(Containers::Array&& data, DataFlags dataFlags) override; - MAGNUM_OBJIMPORTER_LOCAL void doOpenFile(const std::string& filename) override; + MAGNUM_OBJIMPORTER_LOCAL void doOpenFile(Containers::StringView filename) override; MAGNUM_OBJIMPORTER_LOCAL void doClose() override; MAGNUM_OBJIMPORTER_LOCAL UnsignedInt doMeshCount() const override; - MAGNUM_OBJIMPORTER_LOCAL Int doMeshForName(const std::string& name) override; - MAGNUM_OBJIMPORTER_LOCAL std::string doMeshName(UnsignedInt id) override; + MAGNUM_OBJIMPORTER_LOCAL Int doMeshForName(Containers::StringView name) override; + MAGNUM_OBJIMPORTER_LOCAL Containers::String doMeshName(UnsignedInt id) override; MAGNUM_OBJIMPORTER_LOCAL Containers::Optional doMesh(UnsignedInt id, UnsignedInt level) override; MAGNUM_OBJIMPORTER_LOCAL void parseMeshNames(); diff --git a/src/MagnumPlugins/TgaImporter/TgaImporter.cpp b/src/MagnumPlugins/TgaImporter/TgaImporter.cpp index 65104f02f..b6cbfe4fd 100644 --- a/src/MagnumPlugins/TgaImporter/TgaImporter.cpp +++ b/src/MagnumPlugins/TgaImporter/TgaImporter.cpp @@ -209,4 +209,4 @@ Containers::Optional TgaImporter::doImage2D(UnsignedInt, UnsignedIn }} CORRADE_PLUGIN_REGISTER(TgaImporter, Magnum::Trade::TgaImporter, - "cz.mosra.magnum.Trade.AbstractImporter/0.4") + "cz.mosra.magnum.Trade.AbstractImporter/0.5")