28 std::uint32_t
id = std::numeric_limits<std::uint32_t>::max();
31 std::uint32_t offset = 0;
34 static constexpr std::uint32_t metaDataSize =
sizeof(MetaData);
40 , m_capacity(static_cast<
std::uint32_t>(capacity))
51 void alloc(std::uint32_t
id)
const
54 m_allocdBytes = varChunkEnd<MetaData>(m_allocdBytes);
56 auto* meta = getLatestVarPtr<MetaData>();
59 m_allocdBytes = varChunkEnd<T>(m_allocdBytes);
64 meta->offset = m_allocdBytes;
76 std::uint32_t off = 0;
79 while(off < m_allocdBytes)
82 std::uint32_t
const alignedMetaDataOffset
83 = varChunkEnd<MetaData>(off) -
static_cast<std::uint32_t
>(
sizeof(MetaData));
85 (alignedMetaDataOffset +
static_cast<std::uint32_t
>(
sizeof(MetaData))) <= m_allocdBytes);
86 auto* metaDataPtr =
reinterpret_cast<MetaData*
>(
87 __builtin_assume_aligned(m_mem + alignedMetaDataOffset,
alignof(MetaData)));
88 off = metaDataPtr->offset;
90 if(metaDataPtr->id ==
id)
91 return reinterpret_cast<T*
>(__builtin_assume_aligned(&m_mem[off -
sizeof(T)],
alignof(T)));
102 return reinterpret_cast<T*
>(__builtin_assume_aligned(&m_mem[m_allocdBytes -
sizeof(T)],
alignof(T)));
116 auto varChunkEnd(std::uint32_t byteOffset)
const -> std::uint32_t
118 auto const ptr =
reinterpret_cast<std::size_t
>(m_mem + byteOffset);
119 constexpr size_t align = std::max(TMinDataAlignBytes,
alignof(T));
120 std::size_t
const newPtrAdress = ((ptr + align - 1u) / align) * align +
sizeof(T);
121 return static_cast<uint32_t
>(newPtrAdress -
reinterpret_cast<std::size_t
>(m_mem));
126 mutable std::uint32_t m_allocdBytes = 0u;
131 std::uint8_t*
const m_mem;
133 const std::uint32_t m_capacity;