From 1a214cff4e135c00967ae6c788a093b7cec0edb6 Mon Sep 17 00:00:00 2001 From: peri4 Date: Sun, 18 Jun 2023 22:02:20 +0300 Subject: [PATCH] version 3.12.0 split pibase.h into 2 files add PIScopeExitCall --- CMakeLists.txt | 2 +- libs/main/core/pibase.h | 396 ++----------------------------- libs/main/core/pibase_macros.h | 419 +++++++++++++++++++++++++++++++++ main.cpp | 5 +- 4 files changed, 440 insertions(+), 382 deletions(-) create mode 100644 libs/main/core/pibase_macros.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 1ef96b74..baa62ee2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.0) cmake_policy(SET CMP0017 NEW) # need include() with .cmake project(PIP) set(PIP_MAJOR 3) -set(PIP_MINOR 11) +set(PIP_MINOR 12) set(PIP_REVISION 0) set(PIP_SUFFIX ) set(PIP_COMPANY SHS) diff --git a/libs/main/core/pibase.h b/libs/main/core/pibase.h index 4f073d6d..e2972ce9 100644 --- a/libs/main/core/pibase.h +++ b/libs/main/core/pibase.h @@ -34,181 +34,11 @@ #ifndef PIBASE_H #define PIBASE_H -#include "pip_defs.h" +#include "pibase_macros.h" #include "pip_export.h" -#include "pip_version.h" -#include "piplatform.h" #include -//! \~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 is defined when PIP can use "rt" library for \a PITimer::ThreadRT timers implementation -//! \~russian Макрос объявлен когда PIP может использовать библиотеку "rt" для \a PITimer::ThreadRT реализации таймера -# define PIP_TIMER_RT - -//! \~\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 CC_AVR_GCC # include #endif @@ -218,215 +48,6 @@ #include #include -#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; \ - }; \ - __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__() { \ - delete p; \ - p = 0; \ - } \ - c::__PrivateInitializer__ & c::__PrivateInitializer__::operator=(const c::__PrivateInitializer__ &) { \ - if (p) delete 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(); - - //! \~\brief //! \~english Global variable enabling output to piCout, default is true //! \~russian Глобальная переменная, включающая вывод в piCout, при старте true @@ -1021,4 +642,19 @@ inline bool piDeleteSafety(T *& pointer) { #define piLetobef piLetobe +class PIP_EXPORT PIScopeExitCall { +public: + explicit PIScopeExitCall(std::function f): func(f) {} + ~PIScopeExitCall() { + if (func) func(); + } + void cancel() { func = nullptr; } + +private: + NO_COPY_CLASS(PIScopeExitCall) + + std::function func; +}; + + #endif // PIBASE_H diff --git a/libs/main/core/pibase_macros.h b/libs/main/core/pibase_macros.h new file mode 100644 index 00000000..76f914e6 --- /dev/null +++ b/libs/main/core/pibase_macros.h @@ -0,0 +1,419 @@ +/*! \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 is defined when PIP can use "rt" library for \a PITimer::ThreadRT timers implementation +//! \~russian Макрос объявлен когда PIP может использовать библиотеку "rt" для \a PITimer::ThreadRT реализации таймера +# define PIP_TIMER_RT + +//! \~\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; \ + }; \ + __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__() { \ + delete p; \ + p = 0; \ + } \ + c::__PrivateInitializer__ & c::__PrivateInitializer__::operator=(const c::__PrivateInitializer__ &) { \ + if (p) delete 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 diff --git a/main.cpp b/main.cpp index 64a917d9..0b24c593 100644 --- a/main.cpp +++ b/main.cpp @@ -67,7 +67,10 @@ int main(int argc, char * argv[]) { // piCout << e.toString(); // piCout << PIVariantTypes::Enum::fromString(e.toString()).toString(); // piCout << PIVariantTypes::Enum::fromString("\"MyEnum\"(\"Null\":10105 \"Sec\":20 \"Fir\":100) 20").toString(); - + { + PIScopeExitCall ec([]() { piCout << "exit"; }); + ec.cancel(); + } piCout << PIVariantTypes::Enum::fromString("(\"DeformationWithTemperature2\":1\n;Sigma1:2\n;Tau:3)").toString(); return 0;