diff options
Diffstat (limited to 'src/bucketed-array.hpp')
| -rw-r--r-- | src/bucketed-array.hpp | 52 |
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 */ |
