int binary_reader::read(blob& blob) { int len; if (0 == read(len)) return 0; if (len <= get_remaining_size()) { blob = _blob.range(static_cast<int>(_ptr - _blob.data()), len); // optimization: zero-copy if (!blob.buffer_ptr()) { std::shared_ptr<char> buffer(new char[len]); memcpy(buffer.get(), blob.data(), blob.length()); blob = ::dsn::blob(buffer, 0, blob.length()); } _ptr += len; _remaining_size -= len; return len + sizeof(len); } else { dassert(false, "read beyond the end of buffer"); return 0; } }
bool binary_reader::skip(int count) { if (count <= get_remaining_size()) { _ptr += count; _remaining_size -= count; return true; } else { dassert(false, "read beyond the end of buffer"); return false; } }
bool binary_reader::next(const void** data, int* size) { if (get_remaining_size() > 0) { *data = (const void*)_ptr; *size = _remaining_size; _ptr += _remaining_size; _remaining_size = 0; return true; } else return false; }
int binary_reader::read(char* buffer, int sz) { if (sz <= get_remaining_size()) { memcpy((void*)buffer, _ptr, sz); _ptr += sz; _remaining_size -= sz; return sz; } else { dassert(false, "read beyond the end of buffer"); return 0; } }
int binary_reader::read(blob& blob) { int len; if (0 == read(len)) return 0; if (len <= get_remaining_size()) { blob = _blob.range(static_cast<int>(_ptr - _blob.data()), len); _ptr += len; _remaining_size -= len; return len + sizeof(len); } else { dwarn("read beyond the end of buffer"); return 0; } }