/*! \file pibase_macros.h * \ingroup Core * \~\brief * \~english Base macros * \~russian Базовые макросы * * \~\details * \~english * This file declares basic useful maros * \~russian * Этот файл объявляет основные вспомогательные макросы */ /* PIP - Platform Independent Primitives Base macros Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PIBASE_MACROS_H #define PIBASE_MACROS_H #include "pip_defs.h" #include "pip_version.h" #include "piplatform.h" //! \~english //! Meta-information section for any entity. //! Parsing by \a pip_cmg and can be accessed by \a PICodeInfo. //! Contains sequence of key=value pairs, e.g. //! \~russian //! Секция метаинформации для любой сущности. //! Парсится \a pip_cmg и доступна с помощью \a PICodeInfo. //! Содержит набор пар ключ=значение, например //! \~ //! PIMETA(id=12345,tag="my string") #define PIMETA(...) #ifdef DOXYGEN //! \~\brief //! \~english Major value of PIP version //! \~russian Мажорная версия PIP # define PIP_VERSION_MAJOR //! \~\brief //! \~english Minor value of PIP version //! \~russian Минорная версия PIP # define PIP_VERSION_MINOR //! \~\brief //! \~english Revision value of PIP version //! \~russian Ревизия версии PIP # define PIP_VERSION_REVISION //! \~\brief //! \~english Suffix of PIP version //! \~russian Суффикс версии PIP # define PIP_VERSION_SUFFIX //! \~\brief //! \~english Version of PIP in hex - 0x##(Major)##(Minor)##(Revision) //! \~russian Версия PIP в hex - 0x##(Major)##(Minor)##(Revision) # define PIP_VERSION //! \~\brief //! \~english Macro is defined when compile-time debug is enabled //! \~russian Макрос объявлен когда включена compile-time отладка # define PIP_DEBUG //! \~\brief //! \~english Macro is defined when operation system is any Windows //! \~russian Макрос объявлен когда операционная система Windows # define WINDOWS //! \~\brief //! \~english Macro is defined when operation system is QNX or Blackberry //! \~russian Макрос объявлен когда операционная система QNX или Blackberry # define QNX //! \~\brief //! \~english Macro is defined when operation system is Blackberry //! \~russian Макрос объявлен когда операционная система Blackberry # define BLACKBERRY //! \~\brief //! \~english Macro is defined when operation system is FreeBSD //! \~russian Макрос объявлен когда операционная система FreeBSD # define FREE_BSD //! \~\brief //! \~english Macro is defined when operation system is Mac OS //! \~russian Макрос объявлен когда операционная система Mac OS # define MAC_OS //! \~\brief //! \~english Macro is defined when operation system is Android //! \~russian Макрос объявлен когда операционная система Android # define ANDROID //! \~\brief //! \~english Macro is defined when operation system is any Linux //! \~russian Макрос объявлен когда операционная система Linux # define LINUX //! \~\brief //! \~english Macro is defined when operation system is FreeRTOS //! \~russian Макрос объявлен когда операционная система FreeRTOS # define FREERTOS //! \~\brief //! \~english Macro is defined when compiler is GCC or MinGW //! \~russian Макрос объявлен когда компилятор GCC или MinGW # define CC_GCC //! \~\brief //! \~english Macro is defined when PIP is decided that host is support language //! \~russian Макрос объявлен когда PIP решил что система поддерживает локализацию # define HAS_LOCALE //! \~\brief //! \~english Macro is defined when PIP is building for embedded systems //! \~russian Макрос объявлен когда PIP собирается для встраиваемых систем # define MICRO_PIP //! \~\brief //! \~english Macro is defined when compiler is Visual Studio //! \~russian Макрос объявлен когда компилятор Visual Studio # define CC_VC //! \~\brief //! \~english Macro is defined when compiler is AVR GCC //! \~russian Макрос объявлен когда компилятор AVR GCC # define CC_AVR_GCC //! \~\brief //! \~english Macro is defined when compiler is unknown //! \~russian Макрос объявлен когда компилятор неизвестен # define CC_OTHER //! \~\brief //! \~english Macro to declare private section, "export" is optional //! \~russian Макрос для объявления частной секции, "export" необязателен # define PRIVATE_DECLARATION(export) //! \~\brief //! \~english Macro to start definition of private section //! \~russian Макрос для начала реализации частной секции # define PRIVATE_DEFINITION_START(Class) //! \~\brief //! \~english Macro to end definition of private section //! \~russian Макрос для окончания реализации частной секции # define PRIVATE_DEFINITION_END(Class) //! \~\brief //! \~english Macro to access private section by pointer //! \~russian Макрос для доступа к частной секции # define PRIVATE //! \~\brief //! \~english Macro to access private section by pointer without brakes () //! \~russian Макрос для доступа к частной секции без обрамляющих скобок () # define PRIVATEWB //! \~\brief //! \~english Macro to start static initializer //! \~russian Макрос для начала статической инициализации # define STATIC_INITIALIZER_BEGIN //! \~\brief //! \~english Macro to end static initializer //! \~russian Макрос для окончания статической инициализации # define STATIC_INITIALIZER_END //! \~\brief //! \~english Macro to remove class copy availability //! \~russian Макрос для запрета копирования класса # define NO_COPY_CLASS(Class) //! \~\brief //! \~english Macro to supress compiler warning about unused variable //! \~russian Макрос для подавления предупреждения компилятора о неиспользуемой переменной # define NO_UNUSED(x) # undef MICRO_PIP # undef FREERTOS #endif // DOXYGEN #ifdef WINDOWS # ifdef CC_VC # define SHUT_RDWR 2 # pragma comment(lib, "Ws2_32.lib") # pragma comment(lib, "Iphlpapi.lib") # pragma comment(lib, "Psapi.lib") # ifdef ARCH_BITS_32 # define _X86_ # else # define _IA64_ # endif # else # define SHUT_RDWR SD_BOTH # endif typedef int socklen_t; extern long long __pi_perf_freq; #endif #ifndef DOXYGEN # ifdef ANDROID // # define tcdrain(fd) ioctl(fd, TCSBRK, 1) // inline int wctomb(char * c, wchar_t w) {*c = ((char * )&w)[0]; return 1;} // inline int mbtowc(wchar_t * w, const char * c, size_t) {*w = ((wchar_t * )&c)[0]; return 1;} # endif # ifdef MAC_OS # define environ (*_NSGetEnviron()) typedef long time_t; # endif # ifdef LINUX # define environ __environ # endif # ifdef FREE_BSD extern char ** environ; # endif # ifndef NO_UNUSED # define NO_UNUSED(x) (void)x # endif # ifndef assert # define assert(x) # define assertm(exp, msg) # else # define assertm(exp, msg) assert(((void)msg, exp)) # endif # ifdef MICRO_PIP # define __PIP_TYPENAME__(T) "?" # else # define __PIP_TYPENAME__(T) typeid(T).name() # endif # ifdef CC_GCC # undef DEPRECATED # undef DEPRECATEDM # define DEPRECATED __attribute__((deprecated)) # define DEPRECATEDM(msg) __attribute__((deprecated(msg))) # if CC_GCC_VERSION > 0x025F // > 2.95 # pragma GCC diagnostic warning "-Wdeprecated-declarations" # ifdef LINUX # define HAS_LOCALE # endif # ifdef MAC_OS # pragma GCC diagnostic ignored "-Wundefined-bool-conversion" # pragma GCC diagnostic ignored "-Wc++11-extensions" # endif # endif # ifdef ANDROID # pragma GCC diagnostic ignored "-Wunused-parameter" # pragma GCC diagnostic ignored "-Wextra" # pragma GCC diagnostic ignored "-Wc++11-extensions" # pragma GCC diagnostic ignored "-Wundefined-bool-conversion" // # pragma GCC diagnostic ignored "-Wliteral-suffix" # endif # endif # ifdef CC_VC # undef DEPRECATED # undef DEPRECATEDM # define DEPRECATED __declspec(deprecated) # define DEPRECATEDM(msg) __declspec(deprecated(msg)) # pragma warning(disable: 4018) # pragma warning(disable: 4061) # pragma warning(disable: 4100) # pragma warning(disable: 4239) # pragma warning(disable: 4242) # pragma warning(disable: 4244) # pragma warning(disable: 4251) # pragma warning(disable: 4365) # pragma warning(disable: 4512) # pragma warning(disable: 4668) # pragma warning(disable: 4710) # pragma warning(disable: 4800) # pragma warning(disable: 4820) # pragma warning(disable: 4986) # pragma warning(disable: 4996) # ifdef ARCH_BITS_32 typedef long ssize_t; # else typedef long long ssize_t; # endif # endif # ifdef CC_OTHER # undef DEPRECATED # undef DEPRECATEDM # define DEPRECATED # define DEPRECATEDM(msg) # endif #endif // DOXYGEN // Private data macros #ifndef DOXYGEN # 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_DEFINITION_START(c) struct c::__Private__ { # define PRIVATE_DEFINITION_END(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 (__privateinitializer__.p) # define PRIVATEWB __privateinitializer__.p #endif // DOXYGEN #define NO_COPY_CLASS(name) \ name(const name &) = delete; \ name & operator=(const name &) = delete; #define _PIP_ADD_COUNTER_WS(a, cnt, line) a##cnt##_##line #define _PIP_ADD_COUNTER_WF(a, cnt, line) _PIP_ADD_COUNTER_WS(a, cnt, line) #define _PIP_ADD_COUNTER(a) _PIP_ADD_COUNTER_WF(a, __COUNTER__, __LINE__) #define STATIC_INITIALIZER_BEGIN \ class { \ class _Initializer_ { \ public: \ _Initializer_() { #define STATIC_INITIALIZER_END \ } \ } \ _initializer_; \ } \ _PIP_ADD_COUNTER(_pip_initializer_); //! \~\brief //! \~english Minimal sleep in milliseconds for internal PIP using //! \~russian Минимальное значание задержки в милисекундах для внутреннего использования в библиотеке PIP //! \~\details //! \~english Using in \a piMinSleep(), \a PIThread, \a PITimer::Pool. By default 1ms. //! \~russian Используется в \a piMinSleep(), \a PIThread, \a PITimer::Pool. По умолчанию равна 1мс. #ifndef PIP_MIN_MSLEEP # ifndef MICRO_PIP # define PIP_MIN_MSLEEP 1. # else # define PIP_MIN_MSLEEP 10. # endif #endif //! \~\brief //! \~english Macro used for infinite loop //! \~russian Макрос для бесконечного цикла #define FOREVER for (;;) //! \~\brief //! \~english Macro used for infinite wait //! \~russian Макрос для бесконечного ожидания #define FOREVER_WAIT FOREVER piMinSleep(); //! \~\brief //! \~english Macro used for infinite wait //! \~russian Макрос для бесконечного ожидания #define WAIT_FOREVER FOREVER piMinSleep(); #endif // PIBASE_MACROS_H