summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cppc4group.cpp34
-rw-r--r--src/cppc4group.hpp13
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();