Initial commit.
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* 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_ */
|
||||
Reference in New Issue
Block a user