#pragma once #include #include #include #include namespace dp { template class observer : public std::enable_shared_from_this> { public: virtual void on_update(const target&) = 0; }; template class observable : public boost::noncopyable { public: typedef observer observer_type; typedef std::weak_ptr observer_ptr; typedef std::lock_guard lock_guard_type; protected: mutable std::mutex mutex_; std::list observers_; public: void register_observer(const observer_ptr& obj) { lock_guard_type lock(mutex_); observers_.push_back(obj); } void notify_observers(const target& target) { lock_guard_type lock(mutex_); auto iter = observers_.begin(); while (iter != observers_.end()) { std::shared_ptr obj(iter->lock()); if (obj) { obj->on_update(target); ++iter; } else { iter = observers_.erase(iter); } } } }; };