/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ #ifndef CONFIGTYPE_H #define CONFIGTYPE_H #include "base/i2-base.hpp" #include "base/object.hpp" #include "base/type.hpp" #include "base/dictionary.hpp" #include #include namespace icinga { class ConfigObject; class ConfigType { public: virtual ~ConfigType(); intrusive_ptr GetObject(const String& name) const; void RegisterObject(const intrusive_ptr& object); void UnregisterObject(const intrusive_ptr& object); std::vector > GetObjects() const; template static TypeImpl *Get() { typedef TypeImpl ObjType; return static_cast(T::TypeInstance.get()); } template static std::vector > GetObjectsByType() { std::vector > objects = GetObjectsHelper(T::TypeInstance.get()); std::vector > result; result.reserve(objects.size()); for (const auto& object : objects) { result.push_back(static_pointer_cast(object)); } return result; } int GetObjectCount() const; private: typedef std::unordered_map > ObjectMap; typedef std::vector > ObjectVector; mutable std::mutex m_Mutex; ObjectMap m_ObjectMap; ObjectVector m_ObjectVector; static std::vector > GetObjectsHelper(Type *type); }; } #endif /* CONFIGTYPE_H */