class BufferedReader { public: explicit BufferedReader(PackageStream *stream) : _stream(stream) { _data = new char[stream->PackageLen()]; _packageLen = stream->ReadPackage(_data); } int32_t Read(char *output_buffer, int32_t buffer_len) { int32_t actual_len = 0; for (; _data_index < _packageLen && actual_len < buffer_len; ++_data_index) output_buffer[actual_len++] = _data[_data_index]; while (actual_len < buffer_len && 0 != _packageLen) { _packageLen = _stream->ReadPackage(_data); _data_index = 0; for (; _data_index < _packageLen && actual_len < buffer_len; ++_data_index) output_buffer[actual_len++] = _data[_data_index]; } return actual_len; } ~BufferedReader() { delete[] _data; } private: PackageStream *_stream; char *_data; int32_t _data_index = 0; int32_t _packageLen; };