Add PIP_HAS_RTTI

This commit is contained in:
2026-08-11 22:17:16 +03:00
parent 077ac9887b
commit 5f222d6c0c
+54 -40
View File
@@ -218,7 +218,17 @@ extern char ** environ;
# define assertm(exp, msg) assert(((void)msg, exp)) # define assertm(exp, msg) assert(((void)msg, exp))
# endif # 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() # define __PIP_TYPENAME__(T) typeid(T).name()
# else # else
# define __PIP_TYPENAME__(T) "?" # define __PIP_TYPENAME__(T) "?"
@@ -291,17 +301,17 @@ typedef long long ssize_t;
//! \~english Macro to declare private section, "export" is optional //! \~english Macro to declare private section, "export" is optional
//! \~russian Макрос для объявления частной секции, "export" необязателен //! \~russian Макрос для объявления частной секции, "export" необязателен
//! \~sa PRIVATE PRIVATEWB //! \~sa PRIVATE PRIVATEWB
# define PRIVATE_DECLARATION(e) \ # define PRIVATE_DECLARATION(e) \
struct __Private__; \ struct __Private__; \
friend struct __Private__; \ friend struct __Private__; \
struct e __PrivateInitializer__ { \ struct e __PrivateInitializer__ { \
__PrivateInitializer__(); \ __PrivateInitializer__(); \
__PrivateInitializer__(const __PrivateInitializer__ & o); \ __PrivateInitializer__(const __PrivateInitializer__ & o); \
~__PrivateInitializer__(); \ ~__PrivateInitializer__(); \
__PrivateInitializer__ & operator=(const __PrivateInitializer__ & o); \ __PrivateInitializer__ & operator=(const __PrivateInitializer__ & o); \
__Private__ * p = nullptr; \ __Private__ * p = nullptr; \
}; \ }; \
__PrivateInitializer__ __privateinitializer__; __PrivateInitializer__ __privateinitializer__;
//! \~english Macro to start definition of private section //! \~english Macro to start definition of private section
//! \~russian Макрос для начала реализации частной секции //! \~russian Макрос для начала реализации частной секции
@@ -311,31 +321,35 @@ typedef long long ssize_t;
//! \~russian Макрос для окончания реализации частной секции без инициализации //! \~russian Макрос для окончания реализации частной секции без инициализации
//! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_START PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB //! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_START PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB
# define PRIVATE_DEFINITION_END_NO_INITIALIZE(c) \ # define PRIVATE_DEFINITION_END_NO_INITIALIZE(c) \
} \ } \
; ;
//! \~english Macro to initialize private section //! \~english Macro to initialize private section
//! \~russian Макрос для инициализации частной секции //! \~russian Макрос для инициализации частной секции
//! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_START PRIVATE_DEFINITION_END_NO_INITIALIZE PRIVATE PRIVATEWB //! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_START PRIVATE_DEFINITION_END_NO_INITIALIZE PRIVATE PRIVATEWB
# define PRIVATE_DEFINITION_INITIALIZE(c) \ # define PRIVATE_DEFINITION_INITIALIZE(c) \
c::__PrivateInitializer__::__PrivateInitializer__() { p = new c::__Private__(); } \ c::__PrivateInitializer__::__PrivateInitializer__() { \
c::__PrivateInitializer__::__PrivateInitializer__(const c::__PrivateInitializer__ &) { /*if (p) delete p;*/ \ p = new c::__Private__(); \
p = new c::__Private__(); \ } \
} \ c::__PrivateInitializer__::__PrivateInitializer__(const c::__PrivateInitializer__ &) { /*if (p) delete p;*/ \
c::__PrivateInitializer__::~__PrivateInitializer__() { piDeleteSafety(p); } \ p = new c::__Private__(); \
c::__PrivateInitializer__ & c::__PrivateInitializer__::operator=(const c::__PrivateInitializer__ &) { \ } \
piDeleteSafety(p); \ c::__PrivateInitializer__::~__PrivateInitializer__() { \
p = new c::__Private__(); \ piDeleteSafety(p); \
return *this; \ } \
} 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 //! \~english Macro to end definition of private section with initialization
//! \~russian Макрос для окончания реализации частной секции с инициализацией //! \~russian Макрос для окончания реализации частной секции с инициализацией
//! \~sa PRIVATE_DEFINITION_END_NO_INITIALIZE PRIVATE_DEFINITION_START PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB //! \~sa PRIVATE_DEFINITION_END_NO_INITIALIZE PRIVATE_DEFINITION_START PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB
# define PRIVATE_DEFINITION_END(c) \ # define PRIVATE_DEFINITION_END(c) \
PRIVATE_DEFINITION_END_NO_INITIALIZE \ PRIVATE_DEFINITION_END_NO_INITIALIZE \
(c) PRIVATE_DEFINITION_INITIALIZE(c) (c) PRIVATE_DEFINITION_INITIALIZE(c)
//! \~english Macro to access private section by pointer //! \~english Macro to access private section by pointer
//! \~russian Макрос для доступа к частной секции //! \~russian Макрос для доступа к частной секции
@@ -351,9 +365,9 @@ typedef long long ssize_t;
//! \~english Macro to remove class copy availability //! \~english Macro to remove class copy availability
//! \~russian Макрос для запрета копирования класса //! \~russian Макрос для запрета копирования класса
#define NO_COPY_CLASS(name) \ #define NO_COPY_CLASS(name) \
name(const name &) = delete; \ name(const name &) = delete; \
name & operator=(const name &) = delete; name & operator=(const name &) = delete;
//! \~english Counter macro for unique identifier generation //! \~english Counter macro for unique identifier generation
//! \~russian Макрос счетчика для генерации уникальных идентификаторов //! \~russian Макрос счетчика для генерации уникальных идентификаторов
@@ -366,19 +380,19 @@ typedef long long ssize_t;
//! \~russian Макрос для начала статической инициализации //! \~russian Макрос для начала статической инициализации
//! \~sa STATIC_INITIALIZER_END //! \~sa STATIC_INITIALIZER_END
#define STATIC_INITIALIZER_BEGIN \ #define STATIC_INITIALIZER_BEGIN \
class { \ class { \
class _Initializer_ { \ class _Initializer_ { \
public: \ public: \
_Initializer_() { _Initializer_() {
//! \~english Macro to end static initializer //! \~english Macro to end static initializer
//! \~russian Макрос для окончания статической инициализации //! \~russian Макрос для окончания статической инициализации
//! \~sa STATIC_INITIALIZER_BEGIN //! \~sa STATIC_INITIALIZER_BEGIN
#define STATIC_INITIALIZER_END \ #define STATIC_INITIALIZER_END \
} \ } \
} \ } \
_initializer_; \ _initializer_; \
} \ } \
_PIP_ADD_COUNTER(_pip_initializer_); _PIP_ADD_COUNTER(_pip_initializer_);
//! \~english Macro used for infinite loop //! \~english Macro used for infinite loop