#include class BufferedReader { public: PackageStream *steam; char *pakage; int pakage_size; int pos; explicit BufferedReader(PackageStream *stream) { steam = stream; pakage = new char[stream->PackageLen()]; pos = 0; pakage_size = 0; } int32_t Read(char *output_buffer, int32_t buffer_len) { for (int32_t i = 0; i < buffer_len; ++i, ++pos) { if (pos == pakage_size) { pakage_size = steam->ReadPackage(pakage); pos = 0; if (pakage_size == 0) break; } output_buffer[i] = pakage[pos]; } return pos; } ~BufferedReader() { delete[] pakage; } };