#include "common.hh" #include "ro_buffer.hh" #include size_t RoBuffer::read(RoBuffer* buf, void* data, size_t len) { assert(buf); assert(data); if (len == 0) return 0; auto* d = reinterpret_cast(data); size_t got = 0; while (true) { size_t avail; auto want = len - got; auto* ptr = buf->rbuf(want, avail); if (avail == 0) return got; if (avail >= want) { std::copy_n(ptr, want, d + got); buf->rcommit(want); return len; } std::copy_n(ptr, avail, d + got); buf->rcommit(avail); got += avail; } }