#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);
        if (written > 0) {
          cout << endl << "writting: " << out << endl;
        }
        this->buff += pkg;
      } while (written != 0);
      cout << "BufferedReader: " << this->buff << endl;
    }
    int32_t Read(char* output_buffer, int32_t buffer_len) {
      int size = min(buffer_len, this->len);
      snprintf(output_buffer, this->len, "%s", this->buff.substr(this->pos, size).c_str());
      string out(output_buffer);
      size = out.size();
      this->pos += size;
      return size;
    }

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