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

@@ -17,8 +17,12 @@ namespace Nz
*/
inline Stream::Stream(StreamOptionFlags streamOptions, OpenModeFlags openMode) :
m_bufferCapacity(0),
m_bufferOffset(0),
m_bufferSize(0),
m_openMode(openMode),
m_streamOptions(streamOptions)
m_streamOptions(streamOptions),
m_bufferCursor(0)
{
}
@@ -28,6 +32,28 @@ namespace Nz
* \param textMode Enables the mode or disables
*/
inline void Stream::EnableBuffering(bool buffering, std::size_t bufferSize)
{
if (buffering)
{
m_streamOptions &= ~StreamOption::Unbuffered;
if (m_bufferCapacity != bufferSize)
{
m_buffer = std::make_unique<UInt8[]>(bufferSize);
m_bufferCursor = TellStreamCursor();
m_bufferOffset = 0;
m_bufferSize = 0;
m_bufferCapacity = bufferSize;
}
}
else
{
m_streamOptions |= StreamOption::Unbuffered;
m_buffer.reset();
m_bufferCapacity = 0;
}
}
inline void Stream::EnableTextMode(bool textMode)
{
if (textMode)
@@ -74,6 +100,11 @@ namespace Nz
* \return true if it is the case
*/
inline bool Stream::IsBufferingEnabled() const
{
return (m_streamOptions & StreamOption::Unbuffered) == 0;
}
inline bool Stream::IsReadable() const
{
return (m_openMode & OpenMode::ReadOnly) != 0;
@@ -109,22 +140,27 @@ namespace Nz
return (m_openMode & OpenMode::WriteOnly) != 0;
}
/*!
* \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
*/
inline std::size_t Stream::Read(void* buffer, std::size_t size)
inline bool Stream::SetCursorPos(UInt64 offset)
{
NazaraAssert(IsReadable(), "Stream is not readable");
if (m_bufferCapacity == 0)
return SeekStreamCursor(offset);
else
{
if (offset >= m_bufferCursor && offset - m_bufferCursor < m_bufferSize)
m_bufferOffset += offset - m_bufferCursor;
else
{
// Out of buffer
if (!SeekStreamCursor(offset))
return false;
return ReadBlock(buffer, size);
m_bufferCursor = offset;
m_bufferOffset = 0;
m_bufferSize = 0;
}
return true;
}
}
/*!
@@ -137,12 +173,17 @@ namespace Nz
* \remark Produces a NazaraAssert if stream is not writable
* \remark If preallocated space of buffer is less than the size, the behavior is undefined
*/
inline std::size_t Stream::Write(const void* buffer, std::size_t size)
{
NazaraAssert(IsWritable(), "Stream is not writable");
return WriteBlock(buffer, size);
std::size_t writeSize = WriteBlock(buffer, size);
// For now, don't buffer writes
m_bufferCursor += writeSize;
m_bufferSize = 0;
return writeSize;
}
}