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
39 lines
789 B
C++
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;
|
|
}
|
|
|
|
}
|