1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
6 #include "base/i2-base.hpp"
7 #include "base/string.hpp"
8 #include <boost/thread/mutex.hpp>
9 #include <boost/signals2.hpp>
20 template<typename U, typename T>
24 typedef std::map<String, T> ItemMap;
26 void RegisterIfNew(const String& name, const T& item)
28 boost::mutex::scoped_lock lock(m_Mutex);
30 if (m_Items.find(name) != m_Items.end())
33 RegisterInternal(name, item, lock);
36 void Register(const String& name, const T& item)
38 boost::mutex::scoped_lock lock(m_Mutex);
40 RegisterInternal(name, item, lock);
43 void Unregister(const String& name)
48 boost::mutex::scoped_lock lock(m_Mutex);
49 erased = m_Items.erase(name);
58 typename Registry<U, T>::ItemMap items;
61 boost::mutex::scoped_lock lock(m_Mutex);
65 for (const auto& kv : items) {
66 OnUnregistered(kv.first);
70 boost::mutex::scoped_lock lock(m_Mutex);
75 T GetItem(const String& name) const
77 boost::mutex::scoped_lock lock(m_Mutex);
79 auto it = m_Items.find(name);
81 if (it == m_Items.end())
87 ItemMap GetItems() const
89 boost::mutex::scoped_lock lock(m_Mutex);
91 return m_Items; /* Makes a copy of the map. */
94 boost::signals2::signal<void (const String&, const T&)> OnRegistered;
95 boost::signals2::signal<void (const String&)> OnUnregistered;
98 mutable boost::mutex m_Mutex;
99 typename Registry<U, T>::ItemMap m_Items;
101 void RegisterInternal(const String& name, const T& item, boost::mutex::scoped_lock& lock)
103 bool old_item = false;
105 if (m_Items.erase(name) > 0)
108 m_Items[name] = item;
113 OnUnregistered(name);
115 OnRegistered(name, item);
121 #endif /* REGISTRY_H */