summaryrefslogtreecommitdiff
path: root/src/bucketed-array.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/bucketed-array.hpp')
-rw-r--r--src/bucketed-array.hpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/bucketed-array.hpp b/src/bucketed-array.hpp
new file mode 100644
index 0000000..5813ca6
--- /dev/null
+++ b/src/bucketed-array.hpp
@@ -0,0 +1,52 @@
+#ifndef PKE_BUCKETED_ARRAY_HPP
+#define PKE_BUCKETED_ARRAY_HPP
+
+#include <cstddef>
+
+#include "memory.hpp"
+
+constexpr PkeHandleBucketIndex_T BucketContainerDefaultBucketCount = 16;
+constexpr PkeHandleItemIndex_T BucketContainerDefaultItemCount = 256;
+
+template<typename T, typename CT = PkeHandle, PkeHandleBucketIndex_T BKT_CNT = BucketContainerDefaultBucketCount>
+struct BucketContainer {
+ CT limits;
+ CT pkeHandle;
+ T* buckets[BKT_CNT];
+};
+
+template<typename T, typename CT, PkeHandleBucketIndex_T BKT_CNT>
+void Buckets_Init(BucketContainer<T, CT, BKT_CNT> &bktContainer, size_t maxItemCount = BucketContainerDefaultItemCount) {
+ bktContainer.limits.bucketIndex = BKT_CNT;
+ bktContainer.limits.itemIndex = maxItemCount;
+ bktContainer.pkeHandle.hash = 0;
+ for (PkeHandleBucketIndex_T i = 0; i < BKT_CNT; ++i) {
+ bktContainer.buckets[i] = nullptr;
+ }
+ bktContainer.buckets[0] = Pke_New<T>(maxItemCount);
+}
+
+template<typename T, typename CT, PkeHandleBucketIndex_T BKT_CNT>
+inline CT Buckets_NewHandle(BucketContainer<T, CT, BKT_CNT> &bktContainer) {
+ CT returnValue = bktContainer.pkeHandle;
+ bktContainer.pkeHandle.itemIndex += 1;
+ if (bktContainer.pkeHandle.itemIndex >= bktContainer.limits.itemIndex) {
+ bktContainer.pkeHandle.itemIndex = 0;
+ bktContainer.pkeHandle.bucketIndex += 1;
+ assert(bktContainer.pkeHandle.bucketIndex < bktContainer.limits.bucketIndex);
+ }
+ if (bktContainer.pkeHandle.itemIndex == 0) {
+ bktContainer.buckets[bktContainer.pkeHandle.bucketIndex] = Pke_New<T>(bktContainer.limits.itemIndex);
+ }
+ return returnValue;
+}
+
+template<typename T, typename CT, PkeHandleBucketIndex_T BKT_CNT>
+static inline constexpr void Buckets_Destroy(BucketContainer<T, CT, BKT_CNT> &bktContainer) {
+ for (PkeHandleBucketIndex_T i = 0; i < BKT_CNT; ++i) {
+ Pke_Delete<T>(bktContainer.buckets[i], bktContainer.limits.itemIndex);
+ bktContainer.buckets[i] = CAFE_BABE(T);
+ }
+}
+
+#endif /* PKE_BUCKETED_ARRAY_HPP */