Improved proper handling of state events

This commit is contained in:
2023-03-01 05:56:20 -08:00
parent 3f361130fd
commit 008cf282dd
2 changed files with 39 additions and 15 deletions

View File

@ -8,9 +8,26 @@
#include "StateProperty.hpp" #include "StateProperty.hpp"
namespace Dawn { namespace Dawn {
class StateOwner { class StateOwner : public IStateOwner {
private: private:
std::vector<IStateEvent*> eventsSubscribed; std::vector<IStateEvent*> eventsSubscribed;
/**
* Called by the state event when it is disposing (before the StateOwner
* itself is).
*
* @param evt Event that is being disposed.
*/
void _stateEventDisposed(IStateEvent *evt) override {
auto it = eventsSubscribed.begin();
while(it != eventsSubscribed.end()) {
if(*it == evt) {
it = eventsSubscribed.erase(it);
} else {
++it;
}
}
}
public: public:
/** /**

View File

@ -7,15 +7,19 @@
#include "assert/assert.hpp" #include "assert/assert.hpp"
namespace Dawn { namespace Dawn {
class StateOwner; /** Forwarders / Fake Virtuals for other methods. */
template<typename...A> template<typename...A>
class StateEvent; class StateEvent;
class IStateEvent;
class IStateOwner {
public:
virtual void _stateEventDisposed(IStateEvent *evt) = 0;
};
template<typename...A> template<typename...A>
struct StateEventListener { struct StateEventListener {
uint32_t id; uint32_t id;
StateOwner *owner; IStateOwner *owner;
std::function<void(A...)> listener; std::function<void(A...)> listener;
std::function<void(StateEventListener<A...>)> unsubWithParams; std::function<void(StateEventListener<A...>)> unsubWithParams;
std::function<void()> unsub; std::function<void()> unsub;
@ -31,7 +35,7 @@ namespace Dawn {
* *
* @param owner State owner that is being disposed. * @param owner State owner that is being disposed.
*/ */
virtual void _stateOwnerDestroyed(StateOwner *owner) = 0; virtual void _stateOwnerDestroyed(IStateOwner *owner) = 0;
friend class StateOwner; friend class StateOwner;
}; };
@ -41,7 +45,8 @@ namespace Dawn {
protected: protected:
uint32_t stateEventId = 0; uint32_t stateEventId = 0;
void _stateOwnerDestroyed(StateOwner *owner) override { /** Refer to IStateEvent::_stateOwnerDestroyed */
void _stateOwnerDestroyed(IStateOwner *owner) override {
auto it = this->_eventListeners.begin(); auto it = this->_eventListeners.begin();
while(it != this->_eventListeners.end()) { while(it != this->_eventListeners.end()) {
if(it->owner == owner) { if(it->owner == owner) {
@ -66,15 +71,17 @@ namespace Dawn {
it->listener(args...); it->listener(args...);
++it; ++it;
} }
// auto itListeners = this->_eventListeners.begin(); }
// while(itListeners != this->_eventListeners.end()) {
// auto itLists = itListeners->second.begin(); /**
// while(itLists != itListeners->second.end()) { * Disposal of a state event.
// (*itLists)(args...); */
// ++itLists; ~StateEvent() {
// } auto it = this->_eventListeners.begin();
// ++itListeners; while(it != this->_eventListeners.end()) {
// } it->owner->_stateEventDisposed(this);
++it;
}
} }
friend class StateOwner; friend class StateOwner;