#include <string>
#include <algorithm>

class BufferedReader {
 public:
   explicit BufferedReader(PackageStream* stream) {
     streamSize = stream->PackageLen();
     buffer = new char[streamSize];
     int cursize = 0;
     while (true) {
       cursize = stream->ReadPackage(buffer);
       if (cursize > 0) {
         for (int32_t i = 0; i < cursize; i++) {
           text += buffer[i];
         }
       }
       if (cursize <= 0) {
         break;
       }
     }
     delete[] buffer;
   }

   int32_t Read(char* output_buffer, int32_t buffer_len) {
     int32_t a = min<int32_t>((int32_t)(text.size()), pos_ + buffer_len);
     int32_t next_pos = a;
     int32_t len = next_pos - pos_;
     memcpy(output_buffer, text.c_str() + pos_, len);
     pos_ = next_pos;
     return len;
   }

 private:
   char* buffer;
   int32_t streamSize;
   string text;
   int32_t pos_ = 0;
};