#include <cstdint>
#include <string>
#include <cstring>
#include <memory>

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