Tramway SDK
queue.h
Go to the documentation of this file.
1// Tramway Drifting and Dungeon Exploration Simulator SDK Runtime
2
3#ifndef TRAM_SDK_TEMPLATES_QUEUE_H
4#define TRAM_SDK_TEMPLATES_QUEUE_H
5
6#include <iostream>
7#include <atomic>
8
9namespace tram {
10
16template <typename T>
17class Queue {
18public:
19 Queue() = delete;
20 Queue(const Queue&) = delete;
21 Queue(Queue&&) = delete;
22 Queue(const char* name, size_t count) : name(name), count(count) {
23 T* allocated_memory = (T*)::operator new (count * sizeof(T));
24
25 first = allocated_memory;
26 last = allocated_memory;
27
28 memory_start = allocated_memory;
29 memory_end = allocated_memory + count;
30
31 csize = 0;
32 }
33
35 template <typename... Args>
36 void push(Args&&... args) {
37 lock();
38
39 if (count == csize) {
40 std::cout << "Queue " << name << " out of space!" << std::endl;
41 unlock();
42 return;
43 }
44
45 new (last) T (std::forward<Args>(args)...);
46
47 last++;
48 csize++;
49
50 // wrap around
51 if (last == memory_end) {
53 }
54
55 unlock();
56 }
57
58 void pop() {
59 first->~T();
60
61 first++;
62 csize--;
63
64 // wrap around
65 if (first == memory_end) {
67 }
68 }
69
70 T& front() {
71 return *first;
72 }
73
74 T& back() {
75 if (T* elem = last - 1; elem < memory_start) {
76 return *(memory_end - 1);
77 } else {
78 return *last;
79 }
80 }
81
86 bool try_pop(T& value) {
87 lock();
88
89 if (csize == 0) {
90 unlock();
91 return false;
92 }
93
94 value = *first;
95 pop();
96
97 unlock();
98 return true;
99 }
100
101 size_t size() { return csize; }
102
103 void lock() { while (spinlock.exchange(true)); }
104 void unlock() { spinlock.store(false); }
105
106protected:
107 const char* name; // name of queue for log messages etc.
108 size_t csize; // how many elements are in queue right now
109 size_t count; // how many elements can be added to queue
110 T* first; // first element in queue
111 T* last; // one past last element in queue
112 T* memory_start; // beginning of allocated memory
113 T* memory_end; // end of allocated memory
114
115 std::atomic<bool> spinlock = {false};
116};
117
118}
119
120#endif // TRAM_SDK_TEMPLATES_QUEUE_H
Simple queue implementation.
Definition: queue.h:17
bool try_pop(T &value)
Thread safe.
Definition: queue.h:86
void unlock()
Definition: queue.h:104
void lock()
Definition: queue.h:103
T * memory_start
Definition: queue.h:112
Queue(Queue &&)=delete
void push(Args &&... args)
Thread safe.
Definition: queue.h:36
T & front()
Definition: queue.h:70
Queue(const Queue &)=delete
std::atomic< bool > spinlock
Definition: queue.h:115
void pop()
Definition: queue.h:58
T * last
Definition: queue.h:111
size_t count
Definition: queue.h:109
const char * name
Definition: queue.h:107
T * memory_end
Definition: queue.h:113
T & back()
Definition: queue.h:74
Queue(const char *name, size_t count)
Definition: queue.h:22
Queue()=delete
T * first
Definition: queue.h:110
size_t csize
Definition: queue.h:108
size_t size()
Definition: queue.h:101
Serialization, i.e.