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; } }