openMSX
unittest
monotonic_allocator_test.cc
Go to the documentation of this file.
1
#include "catch.hpp"
2
#include "
monotonic_allocator.hh
"
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
15
TEST_CASE
(
"monotonic_allocator"
)
16
{
17
SECTION(
"default"
) {
18
monotonic_allocator
a;
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"
) {
34
monotonic_allocator
a(100);
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"
) {
66
monotonic_allocator
a;
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
}
monotonic_allocator
Definition:
monotonic_allocator.hh:15
monotonic_allocator::allocate
void * allocate(size_t bytes, size_t alignment)
Definition:
monotonic_allocator.hh:46
CHECK
CHECK(m3==m3)
p4
mat4 p4(vec4(1, 2, 3, 4), vec4(3, 4, 5, 6), vec4(5, 0, 7, 8), vec4(7, 8, 9, 0))
p3
mat3 p3(vec3(1, 2, 3), vec3(4, 5, 6), vec3(7, 0, 9))
monotonic_allocator.hh
TEST_CASE
TEST_CASE("monotonic_allocator")
Definition:
monotonic_allocator_test.cc:15
ranges::fill
constexpr void fill(ForwardRange &&range, const T &value)
Definition:
ranges.hh:305
utf8::unchecked::size
size_t size(std::string_view utf8)
Definition:
utf8_unchecked.hh:227
ranges.hh
Generated on Mon Nov 27 2023 22:13:12 for openMSX by
1.9.4