#pragma once #include #include #include #include #include #include class BufferedReader { public: explicit BufferedReader(PackageStream *stream) : stream(stream) { while (true) { char* tmp_buf = new char[stream->PackageLen() + 1]; memset(tmp_buf, 0, stream->PackageLen() + 1); auto result = stream->ReadPackage(tmp_buf); if (result > 0) { buffer += string(tmp_buf); } else { break; } delete[] tmp_buf; } } int32_t Read(char *output_buffer, int32_t buffer_len) { int32_t next_pos = min(buffer.size(), pos_ + buffer_len); int32_t len = next_pos - pos_; memcpy(output_buffer, buffer.c_str() + pos_, len); this->pos_ = next_pos; return len; } private: PackageStream *stream; string buffer; int32_t pos_ = 0; };