Duckstation/src/common/object.h
Connor McLaughlin 2149ab4d69 Initial commit
2019-09-11 14:00:42 +10:00

85 lines
2.7 KiB
C++

#pragma once
#include "object_type_info.h"
class Object
{
// OBJECT TYPE STUFF
private:
static ObjectTypeInfo s_type_info;
public:
typedef Object ThisClass;
static const ObjectTypeInfo* StaticTypeInfo() { return &s_type_info; }
static ObjectTypeInfo* StaticMutableTypeInfo() { return &s_type_info; }
static const PROPERTY_DECLARATION* StaticPropertyMap() { return nullptr; }
static ObjectFactory* StaticFactory() { return nullptr; }
// END OBJECT TYPE STUFF
public:
Object(const ObjectTypeInfo* type_info = &s_type_info);
virtual ~Object();
// Retrieves the type information for this object.
const ObjectTypeInfo* GetTypeInfo() const { return m_type_info; }
// Cast from one object type to another, unchecked.
template<class T>
const T* Cast() const
{
DebugAssert(m_type_info->IsDerived(T::StaticTypeInfo()));
return static_cast<const T*>(this);
}
template<class T>
T* Cast()
{
DebugAssert(m_type_info->IsDerived(T::StaticTypeInfo()));
return static_cast<T*>(this);
}
// Cast from one object type to another, checked.
template<class T>
const T* SafeCast() const
{
return (m_type_info->IsDerived(T::StaticTypeInfo())) ? static_cast<const T*>(this) : nullptr;
}
template<class T>
T* SafeCast()
{
return (m_type_info->IsDerived(T::StaticTypeInfo())) ? static_cast<T*>(this) : nullptr;
}
// Test if one object type is derived from another.
template<class T>
bool IsDerived() const
{
return (m_type_info->IsDerived(T::StaticTypeInfo()));
}
bool IsDerived(const ObjectTypeInfo* type) const { return (m_type_info->IsDerived(type)); }
protected:
// Type info pointer. Set by subclasses.
const ObjectTypeInfo* m_type_info;
};
//
// GenericObjectFactory<T>
//
template<class T>
struct GenericObjectFactory final : public ObjectFactory
{
Object* CreateObject() override { return new T(); }
Object* CreateObject(const String& identifier) override { return new T(); }
void DeleteObject(Object* object) override { delete object; }
};
#define DECLARE_OBJECT_GENERIC_FACTORY(Type) \
\
private: \
static GenericObjectFactory<Type> s_GenericFactory; \
\
public: \
static ObjectFactory* StaticFactory() { return &s_GenericFactory; }
#define DEFINE_OBJECT_GENERIC_FACTORY(Type) \
GenericObjectFactory<Type> Type::s_GenericFactory = GenericObjectFactory<Type>();