From 5f222d6c0c5d5bf006c71e7ccef87003c5b457c3 Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Tue, 11 Aug 2026 22:17:16 +0300 Subject: [PATCH] Add PIP_HAS_RTTI --- libs/main/core/pibase_macros.h | 94 +++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 40 deletions(-) diff --git a/libs/main/core/pibase_macros.h b/libs/main/core/pibase_macros.h index 2e8a9d37..b648a9e4 100644 --- a/libs/main/core/pibase_macros.h +++ b/libs/main/core/pibase_macros.h @@ -218,7 +218,17 @@ extern char ** environ; # define assertm(exp, msg) assert(((void)msg, exp)) # endif -# if defined(__GXX_RTTI__) || defined(__RTTI__) +# ifndef __has_feature +# define __has_feature(x) 0 // Default to 0 if the compiler doesn't support it +# endif + +# if defined(__cpp_rtti) || defined(__GXX_RTTI) || defined(_CPPRTTI) || (__has_feature(cxx_rtti)) +# define PIP_HAS_RTTI 1 +# else +# define PIP_HAS_RTTI 0 +# endif + +# if PIP_HAS_RTTI # define __PIP_TYPENAME__(T) typeid(T).name() # else # define __PIP_TYPENAME__(T) "?" @@ -291,17 +301,17 @@ typedef long long ssize_t; //! \~english Macro to declare private section, "export" is optional //! \~russian Макрос для объявления частной секции, "export" необязателен //! \~sa PRIVATE PRIVATEWB -# define PRIVATE_DECLARATION(e) \ - struct __Private__; \ - friend struct __Private__; \ - struct e __PrivateInitializer__ { \ - __PrivateInitializer__(); \ - __PrivateInitializer__(const __PrivateInitializer__ & o); \ - ~__PrivateInitializer__(); \ - __PrivateInitializer__ & operator=(const __PrivateInitializer__ & o); \ - __Private__ * p = nullptr; \ - }; \ - __PrivateInitializer__ __privateinitializer__; +# define PRIVATE_DECLARATION(e) \ + struct __Private__; \ + friend struct __Private__; \ + struct e __PrivateInitializer__ { \ + __PrivateInitializer__(); \ + __PrivateInitializer__(const __PrivateInitializer__ & o); \ + ~__PrivateInitializer__(); \ + __PrivateInitializer__ & operator=(const __PrivateInitializer__ & o); \ + __Private__ * p = nullptr; \ + }; \ + __PrivateInitializer__ __privateinitializer__; //! \~english Macro to start definition of private section //! \~russian Макрос для начала реализации частной секции @@ -311,31 +321,35 @@ typedef long long ssize_t; //! \~russian Макрос для окончания реализации частной секции без инициализации //! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_START PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB # define PRIVATE_DEFINITION_END_NO_INITIALIZE(c) \ - } \ - ; + } \ + ; //! \~english Macro to initialize private section //! \~russian Макрос для инициализации частной секции //! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_START PRIVATE_DEFINITION_END_NO_INITIALIZE PRIVATE PRIVATEWB -# define PRIVATE_DEFINITION_INITIALIZE(c) \ - c::__PrivateInitializer__::__PrivateInitializer__() { p = new c::__Private__(); } \ - c::__PrivateInitializer__::__PrivateInitializer__(const c::__PrivateInitializer__ &) { /*if (p) delete p;*/ \ - p = new c::__Private__(); \ - } \ - c::__PrivateInitializer__::~__PrivateInitializer__() { piDeleteSafety(p); } \ - c::__PrivateInitializer__ & c::__PrivateInitializer__::operator=(const c::__PrivateInitializer__ &) { \ - piDeleteSafety(p); \ - p = new c::__Private__(); \ - return *this; \ - } +# define PRIVATE_DEFINITION_INITIALIZE(c) \ + c::__PrivateInitializer__::__PrivateInitializer__() { \ + p = new c::__Private__(); \ + } \ + c::__PrivateInitializer__::__PrivateInitializer__(const c::__PrivateInitializer__ &) { /*if (p) delete p;*/ \ + p = new c::__Private__(); \ + } \ + c::__PrivateInitializer__::~__PrivateInitializer__() { \ + piDeleteSafety(p); \ + } \ + c::__PrivateInitializer__ & c::__PrivateInitializer__::operator=(const c::__PrivateInitializer__ &) { \ + piDeleteSafety(p); \ + p = new c::__Private__(); \ + return *this; \ + } //! \~english Macro to end definition of private section with initialization //! \~russian Макрос для окончания реализации частной секции с инициализацией //! \~sa PRIVATE_DEFINITION_END_NO_INITIALIZE PRIVATE_DEFINITION_START PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB -# define PRIVATE_DEFINITION_END(c) \ - PRIVATE_DEFINITION_END_NO_INITIALIZE \ - (c) PRIVATE_DEFINITION_INITIALIZE(c) +# define PRIVATE_DEFINITION_END(c) \ + PRIVATE_DEFINITION_END_NO_INITIALIZE \ + (c) PRIVATE_DEFINITION_INITIALIZE(c) //! \~english Macro to access private section by pointer //! \~russian Макрос для доступа к частной секции @@ -351,9 +365,9 @@ typedef long long ssize_t; //! \~english Macro to remove class copy availability //! \~russian Макрос для запрета копирования класса -#define NO_COPY_CLASS(name) \ - name(const name &) = delete; \ - name & operator=(const name &) = delete; +#define NO_COPY_CLASS(name) \ + name(const name &) = delete; \ + name & operator=(const name &) = delete; //! \~english Counter macro for unique identifier generation //! \~russian Макрос счетчика для генерации уникальных идентификаторов @@ -366,19 +380,19 @@ typedef long long ssize_t; //! \~russian Макрос для начала статической инициализации //! \~sa STATIC_INITIALIZER_END #define STATIC_INITIALIZER_BEGIN \ - class { \ - class _Initializer_ { \ - public: \ - _Initializer_() { + class { \ + class _Initializer_ { \ + public: \ + _Initializer_() { //! \~english Macro to end static initializer //! \~russian Макрос для окончания статической инициализации //! \~sa STATIC_INITIALIZER_BEGIN #define STATIC_INITIALIZER_END \ - } \ - } \ - _initializer_; \ - } \ - _PIP_ADD_COUNTER(_pip_initializer_); + } \ + } \ + _initializer_; \ + } \ + _PIP_ADD_COUNTER(_pip_initializer_); //! \~english Macro used for infinite loop