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