#include <string>
#include <cstring>
#include <algorithm>

using std::string;
using std::memcpy;

class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* stream) {
      int written = 0;
      int pkg_len = stream->PackageLen();
      do {
        char pkg[pkg_len + 1] = { '\0' };
        written = stream->ReadPackage(pkg);
        pkg[pkg_len + 1] = '\0';
        this->len += written;
        string out(pkg);
        this->buff += pkg;
      } while (written != 0);
    }
    int32_t Read(char* output_buffer, int32_t buffer_len) {
      int size = min(buffer_len, this->len - this->pos);
      for (int i = 0; i < size; i++) {
        output_buffer[i] = this->buff[this->pos + i];
      }
      this->pos += size;
      return size;
    }

 private:
  string buff = "";
  int32_t len = 0;
  int32_t pos = 0;
};