mirror of
https://github.com/xenia-project/xenia.git
synced 2025-12-06 07:12:03 +01:00
51 lines
1.3 KiB
C++
51 lines
1.3 KiB
C++
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef POLY_DELEGATE_H_
|
|
#define POLY_DELEGATE_H_
|
|
|
|
#include <functional>
|
|
#include <mutex>
|
|
#include <vector>
|
|
|
|
namespace poly {
|
|
|
|
// TODO(benvanik): go lockfree, and don't hold the lock while emitting.
|
|
|
|
template <typename... Args>
|
|
class Delegate {
|
|
public:
|
|
typedef std::function<void(Args&...)> Listener;
|
|
|
|
void AddListener(Listener const& listener) {
|
|
std::lock_guard<std::mutex> guard(lock_);
|
|
listeners_.push_back(listener);
|
|
}
|
|
|
|
void RemoveAllListeners() {
|
|
std::lock_guard<std::mutex> guard(lock_);
|
|
listeners_.clear();
|
|
}
|
|
|
|
void operator()(Args&... args) {
|
|
std::lock_guard<std::mutex> guard(lock_);
|
|
for (auto& listener : listeners_) {
|
|
listener(args...);
|
|
}
|
|
}
|
|
|
|
private:
|
|
std::mutex lock_;
|
|
std::vector<Listener> listeners_;
|
|
};
|
|
|
|
} // namespace poly
|
|
|
|
#endif // POLY_DELEGATE_H_
|