Iros
 
Loading...
Searching...
No Matches
allocate.h
Go to the documentation of this file.
1#pragma once
2
10#include "di/util/destroy_at.h"
14
15namespace dius::runtime {
16namespace detail {
17 struct SizedTag : di::IntrusiveListTag<SizedTag> {
18 template<typename U>
19 constexpr static auto is_sized(di::InPlaceType<U>) -> bool {
20 return true;
21 }
22 };
23
25
26 struct FreeList : di::IntrusiveListNode<SizedTag> {
27 auto take_node() -> void* {
28 ASSERT(!list.empty());
29
30 auto* node = &*list.pop_front();
31 di::destroy_at(node);
32 return static_cast<void*>(node);
33 }
34
35 void add_node(void* pointer) {
36 auto* node = static_cast<FreeListNode*>(pointer);
37 di::construct_at(node);
38 list.push_front(*node);
39 }
40
42 };
43
45 public:
46 FreeListList() = default;
47
49 void deallocate(void* pointer);
50
51 private:
53 };
54}
55
56class Heap {
57public:
58 static auto the() -> Heap&;
59
61 void deallocate(void* pointer, usize size, usize align);
62
63private:
64 Heap() = default;
65
66 constexpr static auto block_sizes = di::Array {
67 di::Tuple { 64ZU, 64ZU }, di::Tuple { 128ZU, 128ZU }, di::Tuple { 256ZU, 256ZU },
68 di::Tuple { 512ZU, 512ZU }, di::Tuple { 1024ZU, 1024ZU }, di::Tuple { 2048ZU, 2048ZU },
69 di::Tuple { 4096ZU, 4096ZU }, di::Tuple { 16384ZU, 4096ZU },
70 };
71
72 constexpr static auto block_size_count = block_sizes.size();
73
74 constexpr static auto get_block_index(usize size, usize align) -> di::Optional<usize> {
75 for (auto i = 0ZU; i < block_size_count; ++i) {
76 auto [block_size, block_align] = block_sizes[i];
77 if (size <= block_size && align <= block_align) {
78 return i;
79 }
80 }
81
82 return {};
83 }
84
86};
87}
#define ASSERT
Definition assert_bool.h:16
Definition forward_list_node.h:9
Definition forward_list_forward_declaration.h:12
Definition list_node.h:9
Definition list_forward_declaration.h:12
Definition synchronized.h:17
Definition optional_forward_declaration.h:5
Definition tuple_forward_declaration.h:5
void deallocate(void *pointer, usize size, usize align)
Definition allocate.cpp:99
auto allocate(usize size, usize align) -> di::Result< di::AllocationResult<> >
Definition allocate.cpp:75
static auto the() -> Heap &
Definition allocate.cpp:70
auto allocate(usize size, usize align) -> di::Result< di::AllocationResult<> >
Definition allocate.cpp:44
void deallocate(void *pointer)
Definition allocate.cpp:65
constexpr usize size
Definition gfx_test.cpp:24
size_t usize
Definition integers.h:33
Expected< T, Error > Result
Definition result.h:8
constexpr auto destroy_at
Definition destroy_at.h:24
constexpr auto construct_at
Definition construct_at.h:27
Definition allocate.h:16
Definition allocate.h:15
Definition in_place_type.h:5
Definition span_fixed_size.h:37
constexpr auto size() const
Definition array.h:85
Definition allocate.h:24
Definition allocate.h:26
di::IntrusiveForwardList< FreeListNode > list
Definition allocate.h:41
void add_node(void *pointer)
Definition allocate.h:35
auto take_node() -> void *
Definition allocate.h:27
Definition allocate.h:17
static constexpr auto is_sized(di::InPlaceType< U >) -> bool
Definition allocate.h:19