#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;
};