#ifndef PKE_MEMORY_TYPE_DEFS_HPP #define PKE_MEMORY_TYPE_DEFS_HPP #include using PkeHandleBucketIndex_T = uint32_t; using PkeHandleItemIndex_T = uint32_t; const uint8_t PKE_HANDLE_VALIDATION_VALID = 0; const uint8_t PKE_HANDLE_VALIDATION_BUCKET_INDEX_TOO_HIGH = 1; const uint8_t PKE_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH = 2; const uint8_t PKE_HANDLE_VALIDATION_VALUE_MAX = 3; struct PkeHandle { union { struct { PkeHandleBucketIndex_T bucketIndex; PkeHandleItemIndex_T itemIndex; }; uint64_t hash = 0xFFFFFFFFFFFFFFFF; }; }; constexpr PkeHandle PkeHandle_MAX = PkeHandle{}; constexpr bool operator==(const PkeHandle &a, const PkeHandle &b) { return a.hash == b.hash; } constexpr uint8_t ValidateHandle(PkeHandle handle, PkeHandle bucketHandle, uint64_t maxItems) { if (handle == PkeHandle_MAX) return PKE_HANDLE_VALIDATION_VALUE_MAX; if (handle.bucketIndex > bucketHandle.bucketIndex) return PKE_HANDLE_VALIDATION_BUCKET_INDEX_TOO_HIGH; if (handle.itemIndex > maxItems) return PKE_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH; if (handle.bucketIndex == bucketHandle.bucketIndex && handle.itemIndex > bucketHandle.itemIndex) return PKE_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH; return PKE_HANDLE_VALIDATION_VALID; } struct MemBucket; #endif /* PKE_MEMORY_TYPE_DEFS_HPP */