#include <cstdint>
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) {
int32_t i;
for (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 i;
}
~BufferedReader() {
delete[] pakage;
}
};