#include <iostream>
#include <fstream>
#include <vector>
class IReadable
{
public:
IReadable(){};
virtual ~IReadable(){};
virtual IReadable& read(char *p,int n) = 0;
};
class CFileReader: public IReadable
{
public:
template <class T>
CFileReader(T& v) : obj(&v) {};
~CFileReader(){};
IReadable& read(char *p,int n) {
this->obj->read(p,n);
return *(this->obj);
}
private:
IReadable* obj;
};
class CMemoryReader
{
public:
CMemoryReader(){};
~CMemoryReader(){};
CMemoryReader& read(char *p,int n) { return *this; }; // do nothing
private:
char *mem;
};
template <class T>
class GenericReadable : public IReadable {
T & t_;
public:
GenericReadable(T& t) : t_(t) {};
virtual IReadable& read(char *p,int n) {
t_.read(p, n);
return *this;
};
};
template <class T>
GenericReadable<T> make_readable(T& t) {
return GenericReadable<T>(t);
};
int main(int argc,char **argv)
{
std::ifstream file("foo.bar",std::ifstream::binary);
auto fileReadable = make_readable(file);
CFileReader file_reader(fileReadable);
CMemoryReader memory_reader;
auto memReadable = make_readable(memory_reader);
std::vector<IReadable*> vv;
vv.push_back(&file_reader);
vv.push_back(&memReadable);
char buff[8];
for(auto& reader : vv)
{
reader->read(buff,4);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIElSZWFkYWJsZQp7CnB1YmxpYzoKCUlSZWFkYWJsZSgpe307Cgl2aXJ0dWFsIH5JUmVhZGFibGUoKXt9OwoJdmlydHVhbCBJUmVhZGFibGUmIHJlYWQoY2hhciAqcCxpbnQgbikgPSAwOwp9OwoKY2xhc3MgQ0ZpbGVSZWFkZXI6IHB1YmxpYyBJUmVhZGFibGUKewpwdWJsaWM6Cgl0ZW1wbGF0ZSA8Y2xhc3MgVD4KCUNGaWxlUmVhZGVyKFQmIHYpIDogb2JqKCZ2KSB7fTsKCX5DRmlsZVJlYWRlcigpe307CglJUmVhZGFibGUmIHJlYWQoY2hhciAqcCxpbnQgbikgewoJCXRoaXMtPm9iai0+cmVhZChwLG4pOwoJCXJldHVybiAqKHRoaXMtPm9iaik7Cgl9CnByaXZhdGU6CglJUmVhZGFibGUqIG9iajsKfTsKCmNsYXNzIENNZW1vcnlSZWFkZXIKewpwdWJsaWM6CglDTWVtb3J5UmVhZGVyKCl7fTsKCX5DTWVtb3J5UmVhZGVyKCl7fTsKCUNNZW1vcnlSZWFkZXImIHJlYWQoY2hhciAqcCxpbnQgbikgeyByZXR1cm4gKnRoaXM7IH07IC8vIGRvIG5vdGhpbmcKcHJpdmF0ZToKCWNoYXIgKm1lbTsKfTsKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBHZW5lcmljUmVhZGFibGUgOiBwdWJsaWMgSVJlYWRhYmxlIHsKICBUICYgdF87CnB1YmxpYzoKICBHZW5lcmljUmVhZGFibGUoVCYgdCkgOiB0Xyh0KSB7fTsKICB2aXJ0dWFsIElSZWFkYWJsZSYgcmVhZChjaGFyICpwLGludCBuKSB7CiAgICB0Xy5yZWFkKHAsIG4pOwogICAgcmV0dXJuICp0aGlzOwogIH07Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KR2VuZXJpY1JlYWRhYmxlPFQ+IG1ha2VfcmVhZGFibGUoVCYgdCkgewogIHJldHVybiBHZW5lcmljUmVhZGFibGU8VD4odCk7Cn07CgppbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKewoJc3RkOjppZnN0cmVhbSBmaWxlKCJmb28uYmFyIixzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwogICAgYXV0byBmaWxlUmVhZGFibGUgPSBtYWtlX3JlYWRhYmxlKGZpbGUpOwoKCUNGaWxlUmVhZGVyIGZpbGVfcmVhZGVyKGZpbGVSZWFkYWJsZSk7CglDTWVtb3J5UmVhZGVyIG1lbW9yeV9yZWFkZXI7CiAgICAKICAgIGF1dG8gbWVtUmVhZGFibGUgPSBtYWtlX3JlYWRhYmxlKG1lbW9yeV9yZWFkZXIpOwoKCXN0ZDo6dmVjdG9yPElSZWFkYWJsZSo+IHZ2OwoJdnYucHVzaF9iYWNrKCZmaWxlX3JlYWRlcik7Cgl2di5wdXNoX2JhY2soJm1lbVJlYWRhYmxlKTsKCWNoYXIgYnVmZls4XTsKCglmb3IoYXV0byYgcmVhZGVyIDogdnYpCgl7CgkJcmVhZGVyLT5yZWFkKGJ1ZmYsNCk7Cgl9CglyZXR1cm4gMDsKfQ==