#include <iostream>
#include <functional>
template <typename T>
struct property {
typedef std::function<T(T)> filter_function;
typedef T value_type;
property() { }
property(value_type value)
: m_value(value)
{ }
property(value_type value, filter_function onGet)
: m_value(value)
, m_onGet(onGet)
{ }
property(value_type value, filter_function onGet, filter_function onSet)
: m_value(value)
, m_onGet(onGet)
, m_onSet(onSet)
{ }
operator value_type() const {
if (m_onGet) {
return m_onGet(m_value);
}
return m_value;
}
property& operator=(value_type value) {
if (m_onSet) {
m_value = m_onSet(value);
} else {
m_value = value;
}
return *this;
}
value_type m_value;
bool m_readOnly;
filter_function m_onGet;
filter_function m_onSet;
};
class FuckingClass {
public:
property<std::string> fuckingProperty;
FuckingClass()
{
fuckingProperty = property<std::string>("hello",
std::bind(&FuckingClass::OnFuckingPropertyGet, this, std::placeholders::_1),
std::bind(&FuckingClass::OnFuckingPropertySet, this, std::placeholders::_1)
);
}
std::string OnFuckingPropertyGet(std::string s) {
std::cout << "Getting fuckingProperty original value=" << s << std::endl;
return "learn c++ dude";
}
std::string OnFuckingPropertySet(std::string s) {
std::cout << "Setting fuckingProperty to value=" << s << std::endl;
return s;
}
};
int main(int argc, char **argv) {
FuckingClass instance;
instance.fuckingProperty = "world";
std::string s = instance.fuckingProperty;
std::cout << "s = " << s << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgcHJvcGVydHkgewogICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPFQoVCk+IGZpbHRlcl9mdW5jdGlvbjsKICAgIHR5cGVkZWYgVCB2YWx1ZV90eXBlOwoKICAgIHByb3BlcnR5KCkgeyB9CgogICAgcHJvcGVydHkodmFsdWVfdHlwZSB2YWx1ZSkKICAgICAgICA6IG1fdmFsdWUodmFsdWUpCiAgICB7IH0KCiAgICBwcm9wZXJ0eSh2YWx1ZV90eXBlIHZhbHVlLCBmaWx0ZXJfZnVuY3Rpb24gb25HZXQpCiAgICAgICAgOiBtX3ZhbHVlKHZhbHVlKQogICAgICAgICwgbV9vbkdldChvbkdldCkKICAgIHsgfQoKICAgIHByb3BlcnR5KHZhbHVlX3R5cGUgdmFsdWUsIGZpbHRlcl9mdW5jdGlvbiBvbkdldCwgZmlsdGVyX2Z1bmN0aW9uIG9uU2V0KQogICAgICAgIDogbV92YWx1ZSh2YWx1ZSkKICAgICAgICAsIG1fb25HZXQob25HZXQpCiAgICAgICAgLCBtX29uU2V0KG9uU2V0KQogICAgeyB9CgogICAgb3BlcmF0b3IgdmFsdWVfdHlwZSgpIGNvbnN0IHsKICAgICAgICBpZiAobV9vbkdldCkgewogICAgICAgICAgICByZXR1cm4gbV9vbkdldChtX3ZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1fdmFsdWU7CiAgICB9CgogICAgcHJvcGVydHkmIG9wZXJhdG9yPSh2YWx1ZV90eXBlIHZhbHVlKSB7CiAgICAgICAgaWYgKG1fb25TZXQpIHsKICAgICAgICAgICAgbV92YWx1ZSA9IG1fb25TZXQodmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1fdmFsdWUgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIHZhbHVlX3R5cGUgICAgICBtX3ZhbHVlOwogICAgYm9vbCAgICAgICAgICAgIG1fcmVhZE9ubHk7CiAgICBmaWx0ZXJfZnVuY3Rpb24gbV9vbkdldDsKICAgIGZpbHRlcl9mdW5jdGlvbiBtX29uU2V0Owp9OwoKCmNsYXNzIEZ1Y2tpbmdDbGFzcyB7CnB1YmxpYzoKICAgIHByb3BlcnR5PHN0ZDo6c3RyaW5nPiBmdWNraW5nUHJvcGVydHk7CgogICAgRnVja2luZ0NsYXNzKCkKICAgIHsgCiAgICAgICAgZnVja2luZ1Byb3BlcnR5ID0gcHJvcGVydHk8c3RkOjpzdHJpbmc+KCJoZWxsbyIsIAogICAgICAgICAgICBzdGQ6OmJpbmQoJkZ1Y2tpbmdDbGFzczo6T25GdWNraW5nUHJvcGVydHlHZXQsIHRoaXMsIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSksCiAgICAgICAgICAgIHN0ZDo6YmluZCgmRnVja2luZ0NsYXNzOjpPbkZ1Y2tpbmdQcm9wZXJ0eVNldCwgdGhpcywgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKQogICAgICAgICk7CiAgICB9CgogICAgc3RkOjpzdHJpbmcgT25GdWNraW5nUHJvcGVydHlHZXQoc3RkOjpzdHJpbmcgcykgewogICAgICAgIHN0ZDo6Y291dCA8PCAiR2V0dGluZyBmdWNraW5nUHJvcGVydHkgb3JpZ2luYWwgdmFsdWU9IiA8PCBzIDw8IHN0ZDo6ZW5kbDsKICAgICAgICByZXR1cm4gImxlYXJuIGMrKyBkdWRlIjsKICAgIH0KCiAgICBzdGQ6OnN0cmluZyBPbkZ1Y2tpbmdQcm9wZXJ0eVNldChzdGQ6OnN0cmluZyBzKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJTZXR0aW5nIGZ1Y2tpbmdQcm9wZXJ0eSB0byB2YWx1ZT0iIDw8IHMgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiBzOwogICAgfQp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBGdWNraW5nQ2xhc3MgaW5zdGFuY2U7CiAgICBpbnN0YW5jZS5mdWNraW5nUHJvcGVydHkgPSAid29ybGQiOwogICAgc3RkOjpzdHJpbmcgcyA9IGluc3RhbmNlLmZ1Y2tpbmdQcm9wZXJ0eTsKICAgIHN0ZDo6Y291dCA8PCAicyA9ICIgPDwgcyA8PCBzdGQ6OmVuZGw7CiAgICByZXR1cm4gMDsKfQ==