Browse Source

Trade: accept const references in AbstractImporter file callbacks.

audio-import
Vladimír Vondruš 7 years ago
parent
commit
589a912fa1
  1. 2
      doc/changelog.dox
  2. 6
      src/Magnum/Trade/AbstractImporter.h
  3. 25
      src/Magnum/Trade/Test/AbstractImporterTest.cpp

2
doc/changelog.dox

@ -155,6 +155,8 @@ See also:
[mosra/magnum#312](https://github.com/mosra/magnum/pull/312))
@ref Trade::TgaImporter "TgaImporter" now properly reports an error message
when opening an empty file
- @ref Trade::AbstractImporter::setFileCallback() now accepts callbacks with
@cpp const @ce references to user data as well
@subsection changelog-latest-buildsystem Build system

6
src/Magnum/Trade/AbstractImporter.h

@ -1239,7 +1239,7 @@ class MAGNUM_TRADE_EXPORT AbstractImporter: public PluginManager::AbstractManagi
/* Used by the templated version only */
struct FileCallbackTemplate {
void(*callback)();
void* userData;
const void* userData;
} _fileCallbackTemplate{};
};
@ -1250,10 +1250,10 @@ template<class Callback, class T> void AbstractImporter::setFileCallback(Callbac
const auto callbackPtr = static_cast<Containers::Optional<Containers::ArrayView<const char>>(*)(const std::string&, InputFileCallbackPolicy, T&)>(callback);
if(!callbackPtr) return setFileCallback(nullptr);
_fileCallbackTemplate = { reinterpret_cast<void(*)()>(callbackPtr), &userData };
_fileCallbackTemplate = { reinterpret_cast<void(*)()>(callbackPtr), static_cast<const void*>(&userData) };
setFileCallback([](const std::string& filename, const InputFileCallbackPolicy flags, void* const userData) {
auto& s = *reinterpret_cast<FileCallbackTemplate*>(userData);
return reinterpret_cast<Containers::Optional<Containers::ArrayView<const char>>(*)(const std::string&, InputFileCallbackPolicy, T&)>(s.callback)(filename, flags, *static_cast<T*>(s.userData));
return reinterpret_cast<Containers::Optional<Containers::ArrayView<const char>>(*)(const std::string&, InputFileCallbackPolicy, T&)>(s.callback)(filename, flags, *static_cast<T*>(const_cast<void*>(s.userData)));
}, &_fileCallbackTemplate);
}
#endif

25
src/Magnum/Trade/Test/AbstractImporterTest.cpp

@ -66,6 +66,7 @@ struct AbstractImporterTest: TestSuite::Tester {
void setFileCallback();
void setFileCallbackTemplate();
void setFileCallbackTemplateNull();
void setFileCallbackTemplateConst();
void setFileCallbackFileOpened();
void setFileCallbackNotImplemented();
void setFileCallbackNotSupported();
@ -260,6 +261,7 @@ AbstractImporterTest::AbstractImporterTest() {
&AbstractImporterTest::setFileCallback,
&AbstractImporterTest::setFileCallbackTemplate,
&AbstractImporterTest::setFileCallbackTemplateNull,
&AbstractImporterTest::setFileCallbackTemplateConst,
&AbstractImporterTest::setFileCallbackFileOpened,
&AbstractImporterTest::setFileCallbackNotImplemented,
&AbstractImporterTest::setFileCallbackNotSupported,
@ -665,6 +667,29 @@ void AbstractImporterTest::setFileCallbackTemplateNull() {
CORRADE_VERIFY(importer.called);
}
void AbstractImporterTest::setFileCallbackTemplateConst() {
struct: AbstractImporter {
Features doFeatures() const override { return Feature::OpenData|Feature::FileCallback; }
bool doIsOpened() const override { return false; }
void doClose() override {}
void doSetFileCallback(Containers::Optional<Containers::ArrayView<const char>>(*)(const std::string&, InputFileCallbackPolicy, void*), void*) override {
called = true;
}
bool called = false;
} importer;
/* Just verify we can have const parameters */
const int a = 0;
auto lambda = [](const std::string&, InputFileCallbackPolicy, const int&) {
return Containers::Optional<Containers::ArrayView<const char>>{};
};
importer.setFileCallback(lambda, a);
CORRADE_VERIFY(importer.fileCallback());
CORRADE_VERIFY(importer.fileCallbackUserData());
CORRADE_VERIFY(importer.called);
}
void AbstractImporterTest::setFileCallbackFileOpened() {
struct: AbstractImporter {
Features doFeatures() const override { return {}; }

Loading…
Cancel
Save