#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;
  }
};