/** ****************************************************************************** * 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 #include #include namespace poly { // TODO(benvanik): go lockfree, and don't hold the lock while emitting. 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()(Args&... args) { std::lock_guard guard(lock_); for (auto& listener : listeners_) { listener(args...); } } private: std::mutex lock_; std::vector listeners_; }; } // namespace poly #endif // POLY_DELEGATE_H_