#include <iostream>
#include <string>
#include <cstdint>

class BufferedReader {
 public:
  PackageStream *sourse_in;
  char *package;
  int package_size;
  int pos;
  explicit BufferedReader(PackageStream *sourse) {
    sourse_in = sourse;
    package = new char[sourse->PackageLen()];
    pos = 0;
    package_size = 0;
  }
  int32_t Read(char *out_buffer, int32_t buf_len) {
    int32_t i;
    for (i = 0; i < buf_len; ++i, ++pos) {
      if (pos == package_size) {
        package_size = sourse_in->ReadPackage(package);
        pos = 0;
        if (package_size == 0) break;
      }
      out_buffer[i] = package[pos];
    }
    return i;
  }
  ~BufferedReader() {
    delete[] package;
  }
};