#pragma once #include #include #include namespace Swift { class EventOwner; class EventLoop { public: EventLoop(); virtual ~EventLoop(); void postEvent(boost::function event, boost::shared_ptr owner = boost::shared_ptr()); void removeEventsFromOwner(boost::shared_ptr owner); protected: struct Event { Event(boost::shared_ptr owner, const boost::function& callback) : owner(owner), callback(callback) { } bool operator==(const Event& o) const { return o.id == id; } unsigned int id; boost::shared_ptr owner; boost::function callback; }; /** * Reimplement this to call handleEvent(event) from the thread in which * the event loop is residing. */ virtual void post(const Event& event) = 0; void handleEvent(const Event& event); private: struct HasOwner { HasOwner(boost::shared_ptr owner) : owner(owner) {} bool operator()(const Event& event) { return event.owner == owner; } boost::shared_ptr owner; }; boost::mutex eventsMutex_; unsigned int nextEventID_; std::list events_; }; }