#pragma once #include #include #include class BufferedReader { public: explicit BufferedReader(PackageStream *stream) : stream(stream), buffer(new char[stream->PackageLen() + 1]) { memset(this->buffer, 0, this->stream->PackageLen() + 1); auto length = this->stream->ReadPackage(buffer); while (length > 0) { this->data += string(this->buffer); memset(this->buffer, 0, stream->PackageLen() + 1); length = this->stream->ReadPackage(this->buffer); } } int32_t Read(char *output_buffer, int32_t buffer_len) { auto new_position = min(static_cast(this->data.size()), this->position + buffer_len); auto length = new_position - position; memcpy(output_buffer, this->data.c_str() + this->position, length); this->position = new_position; return length; } ~BufferedReader() { delete[] this->buffer; } private: PackageStream *stream; char* buffer; string data; int32_t position = 0; };