DDNet documentation
Loading...
Searching...
No Matches
ringbuffer.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef ENGINE_SHARED_RINGBUFFER_H
4#define ENGINE_SHARED_RINGBUFFER_H
5
6#include <cstdlib>
7#include <functional>
8
10{
11 class CItem
12 {
13 public:
16 int m_Free;
17 int m_Size;
18 };
19
21
24
27
28 int m_Size;
30
31 std::function<void(void *pCurrent)> m_PopCallback = nullptr;
32
33 CItem *NextBlock(CItem *pItem);
34 CItem *PrevBlock(CItem *pItem);
35 CItem *MergeBack(CItem *pItem);
36
37protected:
38 void *Allocate(int Size);
39
40 void *Prev(void *pCurrent);
41 void *Next(void *pCurrent);
42 void *First();
43 void *Last();
44
45 void Init(void *pMemory, int Size, int Flags);
46 int PopFirst();
47 void SetPopCallback(std::function<void(void *pCurrent)> PopCallback);
48
49public:
50 enum
51 {
52 // Will start to destroy items to try to fit the next one
54 };
55 static constexpr int ITEM_SIZE = sizeof(CItem);
56
57 void Clear();
58};
59
60template<typename T>
62{
63public:
64 T *Allocate(int Size) { return (T *)CRingBufferBase::Allocate(Size); }
66 void SetPopCallback(const std::function<void(T *pCurrent)> &PopCallback)
67 {
68 CRingBufferBase::SetPopCallback([PopCallback](void *pCurrent) {
69 PopCallback((T *)pCurrent);
70 });
71 }
72
73 T *Prev(T *pCurrent) { return (T *)CRingBufferBase::Prev(pCurrent); }
74 T *Next(T *pCurrent) { return (T *)CRingBufferBase::Next(pCurrent); }
75 T *First() { return (T *)CRingBufferBase::First(); }
76 T *Last() { return (T *)CRingBufferBase::Last(); }
77};
78
79template<typename T, int TSIZE, int TFLAGS = 0>
81{
82 unsigned char m_aBuffer[TSIZE];
83
84public:
86
87 void Init() { CRingBufferBase::Init(m_aBuffer, TSIZE, TFLAGS); }
88};
89
90template<typename T>
92{
93 unsigned char *m_pBuffer = nullptr;
94
95public:
96 CDynamicRingBuffer(int Size, int Flags = 0) { Init(Size, Flags); }
97
99 {
100 free(m_pBuffer);
101 }
102
103 void Init(int Size, int Flags)
104 {
105 free(m_pBuffer);
106 m_pBuffer = static_cast<unsigned char *>(malloc(Size));
107 CRingBufferBase::Init(m_pBuffer, Size, Flags);
108 }
109};
110
111#endif
~CDynamicRingBuffer()
Definition ringbuffer.h:98
void Init(int Size, int Flags)
Definition ringbuffer.h:103
CDynamicRingBuffer(int Size, int Flags=0)
Definition ringbuffer.h:96
unsigned char * m_pBuffer
Definition ringbuffer.h:93
Definition ringbuffer.h:12
CItem * m_pPrev
Definition ringbuffer.h:14
CItem * m_pNext
Definition ringbuffer.h:15
int m_Free
Definition ringbuffer.h:16
int m_Size
Definition ringbuffer.h:17
Definition ringbuffer.h:10
CItem * m_pConsume
Definition ringbuffer.h:23
static constexpr int ITEM_SIZE
Definition ringbuffer.h:55
int PopFirst()
Definition ringbuffer.cpp:137
void * First()
Definition ringbuffer.cpp:195
int m_Size
Definition ringbuffer.h:28
void * Allocate(int Size)
Definition ringbuffer.cpp:65
void Clear()
Definition ringbuffer.cpp:53
CItem * m_pLast
Definition ringbuffer.h:26
void * Prev(void *pCurrent)
Definition ringbuffer.cpp:167
CItem * m_pProduce
Definition ringbuffer.h:22
CItem * PrevBlock(CItem *pItem)
Definition ringbuffer.cpp:12
CItem * MergeBack(CItem *pItem)
Definition ringbuffer.cpp:19
CItem * m_pBuffer
Definition ringbuffer.h:20
void Init(void *pMemory, int Size, int Flags)
Definition ringbuffer.cpp:45
CItem * NextBlock(CItem *pItem)
Definition ringbuffer.cpp:5
void SetPopCallback(std::function< void(void *pCurrent)> PopCallback)
Definition ringbuffer.cpp:132
@ FLAG_RECYCLE
Definition ringbuffer.h:53
void * Next(void *pCurrent)
Definition ringbuffer.cpp:181
void * Last()
Definition ringbuffer.cpp:202
int m_Flags
Definition ringbuffer.h:29
CItem * m_pFirst
Definition ringbuffer.h:25
std::function< void(void *pCurrent)> m_PopCallback
Definition ringbuffer.h:31
unsigned char m_aBuffer[TSIZE]
Definition ringbuffer.h:82
CStaticRingBuffer()
Definition ringbuffer.h:85
void Init()
Definition ringbuffer.h:87
Definition ringbuffer.h:62
T * Prev(T *pCurrent)
Definition ringbuffer.h:73
int PopFirst()
Definition ringbuffer.h:65
T * Allocate(int Size)
Definition ringbuffer.h:64
void SetPopCallback(const std::function< void(T *pCurrent)> &PopCallback)
Definition ringbuffer.h:66
T * Next(T *pCurrent)
Definition ringbuffer.h:74
T * Last()
Definition ringbuffer.h:76
T * First()
Definition ringbuffer.h:75