summaryrefslogtreecommitdiff
path: root/library/arena.h
blob: 330023e8c25024912d1b386afd6d81cb722258c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#ifndef ARENA_H
#define ARENA_H

#include "base.h"

/**
 * Arena Helper macro's
 * */

#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define ALIGN_UP_POW2(n, p) (((u64)(n) + ((u64)(p) - 1)) & (~((u64)(p) - 1)))



/*
 * Represents a disk partition with major/minor device numbers and block count.
 */

/**
 * replacing malloc/free with arena allocaters
 *
 * */

#define ARENA_BASE_POS (sizeof(mem_arena))
// void * for the size of a pointer on the machine, 64/32bit comp
#define ARENA_ALIGN (sizeof(void *))


static inline u64 KiB(u64 n) { return n << 10; }
static inline u64 MiB(u64 n) { return n << 20; }
static inline u64 GiB(u64 n) { return n << 30; }

typedef struct mem_arena mem_arena;


struct mem_arena 
{
  u64 capacity;
  u64 pos;
} ;

// arena prototypes
mem_arena *
arena_create(u64 capacity);
// make it a void pointer to allow implicit conversion
void
arena_destroy(mem_arena *arena);

void *
arena_push(mem_arena *arena, u64 size, b32 non_zero);

void
arena_pop(mem_arena *arena, u64 size);

void
arena_pop_to(mem_arena *arena, u64 pos);

void
arena_clear(mem_arena *arena);


#define PUSH_STRUCT(arena, T) (T *)arena_push((arena), sizeof(T), 0)
#define PUSH_STRUCT_NZ(arena, T) (T *)arena_push((arena), sizeof(T), 1)
#define PUSH_ARRAY(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 0)
#define PUSH_ARRAY_NZ(arena, T, n) (T *)arena_push((arena), sizeof(T) * (n), 1)


#endif