diff options
Diffstat (limited to 'source/base/base_stack.h')
| -rw-r--r-- | source/base/base_stack.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/source/base/base_stack.h b/source/base/base_stack.h new file mode 100644 index 0000000..9b69e66 --- /dev/null +++ b/source/base/base_stack.h | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | #ifndef BASE_STACK_H | ||
| 2 | #define BASE_STACK_H | ||
| 3 | |||
| 4 | #if defined(PLATFORM_UNIX) | ||
| 5 | #define StackCreate(size) unix_stack_create(size) | ||
| 6 | #define StackDestroy(stack) unix_stack_destroy(stack) | ||
| 7 | #elif defined(PLATFORM_WINDOWS) | ||
| 8 | #define StackCreate(size) win32_stack_create(size) | ||
| 9 | #define StackDestroy(stack) win32_stack_destroy(stack) | ||
| 10 | #endif | ||
| 11 | |||
| 12 | //- | ||
| 13 | |||
| 14 | typedef struct MemStackHeader MemStackHeader; | ||
| 15 | typedef struct MemStack MemStack; | ||
| 16 | |||
| 17 | struct MemStackHeader { | ||
| 18 | u8 padding; | ||
| 19 | u8 previous_offset; | ||
| 20 | }; | ||
| 21 | |||
| 22 | struct MemStack { | ||
| 23 | MemStackHeader *header; | ||
| 24 | u64 current_offset; | ||
| 25 | u64 capacity; | ||
| 26 | u8 *base_position; // TODO: why is this a (u8 *)? | ||
| 27 | }; | ||
| 28 | |||
| 29 | //- | ||
| 30 | |||
| 31 | internal MemStack *stack_push_align(MemStack *stack, u64 size, u8 alignment); | ||
| 32 | internal MemStack *stack_resize_align(MemStack *stack, void *pointer, u64 old_size, u64 new_size, | ||
| 33 | u8 alignment); | ||
| 34 | internal void *stack_push(MemStack *stack, u64 size); | ||
| 35 | internal void stack_pop(MemStack *stack, void *pointer); | ||
| 36 | internal void stack_clear(MemStack *stack); | ||
| 37 | internal u8 calculate_padding(u64 pointer, u8 alignment, u64 header_size); | ||
| 38 | internal MemStack *arena_to_stack(MemArena *arena, u64 size, u64 alignment); | ||
| 39 | |||
| 40 | |||
| 41 | #define ArenaToStack(arena, size) arena_to_stack(arena, size); | ||
| 42 | #define StackPushStruct(stack, type) (type *)stack_push((stack), sizeof(type)) | ||
| 43 | #define StackPushArray(stack, type, len) (type *)stack_push((stack), sizeof(type) * (len)) | ||
| 44 | #define StackPop(stack, pointer) stack_pop(stack, pointer) | ||
| 45 | #define StackClear(stack) stack_clear(stack) | ||
| 46 | |||
| 47 | #endif // BASE_STACK_H | ||
