AI 24/25 Project Software
Documentation for the AI 24/25 course programming project software
Loading...
Searching...
No Matches
segmented_array_store.h
1#pragma once
2
3#include <cassert>
4#include <vector>
5
6namespace segmented_array_store {
7
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_;
13
14public:
15 SegmentedArrayStore() = default;
16
17 ~SegmentedArrayStore()
18 {
19 for (void* segment : segments_) {
20 delete[](segment);
21 }
22 }
23
24 template <typename T>
25 T* allocate(const std::size_t elements)
26 {
27 const std::size_t size = elements * sizeof(T);
28
29 assert(size <= SEGMENT_SIZE);
30
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_);
35 }
36
37 T* res = reinterpret_cast<T*>(current_);
38 current_ = reinterpret_cast<char*>(current_) + size;
39 space_left -= size;
40 return res;
41 }
42
43 std::size_t size_in_bytes() const
44 {
45 return segments_.size() * SEGMENT_SIZE;
46 }
47};
48
49} // namespace segmented_array_store