diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cppc4group.cpp | 34 | ||||
| -rw-r--r-- | src/cppc4group.hpp | 13 |
2 files changed, 46 insertions, 1 deletions
diff --git a/src/cppc4group.cpp b/src/cppc4group.cpp index 464dc88..1b4022e 100644 --- a/src/cppc4group.cpp +++ b/src/cppc4group.cpp @@ -12,6 +12,11 @@ CppC4Group::Data::Data(const void* const data, const size_t size) : data{data}, } +CppC4Group::TmpMemory::TmpMemory(void* const memory, const TmpMemoryCleanupCallback& cleanup, void *const arg) : memory(memory), cleanup(cleanup), arg(arg) +{ + +} + struct CppC4Group::Private { CC4Group* g; @@ -145,11 +150,38 @@ std::string CppC4Group::getErrorCauser() return cc4group.getErrorCauser(p->g); } -void CppC4Group::setTmpMemoryStrategy(const CppC4Group::TmpMemoryStrategy strategy) +void CppC4Group::setTmpMemoryStrategy(const TmpMemoryStrategy strategy) { cc4group.setTmpMemoryStrategy(convertTmpMemoryStrategy(strategy)); } +namespace { + static CppC4Group::TmpMemoryCallback tmpMemoryCallback = nullptr; + + void* customTmpMemoryStrategy(CC4Group* const, size_t size, CC4Group_CleanupJob* cleanup) + { + if(const auto& tmpMemory = tmpMemoryCallback(size)) + { + auto tmpMemorySettings = new CppC4Group::TmpMemory(*tmpMemory); + *cleanup = CC4Group_CleanupJob{[](void* arg){ + auto tmpMemory = reinterpret_cast<CppC4Group::TmpMemory*>(arg); + tmpMemory->cleanup(tmpMemory->memory, tmpMemory->arg); + delete tmpMemory; + }, static_cast<void*>(tmpMemorySettings)}; + + return tmpMemorySettings->memory; + } + + return nullptr; + } +} + +void CppC4Group::setTmpMemoryStrategy(const TmpMemoryCallback callback) +{ + tmpMemoryCallback = callback; + cc4group.setTmpMemoryStrategy(customTmpMemoryStrategy); +} + bool CppC4Group::setMaker(const std::string& maker, const std::string& path, const bool recursive) { return cc4group.setMaker(p->g, maker.c_str(), path.c_str(), recursive); diff --git a/src/cppc4group.hpp b/src/cppc4group.hpp index 78370d9..166fadf 100644 --- a/src/cppc4group.hpp +++ b/src/cppc4group.hpp @@ -4,6 +4,7 @@ #include <vector> #include <optional> #include <cstdio> +#include <functional> class CppC4Group { struct Private; @@ -30,7 +31,18 @@ public: bool official; }; + struct TmpMemory { + using TmpMemoryCleanupCallback = std::function<bool(void* memory, void* arg)>; + + void* memory; + TmpMemoryCleanupCallback cleanup; + void* arg; + + TmpMemory(void* const memory, const TmpMemoryCleanupCallback& cleanup, void* const arg); + }; + public: + using TmpMemoryCallback = std::optional<TmpMemory>(*)(size_t size); using ReadCallback = bool(*)(const void** const data, size_t* const size, void* const arg); using SetupCallback = bool(*)(void* const arg); @@ -47,6 +59,7 @@ public: }; static void setTmpMemoryStrategy(const TmpMemoryStrategy strategy); + static void setTmpMemoryStrategy(const TmpMemoryCallback callback); public: CppC4Group(); |
