class BufferedReader { public: explicit BufferedReader(PackageStream* stream) : stream(stream) { data = new char[stream->PackageLen()]; len = stream->ReadPackage(data); } int32_t Read(char* output_buffer, int32_t buffer_len) { int32_t readed = 0; while (len <= buffer_len - readed && len != 0) { memcpy(output_buffer + readed, data, len); readed += len; len = stream->ReadPackage(data); } return readed; } ~BufferedReader() { delete[] data; } private: PackageStream* stream; char* data; int len; };