]> granicus.if.org Git - icinga2/commitdiff
Add missing meta type class for the Type class
authorGunnar Beutner <gunnar@beutner.name>
Wed, 14 Jan 2015 08:51:44 +0000 (09:51 +0100)
committerGunnar Beutner <gunnar@beutner.name>
Wed, 14 Jan 2015 08:51:44 +0000 (09:51 +0100)
refs #8169

lib/base/type.cpp
lib/base/type.hpp

index ae8faa2c3ad5551c4c76e50b510f7fef4aff5933..93ae1b9bdda780b965cf22482f2a17ad0f9c707a 100644 (file)
 
 using namespace icinga;
 
+static void RegisterTypeType(void)
+{
+       Type::Ptr type = new TypeType();
+       Type::TypeInstance = type;
+       Type::Register(type);
+}
+
+INITIALIZE_ONCE(RegisterTypeType);
+
 String Type::ToString(void) const
 {
        return "type '" + GetName() + "'";
@@ -79,3 +88,52 @@ void Type::SetPrototype(const Object::Ptr& object)
        m_Prototype = object;
 }
 
+Value Type::GetField(int id) const
+{
+       if (id == 0)
+               return GetPrototype();
+
+       return Object::GetField(id);
+}
+
+String TypeType::GetName(void) const
+{
+       return "Type";
+}
+
+Type::Ptr TypeType::GetBaseType(void) const
+{
+       return Type::Ptr();
+}
+
+int TypeType::GetAttributes(void) const
+{
+       return 0;
+}
+
+int TypeType::GetFieldId(const String& name) const
+{
+       if (name == "prototype")
+               return 0;
+
+       return -1;
+}
+
+Field TypeType::GetFieldInfo(int id) const
+{
+       if (id == 0)
+               return Field(0, "Object", "prototype", 0);
+
+       throw std::runtime_error("Invalid field ID.");
+}
+
+int TypeType::GetFieldCount(void) const
+{
+       return 1;
+}
+
+ObjectFactory TypeType::GetFactory(void) const
+{
+       return NULL;
+}
+
index be51c426979f753b65c1e32e1370b29bbba92083..30fd671a5138029ab0c01421bbcd61c499ef2720 100644 (file)
@@ -81,6 +81,8 @@ public:
        static void Register(const Type::Ptr& type);
        static Type::Ptr GetByName(const String& name);
 
+       virtual Value GetField(int id) const;
+
 protected:
        virtual ObjectFactory GetFactory(void) const = 0;
 
@@ -88,6 +90,22 @@ private:
        Object::Ptr m_Prototype;
 };
 
+class I2_BASE_API TypeType : public Type
+{
+public:
+       DECLARE_PTR_TYPEDEFS(Type);
+
+       virtual String GetName(void) const;
+       virtual Type::Ptr GetBaseType(void) const;
+       virtual int GetAttributes(void) const;
+       virtual int GetFieldId(const String& name) const;
+       virtual Field GetFieldInfo(int id) const;
+       virtual int GetFieldCount(void) const;
+
+protected:
+       virtual ObjectFactory GetFactory(void) const;
+};
+
 template<typename T>
 class TypeImpl
 {