summaryrefslogtreecommitdiff
path: root/src/memory.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-08-29 14:15:10 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-06 17:19:09 -0400
commit6a3de7eeacc21e2a6ccec853a24c9d0917d274e4 (patch)
tree4d79080adda9fed223c1ca0e46f7f57c6b7702ee /src/memory.cpp
parent86ece47fd62bbaaf76581828936946555211459b (diff)
move boilerplate bucket code to memory file
Diffstat (limited to 'src/memory.cpp')
-rw-r--r--src/memory.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/memory.cpp b/src/memory.cpp
index f919770..7670b2f 100644
--- a/src/memory.cpp
+++ b/src/memory.cpp
@@ -105,3 +105,23 @@ void pke::Flush() {
DestroyBucket(&buckets[i + 1]);
}
}
+
+uint64_t Buckets_NewHandle(std::size_t bucketBytes, uint64_t bucketItemCount, uint64_t &bucketIncrementer, uint64_t &bucketCounter, uint64_t &itemCounter, void*& buckets) {
+ uint64_t newHandle{itemCounter | bucketCounter};
+
+ itemCounter += uint64_t{1ULL << 32};
+ if (itemCounter > uint64_t{(bucketItemCount - 1) << 32}) {
+ itemCounter = 0ULL;
+ bucketCounter += 1;
+ }
+ if (bucketCounter > bucketIncrementer) {
+ int64_t newIncrement = bucketIncrementer * 1.5;
+ char * newBuckets = reinterpret_cast<char *>(pke::PkeNew(bucketBytes * newIncrement));
+ std::memcpy(newBuckets, buckets, bucketBytes * bucketIncrementer);
+ pke::PkeDelete(buckets, bucketBytes * bucketIncrementer);
+ buckets = newBuckets;
+ bucketIncrementer = newIncrement;
+ }
+
+ return newHandle;
+}