#pragma once
#include <iostream>
#include <string>
#include <cstdint>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <memory>

class BufferedReader {
 public:
    explicit BufferedReader(PackageStream* stream);
    int32_t Read(char* output_buffer, int32_t buffer_len);
    PackageStream* ps;
};

BufferedReader::BufferedReader(PackageStream* stream) {
    ps = stream;
}

int32_t BufferedReader::Read(char* output_buffer, int32_t buffer_len) {
    int ans = 0, new_len = -1;
    while (new_len != 0) {
        new_len = ps->ReadPackage(output_buffer + ans);
        ans += new_len;
    }
    return ans;
}