/** ****************************************************************************** * 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 #include namespace alloy { // TODO(benvanik): go lockfree, and don't hold the lock while emitting. template class Delegate { public: typedef std::function listener_t; void AddListener(listener_t const& listener) { std::lock_guard guard(lock_); listeners_.push_back(listener); } void RemoveListener(listener_t const& listener) { std::lock_guard guard(lock_); for (auto it = listeners_.begin(); it != listeners_.end(); ++it) { if (it == listener) { listeners_.erase(it); break; } } } 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_; }; } // namespace alloy #endif // ALLOY_DELEGATE_H_