#ifndef PK_MEM_TYPES_H #define PK_MEM_TYPES_H #include typedef uint32_t pk_handle_bucket_index_T; typedef uint32_t pk_handle_item_index_T; enum PK_HANDLE_VALIDATION : uint8_t { PK_HANDLE_VALIDATION_VALID = 0, PK_HANDLE_VALIDATION_BUCKET_INDEX_TOO_HIGH = 1, PK_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH = 2, PK_HANDLE_VALIDATION_VALUE_MAX = 3, }; struct pk_handle { pk_handle_bucket_index_T bucketIndex; pk_handle_item_index_T itemIndex; }; #if ! defined(__cplusplus) #define PK_HANDLE_MAX ((struct pk_handle){ .bucketIndex = 0xFFFFFFFF, .itemIndex = 0xFFFFFFFF }) #else #define PK_HANDLE_MAX (pk_handle{ 0xFFFFFFFF, 0xFFFFFFFF }) #endif enum PK_HANDLE_VALIDATION pk_handle_validate(const struct pk_handle handle, const struct pk_handle bucketHandle, const uint64_t maxItems); #if defined(__cplusplus) constexpr struct pk_handle pk_handle_MAX_constexpr = { 0xFFFFFFFF, 0xFFFFFFFF }; inline constexpr bool operator==(const pk_handle& lhs, const pk_handle& rhs) { return lhs.bucketIndex == rhs.bucketIndex && lhs.itemIndex == rhs.itemIndex; } template inline constexpr enum PK_HANDLE_VALIDATION pk_handle_validate_constexpr() { if constexpr (handle == pk_handle_MAX_constexpr) return PK_HANDLE_VALIDATION_VALUE_MAX; if constexpr (handle.bucketIndex > bucketHandle.bucketIndex) return PK_HANDLE_VALIDATION_BUCKET_INDEX_TOO_HIGH; if constexpr (handle.itemIndex > maxItems) return PK_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH; if constexpr (handle.bucketIndex == bucketHandle.bucketIndex && handle.itemIndex > bucketHandle.itemIndex) return PK_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH; return PK_HANDLE_VALIDATION_VALID; } #endif /* __cplusplus */ struct pk_membucket; enum PK_MEMBUCKET_FLAGS : uint64_t { PK_MEMBUCKET_FLAG_NONE = (0), PK_MEMBUCKET_FLAG_TRANSIENT = (1 << 01l), PK_MEMBUCKET_FLAG_ALL = (0xFFFFFFFFFFFFFFFF), }; #endif /* PK_MEM_TYPES_H */ #ifdef PK_IMPL_MEM_TYPES enum PK_HANDLE_VALIDATION pk_handle_validate(const struct pk_handle handle, const struct pk_handle bucketHandle, const uint64_t maxItems) { if (handle.bucketIndex == PK_HANDLE_MAX.bucketIndex && handle.itemIndex == PK_HANDLE_MAX.itemIndex) return PK_HANDLE_VALIDATION_VALUE_MAX; if (handle.bucketIndex > bucketHandle.bucketIndex) return PK_HANDLE_VALIDATION_BUCKET_INDEX_TOO_HIGH; if (handle.itemIndex > maxItems) return PK_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH; if (handle.bucketIndex == bucketHandle.bucketIndex && handle.itemIndex > bucketHandle.itemIndex) return PK_HANDLE_VALIDATION_ITEM_INDEX_TOO_HIGH; return PK_HANDLE_VALIDATION_VALID; } #endif /* PK_IMPL_MEM_TYPES */