Add stream buffering (WIP)

This commit is contained in:
SirLynix
2022-04-09 18:22:57 +02:00
parent 2b66ea1e90
commit 22f58fdbf5
14 changed files with 291 additions and 189 deletions

View File

@@ -30,7 +30,7 @@ namespace Nz
std::filesystem::path Stream::GetDirectory() const
{
return std::filesystem::path();
return {};
}
/*!
@@ -40,7 +40,81 @@ namespace Nz
std::filesystem::path Stream::GetPath() const
{
return std::filesystem::path();
return {};
}
UInt64 Stream::GetCursorPos() const
{
if (m_bufferCapacity == 0)
return TellStreamCursor();
else
{
assert(m_bufferCursor >= m_bufferSize);
return m_bufferCursor - m_bufferSize + m_bufferOffset;
}
}
/*!
* \brief Reads the stream and puts the result in a buffer
* \return Size of the read
*
* \param buffer Buffer to stock data
* \param size Size meant to be read
*
* \remark Produces a NazaraAssert if stream is not readable
* \remark If preallocated space of buffer is less than the size, the behavior is undefined
*/
std::size_t Stream::Read(void* buffer, std::size_t size)
{
NazaraAssert(IsReadable(), "Stream is not readable");
if (m_bufferCapacity == 0)
return ReadBlock(buffer, size);
UInt8* ptr = static_cast<UInt8*>(buffer);
std::size_t readSize = 0;
if (m_bufferOffset < m_bufferSize)
{
std::size_t availableSize = std::min(size, m_bufferSize - m_bufferOffset);
if (ptr)
{
std::memcpy(ptr, &m_buffer[m_bufferOffset], availableSize);
ptr += availableSize;
}
m_bufferOffset += availableSize;
readSize += availableSize;
size -= availableSize;
}
if (size > m_bufferCapacity)
{
// Unbuffered read
m_bufferSize = 0;
std::size_t blockSize = ReadBlock(ptr, size);
m_bufferCursor += blockSize;
readSize += blockSize;
}
else if (size > 0)
{
m_bufferOffset = 0;
m_bufferSize = ReadBlock(&m_buffer[0], m_bufferCapacity);
m_bufferCursor += m_bufferSize;
std::size_t remainingSize = std::min(m_bufferSize, size);
if (ptr)
{
std::memcpy(ptr, &m_buffer[m_bufferOffset], remainingSize);
ptr += remainingSize;
}
m_bufferOffset += remainingSize;
readSize += remainingSize;
size -= remainingSize;
}
return readSize;
}
/*!