A 3D game engine from scratch.
at main 58 lines 1.4 kB view raw
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};