sinksource.cc
1 // Copyright 2013, Beeri 15. All rights reserved.
2 // Author: Roman Gershman (romange@gmail.com)
3 //
4 
5 #include "util/sinksource.h"
6 #include "base/logging.h"
7 #include "base/port.h"
8 
9 namespace util {
10 
11 Sink::WritableBuffer Sink::GetAppendBuffer(size_t min_capacity, WritableBuffer scratch,
12  size_t /*desired_capacity_hint*/) {
13  CHECK_GE(scratch.size(), min_capacity);
14  return scratch;
15 }
16 
17 Status Sink::Flush() { return Status::OK; }
18 
19 StatusObject<size_t> Source::Read(const strings::MutableByteRange& range) {
20  CHECK(!range.empty());
21 
22  size_t read = 0;
23  if (!prepend_buf_.empty()) {
24  if (prepend_buf_.size() >= range.size()) {
25  memcpy(range.begin(), prepend_buf_.begin(), range.size());
26  auto src = prepend_buf_.begin() + range.size();
27  size_t new_size = prepend_buf_.size() - range.size();
28  memmove(prepend_buf_.begin(), src, new_size);
29  prepend_buf_.resize(new_size);
30 
31  return range.size();
32  }
33 
34  memcpy(range.begin(), prepend_buf_.begin(), prepend_buf_.size());
35 
36  read = prepend_buf_.size();
37  prepend_buf_.clear();
38  DCHECK_LT(read, range.size());
39 
40  }
41  if (eof_)
42  return read;
43 
44  auto lrange = range.subpiece(read);
45  while (true) {
46  auto res = ReadInternal(lrange);
47  if (!res.ok())
48  return res;
49 
50  read += res.obj;
51  eof_ = res.obj == 0;
52  if (eof_ || res.obj == lrange.size())
53  break;
54  lrange = lrange.subpiece(res.obj);
55  }
56  return read;
57 }
58 
59 StatusObject<size_t> StringSource::ReadInternal(const strings::MutableByteRange& range) {
60  size_t to_fill = std::min<size_t>({range.size(), block_size_, input_.size()});
61  memcpy(range.begin(), input_.begin(), to_fill);
62 
63  input_.remove_prefix(to_fill);
64  return to_fill;
65 }
66 
67 } // namespace util
virtual StatusObject< size_t > ReadInternal(const strings::MutableByteRange &range)=0
StatusObject< size_t > Read(const strings::MutableByteRange &range)
Reads source into mutable range.
Definition: sinksource.cc:19