]> granicus.if.org Git - icinga2/blob - lib/base/configtype.hpp
Merge pull request #7002 from Icinga/bugfix/check_network-percent-6155
[icinga2] / lib / base / configtype.hpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #ifndef CONFIGTYPE_H
4 #define CONFIGTYPE_H
5
6 #include "base/i2-base.hpp"
7 #include "base/object.hpp"
8 #include "base/type.hpp"
9 #include "base/dictionary.hpp"
10 #include <boost/thread/mutex.hpp>
11
12 namespace icinga
13 {
14
15 class ConfigObject;
16
17 class ConfigType
18 {
19 public:
20         virtual ~ConfigType();
21
22         intrusive_ptr<ConfigObject> GetObject(const String& name) const;
23
24         void RegisterObject(const intrusive_ptr<ConfigObject>& object);
25         void UnregisterObject(const intrusive_ptr<ConfigObject>& object);
26
27         std::vector<intrusive_ptr<ConfigObject> > GetObjects() const;
28
29         template<typename T>
30         static TypeImpl<T> *Get()
31         {
32                 typedef TypeImpl<T> ObjType;
33                 return static_cast<ObjType *>(T::TypeInstance.get());
34         }
35
36         template<typename T>
37         static std::vector<intrusive_ptr<T> > GetObjectsByType()
38         {
39                 std::vector<intrusive_ptr<ConfigObject> > objects = GetObjectsHelper(T::TypeInstance.get());
40                 std::vector<intrusive_ptr<T> > result;
41                 result.reserve(objects.size());
42 for (const auto& object : objects) {
43                         result.push_back(static_pointer_cast<T>(object));
44                 }
45                 return result;
46         }
47
48         int GetObjectCount() const;
49
50 private:
51         typedef std::map<String, intrusive_ptr<ConfigObject> > ObjectMap;
52         typedef std::vector<intrusive_ptr<ConfigObject> > ObjectVector;
53
54         mutable boost::mutex m_Mutex;
55         ObjectMap m_ObjectMap;
56         ObjectVector m_ObjectVector;
57
58         static std::vector<intrusive_ptr<ConfigObject> > GetObjectsHelper(Type *type);
59 };
60
61 }
62
63 #endif /* CONFIGTYPE_H */