summaryrefslogtreecommitdiff
path: root/asl/handle_pool/index_pool.hpp
diff options
context:
space:
mode:
authorSteven Le Rouzic <steven.lerouzic@gmail.com>2025-05-28 00:47:52 +0200
committerSteven Le Rouzic <steven.lerouzic@gmail.com>2025-06-15 22:45:41 +0200
commit484bbdea95c66bf6db23b8080d2cf7987939b03c (patch)
tree137ccd39aa633dddda3526658e992c35fa6854f8 /asl/handle_pool/index_pool.hpp
parentafb237c513854699ee4109dc117e6b58ae645bb8 (diff)
Add index_pool_config
Diffstat (limited to 'asl/handle_pool/index_pool.hpp')
-rw-r--r--asl/handle_pool/index_pool.hpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/asl/handle_pool/index_pool.hpp b/asl/handle_pool/index_pool.hpp
new file mode 100644
index 0000000..f874386
--- /dev/null
+++ b/asl/handle_pool/index_pool.hpp
@@ -0,0 +1,56 @@
+// Copyright 2025 Steven Le Rouzic
+//
+// SPDX-License-Identifier: BSD-3-Clause
+
+#include "asl/base/integers.hpp"
+#include "asl/base/meta.hpp"
+#include "asl/containers/chunked_buffer.hpp"
+#include "asl/memory/allocator.hpp"
+
+namespace asl
+{
+
+// @Todo Uniquely represented for the handle?
+
+template<
+ int kIndexBits_,
+ int kGenBits_,
+ typename UserType_ = empty,
+ int kUserBits_ = 0
+>
+requires (kIndexBits_ > 0 && kGenBits_ > 0 && kUserBits_ >= 0)
+struct index_pool_config
+{
+ static constexpr bool kHasUser = !same_as<UserType_, empty>;
+
+ using UserType = UserType_;
+ using PrimitiveUserType = smallest_unsigned_integer_type_for_width<size_of<UserType> * 8>;
+
+ static_assert(trivially_copy_constructible<UserType>);
+ static_assert(size_of<UserType> == size_of<PrimitiveUserType>, "UserType should be of size 1, 2 or 4");
+
+ static constexpr int kUserBits = []() static -> int {
+ if constexpr (!kHasUser) { return 0; };
+ return kUserBits_ == 0 ? size_of<UserType> * 8 : kUserBits_;
+ }();
+
+ static_assert(kUserBits <= size_of<UserType> * 8);
+
+ static constexpr int kIndexBits = kIndexBits_;
+ static constexpr int kGenBits = kGenBits_;
+
+ static_assert(kIndexBits + kGenBits + kUserBits <= 63);
+
+ using HandleType = smallest_unsigned_integer_type_for_width<kIndexBits + kGenBits + kUserBits + 1>;
+
+ static constexpr int kGenShift = kIndexBits;
+ static constexpr int kUserShift = kIndexBits + kGenBits;
+
+ static constexpr HandleType kValidMask = HandleType{1} << (size_of<HandleType> * 8 - 1);
+ static constexpr HandleType kIndexMask = (HandleType{1} << kIndexBits) - 1;
+ static constexpr HandleType kGenMask = ((HandleType{1} << kGenBits) - 1) << kGenShift;
+ static constexpr HandleType kUserMask = ((HandleType{1} << kUserBits) - 1) << kUserShift;
+};
+
+} // namespace asl
+