14 using ValueType = std::uint64_t;
16 static constexpr uint32_t index_bits = 32;
17 static constexpr uint32_t generation_bits = 32;
18 static constexpr ValueType IndexMask = (ValueType{ 1 } << index_bits) - 1;
19 static constexpr ValueType GenerationMask = (ValueType{ 1 } << generation_bits) - 1;
21 constexpr EntityId() noexcept
22 : value_(Invalid().value_)
25 constexpr EntityId(uint32_t index, uint32_t generation) noexcept
26 : value_((
static_cast<ValueType
>(generation) << index_bits) | (
static_cast<ValueType
>(index) & IndexMask))
30 static constexpr EntityId Invalid()
noexcept
32 return EntityId(std::numeric_limits<ValueType>::max());
35 static constexpr EntityId FromRaw(ValueType raw)
noexcept
40 [[nodiscard]]
constexpr uint32_t Index()
const noexcept
42 return static_cast<uint32_t
>(value_ & IndexMask);
45 [[nodiscard]]
constexpr uint32_t Generation()
const noexcept
47 return static_cast<uint32_t
>((value_ >> index_bits) & GenerationMask);
50 [[nodiscard]]
constexpr ValueType Raw()
const noexcept
55 constexpr bool operator==(
const EntityId& other)
const noexcept =
default;
56 constexpr bool operator!=(
const EntityId& other)
const noexcept =
default;
58 constexpr explicit operator bool()
const noexcept
60 return value_ != Invalid().value_;
64 explicit constexpr EntityId(ValueType raw) noexcept