@@ -258,8 +258,11 @@ Status BufferOutputStream::Reserve(int64_t nbytes) {
258258// ----------------------------------------------------------------------
259259// In-memory buffer reader
260260
261- BufferReader::BufferReader (const uint8_t * buffer, int buffer_size)
262- : buffer_(buffer), buffer_size_(buffer_size), position_(0 ) {}
261+ BufferReader::BufferReader (const std::shared_ptr<Buffer>& buffer)
262+ : buffer_(buffer), data_(buffer->data ()), size_(buffer->size ()), position_(0 ) {}
263+
264+ BufferReader::BufferReader (const uint8_t * data, int64_t size)
265+ : buffer_(nullptr ), data_(data), size_(size), position_(0 ) {}
263266
264267BufferReader::~BufferReader () {}
265268
@@ -278,26 +281,32 @@ bool BufferReader::supports_zero_copy() const {
278281}
279282
280283Status BufferReader::Read (int64_t nbytes, int64_t * bytes_read, uint8_t * buffer) {
281- memcpy (buffer, buffer_ + position_, nbytes);
282- *bytes_read = std::min (nbytes, buffer_size_ - position_);
284+ memcpy (buffer, data_ + position_, nbytes);
285+ *bytes_read = std::min (nbytes, size_ - position_);
283286 position_ += *bytes_read;
284287 return Status::OK ();
285288}
286289
287290Status BufferReader::Read (int64_t nbytes, std::shared_ptr<Buffer>* out) {
288- int64_t size = std::min (nbytes, buffer_size_ - position_);
289- *out = std::make_shared<Buffer>(buffer_ + position_, size);
291+ int64_t size = std::min (nbytes, size_ - position_);
292+
293+ if (buffer_ != nullptr ) {
294+ *out = SliceBuffer (buffer_, position_, size);
295+ } else {
296+ *out = std::make_shared<Buffer>(data_ + position_, size);
297+ }
298+
290299 position_ += nbytes;
291300 return Status::OK ();
292301}
293302
294303Status BufferReader::GetSize (int64_t * size) {
295- *size = buffer_size_ ;
304+ *size = size_ ;
296305 return Status::OK ();
297306}
298307
299308Status BufferReader::Seek (int64_t position) {
300- if (position < 0 || position >= buffer_size_ ) {
309+ if (position < 0 || position >= size_ ) {
301310 return Status::IOError (" position out of bounds" );
302311 }
303312
0 commit comments