UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
RingBuffer.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
4#include "CoreMinimal.h"
5#include "Misc/SecureHash.h"
6
7template< typename DataType >
8class TRingBuffer
9{
10public:
14 TRingBuffer(uint32 BufferDataSize);
15
20
24 void Empty();
25
30 void Enqueue(const DataType& Val);
31
37 void Enqueue(const DataType* ValBuf, const uint32& BufLen);
38
44 bool Dequeue(DataType& ValOut);
45
52 uint32 Dequeue(DataType* ValBuf, const uint32& BufLen);
53
59 bool Peek(DataType& ValOut) const;
60
67 uint32 Peek(DataType* ValBuf, const uint32& BufLen) const;
68
76
82
87 void Serialize(DataType* SerialBuffer) const;
88
94 FORCEINLINE const DataType& operator[](const int32& Index) const;
95 FORCEINLINE DataType& operator[](const int32& Index);
96
101 FORCEINLINE const DataType& Top() const;
102 FORCEINLINE DataType& Top();
103
108 FORCEINLINE const DataType& Bottom() const;
109 FORCEINLINE DataType& Bottom();
110
116
122
128
134
140
146
147
148private:
149 TRingBuffer() = delete;
150
151 // Buffer size
152 const uint32 BufferDataSize;
153
154 // The data memory
155 DataType* Data;
156
157 // Value keeping track of free space
158 uint32 NumDataAvailable;
159
160 // Value keeping track of the next data index
161 uint32 DataIndex;
162
163 // Value to keep track of total amount of data Enqueued
164 uint64 TotalNumDataPushed;
165};
166
167/* TRingBuffer implementation
168*****************************************************************************/
169template< typename DataType >
171 : BufferDataSize(InBufferDataSize)
172{
173 Data = new DataType[BufferDataSize];
174 Empty();
175}
176
177template< typename DataType >
179{
180 delete[] Data;
181}
182
183template< typename DataType >
185{
186 FMemory::Memzero(Data, sizeof(DataType)* BufferDataSize);
187 NumDataAvailable = 0;
188 DataIndex = 0;
189 TotalNumDataPushed = 0;
190}
191
192template< typename DataType >
194{
195 Data[DataIndex++] = Val;
196 DataIndex %= BufferDataSize;
197 ++TotalNumDataPushed;
198 NumDataAvailable = FMath::Clamp< uint32 >(NumDataAvailable + 1, 0, BufferDataSize);
199}
200
201template< typename DataType >
203{
204 check(BufLen <= BufferDataSize);
205 const uint32 FirstPartLen = BufferDataSize - DataIndex;
206 FMemory::Memcpy(Data + DataIndex, ValBuf, sizeof(DataType)* FMath::Min(FirstPartLen, BufLen));
207 if (FirstPartLen < BufLen)
208 {
209 FMemory::Memcpy(Data, ValBuf + FirstPartLen, sizeof(DataType)* (BufLen - FirstPartLen));
210 }
211 DataIndex += BufLen;
212 DataIndex %= BufferDataSize;
213 TotalNumDataPushed += BufLen;
214 NumDataAvailable = FMath::Clamp<uint32>(NumDataAvailable + BufLen, 0, BufferDataSize);
215}
216
217template< typename DataType >
219{
220 if (Peek(ValOut))
221 {
222 NumDataAvailable = FMath::Clamp< uint32 >(NumDataAvailable - 1, 0, BufferDataSize);
223 return true;
224 }
225 else
226 {
227 return false;
228 }
229}
230
231template< typename DataType >
233{
234 const uint32 DataProvided = Peek(ValBuf, BufLen);
235 NumDataAvailable -= DataProvided;
236 return DataProvided;
237}
238
239template< typename DataType >
241{
242 if (NumDataAvailable > 0)
243 {
244 ValOut = Bottom();
245 return true;
246 }
247 else
248 {
249 return false;
250 }
251}
252
253template< typename DataType >
255{
256 const uint32 DataProvided = FMath::Min(BufLen, NumDataAvailable);
257 const uint32 BottomIdx = BottomIndex();
258 const uint32 BottomPartLen = BufferDataSize - BottomIdx;
259 FMemory::Memcpy(ValBuf, Data + BottomIdx, sizeof(DataType)* FMath::Min(BottomPartLen, DataProvided));
261 {
262 FMemory::Memcpy(ValBuf + BottomPartLen, Data, sizeof(DataType)* (DataProvided - BottomPartLen));
263 }
264 return DataProvided;
265}
266
267template< typename DataType >
269{
270 check(CompareLen <= BufferDataSize);
271 const uint32 FirstPartLen = BufferDataSize - DataIndex;
272 int32 FirstCmp = FMemory::Memcmp(Data + BottomIndex(), SerialBuffer, sizeof(DataType)* FMath::Min(FirstPartLen, CompareLen));
273 if (FirstCmp != 0 || FirstPartLen >= CompareLen)
274 {
275 return FirstCmp;
276 }
277 return FMemory::Memcmp(Data, &SerialBuffer[FirstPartLen], sizeof(DataType)* (CompareLen - FirstPartLen));
278}
279
280template< typename DataType >
282{
283 const uint32 FirstPartLen = FMath::Min(BufferDataSize - DataIndex, NumDataAvailable);
284 FSHA1 Sha;
285 Sha.Update(Data + BottomIndex(), sizeof(DataType) * FirstPartLen);
286 if (FirstPartLen < NumDataAvailable)
287 {
288 Sha.Update(Data, sizeof(DataType) * (NumDataAvailable - FirstPartLen));
289 }
290 Sha.Final();
291 Sha.GetHash(OutHash.Hash);
292}
293
294template< typename DataType >
296{
297 const uint32 BottomIdx = BottomIndex();
298 const uint32 BottomPartLen = BufferDataSize - BottomIdx;
299 FMemory::Memcpy(SerialBuffer, Data + BottomIdx, sizeof(DataType)* BottomPartLen);
300 FMemory::Memcpy(SerialBuffer + BottomPartLen, Data, sizeof(DataType)* (BufferDataSize - BottomPartLen));
301}
302
303template< typename DataType >
305{
306 return Data[(BottomIndex() + Index) % BufferDataSize];
307}
308
309template< typename DataType >
311{
312 return Data[(BottomIndex() + Index) % BufferDataSize];
313}
314
315template< typename DataType >
317{
318 return Data[TopIndex()];
319}
320
321template< typename DataType >
323{
324 return Data[TopIndex()];
325}
326
327template< typename DataType >
329{
330 return Data[BottomIndex()];
331}
332
333template< typename DataType >
335{
336 return Data[BottomIndex()];
337}
338
339template< typename DataType >
341{
342 return (DataIndex + BufferDataSize - 1) % BufferDataSize;
343}
344
345template< typename DataType >
347{
348 return (DataIndex + BufferDataSize - NumDataAvailable) % BufferDataSize;
349}
350
351template< typename DataType >
353{
354 return DataIndex;
355}
356
357template< typename DataType >
359{
360 return BufferDataSize;
361}
362
363template< typename DataType >
365{
366 return NumDataAvailable;
367}
368
369template< typename DataType >
371{
372 return TotalNumDataPushed;
373}
#define FORCEINLINE
Definition AndroidPlatform.h:140
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
@ Bottom
Definition MaterialExpressionFunctionInput.h:43
float Val(const FString &Value)
Definition UnrealMath.cpp:3163
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition SecureHash.h:314
CORE_API void Update(const uint8 *data, uint64 len)
Definition SecureHash.cpp:1205
CORE_API void GetHash(uint8 *puDest) const
Definition SecureHash.cpp:1269
CORE_API void Final()
Definition SecureHash.cpp:1245
Definition SecureHash.h:226
Definition RingBuffer.h:135
FORCEINLINE uint32 NextIndex() const
Definition RingBuffer.h:352
bool Dequeue(DataType &ValOut)
Definition RingBuffer.h:218
FORCEINLINE DataType & Bottom()
Definition RingBuffer.h:334
TRingBuffer(uint32 BufferDataSize)
Definition RingBuffer.h:170
FORCEINLINE uint32 RingDataSize() const
Definition RingBuffer.h:358
uint32 Peek(DataType *ValBuf, const uint32 &BufLen) const
Definition RingBuffer.h:254
FORCEINLINE const DataType & Bottom() const
Definition RingBuffer.h:328
int32 SerialCompare(const DataType *SerialBuffer, uint32 CompareLen) const
Definition RingBuffer.h:268
void GetShaHash(FSHAHash &OutHash) const
Definition RingBuffer.h:281
FORCEINLINE uint32 TopIndex() const
Definition RingBuffer.h:340
FORCEINLINE DataType & Top()
Definition RingBuffer.h:322
void Enqueue(const DataType *ValBuf, const uint32 &BufLen)
Definition RingBuffer.h:202
FORCEINLINE DataType & operator[](const int32 &Index)
Definition RingBuffer.h:310
FORCEINLINE uint32 RingDataUsage() const
Definition RingBuffer.h:364
void Empty()
Definition RingBuffer.h:184
uint32 Dequeue(DataType *ValBuf, const uint32 &BufLen)
Definition RingBuffer.h:232
FORCEINLINE uint64 TotalDataPushed() const
Definition RingBuffer.h:370
FORCEINLINE const DataType & Top() const
Definition RingBuffer.h:316
FORCEINLINE uint32 BottomIndex() const
Definition RingBuffer.h:346
FORCEINLINE const DataType & operator[](const int32 &Index) const
Definition RingBuffer.h:304
TRingBuffer()
Definition RingBuffer.h:164
void Enqueue(const DataType &Val)
Definition RingBuffer.h:193
void Serialize(DataType *SerialBuffer) const
Definition RingBuffer.h:295
~TRingBuffer()
Definition RingBuffer.h:224
bool Peek(DataType &ValOut) const
Definition RingBuffer.h:240
ElementType & operator[](IndexType Index)
Definition RingBuffer.h:595
U16 Index
Definition radfft.cpp:71
static UE_FORCEINLINE_HINT void * Memzero(void *Dest, SIZE_T Count)
Definition UnrealMemory.h:131
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160