summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice <fabrice@schaub-dev.xyz>2026-03-02 22:03:20 +0100
committerFabrice <fabrice@schaub-dev.xyz>2026-03-02 22:03:20 +0100
commitf291e0418202c48438407a30de9040ea4f0b4211 (patch)
treec842df28a3247f34c2a7c9fc4f3546e60af5c624
parent176b2b462371cd860ac9c6b5d2c1db92ae707e88 (diff)
buffer stack refined
-rw-r--r--src/memory.cc2
-rw-r--r--src/source.cc21
-rw-r--r--src/voidc.cc16
3 files changed, 15 insertions, 24 deletions
diff --git a/src/memory.cc b/src/memory.cc
index bb0ecb1..22977d1 100644
--- a/src/memory.cc
+++ b/src/memory.cc
@@ -18,7 +18,7 @@ struct Allocator {
template<typename T>
T* allocate(const Allocator* allocator, usize n) {
- return allocator->allocate(allocator->self, sizeof(T) * n, alignof(T));
+ return (T*)allocator->allocate(allocator->self, sizeof(T) * n, alignof(T));
}
u8* allocate(const Allocator* allocator, usize size, usize align) {
diff --git a/src/source.cc b/src/source.cc
index 02dd42e..e1a0710 100644
--- a/src/source.cc
+++ b/src/source.cc
@@ -67,29 +67,19 @@ void buffer_deinit(Buffer* buffer) {
deallocate(buffer->allocator, (u8*)buffer);
}
-struct Buffer_Manager {
+struct Buffer_Stack {
Link* stack;
- Array<Buffer*> buffers;
};
-#define buffer_manager_init(allocator) \
- Buffer_Manager { nullptr, array_init(Buffer*, allocator) }
-
-bool buffer_manager_push(Buffer_Manager* manager, Buffer* b) {
+void buffer_stack_push(Buffer_Stack* manager, Buffer* b) {
assert_neq(manager, nullptr);
assert_neq(b, nullptr);
- bool ret = array_push(&manager->buffers, b);
- if (!ret) return false;
-
- b = *array_last(&manager->buffers);
if (manager->stack != nullptr) link_after(manager->stack, &b->link);
-
manager->stack = &b->link;
- return true;
}
-bool buffer_manager_pop(Buffer_Manager* manager, Buffer** b) {
+bool buffer_stack_pop(Buffer_Stack* manager, Buffer** b) {
assert_neq(manager, nullptr);
assert_neq(b, nullptr);
@@ -106,9 +96,4 @@ bool buffer_manager_pop(Buffer_Manager* manager, Buffer** b) {
return true;
}
-void buffer_manager_deinit(Buffer_Manager* manager) {
- assert_neq(manager, nullptr);
- array_deinit(&manager->buffers);
-}
-
#endif
diff --git a/src/voidc.cc b/src/voidc.cc
index 8cf9a63..fbb9577 100644
--- a/src/voidc.cc
+++ b/src/voidc.cc
@@ -20,13 +20,19 @@ int main() {
String source(SOURCE);
String file(SOURCE_FILE);
- Buffer_Manager manager = buffer_manager_init(heap_allocator());
+ Buffer_Stack stack{};
+ Buffer* buffer = nullptr;
- Buffer buffer{};
- bool ret = buffer_init(&buffer, heap_allocator(), &source, &file);
+ bool ret = buffer_init(heap_allocator(), &source, &file, &buffer);
if (!ret) return EXIT_FAILURE;
- buffer_manager_push(&manager, &buffer);
+ buffer_stack_push(&stack, buffer);
+ buffer_stack_push(&stack, buffer);
- buffer_manager_deinit(&manager);
+ int c = 0;
+ while(buffer_stack_pop(&stack, &buffer)) {
+ c += 1;
+ }
+
+ assert(c == 2);
}