#include <iostream>
#include <string>
#include <cstdint>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <memory>
class BufferedReader {
private:
PackageStream* d;
int shift = 0;
char s[10000];
public:
explicit BufferedReader(PackageStream* stream);
int32_t Read(char* buf, int32_t bytes);
};
BufferedReader::BufferedReader(PackageStream* stream) : d(stream) {
}
int32_t BufferedReader::Read(char* buf, int32_t bytes) {
int count = bytes / d->PackageLen(), len = 0, res;
for (int i = 0; i <= count; ++i) {
len += d->ReadPackage(s + len);
}
if (len <= bytes) {
memcpy(buf, s + shift, size_t(len));
shift += len;
return shift;
}
if (len > bytes) {
memcpy(buf, s + shift, size_t(bytes));
shift += bytes;
return bytes;
}
}