From ce08fff22e4bed3d977cfd662ed2a6d8caa82997 Mon Sep 17 00:00:00 2001 From: Glenn Smith Date: Mon, 14 Sep 2020 17:15:37 -0400 Subject: Database api Co-Authored-By: Josh Ferrell --- binaryninjaapi.cpp | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'binaryninjaapi.cpp') diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp index 6b2497a9..d2815e8f 100644 --- a/binaryninjaapi.cpp +++ b/binaryninjaapi.cpp @@ -19,6 +19,7 @@ // IN THE SOFTWARE. #include "binaryninjaapi.h" +#include using namespace BinaryNinja; using namespace std; @@ -385,4 +386,41 @@ map BinaryNinja::GetMemoryUsageInfo() result[info[i].name] = info[i].value; BNFreeMemoryUsageInfo(info, count); return result; -} \ No newline at end of file +} + + +std::function +BinaryNinja::SplitProgress(std::function originalFn, size_t subpart, size_t subpartCount) +{ + return SplitProgress(originalFn, subpart, std::vector(subpartCount, 1.0 / (double)subpartCount)); +} + + +std::function +BinaryNinja::SplitProgress(std::function originalFn, size_t subpart, std::vector subpartWeights) +{ + if (!originalFn) + return [](size_t, size_t){ return true; }; + + // Normalize weights + double weightSum = std::accumulate(subpartWeights.begin(), subpartWeights.end(), 0.0); + if (weightSum < 0.0001f) + return [](size_t, size_t){ return true; }; + // Keep a running count of weights for the start + std::vector subpartStarts; + double start = 0.0; + for (auto i = 0; i < subpartWeights.size(); ++i) + { + subpartStarts.push_back(start); + subpartWeights[i] /= weightSum; + start += subpartWeights[i]; + } + + return [=](size_t current, size_t max) { + // Just use a large number for easy divisibility + size_t steps = 1000000; + double subpartSize = steps * subpartWeights[subpart]; + double subpartProgress = ((double)current / (double)max) * subpartSize; + return originalFn(subpartStarts[subpart] * steps + subpartProgress, steps); + }; +} -- cgit v1.3.1