#ifndef PKE_BUCKETED_ARRAY_HPP #define PKE_BUCKETED_ARRAY_HPP #include #include "memory.hpp" constexpr PkeHandleBucketIndex_T BucketContainerDefaultBucketCount = 16; constexpr PkeHandleItemIndex_T BucketContainerDefaultItemCount = 256; template struct BucketContainer { CT limits; CT pkeHandle; T* buckets[BKT_CNT]; }; template void Buckets_Init(BucketContainer &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(maxItemCount); } template inline CT Buckets_NewHandle(BucketContainer &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(bktContainer.limits.itemIndex); } return returnValue; } template static inline constexpr void Buckets_Destroy(BucketContainer &bktContainer) { for (PkeHandleBucketIndex_T i = 0; i < BKT_CNT; ++i) { Pke_Delete(bktContainer.buckets[i], bktContainer.limits.itemIndex); bktContainer.buckets[i] = CAFE_BABE(T); } } #endif /* PKE_BUCKETED_ARRAY_HPP */