Files
lix/lix/libutil/io-buffer.cc
T
eldritch horrors 7d681a5049 libutil: add io buffer abstraction
the rpc transition will require sync and async objects to share a single
io buffer (since defining serializers on async is an immense pain in the
tail, slow, and ultimately not necessary). a generic buffer class allows
us to reuse existing serializers more readily (reuse them at all, even).

Change-Id: I5ebba8449f26f2bb76016818928183c7e0123be0
2025-06-11 18:11:57 +00:00

39 lines
789 B
C++

#include "io-buffer.hh"
#include <cassert>
namespace nix {
std::span<const char> IoBuffer::getReadBuffer()
{
const auto used = std::min(bufSize - bufBegin, bufUsed);
return {buffer.get() + bufBegin, used};
}
void IoBuffer::consumed(size_t size)
{
assert(size <= bufUsed);
bufBegin = (bufBegin + size) % bufSize;
bufUsed -= size;
if (bufUsed == 0) {
bufBegin = 0;
}
}
std::span<char> IoBuffer::getWriteBuffer()
{
if (!buffer) {
buffer.reset(new char[bufSize]);
}
const auto bufEnd = (bufBegin + bufUsed) % bufSize;
const auto free = std::min(bufSize - bufEnd, bufSize - bufUsed);
return {buffer.get() + bufEnd, free};
}
void IoBuffer::added(size_t size)
{
assert(size <= bufSize - bufUsed);
bufUsed += size;
}
}