60 lines
1.5 KiB
C++
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;
|
|
}
|
|
} |