#include <iostream>
class TwoWire
{
private:
static void (*user_onReceive)(size_t);
public:
TwoWire();
void begin();
virtual int read(void);
void onReceive(void (*)(int));
void onReceive(void (*)(size_t));
};
void (*TwoWire::user_onReceive)(size_t);
TwoWire::TwoWire() {}
void TwoWire::begin()
{
if (user_onReceive)
{
user_onReceive(123);
}
}
int TwoWire::read(void)
{
return 12;
}
void TwoWire::onReceive(void (*function)(int))
{
user_onReceive = reinterpret_cast<void(*)(size_t)>(function);
}
void TwoWire::onReceive(void (*function)(size_t))
{
user_onReceive = function;
}
TwoWire Wire;
class hardwire {
private:
inline static uint8_t _rx = 0;
public:
void hardwireStart(){
Wire.onReceive(hardwireReceive);
Wire.begin();
}
static void hardwireReceive(int bytes){
_rx = Wire.read();
printf("_rx = %d, bytes = %d", _rx, bytes);
}
};
hardwire chip;
int main()
{
chip.hardwireStart();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgVHdvV2lyZQp7CnByaXZhdGU6CiAgICBzdGF0aWMgdm9pZCAoKnVzZXJfb25SZWNlaXZlKShzaXplX3QpOwoKcHVibGljOgogICAgVHdvV2lyZSgpOwogICAgdm9pZCBiZWdpbigpOwogICAgdmlydHVhbCBpbnQgcmVhZCh2b2lkKTsKICAgIHZvaWQgb25SZWNlaXZlKHZvaWQgKCopKGludCkpOwogICAgdm9pZCBvblJlY2VpdmUodm9pZCAoKikoc2l6ZV90KSk7Cn07Cgp2b2lkICgqVHdvV2lyZTo6dXNlcl9vblJlY2VpdmUpKHNpemVfdCk7CgpUd29XaXJlOjpUd29XaXJlKCkge30KCnZvaWQgVHdvV2lyZTo6YmVnaW4oKQp7CiAgICBpZiAodXNlcl9vblJlY2VpdmUpCiAgICB7CiAgICAgICAgdXNlcl9vblJlY2VpdmUoMTIzKTsKICAgIH0KfQoKaW50IFR3b1dpcmU6OnJlYWQodm9pZCkKewogICAgcmV0dXJuIDEyOwp9Cgp2b2lkIFR3b1dpcmU6Om9uUmVjZWl2ZSh2b2lkICgqZnVuY3Rpb24pKGludCkpCnsKICAgIHVzZXJfb25SZWNlaXZlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKCopKHNpemVfdCk+KGZ1bmN0aW9uKTsKfQoKdm9pZCBUd29XaXJlOjpvblJlY2VpdmUodm9pZCAoKmZ1bmN0aW9uKShzaXplX3QpKQp7CiAgICB1c2VyX29uUmVjZWl2ZSA9IGZ1bmN0aW9uOwp9CgpUd29XaXJlIFdpcmU7CgoKY2xhc3MgaGFyZHdpcmUgewogIHByaXZhdGU6CiAgaW5saW5lIHN0YXRpYyB1aW50OF90IF9yeCA9IDA7CgogIHB1YmxpYzoKICB2b2lkIGhhcmR3aXJlU3RhcnQoKXsKICAgIFdpcmUub25SZWNlaXZlKGhhcmR3aXJlUmVjZWl2ZSk7CiAgICBXaXJlLmJlZ2luKCk7CiAgfQoKICBzdGF0aWMgdm9pZCBoYXJkd2lyZVJlY2VpdmUoaW50IGJ5dGVzKXsKICAgIF9yeCA9IFdpcmUucmVhZCgpOwogICAgcHJpbnRmKCJfcnggPSAlZCwgIGJ5dGVzID0gJWQiLCBfcngsIGJ5dGVzKTsKICB9Cn07CgoKaGFyZHdpcmUgY2hpcDsKCmludCBtYWluKCkKewoJY2hpcC5oYXJkd2lyZVN0YXJ0KCk7CgkKCXJldHVybiAwOwp9