A 3D game engine from scratch.
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net>
2
3#pragma once
4
5#include "memory.hpp"
6
7template <typename T>
8class Queue {
9public:
10 u32 size = 0;
11 u32 max_size = 0;
12 T *items = nullptr;
13 u32 head = 0;
14 u32 tail = 0;
15
16 T* push() {
17 assert(this->size < this->max_size);
18 T* new_slot = this->items + this->tail;
19 if (this->tail + 1 >= this->max_size) {
20 this->tail = 0;
21 } else {
22 this->tail++;
23 }
24 this->size++;
25 return new_slot;
26 }
27
28 T push(T new_item) {
29 T* new_slot = push();
30 *new_slot = new_item;
31 return new_item;
32 }
33
34 T* pop() {
35 assert(this->size > 0);
36 T* item = this->items + this->head;
37 if (this->head + 1 >= this->max_size) {
38 this->head = 0;
39 } else {
40 this->head++;
41 }
42 this->size--;
43 return item;
44 }
45
46 Queue(memory::Pool *memory_pool, u32 new_max_size, const char *debug_name) {
47 this->max_size = new_max_size;
48 this->items = (T*)memory::push(memory_pool, sizeof(T) * this->max_size, debug_name);
49 }
50
51 Queue(memory::Pool *memory_pool, u32 new_size, u32 new_max_size, T *new_items) {
52 this->size = new_size;
53 this->head = 0;
54 this->tail = new_size;
55 this->max_size = new_max_size;
56 this->items = new_items;
57 }
58};