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