#include <string>
#include <cstdint>
#include <algorithm>
#include <cstdlib>
#include <cstring>

class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* stream) {
        buf = new char[stream->PackageLen()];
        int32_t tmp = stream->ReadPackage(buf);
        while (tmp != 0) {
            for (int32_t i = 0; i < tmp; i++) {
                s += buf[i];
            }
            tmp = stream->ReadPackage(buf);
        }
        delete[] buf;
    }

    int32_t Read(char* output_buffer, int32_t buffer_len) {
        int32_t len;
        if (pos > (int32_t)s.size()) {
            return 0;
        }
        if (((int32_t)s.size() - pos) >= buffer_len) {
            len = buffer_len;
        } else {
            len = s.size() - pos;
        }
        int32_t j = 0;
        for (int32_t i = pos; i < pos + len; i++) {
            output_buffer[j] = s[i];
            j++;
        }
        pos += len;
        return len;
    }

 private:
    char* buf;
    string s = "";
    int32_t pos = 0;
};