Add PIP_HAS_RTTI
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user