| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| |
|
| | #ifndef BASE_BASECLASS_H
|
| | #define BASE_BASECLASS_H
|
| |
|
| | #include "Type.h"
|
| |
|
| |
|
| | using PyObject = struct _object;
|
| |
|
| |
|
| |
|
| |
|
| | #define TYPESYSTEM_HEADER() \
|
| | public: \
|
| | static Base::Type getClassTypeId(void); \
|
| | virtual Base::Type getTypeId(void) const; \
|
| | static void init(void); \
|
| | static void* create(void); \
|
| | \
|
| | private: \
|
| | static Base::Type classTypeId
|
| |
|
| |
|
| |
|
| | #define TYPESYSTEM_HEADER_WITH_OVERRIDE() \
|
| | public: \
|
| | static Base::Type getClassTypeId(void); \
|
| | Base::Type getTypeId(void) const override; \
|
| | static void init(void); \
|
| | static void* create(void); \
|
| | \
|
| | private: \
|
| | static Base::Type classTypeId
|
| |
|
| |
|
| |
|
| | #define TYPESYSTEM_SOURCE_P(_class_) \
|
| | Base::Type _class_::getClassTypeId(void) \
|
| | { \
|
| | return _class_::classTypeId; \
|
| | } \
|
| | Base::Type _class_::getTypeId(void) const \
|
| | { \
|
| | return _class_::classTypeId; \
|
| | } \
|
| | Base::Type _class_::classTypeId = Base::Type::BadType; \
|
| | void* _class_::create(void) \
|
| | { \
|
| | return new _class_(); \
|
| | }
|
| |
|
| |
|
| | #define TYPESYSTEM_SOURCE_TEMPLATE_P(_class_) \
|
| | template<> \
|
| | Base::Type _class_::getClassTypeId(void) \
|
| | { \
|
| | return _class_::classTypeId; \
|
| | } \
|
| | template<> \
|
| | Base::Type _class_::getTypeId(void) const \
|
| | { \
|
| | return _class_::classTypeId; \
|
| | } \
|
| | template<> \
|
| | void* _class_::create(void) \
|
| | { \
|
| | return new _class_(); \
|
| | }
|
| |
|
| |
|
| | #define TYPESYSTEM_SOURCE_ABSTRACT_P(_class_) \
|
| | Base::Type _class_::getClassTypeId(void) \
|
| | { \
|
| | return _class_::classTypeId; \
|
| | } \
|
| | Base::Type _class_::getTypeId(void) const \
|
| | { \
|
| | return _class_::classTypeId; \
|
| | } \
|
| | Base::Type _class_::classTypeId = Base::Type::BadType; \
|
| | void* _class_::create(void) \
|
| | { \
|
| | return nullptr; \
|
| | }
|
| |
|
| |
|
| |
|
| | #define TYPESYSTEM_SOURCE(_class_, _parentclass_) \
|
| | TYPESYSTEM_SOURCE_P(_class_) \
|
| | void _class_::init(void) \
|
| | { \
|
| | initSubclass(_class_::classTypeId, #_class_, #_parentclass_, &(_class_::create)); \
|
| | }
|
| |
|
| |
|
| | #define TYPESYSTEM_SOURCE_TEMPLATE_T(_class_, _parentclass_) \
|
| | TYPESYSTEM_SOURCE_TEMPLATE_P(_class_) \
|
| | template<> \
|
| | void _class_::init(void) \
|
| | { \
|
| | initSubclass(_class_::classTypeId, #_class_, #_parentclass_, &(_class_::create)); \
|
| | }
|
| |
|
| |
|
| | #define TYPESYSTEM_SOURCE_ABSTRACT(_class_, _parentclass_) \
|
| | TYPESYSTEM_SOURCE_ABSTRACT_P(_class_) \
|
| | void _class_::init(void) \
|
| | { \
|
| | initSubclass(_class_::classTypeId, #_class_, #_parentclass_, nullptr); \
|
| | }
|
| |
|
| |
|
| | namespace Base
|
| | {
|
| |
|
| | class BaseExport BaseClass
|
| | {
|
| | public:
|
| | static Type getClassTypeId();
|
| | virtual Type getTypeId() const;
|
| | bool isDerivedFrom(const Type type) const
|
| | {
|
| | return getTypeId().isDerivedFrom(type);
|
| | }
|
| |
|
| | static void init();
|
| |
|
| | virtual PyObject* getPyObject();
|
| | virtual void setPyObject(PyObject*);
|
| |
|
| | static void* create()
|
| | {
|
| | return nullptr;
|
| | }
|
| |
|
| | template<typename T>
|
| | bool is() const;
|
| |
|
| | template<typename T>
|
| | bool isDerivedFrom() const;
|
| |
|
| | private:
|
| | static Type classTypeId;
|
| |
|
| | protected:
|
| | static void initSubclass(
|
| | Base::Type& toInit,
|
| | const char* ClassName,
|
| | const char* ParentName,
|
| | Type::instantiationMethod method = nullptr
|
| | );
|
| |
|
| | public:
|
| |
|
| | BaseClass();
|
| | BaseClass(const BaseClass&) = default;
|
| | BaseClass& operator=(const BaseClass&) = default;
|
| | BaseClass(BaseClass&&) = default;
|
| | BaseClass& operator=(BaseClass&&) = default;
|
| |
|
| | virtual ~BaseClass();
|
| | };
|
| |
|
| | template<typename T>
|
| | bool BaseClass::is() const
|
| | {
|
| | static_assert(std::is_base_of_v<BaseClass, T>, "T must be derived from Base::BaseClass");
|
| | return getTypeId() == T::getClassTypeId();
|
| | }
|
| |
|
| | template<typename T>
|
| | bool BaseClass::isDerivedFrom() const
|
| | {
|
| | static_assert(std::is_base_of_v<BaseClass, T>, "T must be derived from Base::BaseClass");
|
| | return getTypeId().isDerivedFrom(T::getClassTypeId());
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | template<typename T, typename U = std::remove_pointer_t<T>>
|
| | requires(std::is_pointer_v<T>)
|
| | T freecad_cast(Base::BaseClass* type)
|
| | {
|
| | static_assert(std::is_base_of_v<Base::BaseClass, U>, "T must be derived from Base::BaseClass");
|
| |
|
| | if (type && type->isDerivedFrom(U::getClassTypeId())) {
|
| | return static_cast<T>(type);
|
| | }
|
| |
|
| | return nullptr;
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | template<typename T, typename U = std::remove_pointer_t<T>>
|
| | requires(std::is_pointer_v<T>)
|
| | const U* freecad_cast(const Base::BaseClass* type)
|
| | {
|
| | static_assert(std::is_base_of_v<Base::BaseClass, U>, "T must be derived from Base::BaseClass");
|
| |
|
| | if (type && type->isDerivedFrom(U::getClassTypeId())) {
|
| | return static_cast<const U*>(type);
|
| | }
|
| |
|
| | return nullptr;
|
| | }
|
| |
|
| | }
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | using Base::freecad_cast;
|
| |
|
| | #endif
|
| |
|