#pragma once #include class BufferedReader { public: explicit BufferedReader(PackageStream* stream): stream(stream) { arr = ""; i = 0; } int32_t Read(char* output_buffer, int32_t buffer_len) { this-> len = stream->PackageLen(); std::unique_ptr buf(new char[len]); int32_t n = 0; for (; i < len && n < buffer_len && i != 0; i++) { output_buffer[n++] = arr[i]; } for (; len > 0 && n < buffer_len;) { len = stream->ReadPackage(buf.get()); arr = ""; for (int32_t cp = 0; cp < len; cp++) { arr += buf[cp]; } for (i = 0; i < len && n < buffer_len; i++) { output_buffer[n++] = buf[i]; } } return n; } private: int32_t len; int32_t i; PackageStream* stream; std::string arr; };