openMSX
monotonic_allocator_test.cc
Go to the documentation of this file.
1#include "catch.hpp"
3#include "ranges.hh"
4#include <span>
5
6[[nodiscard]] static char* alloc(monotonic_allocator& a, size_t size, size_t alignment)
7{
8 char* result = static_cast<char*>(a.allocate(size, alignment));
9 CHECK(result != nullptr);
10 CHECK((reinterpret_cast<uintptr_t>(result) & (alignment - 1)) == 0);
11 ranges::fill(std::span{result, size}, 0xab); // this shouldn't crash
12 return result;
13}
14
15TEST_CASE("monotonic_allocator")
16{
17 SECTION("default") {
19 char* p1 = alloc(a, 300, 4);
20
21 char* p2 = alloc(a, 600, 4);
22 CHECK(p1 + 300 == p2); // adjacent
23
24 char* p3 = alloc(a, 600, 4);
25 CHECK(p2 + 600 != p3); // not adjacent, doesn't fit in initial 1kB block
26
27 char* p4 = alloc(a, 600, 4);
28 CHECK(p3 + 600 == p4); // adjacent again because 2nd block is 2kB
29
30 char* p5 = alloc(a, 10'000, 4);
31 CHECK(p4 + 600 != p5); // not adjacent
32 }
33 SECTION("initial size") {
35 char* p1 = alloc(a, 32, 4);
36
37 char* p2 = alloc(a, 32, 4);
38 CHECK(p1 + 32 == p2); // adjacent
39
40 char* p3 = alloc(a, 32, 4);
41 CHECK(p1 + 64 == p3); // adjacent
42
43 char* p4 = alloc(a, 32, 4);
44 CHECK(p1 + 96 != p4); // not adjacent
45 }
46 SECTION("initial buffer") {
47 char buf[100];
48 monotonic_allocator a(buf, 100);
49
50 char* p1 = alloc(a, 40, 1);
51 CHECK(p1 == buf);
52
53 char* p2 = alloc(a, 40, 1);
54 CHECK(p2 == buf + 40);
55
56 char* p3 = alloc(a, 40, 1);
57 CHECK(p3 != buf + 80);
58
59 char* p4 = alloc(a, 40, 1);
60 CHECK(p4 == p3 + 40);
61
62 char* p5 = alloc(a, 40, 1);
63 CHECK(p5 == p3 + 80);
64 }
65 SECTION("alignment") {
67 char* p1 = alloc(a, 13, 1);
68
69 char* p2 = alloc(a, 4, 4);
70 CHECK(p2 == p1 + 16);
71
72 char* p3 = alloc(a, 3, 2);
73 CHECK(p3 == p2 + 4);
74
75 char* p4 = alloc(a, 3, 2);
76 CHECK(p4 == p3 + 4);
77 }
78}
void * allocate(size_t bytes, size_t alignment)
CHECK(m3==m3)
mat4 p4(vec4(1, 2, 3, 4), vec4(3, 4, 5, 6), vec4(5, 0, 7, 8), vec4(7, 8, 9, 0))
mat3 p3(vec3(1, 2, 3), vec3(4, 5, 6), vec3(7, 0, 9))
TEST_CASE("monotonic_allocator")
constexpr void fill(ForwardRange &&range, const T &value)
Definition: ranges.hh:305
size_t size(std::string_view utf8)