2#include "gaia/config/config.h"
7#include "gaia/cnt/darray.h"
8#include "gaia/core/utility.h"
9#include "gaia/mem/mem_alloc.h"
14 struct ArchetypeMatchStamps {
17 static constexpr uint32_t PageBits = 10;
18 static constexpr uint32_t PageSize = 1U << PageBits;
19 static constexpr uint32_t PageMask = PageSize - 1;
22 cnt::darray<uint32_t*> pages;
24 ArchetypeMatchStamps() =
default;
25 ArchetypeMatchStamps(
const ArchetypeMatchStamps&) =
delete;
26 ArchetypeMatchStamps& operator=(
const ArchetypeMatchStamps&) =
delete;
28 ArchetypeMatchStamps(ArchetypeMatchStamps&& other)
noexcept: pages(GAIA_MOV(other.pages)) {
32 ArchetypeMatchStamps& operator=(ArchetypeMatchStamps&& other)
noexcept {
37 pages = GAIA_MOV(other.pages);
42 ~ArchetypeMatchStamps() {
46 GAIA_NODISCARD
bool has(uint32_t sid)
const {
47 const auto pid = sid >> PageBits;
48 return pid < pages.size() && pages[pid] !=
nullptr;
51 GAIA_NODISCARD uint32_t get(uint32_t sid)
const {
52 GAIA_ASSERT(has(sid));
53 const auto pid = sid >> PageBits;
54 const auto did = sid & PageMask;
55 return pages[pid][did];
58 void set(uint32_t sid, uint32_t version) {
59 const auto pid = sid >> PageBits;
60 const auto did = sid & PageMask;
61 auto* page = ensure_page(pid);
66 for (
auto* page: pages) {
72 std::memset(page, 0,
sizeof(uint32_t) * PageSize);
77 GAIA_NODISCARD uint32_t* ensure_page(uint32_t pid) {
78 if (pid >= pages.size())
79 pages.resize(pid + 1,
nullptr);
81 auto*& page = pages[pid];
82 if (page ==
nullptr) {
83 page = mem::AllocHelper::alloc<uint32_t>(
"ArchetypeMatchStampPage", PageSize);
84 std::memset(page, 0,
sizeof(uint32_t) * PageSize);
91 for (
auto* page: pages) {
94 mem::AllocHelper::free(
"ArchetypeMatchStampPage", page);