6namespace segmented_array_store {
8template <std::
size_t SEGMENT_SIZE = 16384>
9class SegmentedArrayStore {
10 std::size_t space_left = 0;
11 void* current_ =
nullptr;
12 std::vector<void*> segments_;
15 SegmentedArrayStore() =
default;
17 ~SegmentedArrayStore()
19 for (
void* segment : segments_) {
25 T* allocate(
const std::size_t elements)
27 const std::size_t size = elements *
sizeof(T);
29 assert(size <= SEGMENT_SIZE);
31 if (!std::align(
alignof(T), size, current_, space_left)) {
32 space_left = SEGMENT_SIZE;
33 current_ = ::operator
new[](SEGMENT_SIZE);
34 segments_.push_back(current_);
37 T* res =
reinterpret_cast<T*
>(current_);
38 current_ =
reinterpret_cast<char*
>(current_) + size;
43 std::size_t size_in_bytes()
const
45 return segments_.size() * SEGMENT_SIZE;