1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Observable
{
struct entendu
{
IListener* m_listener;
bool m_ok;
entendu(IListener* l) : m_listener(l), m_ok(false) {}
};
public:
void AddListener(IListener* pListener) {
m_vecListeners.push_back(entendu(pListener));
}
void RemoveListener(IListener* pListener) {
std::vector<entendu>::iterator it =
std::find_if(m_vecListeners.begin(), m_vecListeners.end(),
[pListener](entendu const & e) { return e.m_listener == pListener; });
if (it != m_vecListeners.end())
it->m_ok = true;
}
private:
void NotifyEvent() {
for (std::vector<entendu>::iterator it = m_vecListeners.begin(); it != m_vecListeners.end(); ++it)
(*it).m_listener->OnEvent();
m_vecListeners.erase(
std::remove_if(m_vecListeners.begin(), m_vecListeners.end(),
[](entendu const & e) { return e.m_ok == true; }),
m_vecListeners.end());
}
std::vector<entendu> m_vecListeners;
}; |
Partager