#include <iostream>
#include <functional>
using namespace std;
class Notify
{
using HandlerType = std::function<void ( Notify& )>;
unsigned int Value_;
HandlerType Handler_;
public:
Notify() : Value_( 0 )
{
}
unsigned int value() const
{
return Value_;
}
void set_value( unsigned int Val )
{
if( Val != value() )
{
Value_ = Val;
if( Handler_ )
{
Handler_( *this );
}
}
}
void set_handler( HandlerType Handler )
{
Handler_ = Handler;
}
};
Notify n;
class Sink
{
public:
Sink()
{
n.set_handler( std::bind( &Sink::handler, this, std::placeholders::_1 ) );
}
void handler( Notify& obj )
{
std::cout << "Handler called" << endl;
}
};
int main()
{
Sink s;
n.set_value( 123 );
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBOb3RpZnkKewoJdXNpbmcgSGFuZGxlclR5cGUgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQgKCBOb3RpZnkmICk+OwoJCgl1bnNpZ25lZCBpbnQgVmFsdWVfOwoJSGFuZGxlclR5cGUgIEhhbmRsZXJfOwoJCnB1YmxpYzoKCU5vdGlmeSgpIDogVmFsdWVfKCAwICkKCXsKCX0KCQoJdW5zaWduZWQgaW50IHZhbHVlKCkgY29uc3QKCXsKCQlyZXR1cm4gVmFsdWVfOwoJfQoJCgl2b2lkIHNldF92YWx1ZSggdW5zaWduZWQgaW50IFZhbCApCgl7CgkJaWYoIFZhbCAhPSB2YWx1ZSgpICkKCQl7CgkJCVZhbHVlXyA9IFZhbDsKCQkJaWYoIEhhbmRsZXJfICkKCQkJewoJCQkJSGFuZGxlcl8oICp0aGlzICk7CgkJCX0KCQl9Cgl9CgkKCXZvaWQgc2V0X2hhbmRsZXIoIEhhbmRsZXJUeXBlIEhhbmRsZXIgKQoJewoJCUhhbmRsZXJfID0gSGFuZGxlcjsKCX0KfTsKCk5vdGlmeSBuOwoKY2xhc3MgU2luawp7CnB1YmxpYzoKICAgU2luaygpCiAgIHsKICAgICAgbi5zZXRfaGFuZGxlciggc3RkOjpiaW5kKCAmU2luazo6aGFuZGxlciwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xICkgKTsKICAgfQogICAKICAgdm9pZCBoYW5kbGVyKCBOb3RpZnkmIG9iaiApCiAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJIYW5kbGVyIGNhbGxlZCIgPDwgZW5kbDsKICAgfQp9OwoKaW50IG1haW4oKQp7CiAgIFNpbmsgczsKICAgbi5zZXRfdmFsdWUoIDEyMyApOwogICByZXR1cm4gMDsKfQo=