48 lines
909 B
C++
48 lines
909 B
C++
/*
|
|
* ObservableTemplate.h
|
|
*
|
|
* Created on: 11.06.2014
|
|
* Author: matzman
|
|
*/
|
|
|
|
#ifndef OBSERVABLETEMPLATE_H_
|
|
#define OBSERVABLETEMPLATE_H_
|
|
|
|
#include <set>
|
|
#include <mutex>
|
|
#include <functional>
|
|
#include <cstdint>
|
|
|
|
namespace tfcppsimple {
|
|
|
|
template<class C>
|
|
class ObservableTemplate {
|
|
protected:
|
|
std::mutex observableLock;
|
|
std::set<C*> listeners;
|
|
public:
|
|
bool addListener(C& listener) {
|
|
std::lock_guard<std::mutex> lock(observableLock);
|
|
return listeners.insert(&listener).second;
|
|
}
|
|
bool removeListener(C& listener) {
|
|
std::lock_guard<std::mutex> lock(observableLock);
|
|
return listeners.erase(&listener) == 1;
|
|
}
|
|
uint32_t notifyListeners(std::function<bool(C& listener)> visitor) {
|
|
std::lock_guard<std::mutex> lock(observableLock);
|
|
uint32_t count = 0;
|
|
for (auto l : listeners) {
|
|
count++;
|
|
if (!visitor(*l)) break;
|
|
}
|
|
return count;
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* OBSERVABLETEMPLATE_H_ */
|