arena_allocator
Code
arena_allocator.odin ¶51 linesSource
1package arena_allocator
2
3import "core:fmt"
4import "core:os"
5
6// virtual package implements a multi-purpose arena allocator. If you are on a
7// platform that does not support virtual memory, then there is also a similar
8// arena in `core:mem`.
9import vmem "core:mem/virtual"
10
11load_files :: proc() -> ([]string, vmem.Arena) {
12 // This creates a growing virtual memory arena. It uses virtual memory and
13 // can grow as things are added to it.
14 arena: vmem.Arena
15 arena_err := vmem.arena_init_growing(&arena)
16 ensure(arena_err == nil)
17 arena_alloc := vmem.arena_allocator(&arena)
18
19 // See arena_init_static for an arena that uses virtual memory, but cannot grow.
20
21 // See arena_init_buffer for an arena that does not use virtual memory,
22 // instead it relies on you feeding it a buffer.
23
24 f1, f1_err := os.read_entire_file("file1.txt", arena_alloc)
25 ensure(f1_err == nil)
26
27 f2, f2_err := os.read_entire_file("file2.txt", arena_alloc)
28 ensure(f2_err == nil)
29
30 f3, f3_err := os.read_entire_file("file3.txt", arena_alloc)
31 ensure(f3_err == nil)
32
33 res := make([]string, 3, arena_alloc)
34 res[0] = string(f1)
35 res[1] = string(f2)
36 res[2] = string(f3)
37
38 return res, arena
39}
40
41main :: proc() {
42 files, arena := load_files()
43
44 for f in files {
45 fmt.println(f)
46 }
47
48 // This deallocates everything that was allocated on the arena:
49 // The loaded content of the files as well as the `files` slice.
50 vmem.arena_destroy(&arena)
51}
Other Files
file1.txt ¶1 lineSource
This is from file1.txt
file2.txt ¶1 lineSource
This is from file2.txt
file3.txt ¶1 lineSource
This is from file3.txt