#pragma once
class BufferedReader {
public:
explicit BufferedReader(PackageStream* stream) : stream(stream) {
data = new char[stream->PackageLen()];
len = stream->ReadPackage(data);
}
int32_t Read(char* output_buffer, int32_t buffer_len) {
int32_t readed = 0;
while (len <= buffer_len - readed && len != 0) {
memcpy(output_buffer + readed, data, len);
readed += len;
len = stream->ReadPackage(data);
}
if (len != 0) {
char* buf = new char[len - (buffer_len - readed)];
memcpy(output_buffer + readed, data, buffer_len - readed);
memcpy(buf, data + buffer_len - readed,
len - (buffer_len - readed));
memcpy(data, buf, len - (buffer_len - readed));
delete[] buf;
len -= buffer_len - readed;
readed = buffer_len;
}
return readed;
}
~BufferedReader() {
delete[] data;
}
private:
PackageStream* stream;
char* data;
int32_t len;
};