summaryrefslogtreecommitdiff
path: root/src/ro_buffer.cc
blob: a07132108b6b6e1e24dbede22f86396e3f25e54d (plain)
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
#include "ro_buffer.hh"

#include <algorithm>
#include <cassert>

size_t RoBuffer::read(void* data, size_t len) {
  assert(data);
  if (len == 0)
    return 0;
  auto* d = reinterpret_cast<char*>(data);
  size_t got = 0;
  while (true) {
    size_t avail;
    auto want = len - got;
    auto* ptr = rbuf(want, avail);
    if (avail == 0)
      return got;
    if (avail >= want) {
      std::copy_n(ptr, want, d + got);
      rcommit(want);
      return len;
    }
    std::copy_n(ptr, avail, d + got);
    rcommit(avail);
    got += avail;
  }
}