1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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;
}

}