AuroraRuntime/Include/Aurora/Memory/ByteBuffer_WriteFrom.inl

60 lines
1.5 KiB
C++

/***
Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: ByteBuffer_WriteFrom.inl
Date: 2022-11-07
Author: Reece
***/
#pragma once
namespace Aurora::Memory
{
AuUInt ByteBuffer::WriteFromEx(ByteBuffer &buffer,
AuUInt uLength)
{
AuUInt uTotal {};
bool bSuccess {};
do
{
auto readView = buffer.GetNextLinearRead();
if ((this->flagExpandable || this->flagAlwaysExpandable) &&
!this->CanWrite(readView.length))
{
this->Resize((this->writePtr - this->base) + readView.length);
}
auto writeView = this->GetNextLinearWrite();
auto uReadNext = AuMin(readView.length, writeView.length);
if (uLength <= uTotal + uReadNext)
{
uReadNext = AuMin(uReadNext, uLength - uTotal);
}
if (uReadNext)
{
AuMemcpy(writeView.ptr, readView.ptr, uReadNext);
}
this->writePtr += uReadNext;
buffer.readPtr += uReadNext;
uTotal += uReadNext;
bSuccess = uReadNext;
}
while (bSuccess);
return uTotal;
}
bool ByteBuffer::WriteFrom(ByteBuffer &buffer)
{
auto readable = buffer.RemainingBytes();
bool bStatus = this->WriteFromEx(buffer, readable) == readable;
this->flagWriteError |= !bStatus;
return bStatus;
}
}