From 2411731d344e54a5d2e8d81c5752dfca9f9c4fb3 Mon Sep 17 00:00:00 2001 From: abv Date: Sun, 29 Nov 2015 16:33:05 +0300 Subject: [PATCH] Avoid recurrence in implicit instantiation of type descriptors --- src/Standard/Standard_Transient.cxx | 7 ++++++- src/Standard/Standard_Transient.hxx | 5 ++++- src/Standard/Standard_Type.hxx | 17 ++++++++++------- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/Standard/Standard_Transient.cxx b/src/Standard/Standard_Transient.cxx index e209c78452..561069fa88 100644 --- a/src/Standard/Standard_Transient.cxx +++ b/src/Standard/Standard_Transient.cxx @@ -23,11 +23,16 @@ void Standard_Transient::Delete() const delete this; } +const Handle(Standard_Type)& Standard_Transient::get_type_descriptor () +{ + return opencascade::type_instance::get(); +} + // // const Handle(Standard_Type)& Standard_Transient::DynamicType() const { - return opencascade::type_instance::get(); + return get_type_descriptor(); } // diff --git a/src/Standard/Standard_Transient.hxx b/src/Standard/Standard_Transient.hxx index 2cfd120f09..b6a20e7bef 100644 --- a/src/Standard/Standard_Transient.hxx +++ b/src/Standard/Standard_Transient.hxx @@ -58,7 +58,10 @@ public: static const char* get_type_name () { return "Standard_Transient"; } - //! Returns a type information object about this object. + //! Returns type descriptor of Standard_Transient class + Standard_EXPORT static const opencascade::handle& get_type_descriptor (); + + //! Returns a type descriptor about this object. Standard_EXPORT virtual const opencascade::handle& DynamicType() const; //! Returns a true value if this is an instance of Type. diff --git a/src/Standard/Standard_Type.hxx b/src/Standard/Standard_Type.hxx index 278ec96129..d33b97a9a3 100644 --- a/src/Standard/Standard_Type.hxx +++ b/src/Standard/Standard_Type.hxx @@ -23,33 +23,36 @@ #include //! Helper macro to get instance of a type descriptor for a class in a legacy way. -#define STANDARD_TYPE(theType) Standard_Type::Instance() +#define STANDARD_TYPE(theType) theType::get_type_descriptor() //! Helper macro to be included in definition of the classes inheriting -//! Standard_Transient to enable use of OCCT RTTI and smart pointers (handles). +//! Standard_Transient to enable use of OCCT RTTI. //! -//! Inline version, does not require IMPLEMENT_STANDARD_RTTIEXT but -//! leading to increase of size of binaries. +//! Inline version, does not require IMPLEMENT_STANDARD_RTTIEXT, but when used +//! for big hierarchies of classes may cause considerable increase of size of binaries. #define DEFINE_STANDARD_RTTI_INLINE(Class,Base) \ public: \ typedef Base base_type; \ static const char* get_type_name () { return #Class; } \ + static const Handle(Standard_Type)& get_type_descriptor () { return Standard_Type::Instance(); } \ virtual const Handle(Standard_Type)& DynamicType() const Standard_OVERRIDE \ { return STANDARD_TYPE(Class); } //! Helper macro to be included in definition of the classes inheriting -//! Standard_Transient to enable use of OCCT RTTI and smart pointers (handles). +//! Standard_Transient to enable use of OCCT RTTI. //! //! Out-of-line version, requires IMPLEMENT_STANDARD_RTTIEXT. #define DEFINE_STANDARD_RTTIEXT(Class,Base) \ public: \ typedef Base base_type; \ static const char* get_type_name () { return #Class; } \ + Standard_EXPORT static const Handle(Standard_Type)& get_type_descriptor (); \ Standard_EXPORT virtual const Handle(Standard_Type)& DynamicType() const Standard_OVERRIDE; -//! Defines implementation of DynamicType() function +//! Defines implementation of type descriptor and DynamicType() function #define IMPLEMENT_STANDARD_RTTIEXT(Class,Base) \ - const Handle(Standard_Type)& Class::DynamicType() const { return STANDARD_TYPE(Class); } + const Handle(Standard_Type)& Class::get_type_descriptor () { return Standard_Type::Instance(); } \ + const Handle(Standard_Type)& Class::DynamicType() const { return get_type_descriptor(); } // forward declaration of type_instance class namespace opencascade {