#include <string>
#include <cstdint>
#include <algorithm>
#include <cstdlib>
#include <cstring>
class BufferedReader {
public:
explicit BufferedReader(PackageStream* stream) {
buf = new char[stream->PackageLen()];
int32_t tmp = stream->ReadPackage(buf);
while (tmp != 0) {
for (int32_t i = 0; i < tmp; i++) {
s += buf[i];
}
tmp = stream->ReadPackage(buf);
}
delete[] buf;
}
int32_t Read(char* output_buffer, int32_t buffer_len) {
int32_t len;
if (pos > (int32_t)s.size()) {
return 0;
}
if (((int32_t)s.size() - pos) >= buffer_len) {
len = buffer_len;
} else {
len = s.size() - pos;
}
int32_t j = 0;
for (int32_t i = pos; i < pos + len; i++) {
output_buffer[j] = s[i];
j++;
}
pos += len;
return len;
}
private:
char* buf;
string s = "";
int32_t pos = 0;
};