#ifndef CODE_OBSERVABLE #define CODE_OBSERVABLE #include "code/return.h" #include template class observer_t { public: virtual void on_change( V* value_p ) = 0; }; template class observable_t { public: enum class error_t { none, unknown, not_observing }; struct configuration_t { V* value_m; }; observable_t( configuration_t* configuration_p ) { configuration_m = configuration_p; } void_t observe( observer_t* observer_p ) { observer_p->on_change(configuration_m->value_m); observers_m.push_back(observer_p); } void_t unobserve( observer_t* observer_p ) { observable_t::error_t error_l = observable_t::error_t::not_observing; for (int i = 0; i < observers_m.size(); i++) { if (observers_m[i] == observer_p) { observers_m.erase(i); error_l = observable_t::error_t::none; break; } } void_t void_l; void_l.error_m = error_l; return void_l; } V* get_value() { return value_m; } void_t change( V* value_p ) { configuration_m->value_m = value_p; for (int i = 0; i < observers_m.size(); i++) { observer_m = observers_m[i]; observer_m->on_change(configuration_m->value_m); } void_t void_l; void_l.error_m = observable_t::error_t::none; return void_l; } private: std::vector*> observers_m; configuration_t* configuration_m; }; template class observable_factory_t : public observable_t { public: return_t *> create( observable_t::configuration_t configuration_p ) { observable_t* observable_l = new observable_t( configuration_p ); return_t return_l; return_l.error_m = observable_t::error_t::none; return_l.value_m = observable_l; return return_l; } void_t dispose( observable_t* observable_p ) { delete observable_p; void_t void_l; void_l.error_m = observable_t::error_t::none; return void_l; } }; #endif