class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* stream) {
        buf = new char[stream->PackageLen()];
        pacStream = stream;
    }
    int32_t Read(char* output_buffer, int32_t buffer_len) {
      int readed = 0, i = 0;
      while (buffer_len != 0 && iter != rmb) {
        output_buffer[i++] = this->buf[iter++];
        readed++;
        buffer_len--;
      }
      if (buffer_len > 0) {
        iter = 0;
        rmb = pacStream->ReadPackage(this->buf);
        while (buffer_len != 0 && iter != rmb) {
          output_buffer[i++] = this->buf[iter++];
          readed++;
          buffer_len--;
          if (iter == pacStream->PackageLen()) {
                rmb = pacStream->ReadPackage(this->buf);
                iter = 0;
          }
        }
      }
      return readed;
    }

 private:
    int iter = 0, rmb = 0;
    char* buf;
    PackageStream* pacStream;
};