#include <cstdint>
class BufferedReader {
 public:
  PackageStream *steam;
  char *pakage;
  int pakage_size;
  int pos;
  explicit BufferedReader(PackageStream *stream) {
    steam = stream;
    pakage = new char[stream->PackageLen()];
    pos = 0;
    pakage_size = 0;
  }
  int32_t Read(char *output_buffer, int32_t buffer_len) {
      int32_t i;
    for (i = 0; i < buffer_len; ++i, ++pos) {
      if (pos == pakage_size) {
        pakage_size = steam->ReadPackage(pakage);
        pos = 0;
        if (pakage_size == 0) break;
      }
      output_buffer[i] = pakage[pos];
    }
    return i;
  }
  ~BufferedReader() {
    delete[] pakage;
  }
};