#include <iostream>
#include <string>
#include <cstdint>
class BufferedReader {
public:
PackageStream *sourse_in;
char *package;
int package_size, pos;
explicit BufferedReader(PackageStream *sourse) {
sourse_in = sourse;
package = new char[sourse->PackageLen()];
pos = 0;
package_size = 0;
}
int32_t Read(char *output_buffer, int32_t buffer_len) {
int32_t i = 0;
while (i < buffer_len && package_size) {
if (pos == package_size) {
package_size = sourse_in->ReadPackage(package);
pos = 0;
}
i++;
++pos;
output_buffer[i] = package[pos];
}
return i;
}
~BufferedReader() {
delete[] package;
}
};