/** ****************************************************************************** * 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 ALLOY_DELEGATE_H_ #define ALLOY_DELEGATE_H_ #include #include #include namespace alloy { // TODO(benvanik): go lockfree, and don't hold the lock while emitting. template class Delegate; template class Delegate { public: typedef std::function Listener; void AddListener(Listener const& listener) { std::lock_guard guard(lock_); listeners_.push_back(listener); } void RemoveAllListeners() { std::lock_guard guard(lock_); listeners_.clear(); } void operator()(T& e) { std::lock_guard guard(lock_); for (auto& listener : listeners_) { listener(e); } } private: std::mutex lock_; std::vector listeners_; }; template <> class Delegate { public: typedef std::function Listener; void AddListener(Listener const& listener) { std::lock_guard guard(lock_); listeners_.push_back(listener); } void RemoveAllListeners() { std::lock_guard guard(lock_); listeners_.clear(); } void operator()() { std::lock_guard guard(lock_); for (auto& listener : listeners_) { listener(); } } private: std::mutex lock_; std::vector listeners_; }; } // namespace alloy #endif // ALLOY_DELEGATE_H_