#include <iostream>
struct Reader {
virtual void action() = 0;
};
struct Writer {
virtual void action() = 0;
};
struct ReadWriter {
int i;
struct ReaderAdapter : Reader {
ReadWriter *rw;
ReaderAdapter( ReadWriter *rw ) : rw( rw ) {}
void action() override {
rw->read_action();
}
} reader;
struct WriterAdapter : Writer {
ReadWriter *rw;
WriterAdapter( ReadWriter *rw ) : rw( rw ) {}
void action() override {
rw->write_action();
}
} writer;
ReadWriter( int i = 0 ) : i( i ), reader( this ), writer( this ) {}
void read_action() {
std::cout << "reader " << i << "\n";
}
void write_action() {
std::cout << "writer " << i << "\n";
}
operator Reader*() {
return &this->reader;
}
operator Writer*() {
return &this->writer;
}
};
void use_reader( Reader* reader ) {
reader->action();
}
void use_writer( Writer* writer ) {
writer->action();
}
int main() {
ReadWriter rw( 10 );
use_reader( rw );
use_writer( rw );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IFJlYWRlciB7CiAgICB2aXJ0dWFsIHZvaWQgYWN0aW9uKCkgPSAwOwp9OwoKc3RydWN0IFdyaXRlciB7CiAgICB2aXJ0dWFsIHZvaWQgYWN0aW9uKCkgPSAwOwp9OwoKc3RydWN0IFJlYWRXcml0ZXIgewoKICAgIGludCBpOwoKICAgIHN0cnVjdCBSZWFkZXJBZGFwdGVyIDogUmVhZGVyIHsKICAgICAgICBSZWFkV3JpdGVyICpydzsKCiAgICAgICAgUmVhZGVyQWRhcHRlciggUmVhZFdyaXRlciAqcncgKSA6IHJ3KCBydyApIHt9CiAgICAgICAgCiAgICAgICAgdm9pZCBhY3Rpb24oKSBvdmVycmlkZSB7CiAgICAgICAgICAgIHJ3LT5yZWFkX2FjdGlvbigpOwogICAgICAgIH0KICAgIH0gcmVhZGVyOwoKICAgIHN0cnVjdCBXcml0ZXJBZGFwdGVyIDogV3JpdGVyIHsKICAgICAgICBSZWFkV3JpdGVyICpydzsKCiAgICAgICAgV3JpdGVyQWRhcHRlciggUmVhZFdyaXRlciAqcncgKSA6IHJ3KCBydyApIHt9CiAgICAgICAgCiAgICAgICAgdm9pZCBhY3Rpb24oKSBvdmVycmlkZSB7CiAgICAgICAgICAgIHJ3LT53cml0ZV9hY3Rpb24oKTsKICAgICAgICB9CiAgICB9IHdyaXRlcjsKCiAgICBSZWFkV3JpdGVyKCBpbnQgaSA9IDAgKSA6IGkoIGkgKSwgcmVhZGVyKCB0aGlzICksIHdyaXRlciggdGhpcyApIHt9ICAgIAoKICAgIHZvaWQgcmVhZF9hY3Rpb24oKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJyZWFkZXIgIiA8PCBpIDw8ICJcbiI7CiAgICB9CgogICAgdm9pZCB3cml0ZV9hY3Rpb24oKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJ3cml0ZXIgIiA8PCBpIDw8ICJcbiI7CiAgICB9ICAgIAoKICAgIG9wZXJhdG9yIFJlYWRlciooKSB7CiAgICAgICAgcmV0dXJuICZ0aGlzLT5yZWFkZXI7CiAgICB9CgogICAgb3BlcmF0b3IgV3JpdGVyKigpIHsKICAgICAgICByZXR1cm4gJnRoaXMtPndyaXRlcjsKICAgIH0KfTsKCnZvaWQgdXNlX3JlYWRlciggUmVhZGVyKiByZWFkZXIgKSB7CiAgICByZWFkZXItPmFjdGlvbigpOwp9Cgp2b2lkIHVzZV93cml0ZXIoIFdyaXRlciogd3JpdGVyICkgewogICAgd3JpdGVyLT5hY3Rpb24oKTsKfQoKaW50IG1haW4oKSB7CiAgICBSZWFkV3JpdGVyIHJ3KCAxMCApOwoKICAgIHVzZV9yZWFkZXIoIHJ3ICk7CiAgICB1c2Vfd3JpdGVyKCBydyApOwogICAgCiAgICByZXR1cm4gMDsKfQo=