#include <string>
#include <algorithm>
#include <memory>

class BufferedReader {
private:
PackageStream *stream_;
std::string data;
int32_t pos = 0;

public:
explicit BufferedReader(PackageStream *stream) : stream_(stream) {
int32_t len;
do {
std::unique_ptr<char[]> str(new char[stream->PackageLen()]);

len = stream->ReadPackage(str.get());

for (int i = 0; i < len; i++) {
data += str[i];
}
} while (len > 0);
}

int32_t Read(char *output_buffer, int32_t buffer_len) {
int len1 = buffer_len, len2 = data.size() - pos;
int32_t len = std::min(len1, len2);
memcpy(output_buffer, data.c_str() + pos, len);
pos += len;

return len;
}
};