Files
UnrealEngineUWP/Engine/Source/Developer/TraceAnalysis/Private/Analysis/StreamReader.cpp
martin ridgers e96f55b209 Added a backtrack call to be able to restore a reader to an earlier point in its buffer. Like marks, only for the times when one wasn't able to take a mark.
#rb none
#rnx
#preflight 6151a7b659c66a000102f21b

#ROBOMERGE-AUTHOR: martin.ridgers
#ROBOMERGE-SOURCE: CL 17629130 in //UE5/Main/...
#ROBOMERGE-BOT: STARSHIP (Main -> Release-Engine-Test) (v871-17566257)

[CL 17629139 by martin ridgers in ue5-release-engine-test branch]
2021-09-27 07:59:18 -04:00

126 lines
2.7 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "StreamReader.h"
#include "HAL/UnrealMemory.h"
#include "Math/UnrealMath.h"
namespace UE {
namespace Trace {
////////////////////////////////////////////////////////////////////////////////
FStreamReader::~FStreamReader()
{
FMemory::Free(Buffer);
}
////////////////////////////////////////////////////////////////////////////////
const uint8* FStreamReader::GetPointer(uint32 Size)
{
if (Cursor + Size > End)
{
DemandHint = FMath::Max(DemandHint, Size);
return nullptr;
}
return Buffer + Cursor;
}
////////////////////////////////////////////////////////////////////////////////
void FStreamReader::Advance(uint32 Size)
{
Cursor += Size;
}
////////////////////////////////////////////////////////////////////////////////
int32 FStreamReader::GetRemaining() const
{
return int32(PTRINT(End - Cursor));
}
////////////////////////////////////////////////////////////////////////////////
bool FStreamReader::IsEmpty() const
{
return Cursor >= End;
}
////////////////////////////////////////////////////////////////////////////////
bool FStreamReader::Backtrack(const uint8* To)
{
uint32 BacktrackedCursor = uint32(UPTRINT(To - Buffer));
if (BacktrackedCursor > End)
{
return false;
}
Cursor = BacktrackedCursor;
return true;
}
////////////////////////////////////////////////////////////////////////////////
struct FMark* FStreamReader::SaveMark() const
{
return (FMark*)(UPTRINT(Cursor));
}
////////////////////////////////////////////////////////////////////////////////
void FStreamReader::RestoreMark(struct FMark* Mark)
{
Cursor = uint32(UPTRINT(Mark));
if (Cursor > End)
{
Cursor = End;
}
}
////////////////////////////////////////////////////////////////////////////////
void FStreamBuffer::Append(const uint8* Data, uint32 Size)
{
uint8* Out = Append(Size);
FMemory::Memcpy(Out, Data, Size);
}
////////////////////////////////////////////////////////////////////////////////
uint8* FStreamBuffer::Append(uint32 Size)
{
DemandHint = FMath::Max(Size, DemandHint);
Consolidate();
uint8* Out = Buffer + End;
End += Size;
check(End <= BufferSize);
return Out;
}
////////////////////////////////////////////////////////////////////////////////
void FStreamBuffer::Consolidate()
{
int32 Remaining = End - Cursor;
DemandHint += Remaining;
if (DemandHint >= BufferSize)
{
const uint32 GrowthSizeMask = (64 << 10) - 1;
BufferSize = (DemandHint + GrowthSizeMask + 1) & ~GrowthSizeMask;
Buffer = (uint8*)FMemory::Realloc(Buffer, BufferSize);
}
if (!Remaining)
{
Cursor = 0;
End = 0;
}
else if (Cursor)
{
memmove(Buffer, Buffer + Cursor, Remaining);
Cursor = 0;
End = Remaining;
check(End <= BufferSize);
}
DemandHint = 0;
}
} // namespace Trace
} // namespace UE