Doxygen generated by local qwen3-coder-next, part 2

This commit is contained in:
2026-03-03 21:37:36 +03:00
parent 6ed7befa47
commit f536c55fcb
70 changed files with 3981 additions and 1478 deletions

View File

@@ -1,9 +1,13 @@
/*! \file picli.h
* \ingroup Application
* \~\brief
* \~english Command-Line parser
* \~russian Парсер командной строки
*/
//! \file picli.h
//! \ingroup Application
//! \brief
//! \~english Command-line argument parser
//! \~russian Парсер аргументов командной строки
//! \details
//! \~english The PICLI class provides convenient parsing of command-line arguments. It supports short keys (e.g., -c), full keys (e.g.,
//! --console), and arguments with/without values.
//! \~russian Класс PICLI предоставляет удобный разбор аргументов командной строки. Поддерживаются короткие ключи (например, -c), полные
//! ключи (например, --console) и аргументы с значениями/без значений.
/*
PIP - Platform Independent Primitives
Command-Line Parser
@@ -29,80 +33,78 @@
#include "piset.h"
#include "pistringlist.h"
//! \ingroup Application
//! \~\brief
//! \~english Command-Line parser.
//! \~russian Парсер командной строки.
//! \~english Command-line argument parser class
//! \~russian Класс парсера аргументов командной строки
class PIP_EXPORT PICLI {
public:
//! \~english Constructs %PICLI from "argc" and "argv" from "int main()" method.
//! \~russian Создает %PICLI из "argc" и "argv" из метода "int main()".
//! \~english Constructs %PICLI from "argc" and "argv" parameters of the main() function
//! \~russian Создает %PICLI из параметров "argc" и "argv" функции main()
PICLI(int argc, char * argv[]);
//! \~english Add argument with name "name", short key = name first letter and full key = name.
//! \~russian Добавляет аргумент с именем "name", коротким ключом = первой букве имени и полным ключом = имени.
//! \~english Adds an argument with the specified name, short key (first letter of name) and full key (name)
//! \~russian Добавляет аргумент с указанным именем, коротким ключом (первая буква имени) и полным ключом (имя)
void addArgument(const PIString & name, bool value = false);
//! \~english Add argument with name "name", short key = "shortKey" and full key = name.
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = имени.
//! \~english Adds an argument with the specified name, short key and full key (equal to name)
//! \~russian Добавляет аргумент с указанным именем, коротким ключом и полным ключом (равным имени)
void addArgument(const PIString & name, const PIChar & shortKey, bool value = false);
//! \~english Add argument with name "name", short key = "shortKey" and full key = name.
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = имени.
//! \~english Adds an argument with the specified name, short key and full key (equal to name)
//! \~russian Добавляет аргумент с указанным именем, коротким ключом и полным ключом (равным имени)
void addArgument(const PIString & name, const char * shortKey, bool value = false);
//! \~english Add argument with name "name", short key = "shortKey" and full key = "fullKey".
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = "fullKey".
//! \~english Adds an argument with the specified name, short key and full key
//! \~russian Добавляет аргумент с указанным именем, коротким ключом и полным ключом
void addArgument(const PIString & name, const PIChar & shortKey, const PIString & fullKey, bool value = false);
//! \~english Add argument with name "name", short key = "shortKey" and full key = "fullKey".
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = "fullKey".
//! \~english Adds an argument with the specified name, short key and full key
//! \~russian Добавляет аргумент с указанным именем, коротким ключом и полным ключом
void addArgument(const PIString & name, const char * shortKey, const PIString & fullKey, bool value = false);
//! \~english Returns unparsed command-line argument by index "index". Index 0 is program execute command.
//! \~russian Возвращает исходный аргумент командной строки по индексу "index". Индекс 0 это команда вызова программы.
//! \~english Returns the unparsed command-line argument at the specified index (index 0 is the program execution command)
//! \~russian Возвращает неразобранный аргумент командной строки по указанному индексу (индекс 0 - команда выполнения программы)
PIString rawArgument(int index);
//! \~english Returns mandatory command-line argument by index "index".
//! \~russian Возвращает обязательный аргумент командной строки по индексу "index".
//! \~english Returns the mandatory command-line argument at the specified index
//! \~russian Возвращает обязательный аргумент командной строки по указанному индексу
PIString mandatoryArgument(int index);
//! \~english Returns optional command-line argument by index "index".
//! \~russian Возвращает опциональный аргумент командной строки по индексу "index".
//! \~english Returns the optional command-line argument at the specified index
//! \~russian Возвращает опциональный аргумент командной строки по указанному индексу
PIString optionalArgument(int index);
//! \~english Returns unparsed command-line arguments.
//! \~russian Возвращает исходные аргументы командной строки.
//! \~english Returns all unparsed command-line arguments
//! \~russian Возвращает все неразобранные аргументы командной строки
const PIStringList & rawArguments();
//! \~english Returns mandatory command-line arguments.
//! \~russian Возвращает обязательные аргументы командной строки.
//! \~english Returns all mandatory command-line arguments
//! \~russian Возвращает все обязательные аргументы командной строки
const PIStringList & mandatoryArguments();
//! \~english Returns optional command-line arguments.
//! \~russian Возвращает опциональные аргументы командной строки.
//! \~english Returns all optional command-line arguments
//! \~russian Возвращает все опциональные аргументы командной строки
const PIStringList & optionalArguments();
//! \~english Returns program execute command without arguments.
//! \~russian Возвращает команду вызова программы без аргументов.
//! \~english Returns the program execution command without arguments
//! \~russian Возвращает команду выполнения программы без аргументов
PIString programCommand();
//! \~english Returns if argument "name" found.
//! \~russian Возвращает найден ли аргумент "name".
//! \~english Checks if the argument with the specified name was found in command-line
//! \~russian Проверяет, был ли найден аргумент с указанным именем в командной строке
bool hasArgument(const PIString & name);
//! \~english Returns argument "name" value, or empty string if this is no value.
//! \~russian Возвращает значение аргумента "name" или пустую строку, если значения нет.
//! \~english Returns the value of the argument with the specified name, or empty string if no value
//! \~russian Возвращает значение аргумента с указанным именем или пустую строку, если значение отсутствует
PIString argumentValue(const PIString & name);
//! \~english Returns short key of argument "name", or empty string if this is no argument.
//! \~russian Возвращает короткий ключ аргумента "name" или пустую строку, если аргумента нет.
//! \~english Returns the short key of the argument with the specified name, or empty string if argument not found
//! \~russian Возвращает короткий ключ аргумента с указанным именем или пустую строку, если аргумент не найден
PIString argumentShortKey(const PIString & name);
//! \~english Returns full key of argument "name", or empty string if this is no argument.
//! \~russian Возвращает полный ключ аргумента "name" или пустую строку, если аргумента нет.
//! \~english Returns the full key of the argument with the specified name, or empty string if argument not found
//! \~russian Возвращает полный ключ аргумента с указанным именем или пустую строку, если аргумент не найден
PIString argumentFullKey(const PIString & name);
//! \~english Returns short key prefix.
@@ -137,36 +139,58 @@ public:
//! \~russian Устанавливает количество опциональных аргументов.
void setOptionalArgumentsCount(const int count);
//! \~english Returns debug mode state.
//! \~russian Возвращает состояние режима отладки.
//! \~english Returns the debug mode state
//! \~russian Возвращает состояние режима отладки
bool debug() const { return debug_; }
//! \~english Sets debug mode state.
//! \~russian Устанавливает состояние режима отладки.
//! \~english Sets the debug mode state
//! \~russian Устанавливает состояние режима отладки
void setDebug(bool debug) { debug_ = debug; }
//! \~english Returns class name.
//! \~russian Возвращает имя класса.
//! \~english Returns the class name
//! \~russian Возвращает имя класса
PIConstChars className() const { return "PICLI"; }
//! \~english Returns object name.
//! \~russian Возвращает имя объекта.
//! \~english Returns the object name
//! \~russian Возвращает имя объекта
PIString name() const { return PIStringAscii("CLI"); }
private:
//! \~english Represents a single command-line argument with its properties
//! \~russian Представляет один аргумент командной строки со всеми его свойствами
struct Argument {
Argument() {}
Argument(const PIString & n, const PIChar & s, const PIString & f, bool v) {
name = n;
short_key = s;
full_key = f;
has_value = v;
}
//! \~english Argument name
//! \~russian Имя аргумента
PIString name;
//! \~english Short key character
//! \~russian Символ короткого ключа
PIChar short_key;
//! \~english Full key string
//! \~russian Строка полного ключа
PIString full_key;
//! \~english Argument value
//! \~russian Значение аргумента
PIString value;
bool has_value = false, found = false;
//! \~english Flag indicating if the argument has a value
//! \~russian Флаг, указывающий, имеет ли аргумент значение
bool has_value = false;
//! \~english Flag indicating if the argument was found in command-line
//! \~russian Флаг, указывающий, был ли аргумент найден в командной строке
bool found = false;
//! \~english Argument constructor
//! \~russian Конструктор аргумента
Argument(const PIString & name, const PIChar & shortKey, const PIString & fullKey, bool hasValue) {
this->name = name;
this->short_key = shortKey;
this->full_key = fullKey;
this->has_value = hasValue;
}
};
void parse();

View File

@@ -1,9 +1,11 @@
/*! \file pilog.h
* \ingroup Application
* \~\brief
* \~english High-level log
* \~russian Высокоуровневый лог
*/
//! \file pilog.h
//! \ingroup Application
//! \brief
//! \~english High-level log
//! \~russian Высокоуровневый лог
//! \details
//! \~english Provides log with optional file and console output, with configurable timestamp format and line format.
//! \~russian Предоставляет лог с опциональным выводом в файл и консоль, с настраиваемым форматом метки времени и форматом строки.
/*
PIP - Platform Independent Primitives
High-level log
@@ -30,10 +32,8 @@
#include "piiostream.h"
#include "pithread.h"
//! \ingroup Application
//! \~\brief
//! \~english High-level log
//! \~russian Высокоуровневый лог
//! \~english High-level log class providing log with optional file and console output
//! \~russian Класс высокоуровневого лога с опциональным выводом в файл и консоль
class PIP_EXPORT PILog: public PIThread {
PIOBJECT_SUBCLASS(PILog, PIThread)

View File

@@ -1,9 +1,16 @@
/*! \file pisingleapplication.h
* \ingroup Application
* \~\brief
* \~english Single-instance application control
* \~russian Контроль одного экземпляра приложения
*/
//! \file pisingleapplication.h
//! \ingroup Application
//! \brief
//! \~english Single-instance application control
//! \~russian Контроль одного экземпляра приложения
//! \details
//! \~english The PISingleApplication class provides single-instance application control. It allows detecting if the current application
//! instance is the first one launched and enables inter-process communication between multiple instances. Multiple instances with the same
//! "app_name" can detect each other and communicate. The first instance becomes the server, receiving messages from subsequent instances.
//! \~russian Класс PISingleApplication предоставляет контроль одного экземпляра приложения. Он позволяет определить, является ли текущий
//! экземпляр первым запущенным, и обеспечивает межпроцессное взаимодействие между несколькими экземплярами. Несколько экземпляров с
//! одинаковым "app_name" могут обнаруживать друг друга и обмениваться сообщениями. Первый экземпляр становится сервером, принимающим
//! сообщения от последующих экземпляров.
/*
PIP - Platform Independent Primitives
Single application
@@ -30,10 +37,9 @@
class PISharedMemory;
//! \ingroup Application
//! \~\brief
//! \~english Single-instance application control.
//! \~russian Контроль одного экземпляра приложения.
//! \~english Single-instance application control class that tracks repeated application launches and enables inter-process communication
//! \~russian Класс контроля одного экземпляра приложения, отслеживающий повторный запуск приложения и обеспечивающий межпроцессное
//! взаимодействие
class PIP_EXPORT PISingleApplication: public PIThread {
PIOBJECT_SUBCLASS(PISingleApplication, PIThread);
@@ -51,16 +57,14 @@ public:
//! \~russian Возвращает первым ли был запущен этот экземпляр приложения
bool isFirst() const;
EVENT_HANDLER1(void, sendMessage, const PIByteArray &, m);
EVENT1(messageReceived, PIByteArray, m);
//! \handlers
//! \{
//! \fn void sendMessage(const PIByteArray & m)
//! \brief
//! \~english Send message "m" to first launched application
//! \~russian Посылает сообщение "m" первому запущеному приложению
//! \~english Sends message "m" to the first launched application instance
//! \~russian Посылает сообщение "m" первому запущенному экземпляру приложения
EVENT_HANDLER1(void, sendMessage, const PIByteArray &, m);
//! \}
//! \events
@@ -68,20 +72,43 @@ public:
//! \fn void messageReceived(PIByteArray m)
//! \brief
//! \~english Raise on first launched application receive message from another
//! \~russian Вызывается первым запущеным приложением по приему сообщения от других
//! \~english Emitted by the first launched application when receiving a message from another instance
//! \~russian Вызывается первым запущенным приложением при получении сообщения от другого экземпляра
EVENT1(messageReceived, PIByteArray, m);
//! \}
private:
//! \~english Initializes the single application detection mechanism
//! \~russian Инициализирует механизм обнаружения одного экземпляра приложения
void begin() override;
//! \~english Runs the single application monitoring loop
//! \~russian Запускает цикл мониторинга одного экземпляра приложения
void run() override;
//! \~english Waits until the first application instance is determined
//! \~russian Ожидает определения первого экземпляра приложения
void waitFirst() const;
//! \~english Shared memory object for inter-process communication
//! \~russian Объект разделяемой памяти для межпроцессного взаимодействия
PISharedMemory * shm;
//! \~english Timer for measuring time intervals
//! \~russian Таймер для измерения временных интервалов
PITimeMeasurer ftm;
//! \~english Buffer for reading messages from shared memory
//! \~russian Буфер для чтения сообщений из разделяемой памяти
PIByteArray readed;
//! \~english Flag indicating if this is the first application instance
//! \~russian Флаг, указывающий, является ли этот экземпляр первым
bool first, started;
//! \~english Sequence counter for message ordering
//! \~russian Счетчик последовательности для упорядочения сообщений
int sacnt;
};

View File

@@ -1,9 +1,13 @@
/*! \file pisystemmonitor.h
* \ingroup Application
* \~\brief
* \~english System resources monitoring
* \~russian Мониторинг ресурсов системы
*/
//! \file pisystemmonitor.h
//! \ingroup Application
//! \brief
//! \~english System resources monitoring
//! \~russian Мониторинг ресурсов системы
//! \details
//! \~english This module provides process and system resource monitoring capabilities including CPU usage, memory consumption, and thread
//! statistics. It supports cross-platform monitoring on Linux, Windows, macOS, and ESP platforms.
//! \~russian Этот модуль предоставляет возможности мониторинга ресурсов процессов и системы, включая использование CPU, потребление памяти
//! и статистику потоков. Поддерживается кроссплатформенный мониторинг на Linux, Windows, macOS и ESP платформах.
/*
PIP - Platform Independent Primitives
Process resource monitor
@@ -95,16 +99,16 @@ public:
//! \~russian Память данных в байтах
ullong data_memsize = 0;
//! \~english
//! \~russian
//! \~english Total RAM in bytes
//! \~russian Общий объем ОЗУ в байтах
ullong ram_total = 0;
//! \~english
//! \~russian
//! \~english Free RAM in bytes
//! \~russian Свободный объем ОЗУ в байтах
ullong ram_free = 0;
//! \~english
//! \~russian
//! \~english Used RAM in bytes
//! \~russian Используемый объем ОЗУ в байтах
ullong ram_used = 0;
//! \~english CPU load in kernel space
@@ -208,46 +212,76 @@ public:
//! \~english Starts monitoring of application process with update interval "interval_ms" milliseconds
//! \~russian Начинает мониторинг процесса приложения с интервалом обновления "interval_ms" миллисекунд
//! \~details
//! \~english Monitors the current application process.
//! \~russian Мониторит текущий процесс приложения.
bool startOnSelf(PISystemTime interval = PISystemTime::fromSeconds(1.));
//! \~english Stop monitoring
//! \~english Stops monitoring
//! \~russian Останавливает мониторинг
void stop();
//! \~english Returns monitoring process PID
//! \~russian Возвращает PID наблюдаемого процесса
//! \~details
//! \~english Returns the process identifier being monitored.
//! \~russian Возвращает идентификатор процесса, который наблюдается.
int pID() const { return pID_; }
//! \~english Returns monitoring process statistics
//! \~russian Возвращает статистику наблюдаемого процесса
//! \~details
//! \~english Returns process statistics including CPU usage, memory consumption, and thread count.
//! \~russian Возвращает статистику процесса, включая использование CPU, потребление памяти и количество потоков.
ProcessStats statistic() const;
//! \~english Returns monitoring process threads statistics
//! \~russian Возвращает статистику потоков наблюдаемого процесса
//! \~details
//! \~english Returns statistics for all threads in the monitored process.
//! \~russian Возвращает статистику всех потоков в наблюдаемом процессе.
PIVector<ThreadStats> threadsStatistic() const;
//! \~english Sets process statistics.
//! \~russian Устанавливает статистику процесса.
//! \~details
//! \~english Sets the process statistics manually.
//! \~russian Вручную устанавливает статистику процесса.
void setStatistic(const ProcessStats & s);
//! \~english Returns total RAM in bytes.
//! \~russian Возвращает общий объем ОЗУ в байтах.
//! \~english Returns total RAM in bytes
//! \~russian Возвращает общий объем ОЗУ в байтах
//! \~details
//! \~english Returns the total amount of physical memory in bytes.
//! \~russian Возвращает общий объем физической памяти в байтах.
static ullong totalRAM();
//! \~english Returns free RAM in bytes.
//! \~russian Возвращает свободный объем ОЗУ в байтах.
//! \~english Returns free RAM in bytes
//! \~russian Возвращает свободный объем ОЗУ в байтах
//! \~details
//! \~english Returns the amount of free physical memory in bytes.
//! \~russian Возвращает объем свободной физической памяти в байтах.
static ullong freeRAM();
//! \~english Returns used RAM in bytes.
//! \~russian Возвращает используемый объем ОЗУ в байтах.
//! \~english Returns used RAM in bytes
//! \~russian Возвращает используемый объем ОЗУ в байтах
//! \~details
//! \~english Returns the amount of used physical memory in bytes.
//! \~russian Возвращает объем используемой физической памяти в байтах.
static ullong usedRAM();
//! \~english Event raised when new measurements are available.
//! \~russian Событие вызывается когда доступны новые измерения.
//! \~\events
//! \~\{
//! \~\fn void measured()
//! \~english Event raised when new measurements are available
//! \~russian Событие вызывается когда доступны новые измерения
EVENT(measured);
//! \~\}
private:
void run() override;
void gatherThread(llong id);
@@ -293,16 +327,16 @@ inline PICout operator<<(PICout s, const PISystemMonitor::ThreadStats & v) {
//! \relatesalso PIBinaryStream
//! \~english Store operator.
//! \~russian Оператор сохранения.
//! \~english Store operator
//! \~russian Оператор сохранения
BINARY_STREAM_WRITE(PISystemMonitor::ProcessStats) {
s << PIMemoryBlock(&v, sizeof(PISystemMonitor::ProcessStatsFixed)) << v.exec_name << v.state;
return s;
}
//! \relatesalso PIBinaryStream
//! \~english Restore operator.
//! \~russian Оператор извлечения.
//! \~english Restore operator
//! \~russian Оператор извлечения
BINARY_STREAM_READ(PISystemMonitor::ProcessStats) {
s >> PIMemoryBlock(&v, sizeof(PISystemMonitor::ProcessStatsFixed)) >> v.exec_name >> v.state;
v.makeStrings();
@@ -310,16 +344,16 @@ BINARY_STREAM_READ(PISystemMonitor::ProcessStats) {
}
//! \relatesalso PIBinaryStream
//! \~english Store operator.
//! \~russian Оператор сохранения.
//! \~english Store operator
//! \~russian Оператор сохранения
BINARY_STREAM_WRITE(PISystemMonitor::ThreadStats) {
s << PIMemoryBlock(&v, sizeof(PISystemMonitor::ThreadStatsFixed)) << v.name;
return s;
}
//! \relatesalso PIBinaryStream
//! \~english Restore operator.
//! \~russian Оператор извлечения.
//! \~english Restore operator
//! \~russian Оператор извлечения
BINARY_STREAM_READ(PISystemMonitor::ThreadStats) {
s >> PIMemoryBlock(&v, sizeof(PISystemMonitor::ThreadStatsFixed)) >> v.name;
return s;

View File

@@ -1,9 +1,11 @@
/*! \file pitranslator.h
* \ingroup Application
* \~\brief
* \~english Translation support
* \~russian Поддержка перевода
*/
//! \file pitranslator.h
//! \ingroup Application
//! \brief
//! \~english Translation support
//! \~russian Поддержка перевода
//! \details
//! \~english Provides translation support with context-aware string wrappers and multiple loading methods.
//! \~russian Предоставляет поддержку перевода с контекстно-зависимыми обертками строк и методами загрузки.
/*
PIP - Platform Independent Primitives
Translation support
@@ -32,26 +34,24 @@
#define piTr PITranslator::tr
#define piTrNoOp PITranslator::trNoOp
//! \ingroup Application
//! \~\brief
//! \~english Translation support
//! \~russian Поддержка перевода
//! \~english Translator class providing translation functionality with context support.
//! \~russian Класс переводчика, обеспечивающий функциональность перевода с поддержкой контекста.
class PIP_EXPORT PITranslator {
public:
//! \~english Translates string "in" with optional context.
//! \~russian Переводит строку "in" с опциональным контекстом.
static PIString tr(const PIString & in, const PIString & context = {});
//! \~english Translates string "in" with optional context.
//! \~russian Переводит строку "in" с опциональным контекстом.
//! \~english Overload of tr() for string literals.
//! \~russian Перегрузка tr() для строковых литералов.
static PIString tr(const char * in, const PIString & context = {}) { return tr(PIString::fromUTF8(in), context); }
//! \~english Returns original string without translation.
//! \~russian Возвращает оригинальную строку без перевода.
static PIString trNoOp(const PIString & in, const PIString & context = {}) { return in; }
//! \~english Returns original string without translation.
//! \~russian Возвращает оригинальную строку без перевода.
//! \~english Overload of trNoOp() for string literals.
//! \~russian Перегрузка trNoOp() для строковых литералов.
static PIString trNoOp(const char * in, const PIString & context = {}) { return trNoOp(PIString::fromUTF8(in), context); }
//! \~english Clears all loaded translations.
@@ -84,12 +84,12 @@ private:
};
//! \~english Context-aware string wrapper for translation.
//! \~russian Контекстно-зависимая обертка строки для перевода.
//! \~english Context-aware string wrapper that automatically translates strings using PITranslator::tr().
//! \~russian Контекстно-зависимая обертка строки, автоматически переводящая строки с помощью PITranslator::tr().
class PIStringContextTr {
public:
//! \~english Constructs wrapper from string.
//! \~russian Создает обертку из строки.
//! \~english Constructs wrapper from string (rvalue reference).
//! \~russian Создает обертку из строки (rvalue reference).
PIStringContextTr(PIString && s): _s(s) {}
//! \~english Returns translated string.
@@ -105,12 +105,12 @@ private:
};
//! \~english Context-aware string wrapper without translation (no-op).
//! \~russian Контекстно-зависимая обертка строки без перевода (заглушка).
//! \~english Context-aware string wrapper that preserves original strings without translation (no-op).
//! \~russian Контекстно-зависимая обертка строки, сохраняющая оригинальные строки без перевода (заглушка).
class PIStringContextTrNoOp {
public:
//! \~english Constructs wrapper from string.
//! \~russian Создает обертку из строки.
//! \~english Constructs wrapper from string (rvalue reference).
//! \~russian Создает обертку из строки (rvalue reference).
PIStringContextTrNoOp(PIString && s): _s(s) {}
//! \~english Returns original string.
@@ -126,16 +126,14 @@ private:
};
//! \~\brief
//! \~english Translate string with \a PITranslator::tr()
//! \~russian Перевести строку с помощью \a PITranslator::tr()
//! \~english User-defined literal for translating string literals: "hello"_tr.
//! \~russian Пользовательский литерал для перевода строковых литералов: "hello"_tr.
inline PIStringContextTr operator""_tr(const char * v, size_t sz) {
return PIStringContextTr(PIString::fromUTF8(v, sz));
}
//! \~\brief
//! \~english Translate string with \a PITranslator::tr()
//! \~russian Перевести строку с помощью \a PITranslator::tr()
//! \~english User-defined literal for non-translating string literals: "hello"_trNoOp.
//! \~russian Пользовательский литерал для непереводимых строковых литералов: "hello"_trNoOp.
inline PIStringContextTrNoOp operator""_trNoOp(const char * v, size_t sz) {
return PIStringContextTrNoOp(PIString::fromUTF8(v, sz));
}

View File

@@ -50,8 +50,8 @@ public:
ServerClient() {}
protected:
//! ~english Called before client destruction
//! ~russian Вызывается перед уничтожением клиента
//! \~english Called before client destruction
//! \~russian Вызывается перед уничтожением клиента
virtual void aboutDelete() {}
private:
@@ -77,8 +77,8 @@ public:
//! \~russian Уничтожает экземпляр Client
~Client();
//! ~english Connects to specified server address
//! ~russian Подключается к указанному адресу сервера
//! \~english Connects to specified server address
//! \~russian Подключается к указанному адресу сервера
void connect(PINetworkAddress addr);
protected:

View File

@@ -37,8 +37,6 @@ namespace PIClientServer {
class Server;
class ClientInterface {};
//! \brief
//! \~english Base class for client and server-side client
//! \~russian Базовый класс для клиента и клиента на стороне сервера

View File

@@ -6,6 +6,9 @@
//! \details
//! \~english TCP server implementation for client-server communication.
//! \~russian Реализация TCP сервера для клиент-серверного взаимодействия.
//! \~\note Thread-safe implementation with mutex protection for client management.
//! \~russian Потокобезопасная реализация с защитой мьютексом для управления клиентами.
//! \~\sa ServerClient, PIEthernet, PINetworkAddress
/*
PIP - Platform Independent Primitives
Ivan Pelipenko peri4ko@yandex.ru
@@ -40,7 +43,7 @@ namespace PIClientServer {
class ServerClient;
//! \details
//! \~english TCP server implementation for client-server communication. Accepts incoming connections and manages multiple clients with
//! configurable factory for client instance creation.
//! \~russian Реализация TCP сервера для клиент-серверного взаимодействия. Принимает входящие соединения и управляет несколькими клиентами с
@@ -52,49 +55,72 @@ class PIP_CLIENT_SERVER_EXPORT Server: public PIStreamPackerConfig {
public:
//! \~english Creates Server instance
//! \~russian Создает экземпляр Server
//! \~\details Initializes the TCP server with default settings (max 1000 clients).
//! \~russian Инициализирует TCP сервер с настройками по умолчанию (максимум 1000 клиентов).
Server();
//! \~english Destroys Server instance
//! \~russian Уничтожает экземпляр Server
//! \~\details Stops the server and closes all client connections.
//! \~russian Останавливает сервер и закрывает все клиентские соединения.
virtual ~Server();
//! ~english Starts listening on specified address
//! ~russian Начинает прослушивание на указанном адресе
//! \~english Starts listening on specified address
//! \~russian Начинает прослушивание на указанном адресе
//! \~\details Begins accepting incoming connections on the given network address.
//! \~russian Начинает принимать входящие соединения на заданном сетевом адресе.
void listen(PINetworkAddress addr);
//! ~english Starts listening on all interfaces
//! ~russian Начинает прослушивание на всех интерфейсах
//! \~english Starts listening on all interfaces
//! \~russian Начинает прослушивание на всех интерфейсах
//! \~\details Equivalent to listen({0, port}), binds to all available network interfaces.
//! \~russian Эквивалентно listen({0, port}), привязывается ко всем доступным сетевым интерфейсам.
void listenAll(ushort port) { listen({0, port}); }
//! ~english Stops the server
//! ~russian Останавливает сервер
//! \~english Stops the server
//! \~russian Останавливает сервер
//! \~\details Stops accepting new connections and closes all existing client connections.
//! \~russian Останавливает прием новых соединений и закрывает все существующие клиентские соединения.
void stopServer();
//! ~english Closes all client connections
//! ~russian Закрывает все клиентские соединения
//! \~english Closes all client connections
//! \~russian Закрывает все клиентские соединения
//! \~\details Immediately closes all active client connections without stopping the server.
//! \~russian Немедленно закрывает все активные клиентские соединения без остановки сервера.
void closeAll();
//! ~english Gets maximum allowed clients
//! ~russian Возвращает максимальное число клиентов
//! \~english Gets maximum allowed clients
//! \~russian Возвращает максимальное число клиентов
//! \~\details Returns the maximum number of concurrent client connections allowed.
//! \~russian Возвращает максимальное количество одновременных клиентских подключений.
int getMaxClients() const { return max_clients; }
//! ~english Sets maximum allowed clients
//! ~russian Устанавливает максимальное число клиентов
//! \~english Sets maximum allowed clients
//! \~russian Устанавливает максимальное число клиентов
//! \~\details Sets the maximum number of concurrent client connections. Default is 1000.
//! \~russian Устанавливает максимальное количество одновременных клиентских подключений. По умолчанию 1000.
void setMaxClients(int new_max_clients);
//! ~english Gets current clients count
//! ~russian Возвращает текущее количество клиентов
//! \~english Gets current clients count
//! \~russian Возвращает текущее количество клиентов
//! \~\details Returns the number of currently connected clients.
//! \~russian Возвращает количество текущих подключенных клиентов.
int clientsCount() const;
//! ~english Executes function for each connected client
//! ~russian Выполняет функцию для каждого подключённого клиента
//! \~english Executes function for each connected client
//! \~russian Выполняет функцию для каждого подключённого клиента
//! \~\details Iterates over all connected clients and executes the provided callback function.
//! \~russian Итерируется по всем подключенным клиентам и выполняет предоставленную функцию обратного вызова.
void forEachClient(std::function<void(ServerClient *)> func);
//! ~english Sets factory for creating new client instances
//! ~russian Устанавливает фабрику для создания клиентских экземпляров
//! \~english Sets factory for creating new client instances
//! \~russian Устанавливает фабрику для создания клиентских экземпляров
//! \~\details Sets a custom factory function used to create new ServerClient instances for incoming connections.
//! \~russian Устанавливает пользовательскую функцию фабрики, используемую для создания новых экземпляров ServerClient для входящих
//! соединений.
void setClientFactory(std::function<ServerClient *()> f) { client_factory = f; }
private:

View File

@@ -1,9 +1,13 @@
/*! \file picodeinfo.h
* \ingroup Code
* \~\brief
* \~english C++ code info structs. See \ref code_model.
* \~russian Структуры для C++ кода. Подробнее \ref code_model.
*/
//! \~\addtogroup Code
//! \~\{
//! \~\file picodeinfo.h
//! \~\brief
//! \~english C++ code info structs. See \ref code_model.
//! \~russian Структуры для C++ кода. Подробнее \ref code_model.
//! \~\details
//! \~english Contains structures for code generation and reflection: TypeInfo, FunctionInfo, ClassInfo, EnumInfo, EnumeratorInfo.
//! \~russian Содержит структуры для кодогенерации и рефлексии: TypeInfo, FunctionInfo, ClassInfo, EnumInfo, EnumeratorInfo.
//! \~\}
/*
PIP - Platform Independent Primitives
C++ code info structs
@@ -36,6 +40,11 @@ class PIVariant;
//! \~english Namespace contains structures for code generation. See \ref code_model.
//! \~russian Пространство имен содержит структуры для кодогенерации. Подробнее \ref code_model.
//! \~\details
//! \~english Provides classes and structures for code introspection, including type information, function details, class metadata, and enum
//! information.
//! \~russian Предоставляет классы и структуры для интроспекции кода, включая информацию о типах, детали функций, метаданные классов и
//! информацию о перечислениях.
namespace PICodeInfo {

View File

@@ -34,9 +34,13 @@
#include "pievaluator.h"
#include "pifile.h"
//! \~english Check if character is valid C identifier character.
//! \~russian Проверить, является ли символ допустимым символом идентификатора C.
inline bool _isCChar(const PIChar & c) {
return (c.isAlpha() || (c.toAscii() == '_'));
}
//! \~english Check if string starts with valid C identifier character.
//! \~russian Проверить, начинается ли строка с допустимого символа идентификатора C.
inline bool _isCChar(const PIString & c) {
if (c.isEmpty()) return false;
return _isCChar(c[0]);
@@ -48,12 +52,16 @@ public:
//! \~russian Конструктор по умолчанию.
PICodeParser();
//! \~english Visibility scope for class members.
//! \~russian Область видимости членов класса.
enum Visibility {
Global,
Public,
Protected,
Private
};
//! \~english Attribute flags for class members.
//! \~russian Флаги атрибутов членов класса.
enum Attribute {
NoAttributes = 0x0,
Const = 0x01,

View File

@@ -1,17 +1,17 @@
/*! \file pibase.h
* \ingroup Core
* \~\brief
* \~english Base types and functions
* \~russian Базовые типы и методы
*
* \~\details
* \~english
* This file implements first layer above the system and
* declares some basic useful functions
* \~russian
* Этот файл реализует первый слой после системы и объявляет
* несколько базовых полезных методов
*/
//! \addtogroup Core
//! \{
//! \file pibase.h
//! \brief
//! \~english Base types and functions
//! \~russian Базовые типы и методы
//! \details
//! \~english
//! This file implements first layer above the system and
//! declares some basic useful functions
//! \~russian
//! Этот файл реализует первый слой после системы и объявляет
//! несколько базовых полезных методов
//! \~\}
/*
PIP - Platform Independent Primitives
Base types and functions
@@ -409,6 +409,30 @@ inline void piChangeEndianBinary(PIMemoryBlock mem_blk) {
template<typename T>
inline void piChangeEndian(T & v);
//! \~\details
//! \~english
//! Specializations for 16-bit, 32-bit integers and float types
//! \~russian
//! Специализации для целочисленных типов 16-бит и 32-бит, а также типа float
template<>
inline void piChangeEndian(uint16_t & v);
//! \~\details
//! \~english
//! Specializations for 16-bit, 32-bit integers and float types
//! \~russian
//! Специализации для целочисленных типов 16-бит и 32-бит, а также типа float
template<>
inline void piChangeEndian(uint32_t & v);
//! \~\details
//! \~english
//! Specializations for 16-bit, 32-bit integers and float types
//! \~russian
//! Специализации для целочисленных типов 16-бит и 32-бит, а также типа float
template<>
inline void piChangeEndian(float & v);
//! \~\brief
//! \~english Templated function that returns value "v" with inversed byte order
@@ -416,6 +440,30 @@ inline void piChangeEndian(T & v);
template<typename T>
inline T piChangedEndian(const T & v);
//! \~\details
//! \~english
//! Specializations for 16-bit, 32-bit integers, float types and pointer types
//! \~russian
//! Специализации для целочисленных типов 16-бит и 32-бит, типа float и типов указателей
template<>
inline uint16_t piChangedEndian(const uint16_t & v);
//! \~\details
//! \~english
//! Specializations for 16-bit, 32-bit integers, float types and pointer types
//! \~russian
//! Специализации для целочисленных типов 16-бит и 32-бит, типа float и типов указателей
template<>
inline uint32_t piChangedEndian(const uint32_t & v);
//! \~\details
//! \~english
//! Specializations for 16-bit, 32-bit integers, float types and pointer types
//! \~russian
//! Специализации для целочисленных типов 16-бит и 32-бит, типа float и типов указателей
template<>
inline float piChangedEndian(const float & v);
template<typename T>
inline void piChangeEndian(T & v) {
@@ -515,51 +563,87 @@ inline uint piHashData(const uchar * data, uint len, uint seed = 0) {
}
//! \~\brief
//! \~english Generic hash function, returns 0 for unknown types
//! \~russian Хэш-функция общего назначения, возвращает 0 для неизвестных типов
template<typename T>
inline uint piHash(const T & v) {
return 0;
}
//! \~\brief
//! \~english Hash function specialization for char type
//! \~russian Специализация хэш-функции для типа char
template<>
inline uint piHash(const char & v) {
return (uint)v;
}
//! \~\brief
//! \~english Hash function specialization for uchar type
//! \~russian Специализация хэш-функции для типа uchar
template<>
inline uint piHash(const uchar & v) {
return (uint)v;
}
//! \~\brief
//! \~english Hash function specialization for short type
//! \~russian Специализация хэш-функции для типа short
template<>
inline uint piHash(const short & v) {
return (uint)v;
}
//! \~\brief
//! \~english Hash function specialization for ushort type
//! \~russian Специализация хэш-функции для типа ushort
template<>
inline uint piHash(const ushort & v) {
return (uint)v;
}
//! \~\brief
//! \~english Hash function specialization for int type
//! \~russian Специализация хэш-функции для типа int
template<>
inline uint piHash(const int & v) {
return (uint)v;
}
//! \~\brief
//! \~english Hash function specialization for uint type
//! \~russian Специализация хэш-функции для типа uint
template<>
inline uint piHash(const uint & v) {
return (uint)v;
}
//! \~\brief
//! \~english Hash function specialization for llong type using piHashData
//! \~russian Специализация хэш-функции для типа llong с использованием piHashData
template<>
inline uint piHash(const llong & v) {
return piHashData((const uchar *)&v, sizeof(v));
}
//! \~\brief
//! \~english Hash function specialization for ullong type using piHashData
//! \~russian Специализация хэш-функции для типа ullong с использованием piHashData
template<>
inline uint piHash(const ullong & v) {
return piHashData((const uchar *)&v, sizeof(v));
}
//! \~\brief
//! \~english Hash function specialization for float type
//! \~russian Специализация хэш-функции для типа float
template<>
inline uint piHash(const float & v) {
return (uint)v;
}
//! \~\brief
//! \~english Hash function specialization for double type using piHashData
//! \~russian Специализация хэш-функции для типа double с использованием piHashData
template<>
inline uint piHash(const double & v) {
return piHashData((const uchar *)&v, sizeof(v));
}
//! \~\brief
//! \~english Hash function specialization for ldouble type using piHashData
//! \~russian Специализация хэш-функции для типа ldouble с использованием piHashData
template<>
inline uint piHash(const ldouble & v) {
return piHashData((const uchar *)&v, sizeof(v));
@@ -742,16 +826,30 @@ struct PIP_EXPORT PINonTriviallyCopyable {
inline PINonTriviallyCopyable::PINonTriviallyCopyable(PINonTriviallyCopyable &&) noexcept = default;
//! \~\brief
//! \~english Template struct for extracting function type from callable objects
//! \~russian Шаблонная структура для извлечения типа функции из вызываемых объектов
template<typename T>
struct FunctionType {
using Type = void;
};
//! \~\brief
//! \~english Specialization for member function pointers
//! \~russian Специализация для указателей на члены класса
template<typename Ret, typename Class, typename... Args>
struct FunctionType<Ret (Class::*)(Args...) const> {
using Type = std::function<Ret(Args...)>;
};
//! \~\brief
//! \~english Convert lambda/functional object to std::function
//! \~russian Преобразует лямбду/функциональный объект в std::function
//! \~\details
//! \~english
//! Uses FunctionType template to extract the function signature from the callable object
//! \~russian
//! Использует шаблон FunctionType для извлечения сигнатуры функции из вызываемого объекта
template<typename L>
typename FunctionType<decltype(&L::operator())>::Type toStdFunction(L const & func) {
return func;

View File

@@ -1,15 +1,17 @@
/*! \file pibase_macros.h
* \ingroup Core
* \~\brief
* \~english Base macros
* \~russian Базовые макросы
*
* \~\details
* \~english
* This file declares basic useful maros
* \~russian
* Этот файл объявляет основные вспомогательные макросы
*/
//! \addtogroup Core
//! \{
//! \file pibase_macros.h
//! \brief
//! \~english Base macros
//! \~russian Базовые макросы
//! \details
//! \~english
//! This file declares basic useful macros for the PIP library including platform detection,
//! compiler-specific configurations, and utility macros for private data handling.
//! \~russian
//! Этот файл объявляет основные вспомогательные макросы для библиотеки PIP, включая обнаружение платформы,
//! конфигурации, специфичные для компилятора, и служебные макросы для работы с приватными данными.
//! \~\}
/*
PIP - Platform Independent Primitives
Base macros
@@ -46,151 +48,123 @@
//! Содержит набор пар ключ=значение, например
//! \~
//! PIMETA(id=12345,tag="my string")
//! \~\sa PIMETA
#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 ()
//! \~english Macro to access private section by pointer without braces ()
//! \~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)
@@ -320,76 +294,132 @@ typedef long long ssize_t;
// 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__;
//! \~english Macro to declare private section, "export" is optional
//! \~russian Макрос для объявления частной секции, "export" необязателен
//! \~details
//! \~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__;
//! \~english Macro to start definition of private section
//! \~russian Макрос для начала реализации частной секции
//! \~details
//! \~english Macro to start definition of private section
//! \~russian Макрос для начала реализации частной секции
//! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_END_NO_INITIALIZE PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB
# define PRIVATE_DEFINITION_START(c) struct c::__Private__ {
//! \~english Macro to end definition of private section without initialization
//! \~russian Макрос для окончания реализации частной секции без инициализации
//! \~details
//! \~english Macro to end definition of private section without initialization
//! \~russian Макрос для окончания реализации частной секции без инициализации
//! \~sa PRIVATE_DEFINITION_END PRIVATE_DEFINITION_START PRIVATE_DEFINITION_INITIALIZE PRIVATE PRIVATEWB
# define PRIVATE_DEFINITION_END_NO_INITIALIZE(c) \
} \
;
# 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_END(c) \
PRIVATE_DEFINITION_END_NO_INITIALIZE \
(c) PRIVATE_DEFINITION_INITIALIZE(c)
} \
;
//! \~english Macro to initialize private section
//! \~russian Макрос для инициализации частной секции
//! \~details
//! \~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; \
}
//! \~english Macro to end definition of private section with initialization
//! \~russian Макрос для окончания реализации частной секции с инициализацией
//! \~details
//! \~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)
//! \~english Macro to access private section by pointer
//! \~russian Макрос для доступа к частной секции
//! \~details
//! \~english Macro to access private section by pointer
//! \~russian Макрос для доступа к частной секции
//! \~sa PRIVATEWB
# define PRIVATE (__privateinitializer__.p)
//! \~english Macro to access private section by pointer without braces ()
//! \~russian Макрос для доступа к частной секции без обрамляющих скобок ()
//! \~details
//! \~english Macro to access private section by pointer without braces ()
//! \~russian Макрос для доступа к частной секции без обрамляющих скобок ()
//! \~sa PRIVATE
# define PRIVATEWB __privateinitializer__.p
#endif // DOXYGEN
#define NO_COPY_CLASS(name) \
name(const name &) = delete; \
name & operator=(const name &) = delete;
//! \~english Macro to remove class copy availability
//! \~russian Макрос для запрета копирования класса
#define NO_COPY_CLASS(name) \
name(const name &) = delete; \
name & operator=(const name &) = delete;
//! \~english Counter macro for unique identifier generation
//! \~russian Макрос счетчика для генерации уникальных идентификаторов
#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__)
//! \~english Macro to start static initializer
//! \~russian Макрос для начала статической инициализации
//! \~details
//! \~english Macro to start static initializer
//! \~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 Макрос для окончания статической инициализации
//! \~details
//! \~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_);
//! \~\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мс.
//! \~\sa PIP_MIN_MSLEEP
#ifndef PIP_MIN_MSLEEP
# ifndef MICRO_PIP
# define PIP_MIN_MSLEEP 1.
@@ -399,19 +429,26 @@ typedef long long ssize_t;
#endif
//! \~\brief
//! \~english Macro used for infinite loop
//! \~russian Макрос для бесконечного цикла
//! \~\details
//! \~english Expands to \c for(;;) infinite loop construct
//! \~russian Раскрывается в конструкцию бесконечного цикла \c for(;;)
#define FOREVER for (;;)
//! \~\brief
//! \~english Macro used for infinite wait
//! \~russian Макрос для бесконечного ожидания
//! \~\details
//! \~english Expands to infinite loop with periodic sleep calls for CPU-friendly waiting
//! \~russian Раскрывается в бесконечный цикл с периодическими вызовами sleep для экономии ресурсов CPU
#define FOREVER_WAIT FOREVER piMinSleep();
//! \~\brief
//! \~english Macro used for infinite wait
//! \~russian Макрос для бесконечного ожидания
//! \~\details
//! \~english Expands to infinite loop with periodic sleep calls for CPU-friendly waiting
//! \~russian Раскрывается в бесконечный цикл с периодическими вызовами sleep для экономии ресурсов CPU
//! \~\sa FOREVER_WAIT
#define WAIT_FOREVER FOREVER piMinSleep();

View File

@@ -1,9 +1,13 @@
/*! \file picollection.h
* \ingroup Core
* \~\brief
* \~english Unique classes collection
* \~russian Коллекция уникальных классов
*/
//! \addtogroup Core
//! \{
//! \file picollection.h
//! \brief
//! \~english Unique classes collection
//! \~russian Коллекция уникальных классов
//! \details
//! \~english Helper module to collect and retrieve classes into groups using macros for automatic registration.
//! \~russian Модуль-помощник для сбора и получения классов в группы с помощью макросов для автоматической регистрации.
//! \~\}
/*
PIP - Platform Independent Primitives
Peer - named I/O ethernet node, forming self-organized peering network
@@ -100,42 +104,63 @@
#endif
/// \~english Helper to collect and retrieve classes to groups.
/// \~russian Помощник для создания и получения классов в группы.
//! \~english Helper to collect and retrieve classes into groups.
//! \~russian Помощник для сбора и получения классов в группы.
class PIP_EXPORT PICollection {
friend class __PICollectionInitializer;
public:
//! \~english Default constructor
//! \~russian Конструктор по умолчанию
//! \~english Default constructor.
//! \~russian Конструктор по умолчанию.
PICollection() { ; }
//! \~english Returns all existing groups by their names
//! \~russian Возвращает имена всех групп
//! \~english Returns all existing groups by their names.
//! \~russian Возвращает имена всех существующих групп.
static PIStringList groups();
//! \~english Returns all elements of group "group"
//! \~russian Возвращает все элементы группы "group"
//! \~english Returns all elements of group "group".
//! \~russian Возвращает все элементы группы "group".
//! \details
//! \~english Returns a vector containing all elements registered in the specified group.
//! \~russian Возвращает вектор, содержащий все элементы, зарегистрированные в указанной группе.
//! \~\sa groups()
static PIVector<const PIObject *> groupElements(const PIString & group);
//! \~english Add element "element" to group "group"
//! \~russian Добавляет элемент "element" в группу "group"
//! \~english Add element "element" to group "group".
//! \~russian Добавляет элемент "element" в группу "group".
//! \details
//! \~english Adds the specified element to the group. If the group does not exist, it will be created.
//! \~russian Добавляет указанный элемент в группу. Если группа не существует, она будет создана.
//! \~\sa groupElements()
static bool addToGroup(const PIString & group, const PIObject * element);
class PIP_EXPORT CollectionAdder {
public:
//! \~english Constructor that adds element to group
//! \~russian Конструктор, который добавляет элемент в группу
//! \~english Constructor that adds element to group.
//! \~russian Конструктор, который добавляет элемент в группу.
//! \details
//! \~english Constructs a CollectionAdder that registers the element with the specified group, optionally setting its name and
//! ownership.
//! \~russian Создает CollectionAdder, который регистрирует элемент с указанной группой, при необходимости устанавливая имя и
//! владение.
CollectionAdder(const PIString & group, const PIObject * element, const PIString & name = PIString(), bool own = false);
};
protected:
struct PIP_EXPORT Group {
//! \~english Constructor that initializes group name.
//! \~russian Конструктор, инициализирующий имя группы.
Group(const PIString & name_ = PIString()) { name = name_; }
//! \~english Group name.
//! \~russian Имя группы.
PIString name;
//! \~english List of elements in the group.
//! \~russian Список элементов в группе.
PIVector<const PIObject *> elements;
};
//! \~english Returns reference to the groups vector.
//! \~russian Возвращает ссылку на вектор групп.
static PIVector<Group> & _groups();
};

View File

@@ -16,37 +16,26 @@
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//! \defgroup Core Core
//! \~\brief
//! \~english Basic functionality.
//! \~russian Базовая функциональность.
//!
//! \~\details
//! \~english \section cmake_module_Core Building with CMake
//! \~russian \section cmake_module_Core Сборка с использованием CMake
//!
//! \~\code
//! find_package(PIP REQUIRED)
//! target_link_libraries([target] PIP)
//! \endcode
//!
//! \~english \par Common
//! \~russian \par Общее
//!
//! \~english
//! These files provides platform abstraction, useful macros, methods and classes
//!
//! \~russian
//! Эти файлы обеспечивают абстракцию операционной системы, полезные макросы, методы и классы
//!
//! \~\authors
//! \~english
//! Ivan Pelipenko peri4ko@yandex.ru;
//! Andrey Bychkov work.a.b@yandex.ru;
//! \~russian
//! Иван Пелипенко peri4ko@yandex.ru;
//! Андрей Бычков work.a.b@yandex.ru;
//!
/*! \file picoremodule.h
* \ingroup Core
* \~\brief
* \~english Core module includes for PIP library
* \~russian Модуль инклюдов ядра для библиотеки PIP
* \details
* \~english
* This file includes all core module headers providing platform-independent abstractions
* for basic functionality, types, collections, JSON serialization, objects, properties, and time.
* \~russian
* Этот файл включает все заголовки модуля ядра, предоставляющие абстракции для базовой
* функциональности, типов, коллекций, JSON-сериализации, объектов, свойств и времени.
* \~\authors
* \~english
* Ivan Pelipenko peri4ko@yandex.ru;
* Andrey Bychkov work.a.b@yandex.ru;
* \~russian
* Иван Пелипенко peri4ko@yandex.ru;
* Андрей Бычков work.a.b@yandex.ru;
*/
#ifndef PICOREMODULE_H
#define PICOREMODULE_H

View File

@@ -1,9 +1,15 @@
/*! \file picout.h
* \ingroup Core
* \~\brief
* \~english Universal output to console class
* \~russian Универсальный вывод в консоль
*/
//! \addtogroup Core
//! \{
//! \file picout.h
//! \brief
//! \~english Universal output to console class
//! \~russian Универсальный вывод в консоль
//! \details
//! \~english This class provides many stream operators for output with features like text formatting, spaces between entries, and new
//! lines.
//! \~russian Данный класс предоставляет множество операторов для вывода с такими возможностями как форматирование текста, пробелы между
//! записями и новые строки.
//! \~\}
/*
PIP - Platform Independent Primitives
Universal output to console class
@@ -50,13 +56,13 @@
#else
# define piCout PICout(piDebug, PICoutStdStream::StdOut)
# define piCoutObj \
PICout(piDebug && debug(), PICoutStdStream::StdOut) \
<< (PIStringAscii("[") + className() + (name().isEmpty() ? "]" : PIStringAscii(" \"") + name() + PIStringAscii("\"]")))
# define piCoutObj \
PICout(piDebug && debug(), PICoutStdStream::StdOut) \
<< (PIStringAscii("[") + className() + (name().isEmpty() ? "]" : PIStringAscii(" \"") + name() + PIStringAscii("\"]")))
# define piCerr PICout(piDebug, PICoutStdStream::StdErr)
# define piCerrObj \
PICout(piDebug && debug(), PICoutStdStream::StdErr) \
<< (PIStringAscii("[") + className() + (name().isEmpty() ? "]" : PIStringAscii(" \"") + name() + PIStringAscii("\"]")))
# define piCerrObj \
PICout(piDebug && debug(), PICoutStdStream::StdErr) \
<< (PIStringAscii("[") + className() + (name().isEmpty() ? "]" : PIStringAscii(" \"") + name() + PIStringAscii("\"]")))
#endif
@@ -66,11 +72,17 @@ class PIObject;
//! \relatesalso PICout
//! \~english Namespace contains enums that controls PICout
//! \~russian Пространство имен содержит перечисления для контроля PICout
//! \details
//! \~english This namespace contains all enumerations used for controlling PICout output format and behavior.
//! \~russian Данное пространство имен содержит все перечисления, используемые для управления форматом и поведением вывода PICout.
namespace PICoutManipulators {
//! \~english Enum contains special characters
//! \~russian Перечисление со спецсимволами
//! \details
//! \~english Contains special character codes like null, newline, tab, escape, and quote.
//! \~russian Содержит коды специальных символов: null, newline, tab, escape и quote.
enum PICoutSpecialChar {
Null /*! \~english Null-character, '\\0' \~russian Нулевой символ, '\\0' */,
NewLine /*! \~english New line character, '\\n' \~russian Новая строка, '\\n' */,
@@ -82,6 +94,9 @@ enum PICoutSpecialChar {
//! \~english Enum contains immediate action
//! \~russian Перечисление с немедленными действиями
//! \details
//! \~english Contains actions that can be performed immediately on the output stream such as flush, backspace, and cursor control.
//! \~russian Содержит действия, которые можно выполнить немедленно над потоком вывода: flush, backspace и управление курсором.
enum PICoutAction {
Flush /*! \~english Flush the output \~russian Обновить вывод */,
Backspace /*! \~english Remove last symbol \~russian Удалить последний символ */,
@@ -97,6 +112,9 @@ enum PICoutAction {
//! \~english Enum contains control of PICout
//! \~russian Перечисление с управлением PICout
//! \details
//! \~english Contains control flags for output formatting including spaces, new lines, quotes, and locking behavior.
//! \~russian Содержит флаги управления форматированием вывода: пробелы, новые строки, кавычки и поведение блокировки.
enum PICoutControl {
AddNone /*! \~english No controls \~russian Без управления */ = 0x0,
AddSpaces /*! \~english Spaces will be appear after each output \~russian Пробел после каждого вывода */ = 0x1,
@@ -110,14 +128,18 @@ enum PICoutControl {
//! \~english Enum contains output format
//! \~russian Перечисление с форматом вывода
//! \details
//! \~english Contains format flags for integers (binary, octal, decimal, hexadecimal) and text styling (bold, italic, underline, colors).
//! \~russian Содержит флаги форматирования для целых чисел (binary, octal, decimal, hexadecimal) и стилизации текста (bold, italic,
//! underline, colors).
enum PICoutFormat {
Bin /*! \~english Binary representation of integers \~russian Двоичное представление для целых чисел */ = 0x01,
Oct /*! \~english Octal representation of integers \~russian Восьмеричное представление для целых чисел */ = 0x02,
Dec /*! \~english Decimal representation of integers \~russian Десятичное представление для целых чисел */ = 0x04,
Hex /*! \~english Hexadecimal representation of integers \~russian Шестнадцатеричное представление для целых чисел */ = 0x08,
Bold /*! \~english Bold \~russian Жирный */ = 0x10,
Faint /*! \~english \~russian */ = 0x20,
Italic /*! \~english \~russian */ = 0x40,
Faint /*! \~english Faint \~russian Тусклый */ = 0x20,
Italic /*! \~english Italic \~russian Курсив */ = 0x40,
Underline /*! \~english Underline \~russian Подчеркнутый */ = 0x80,
Blink /*! \~english Blink \~russian Мигающий */ = 0x100,
Black /*! \~english Black font \~russian Чёрный */ = 0x400,
@@ -147,6 +169,9 @@ typedef PIFlags<PICoutControl> PICoutControls;
//! \~english Enum contains console streams
//! \~russian Перечисление с потоками консоли
//! \details
//! \~english Defines the standard output streams: standard output (stdout) and standard error (stderr).
//! \~russian Определяет стандартные потоки вывода: стандартный вывод (stdout) и стандартный поток ошибок (stderr).
enum class PICoutStdStream {
StdOut /*! \~english Standard output stream \~russian Стандартный поток вывода */ = 0,
StdErr /*! \~english Standard error stream \~russian Стандартный поток ошибок */ = 1,
@@ -157,18 +182,35 @@ enum class PICoutStdStream {
//! \~\brief
//! \~english Universal output to console class.
//! \~russian Универсальный вывод в консоль.
//! \details
//! \~english This class provides a universal output interface with support for various data types, formatting options, and multiple output
//! devices (console, buffer).
//! \~russian Данный класс предоставляет универсальный интерфейс вывода с поддержкой различных типов данных, опций форматирования и
//! нескольких устройств вывода (консоль, буфер).
class PIP_EXPORT PICout {
public:
//! \~english Default constructor with default features (AddSpaces and AddNewLine)
//! \~russian Конструктор по умолчанию (AddSpaces и AddNewLine)
//! \details
//! \~english Constructs a PICout instance with default control flags (AddSpaces and AddNewLine) and default stream (StdOut).
//! \~russian Создает экземпляр PICout с флагами управления по умолчанию (AddSpaces и AddNewLine) и потоком по умолчанию (StdOut).
PICout(int controls = PICoutManipulators::DefaultControls, PICoutStdStream stream = PICoutStdStream::StdOut);
//! \~english Construct with default features (AddSpaces and AddNewLine), but if \"active\" is false does nothing
//! \~russian Конструктор по умолчанию (AddSpaces и AddNewLine), но если не \"active\" то будет неактивным
//! \details
//! \~english Constructs a PICout instance that is active only if the \"active\" parameter is true; otherwise, output operations are
//! ignored.
//! \~russian Создает экземпляр PICout, который активен только если параметр \"active\" равен true; в противном случае операции вывода
//! игнорируются.
PICout(bool active, PICoutStdStream stream = PICoutStdStream::StdOut);
//! \~english Copy constructor
//! \~russian Конструктор копирования
PICout(const PICout & other);
//! \~english Destructor
//! \~russian Деструктор
~PICout();
@@ -178,14 +220,24 @@ public:
public:
//! \~english Singleton access to %PICout::Notifier
//! \~russian Синглтон класса %PICout::Notifier
//! \details
//! \~english Returns the singleton instance of the Notifier class used for emitting PICout events.
//! \~russian Возвращает синглтон-экземпляр класса Notifier, используемого для посылки событий PICout.
static Notifier * instance();
//! \~english Object that emit events from %PICout
//! \~russian Объект, который посылает события от %PICout
//! \details
//! \~english Returns the PIObject instance that emits events when PICout with external buffer is destroyed.
//! \~russian Возвращает экземпляр PIObject, который посылает события при уничтожении PICout с внешним буфером.
static PIObject * object();
private:
//! \~english Private constructor for singleton pattern
//! \~russian Приватный конструктор для паттерна Singleton
Notifier();
//! \~english Macro to disable copy constructor and assignment operator
//! \~russian Макрос для отключения конструктора копирования и оператора присваивания
NO_COPY_CLASS(Notifier)
PIObject * o = nullptr;
@@ -194,6 +246,9 @@ public:
//! \~english Enum contains output devices of %PICout
//! \~russian Перечисление с устройствами вывода для %PICout
//! \details
//! \~english Defines output devices including console, buffer, and combined output.
//! \~russian Определяет устройства вывода: консоль, буфер и комбинированный вывод.
enum OutputDevice {
NoDevices /** \~english %PICout is disabled \~russian %PICout неактивен */ = 0x0,
Console /** \~english Standard console output \~russian Стандартный вывод в консоль */ = 0x1,
@@ -206,200 +261,358 @@ public:
//! \~english Output operator for strings with <tt>"const char * "</tt> type
//! \~russian Оператор вывода для строк <tt>"const char * "</tt>
//! \details
//! \~english Outputs a C-style string to the configured stream.
//! \~russian Выводит C-строку в настроенный поток.
PICout & operator<<(const char * v);
//! \~english Output operator for \a PIString
//! \~russian Оператор вывода для \a PIString
//! \details
//! \~english Outputs a PIString to the configured stream.
//! \~russian Выводит PIString в настроенный поток.
PICout & operator<<(const PIString & v);
//! \~english Output operator for boolean values
//! \~russian Оператор вывода для логических значений
//! \details
//! \~english Outputs a boolean value (true/false) to the configured stream.
//! \~russian Выводит логическое значение (true/false) в настроенный поток.
PICout & operator<<(bool v);
//! \~english Output operator for <tt>"char"</tt> values
//! \~russian Оператор вывода для <tt>"char"</tt> значений
//! \details
//! \~english Outputs a character value to the configured stream.
//! \~russian Выводит символьное значение в настроенный поток.
PICout & operator<<(char v);
//! \~english Output operator for <tt>"unsigned char"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned char"</tt> значений
//! \details
//! \~english Outputs an unsigned character value to the configured stream.
//! \~russian Выводит беззнаковое символьное значение в настроенный поток.
PICout & operator<<(uchar v);
//! \~english Output operator for <tt>"short"</tt> values
//! \~russian Оператор вывода для <tt>"short"</tt> значений
//! \details
//! \~english Outputs a short integer value to the configured stream.
//! \~russian Выводит короткое целочисленное значение в настроенный поток.
PICout & operator<<(short v);
//! \~english Output operator for <tt>"unsigned short"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned short"</tt> значений
//! \details
//! \~english Outputs an unsigned short integer value to the configured stream.
//! \~russian Выводит беззнаковое короткое целочисленное значение в настроенный поток.
PICout & operator<<(ushort v);
//! \~english Output operator for <tt>"int"</tt> values
//! \~russian Оператор вывода для <tt>"int"</tt> значений
//! \details
//! \~english Outputs an integer value to the configured stream with optional format (binary, octal, decimal, hexadecimal).
//! \~russian Выводит целочисленное значение в настроенный поток с опциональным форматированием (binary, octal, decimal, hexadecimal).
PICout & operator<<(int v);
//! \~english Output operator for <tt>"unsigned int"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned int"</tt> значений
//! \details
//! \~english Outputs an unsigned integer value to the configured stream with optional format (binary, octal, decimal, hexadecimal).
//! \~russian Выводит беззнаковое целочисленное значение в настроенный поток с опциональным форматированием (binary, octal, decimal,
//! hexadecimal).
PICout & operator<<(uint v);
//! \~english Output operator for <tt>"long"</tt> values
//! \~russian Оператор вывода для <tt>"long"</tt> значений
//! \details
//! \~english Outputs a long integer value to the configured stream with optional format (binary, octal, decimal, hexadecimal).
//! \~russian Выводит длинное целочисленное значение в настроенный поток с опциональным форматированием (binary, octal, decimal,
//! hexadecimal).
PICout & operator<<(long v);
//! \~english Output operator for <tt>"unsigned long"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned long"</tt> значений
//! \details
//! \~english Outputs an unsigned long integer value to the configured stream with optional format (binary, octal, decimal,
//! hexadecimal).
//! \~russian Выводит беззнаковое длинное целочисленное значение в настроенный поток с опциональным форматированием (binary, octal,
//! decimal, hexadecimal).
PICout & operator<<(ulong v);
//! \~english Output operator for <tt>"long long"</tt> values
//! \~russian Оператор вывода для <tt>"long long"</tt> значений
//! \details
//! \~english Outputs a long long integer value to the configured stream with optional format (binary, octal, decimal, hexadecimal).
//! \~russian Выводит длинное long long целочисленное значение в настроенный поток с опциональным форматированием (binary, octal,
//! decimal, hexadecimal).
PICout & operator<<(llong v);
//! \~english Output operator for <tt>"unsigned long long"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned long long"</tt> значений
//! \details
//! \~english Outputs an unsigned long long integer value to the configured stream with optional format (binary, octal, decimal,
//! hexadecimal).
//! \~russian Выводит беззнаковое длинное long long целочисленное значение в настроенный поток с опциональным форматированием (binary,
//! octal, decimal, hexadecimal).
PICout & operator<<(ullong v);
//! \~english Output operator for <tt>"float"</tt> values
//! \~russian Оператор вывода для <tt>"float"</tt> значений
//! \details
//! \~english Outputs a floating-point value to the configured stream.
//! \~russian Выводит значение с плавающей точкой в настроенный поток.
PICout & operator<<(float v);
//! \~english Output operator for <tt>"double"</tt> values
//! \~russian Оператор вывода для <tt>"double"</tt> значений
//! \details
//! \~english Outputs a double-precision floating-point value to the configured stream.
//! \~russian Выводит значение с двойной точностью в настроенный поток.
PICout & operator<<(double v);
//! \~english Output operator for <tt>"ldouble"</tt> values
//! \~russian Оператор вывода для <tt>"ldouble"</tt> значений
//! \details
//! \~english Outputs a long double-precision floating-point value to the configured stream.
//! \~russian Выводит значение с расширенной точностью в настроенный поток.
PICout & operator<<(ldouble v);
//! \~english Output operator for pointers
//! \~russian Оператор вывода для указателей
//! \details
//! \~english Outputs a pointer address to the configured stream in hexadecimal format.
//! \~russian Выводит адрес указателя в настроенный поток в шестнадцатеричном формате.
PICout & operator<<(const void * v);
//! \~english Output operator for PIObject and ancestors
//! \~russian Оператор вывода для PIObject и наследников
//! \details
//! \~english Outputs a PIObject or its descendants to the configured stream, including class name and object name.
//! \~russian Выводит PIObject или его наследников в настроенный поток, включая имя класса и имя объекта.
PICout & operator<<(const PIObject * v);
//! \~english Output operator for \a PICoutSpecialChar values
//! \~russian Оператор вывода для \a PICoutSpecialChar
//! \details
//! \~english Outputs special characters like newline, tab, or escape to the configured stream.
//! \~russian Выводит специальные символы (newline, tab, escape) в настроенный поток.
PICout & operator<<(PICoutManipulators::PICoutSpecialChar v);
//! \~english Output operator for \a PIFlags<PICoutFormat> values
//! \~russian Оператор вывода для \a PIFlags<PICoutFormat>
//! \details
//! \~english Sets output format flags (binary, octal, decimal, hexadecimal, bold, colors) for subsequent integer output.
//! \~russian Устанавливает флаги форматирования вывода (binary, octal, decimal, hexadecimal, bold, colors) для последующего вывода
//! целых чисел.
PICout & operator<<(PIFlags<PICoutManipulators::PICoutFormat> v);
//! \~english Output operator for \a PICoutFormat values
//! \~russian Оператор вывода для \a PICoutFormat
//! \details
//! \~english Sets output format flag (binary, octal, decimal, hexadecimal, bold, colors) for subsequent integer output.
//! \~russian Устанавливает флаг форматирования вывода (binary, octal, decimal, hexadecimal, bold, colors) для последующего вывода целых
//! чисел.
PICout & operator<<(PICoutManipulators::PICoutFormat v);
//! \~english Do some action
//! \~russian Делает действие
//! \details
//! \~english Performs an immediate action on the output stream such as flush, backspace, or cursor control.
//! \~russian Выполняет немедленное действие над потоком вывода: flush, backspace или управление курсором.
PICout & operator<<(PICoutManipulators::PICoutAction v);
//! \~english Set control flag "c" is "on" state
//! \~russian Установить флаг "c" в "on" состояние
//! \details
//! \~english Sets or clears the specified control flag (AddSpaces, AddNewLine, AddQuotes) for the output stream.
//! \~russian Устанавливает или сбрасывает указанный флаг управления (AddSpaces, AddNewLine, AddQuotes) для потока вывода.
PICout & setControl(PICoutManipulators::PICoutControl c, bool on = true);
//! \~english Set control flags "c"
//! \~russian Установить флаги "c"
//! \details
//! \~english Sets multiple control flags at once using the PICoutControls bitmask.
//! \~russian Устанавливает несколько флагов управления одновременно с помощью битовой маски PICoutControls.
PICout & setControls(PICoutManipulators::PICoutControls c);
//! \~english Exec \a saveControls() and set control flags to "c"
//! \~russian Иыполнить \a saveControls() и Установить флаги "c"
//! \details
//! \~english Saves current control flags to the internal stack and then sets new control flags "c".
//! \~russian Сохраняет текущие флаги управления во внутренний стек и устанавливает новые флаги управления "c".
PICout & saveAndSetControls(PICoutManipulators::PICoutControls c);
//! \~english Save control flags to internal stack
//! \~russian Сохраняет состояние флагов во внутренний стек
//! \~\sa \a restoreControl()
//! \details
//! \~english Saves the current control flags to an internal stack for later restoration using restoreControls().
//! \~russian Сохраняет текущие флаги управления во внутренний стек для последующего восстановления с помощью restoreControls().
//! \~\sa \a restoreControls()
PICout & saveControls();
//! \~english Restore control flags from internal stack
//! \~russian Восстанавливает состояние флагов из внутреннего стека
//! \~\sa \a saveControl()
//! \details
//! \~english Restores the control flags from the internal stack that were previously saved using saveControls().
//! \~russian Восстанавливает флаги управления из внутреннего стека, которые были ранее сохранены с помощью saveControls().
//! \~\sa \a saveControls()
PICout & restoreControls();
//! \~english Conditional put space character to output
//! \~russian Условно добавляет пробел
//! \details
//! \~english Conditionally adds a space character to the output if the AddSpaces control flag is enabled.
//! \~russian Условно добавляет пробел в вывод, если включен флаг управления AddSpaces.
PICout & space();
//! \~english Conditional put quote character to output
//! \~russian Условно добавляет кавычки
//! \details
//! \~english Conditionally adds quote characters to the output if the AddQuotes control flag is enabled.
//! \~russian Условно добавляет кавычки в вывод, если включен флаг управления AddQuotes.
PICout & quote();
//! \~english Conditional put new line character to output
//! \~russian Условно добавляет новую строку
//! \details
//! \~english Conditionally adds a newline character to the output if the AddNewLine control flag is enabled.
//! \~russian Условно добавляет символ новой строки в вывод, если включен флаг управления AddNewLine.
PICout & newLine();
//! \~english Write char
//! \~russian Пишет символ
//! \details
//! \~english Writes a single character directly to the output stream without any formatting.
//! \~russian Записывает один символ непосредственно в поток вывода без какого-либо форматирования.
PICout & write(char c);
//! \~english Write raw data
//! \~russian Пишет сырые символы
//! \details
//! \~english Writes raw C-style string data directly to the output stream without any formatting.
//! \~russian Записывает сырые данные C-строки непосредственно в поток вывода без какого-либо форматирования.
PICout & write(const char * str);
//! \~english Write raw data
//! \~russian Пишет сырые символы
//! \details
//! \~english Writes raw data of specified length directly to the output stream without any formatting.
//! \~russian Записывает сырые данные указанной длины непосредственно в поток вывода без какого-либо форматирования.
PICout & write(const char * str, int len);
//! \~english Write raw \a PIString
//! \~russian Пишет сырой \a PIString
//! \details
//! \~english Writes raw PIString data directly to the output stream without any formatting.
//! \~russian Записывает сырые данные PIString непосредственно в поток вывода без какого-либо форматирования.
PICout & write(const PIString & s);
//! \~english Output \a PIString to stdout
//! \~russian Вывод \a PIString в stdout
//! \details
//! \~english Outputs a PIString to the specified standard stream (stdout or stderr).
//! \~russian Выводит PIString в указанный стандартный поток (stdout или stderr).
static void stdoutPIString(const PIString & str, PICoutStdStream s = PICoutStdStream::StdOut);
//! \~english Returns internal PIString buffer
//! \~russian Возвращает внутренний PIString буфер
//! \details
//! \~english Returns the internal PIString buffer containing all accumulated output.
//! \~russian Возвращает внутренний буфер PIString, содержащий все накопленные данные вывода.
static PIString getBuffer();
//! \~english Returns internal PIString buffer and clear it
//! \~russian Возвращает внутренний PIString буфер и очищает его
//! \details
//! \~english Returns the internal PIString buffer containing all accumulated output and clears the buffer.
//! \~russian Возвращает внутренний буфер PIString, содержащий все накопленные данные вывода, и очищает буфер.
static PIString getBufferAndClear();
//! \~english Clear internal PIString buffer
//! \~russian Очищает внутренний PIString буфер
//! \details
//! \~english Clears the internal PIString buffer without returning its contents.
//! \~russian Очищает внутренний буфер PIString без возврата его содержимого.
static void clearBuffer();
//! \~english Set output to device "d" enabled "on". Returns if it was enabled
//! \~russian Устройство вывода "d" устанавливается в "on". Возвращает было ли устройство активно
//! \details
//! \~english Enables or disables the specified output device (Console, Buffer) and returns whether it was previously enabled.
//! \~russian Включает или выключает указанное устройство вывода (Console, Buffer) и возвращает, было ли оно ранее включено.
static bool setOutputDevice(OutputDevice d, bool on = true);
//! \~english Turn on output device "d". Returns if it was enabled
//! \~russian Включает устройство вывода "d". Возвращает было ли устройство активно
//! \details
//! \~english Enables the specified output device (Console, Buffer) and returns whether it was previously enabled.
//! \~russian Включает указанное устройство вывода (Console, Buffer) и возвращает, было ли оно ранее включено.
static bool enableOutputDevice(OutputDevice d) { return setOutputDevice(d, true); }
//! \~english Turn off output device "d". Returns if it was enabled
//! \~russian Выключает устройство вывода "d". Возвращает было ли устройство активно
//! \details
//! \~english Disables the specified output device (Console, Buffer) and returns whether it was previously enabled.
//! \~russian Выключает указанное устройство вывода (Console, Buffer) и возвращает, было ли оно ранее включено.
static bool disableOutputDevice(OutputDevice d) { return setOutputDevice(d, false); }
//! \~english Set output to devices to "d"
//! \~russian Устанавливает устройства вывода "d"
//! \details
//! \~english Sets the output devices using a bitmask of OutputDevices flags.
//! \~russian Устанавливает устройства вывода с помощью битовой маски флагов OutputDevices.
static void setOutputDevices(OutputDevices d);
//! \~english Returns current output devices
//! \~russian Возвращает текущие устройства вывода
//! \details
//! \~english Returns the bitmask of currently enabled output devices.
//! \~russian Возвращает битовую маску текущих включенных устройств вывода.
static OutputDevices currentOutputDevices() { return devs; }
//! \~english Returns if output device "d" is active
//! \~russian Возвращает активно ли устройство вывода "d"
//! \details
//! \~english Returns whether the specified output device is currently enabled.
//! \~russian Возвращает, включено ли указанное устройство вывода в данный момент.
static bool isOutputDeviceActive(OutputDevice d);
//! \~english Construct with external buffer.
//! \~russian Конструктор с внешним буфером.
//! \details
//! \~english Creates a PICout instance that outputs to an external PIString buffer with specified control flags.
//! \~russian Создает экземпляр PICout, который выводит данные во внешний буфер PIString с указанными флагами управления.
static PICout withExternalBuffer(PIString * buffer,
PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::AddSpaces);
PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::AddSpaces);
//! \~english Construct with external buffer and ID "id". See \a Notifier for details
//! \~russian Конструктор с внешним буфером и ID "id". Подробнее \a Notifier
//! \details
//! \~english Creates a PICout instance with external buffer and notification ID. When the last copy is destroyed, it emits a finished()
//! event via Notifier.
//! \~russian Создает экземпляр PICout с внешним буфером и идентификатором уведомления. При уничтожении последней копии посылается
//! событие finished() через Notifier.
static PICout withExternalBufferAndID(PIString * buffer,
int id,
PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::DefaultControls);
int id,
PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::DefaultControls);
//! \~english Returns unique external buffer ID for later use in \a withExternalBufferAndID()
//! \~russian Возвращает уникальный ID для внешнего буфера для дальнейшего использования в \a withExternalBufferAndID()
//! \details
//! \~english Registers a new unique ID for an external buffer that can be used with withExternalBufferAndID() for notification
//! purposes.
//! \~russian Регистрирует новый уникальный ID для внешнего буфера, который можно использовать с withExternalBufferAndID() для целей
//! уведомления.
static int registerExternalBufferID();
//! \~english Returns the internal mutex for thread-safe output operations
//! \~russian Возвращает внутренний мьютекс для потокобезопасных операций вывода
static PIMutex & __mutex__();
//! \~english Returns the internal string buffer reference
//! \~russian Возвращает ссылку на внутренний буфер строки
static PIString & __string__();
private:

View File

@@ -56,30 +56,45 @@ extern PIP_EXPORT lconv * currentLocale;
//! \brief
//! \~english Return readable error description in format "code <number> - <description>"
//! \~russian Возвращает читаемое описание ошибки в формате "code <номер> - <описание>"
//! \~\details
//! \~english Returns the last error message from the system in format "code <number> - <description>"
//! \~russian Возвращает последнее сообщение об ошибке из системы в формате "code <номер> - <описание>"
PIP_EXPORT PIString errorString();
//! \ingroup Core
//! \brief
//! \~english Reset last error
//! \~russian Сброс последней ошибки
//! \~\details
//! \~english Clears the last error message stored by the system
//! \~russian Очищает последнее сообщение об ошибке, сохраненное в системе
PIP_EXPORT void errorClear();
//! \ingroup Core
//! \brief
//! \~english Initialize random number generator
//! \~russian Инициализация генератора случайных чисел
//! \~\details
//! \~english Seeds the random number generator with a value based on current time
//! \~russian Инициализирует генератор случайных чисел значением на основе текущего времени
PIP_EXPORT void randomize();
//! \ingroup Core
//! \brief
//! \~english Returns random integer value
//! \~russian Возвращает случайное целое число
//! \~\details
//! \~english Returns a random integer value from the random number generator
//! \~russian Возвращает случайное целое число из генератора случайных чисел
PIP_EXPORT int randomi();
//! \ingroup Core
//! \brief
//! \~english Return readable version of PIP
//! \~russian Возвращает читаемую версию PIP
//! \~\details
//! \~english Returns the PIP library version as a human-readable string
//! \~russian Возвращает версию библиотеки PIP в виде читаемой строки
PIP_EXPORT PIString PIPVersion();
#endif // PIINCLUDES_H

View File

@@ -16,6 +16,19 @@
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//! \addtogroup Core
//! \{
//! \file piincludes_p.h
//! \brief
//! \~english Private PIP includes for platform-dependent types and functions
//! \~russian Приватные includes PIP для платформо-зависимых типов и функций
//! \details
//! \~english This header provides platform-specific includes, type definitions, and function pointers needed for low-level system
//! operations across different platforms including Windows, Linux, FreeRTOS, and Arduino
//! \~russian Этот заголовочный файл предоставляет платформо-зависимые includes, определения типов и указатели на функции, необходимые для
//! низкоуровневых системных операций на различных платформах включая Windows, Linux, FreeRTOS и Arduino
//! \~\}
#ifndef PIINCLUDES_P_H
#define PIINCLUDES_P_H

View File

@@ -7,6 +7,8 @@
//! \details
//! \~english This file provides initialization and build information for the PIP library.
//! \~russian Этот файл предоставляет инициализацию и информацию о сборке для библиотеки PIP.
//! \}
/*!
PIP - Platform Independent Primitives
Initialization
@@ -66,18 +68,37 @@ public:
//! \~english Build options which PIP library was built
//! \~russian Опции, с которыми был собран PIP
enum BuildOption {
boICU /*! \~english Unicode support by ICU \~russian Поддержка юникода через ICU */ = 0x01,
boUSB /*! \~english USB support \~russian Поддержка USB */ = 0x02,
boCrypt /*! \~english Crypt support \~russian Поддержка шифрования */ = 0x08,
boIntrospection /*! \~english Introspection \~russian Интроспекция */ = 0x010,
boFFTW /*! \~english FFTW3 support \~russian Поддержка FFTW3 */ = 0x40,
boCompress /*! \~english Zlib compression support \~russian Поддержка сжатия Zlib */ = 0x80,
boOpenCL /*! \~english OpenCL support \~russian Поддержка OpenCL */ = 0x100,
boCloud /*! \~english PICloud transport support \~russian Поддержка облачного транспорта PICloud */ = 0x200,
boConsole /*! \~english Console graphics support \~russian Поддержка графики в консоли */ = 0x400,
//! \~english Unicode support by ICU
//! \~russian Поддержка юникода через ICU
boICU = 0x01,
//! \~english USB support
//! \~russian Поддержка USB
boUSB = 0x02,
//! \~english Crypt support
//! \~russian Поддержка шифрования
boCrypt = 0x08,
//! \~english Introspection
//! \~russian Интроспекция
boIntrospection = 0x010,
//! \~english FFTW3 support
//! \~russian Поддержка FFTW3
boFFTW = 0x40,
//! \~english Zlib compression support
//! \~russian Поддержка сжатия Zlib
boCompress = 0x80,
//! \~english OpenCL support
//! \~russian Поддержка OpenCL
boOpenCL = 0x100,
//! \~english PICloud transport support
//! \~russian Поддержка облачного транспорта PICloud
boCloud = 0x200,
//! \~english Console graphics support
//! \~russian Поддержка графики в консоли
boConsole = 0x400,
};
//! \~english Returns singleton instance of PIInit
//! \~russian Возвращает синглтон экземпляр PIInit
//! \~\sa __PIInit_Initializer__
static PIInit * instance() { return __PIInit_Initializer__::__instance__; }
//! \ingroup Core
@@ -88,6 +109,7 @@ public:
//! \ingroup Core
//! \~english Returns build options as stringlist
//! \~russian Возвращает опции сборки как список строк
//! \~\sa isBuildOptionEnabled()
static PIStringList buildOptions();
private:

View File

@@ -1,9 +1,15 @@
/*! \file pimemoryblock.h
* \ingroup Core
* \~\brief
* \~english Base types and functions
* \~russian Базовые типы и методы
*/
//! \addtogroup Core
//! \{
//! \file pimemoryblock.h
//! \brief
//! \~english Memory block helper struct for data storage and binary stream operations
//! \~russian Вспомогательная структура памяти для хранения данных и операций с двоичным потоком
//! \details
//! \~english The PIMemoryBlock struct provides a lightweight wrapper to store and restore custom blocks of data to/from PIBinaryStream. It
//! holds a pointer to data and its size in bytes.
//! \~russian Структура PIMemoryBlock предоставляет легковесный wrapper для сохранения и извлечения произвольных блоков данных в/из
//! PIBinaryStream. Она содержит указатель на данные и их размер в байтах.
//! \~\}
/*
PIP - Platform Independent Primitives
Base types and functions
@@ -27,62 +33,75 @@
#define PIMEMORYBLOCK_H
//! \ingroup Core
//! \include pimemoryblock.h
//! \brief
//! \~english Help struct to store/restore custom blocks of data to/from PIBinaryStream
//! \~russian Вспомогательная структура для сохранения/извлечения произвольного блока данных в/из PIBinaryStream
//! \~english Helper struct to store and restore custom blocks of data to/from PIBinaryStream
//! \~russian Вспомогательная структура для сохранения и извлечения произвольных блоков данных в/из PIBinaryStream
struct PIMemoryBlock {
public:
//! \~english Constructs data block
//! \~russian Создает блок данных
//! \~english Constructs an empty data block
//! \~russian Создает пустой блок данных
PIMemoryBlock() {}
//! \~english Constructs data block
//! \~russian Создает блок данных
//! \~english Constructs a data block with given pointer and size
//! \param data_ Pointer to the data
//! \param size_ Size of the data in bytes
//! \~russian Создает блок данных с заданным указателем и размером
//! \param data_ Указатель на данные
//! \param size_ Размер данных в байтах
PIMemoryBlock(const void * data_, const int size_) {
d = const_cast<void *>(data_);
s = size_;
}
//! \~english Copy constructor
//! \param o Source memory block to copy
//! \~russian Конструктор копирования
//! \param o Исходный блок памяти для копирования
PIMemoryBlock(const PIMemoryBlock & o) {
d = o.d;
s = o.s;
}
//! \~english Assignment operator
//! \param o Source memory block to assign
//! \~russian Оператор присваивания
//! \param o Исходный блок памяти для присваивания
PIMemoryBlock & operator=(const PIMemoryBlock & o) {
d = o.d;
s = o.s;
return *this;
}
//! \~english Pointer to data
//! \~russian Указатель на данные
//! \~english Returns pointer to data
//! \~russian Возвращает указатель на данные
void * data() { return d; }
//! \~english Pointer to data
//! \~russian Указатель на данные
//! \~english Returns const pointer to data
//! \~russian Возвращает константный указатель на данные
const void * data() const { return d; }
//! \~english Size of data in bytes
//! \~russian Размер данных в байтах
//! \~english Returns size of data in bytes
//! \~russian Возвращает размер данных в байтах
int size() const { return s; }
//! \~english Returns if this block points to nothing
//! \~russian Возвращает пустой ли указатель на данные
//! \~english Returns true if this block is null (points to nothing)
//! \~russian Возвращает true, если этот блок пустой (не указывает ни на что)
bool isNull() const { return d; }
private:
//! \~english Pointer to data
//! \~russian Указатель на данные
void * d = nullptr;
//! \~english Size of data in bytes
//! \~russian Размер данных в байтах
int s = 0;
};
//! \~english Returns PIMemoryBlock from pointer to variable "ptr" with type "T"
//! \~russian Возвращает PIMemoryBlock из указателя "ptr" типа "T"
//! \~english Creates a PIMemoryBlock from a pointer to a variable of type T
//! \param ptr Pointer to the variable
//! \~russian Создает PIMemoryBlock из указателя на переменную типа T
//! \param ptr Указатель на переменную
//! \~\sa PIMemoryBlock
template<typename T>
PIMemoryBlock createMemoryBlock(const T * ptr) {
return PIMemoryBlock(ptr, sizeof(T));

View File

@@ -1,15 +1,15 @@
//! \addtogroup Core
//! \{
//! \file piobject.h
//! \brief
//! \~\addtogroup Core
//! \~\{
//! \~\file piobject.h
//! \~\brief
//! \~english Base object class providing event -> handler mechanism
//! \~russian Базовый класс объектов, обеспечивающий механизм событий -> обработчиков
//! \details
//! \~\details
//! \~english PIObject is the base class for all PIP classes that need event-driven communication.
//! It provides signal-slot mechanism, property system, and object lifetime management.
//! \~russian PIObject является базовым классом для всех классов PIP, которым необходима событийная коммуникация.
//! Он обеспечивает механизм сигналов-слотов, систему свойств и управление жизненным циклом объектов.
//! \~
//! \~\}
/*
PIP - Platform Independent Primitives
Object, base class of some PIP classes, provide EVENT -> EVENT_HANDLER mechanism
@@ -42,6 +42,9 @@
//! \~english Base class for classes using event -> handler mechanism
//! \~russian Базовый класс для классов, использующих механизм событий -> обработчиков
//! \~\details
//! \~english Provides event-driven communication through signals and slots, property system, and object lifetime management.
//! \~russian Обеспечивает событийную коммуникацию через сигналы и слоты, систему свойств и управление жизненным циклом объектов.
class PIP_EXPORT PIObject {
#ifndef MICRO_PIP
friend class PIObjectManager;
@@ -60,10 +63,11 @@ public:
virtual ~PIObject();
//! \ingroup Core
//! \~\brief
//! \~english Helper class for obtain info about if connection successful and disconnect single connection.
//! \~russian Вспомогательный класс для получения информации об успешности соединения и возможности его разрыва.
//! \~\details
//! \~english Holds connection information including source/destination objects, event name, and handler address.
//! \~russian Содержит информацию о соединении, включая объекты-источник и получатель, имя события и адрес обработчика.
class PIP_EXPORT Connection {
friend class PIObject;
Connection(void * sl,
@@ -99,26 +103,44 @@ public:
public:
//! \~english Constructs invalid %Connection
//! \~russian Создает недействительный %Connection
//! \~\details
//! \~english Creates a Connection object that is not connected to any signal or slot.
//! \~russian Создает объект Connection, который не подключен ни к какому сигналу или слоту.
Connection();
//! \~english Returns if %Connection is valid
//! \~russian Возвращает успешен ли %Connection
//! \~\details
//! \~english Returns true if the connection has been successfully established with a valid signal.
//! \~russian Возвращает true, если соединение было успешно установлено с действительным сигналом.
bool isValid() const { return signal; }
//! \~english Returns source object
//! \~russian Возвращает объект-источник
//! \~\details
//! \~english Returns the PIObject that emits the signal.
//! \~russian Возвращает PIObject, который генерирует сигнал.
PIObject * sourceObject() const { return src_o; }
//! \~english Returns destination object or "nullptr" if this is lambda connection
//! \~russian Возвращает объект-приемник или "nullptr" если это соединение на лямбда-функцию
//! \~\details
//! \~english Returns the PIObject that receives the signal, or nullptr for lambda connections.
//! \~russian Возвращает PIObject, который получает сигнал, или nullptr для соединений на лямбда-функцию.
PIObject * destinationObject() const { return dest_o; }
//! \~english Returns performer object or "nullptr" if this is non-queued connection
//! \~russian Возвращает объект-исполнитель или "nullptr" если это соединение не отложенное
//! \~\details
//! \~english Returns the PIObject that performs the queued connection, or nullptr for direct connections.
//! \~russian Возвращает PIObject, который выполняет отложенное соединение, или nullptr для прямых соединений.
PIObject * performerObject() const { return performer; }
//! \~english Disconnect this %Connection, returns if operation successful
//! \~russian Разрывает этот %Connection, возвращает успешен ли разрыв
//! \~\details
//! \~english Disconnects the connection and returns true if successful.
//! \~russian Разрывает соединение и возвращает true в случае успеха.
bool disconnect() const;
};
@@ -128,18 +150,31 @@ private:
public:
//! \~english Returns object name
//! \~russian Возвращает имя объекта
//! \~\details
//! \~english Returns the name property of the object.
//! \~russian Возвращает свойство имени объекта.
PIString name() const { return property("name").toString(); }
//! \~english Returns object class name
//! \~russian Возвращает имя класса объекта
//! \~\details
//! \~english Returns the name of the class as a C-string.
//! \~russian Возвращает имя класса в виде C-строки.
virtual const char * className() const { return "PIObject"; }
//! \~english Returns class name hash ID
//! \~russian Возвращает хеш-идентификатор имени класса
virtual uint classNameID() const {
static uint ret = PIStringAscii("PIObject").hash();
return ret;
}
//! \~english Returns class name as C-string
//! \~russian Возвращает имя класса в виде C-строки
static const char * __classNameCC() { return "PIObject"; }
//! \~english Returns class name hash ID (static)
//! \~russian Возвращает хеш-идентификатор имени класса (статический)
static uint __classNameIDS() {
static uint ret = PIStringAscii("PIObject").hash();
return ret;
@@ -147,28 +182,46 @@ public:
//! \~english Returns parent class name
//! \~russian Возвращает имя родительского класса
//! \~\details
//! \~english Returns the name of the parent class as a C-string.
//! \~russian Возвращает имя родительского класса в виде C-строки.
virtual const char * parentClassName() const { return ""; }
//! \~english Return if \a piCoutObj of this object is active
//! \~russian Возвращает включен ли вывод \a piCoutObj для этого объекта
//! \~english Return if debug output is active for this object
//! \~russian Возвращает включен ли вывод отладки для этого объекта
//! \~\details
//! \~english Returns whether debug output is enabled for this object.
//! \~russian Возвращает, включен ли вывод отладки для этого объекта.
bool debug() const { return property("debug").toBool(); }
//! \~english Set object name
//! \~russian Устанавливает имя объекта
//! \~\details
//! \~english Sets the name property of the object.
//! \~russian Устанавливает свойство имени объекта.
void setName(const PIString & name) { setProperty("name", name); }
//! \~english Set object \a piCoutObj active
//! \~russian Включает или отключает вывод \a piCoutObj для этого объекта
//! \~english Set debug output active for this object
//! \~russian Включает или отключает вывод отладки для этого объекта
//! \~\details
//! \~english Enables or disables debug output for this object.
//! \~russian Включает или отключает вывод отладки для этого объекта.
void setDebug(bool debug) { setProperty("debug", debug); }
//! \~english Returns property with name "name"
//! \~russian Возвращает свойство объекта по имени "name"
//! \~\details
//! \~english Returns the property value by name.
//! \~russian Возвращает значение свойства по имени.
PIVariant property(const char * name) const { return properties_.value(piHashData((const uchar *)name, strlen(name))); }
//! \~english Set property with name "name" to "value". If there is no such property in object it will be added
//! \~russian Устанавливает у объекта свойство по имени "name" в "value". Если такого свойства нет, оно добавляется
//! \~\details
//! \~english Sets the property value by name. If the property does not exist, it is added.
//! \~russian Устанавливает значение свойства по имени. Если свойство не существует, оно добавляется.
void setProperty(const char * name, const PIVariant & value) {
properties_[piHashData((const uchar *)name, strlen(name))] = value;
propertyChanged(name);
@@ -176,34 +229,69 @@ public:
//! \~english Returns if property with name "name" exists
//! \~russian Возвращает присутствует ли свойство по имени "name"
//! \~\details
//! \~english Returns true if the property with the given name exists in the object.
//! \~russian Возвращает true, если свойство с заданным именем существует в объекте.
bool isPropertyExists(const char * name) const { return properties_.contains(piHashData((const uchar *)name, strlen(name))); }
//! \~english Sets thread safety mode
//! \~russian Устанавливает режим потокобезопасности
//! \~\details
//! \~english Enables or disables thread-safe mode for the object.
//! \~russian Включает или отключает потокобезопасный режим для объекта.
void setThreadSafe(bool yes) { thread_safe_ = yes; }
//! \~english Returns if object is thread safe
//! \~russian Возвращает является ли объект потокобезопасным
//! \~\details
//! \~english Returns whether the object operates in thread-safe mode.
//! \~russian Возвращает, работает ли объект в потокобезопасном режиме.
bool isThreadSafe() const { return thread_safe_; }
//! \~english Executes method with specified arguments
//! \~russian Выполняет метод с указанными аргументами
//! \~\details
//! \~english Executes the specified method with the given arguments on this object.
//! \~russian Выполняет указанный метод с заданными аргументами на данном объекте.
bool execute(const PIString & method, const PIVector<PIVariantSimple> & vl);
//! \~english Executes method without arguments
//! \~russian Выполняет метод без аргументов
//! \~\details
//! \~english Executes the specified method without arguments on this object.
//! \~russian Выполняет указанный метод без аргументов на данном объекте.
bool execute(const PIString & method) { return execute(method, PIVector<PIVariantSimple>()); }
//! \~english Executes method with one argument
//! \~russian Выполняет метод с одним аргументом
//! \~\details
//! \~english Executes the specified method with one argument on this object.
//! \~russian Выполняет указанный метод с одним аргументом на данном объекте.
bool execute(const PIString & method, const PIVariantSimple & v0) { return execute(method, PIVector<PIVariantSimple>() << v0); }
//! \~english Executes method with two arguments
//! \~russian Выполняет метод с двумя аргументами
//! \~\details
//! \~english Executes the specified method with two arguments on this object.
//! \~russian Выполняет указанный метод с двумя аргументами на данном объекте.
bool execute(const PIString & method, const PIVariantSimple & v0, const PIVariantSimple & v1) {
return execute(method, PIVector<PIVariantSimple>() << v0 << v1);
}
//! \~english Executes method with three arguments
//! \~russian Выполняет метод с тремя аргументами
//! \~\details
//! \~english Executes the specified method with three arguments on this object.
//! \~russian Выполняет указанный метод с тремя аргументами на данном объекте.
bool execute(const PIString & method, const PIVariantSimple & v0, const PIVariantSimple & v1, const PIVariantSimple & v2) {
return execute(method, PIVector<PIVariantSimple>() << v0 << v1 << v2);
}
//! \~english Executes method with four arguments
//! \~russian Выполняет метод с четырьмя аргументами
//! \~\details
//! \~english Executes the specified method with four arguments on this object.
//! \~russian Выполняет указанный метод с четырьмя аргументами на данном объекте.
bool execute(const PIString & method,
const PIVariantSimple & v0,
const PIVariantSimple & v1,
@@ -214,24 +302,43 @@ public:
//! \~english Executes method queued with performer
//! \~russian Выполняет метод в очереди с исполнителем
//! \~\details
//! \~english Queues the specified method with the given arguments to be executed by the performer object.
//! \~russian Ставит в очередь указанный метод с заданными аргументами для выполнения объектом-исполнителем.
bool executeQueued(PIObject * performer, const PIString & method, const PIVector<PIVariantSimple> & vl);
//! \~english Executes method without arguments queued with performer
//! \~russian Выполняет метод без аргументов в очереди с исполнителем
//! \~\details
//! \~english Queues the specified method without arguments to be executed by the performer object.
//! \~russian Ставит в очередь указанный метод без аргументов для выполнения объектом-исполнителем.
bool executeQueued(PIObject * performer, const PIString & method) {
return executeQueued(performer, method, PIVector<PIVariantSimple>());
}
//! \~english Executes method with one argument queued with performer
//! \~russian Выполняет метод с одним аргументом в очереди с исполнителем
//! \~\details
//! \~english Queues the specified method with one argument to be executed by the performer object.
//! \~russian Ставит в очередь указанный метод с одним аргументом для выполнения объектом-исполнителем.
bool executeQueued(PIObject * performer, const PIString & method, const PIVariantSimple & v0) {
return executeQueued(performer, method, PIVector<PIVariantSimple>() << v0);
}
//! \~english Executes method with two arguments queued with performer
//! \~russian Выполняет метод с двумя аргументами в очереди с исполнителем
//! \~\details
//! \~english Queues the specified method with two arguments to be executed by the performer object.
//! \~russian Ставит в очередь указанный метод с двумя аргументами для выполнения объектом-исполнителем.
bool executeQueued(PIObject * performer, const PIString & method, const PIVariantSimple & v0, const PIVariantSimple & v1) {
return executeQueued(performer, method, PIVector<PIVariantSimple>() << v0 << v1);
}
//! \~english Executes method with three arguments queued with performer
//! \~russian Выполняет метод с тремя аргументами в очереди с исполнителем
//! \~\details
//! \~english Queues the specified method with three arguments to be executed by the performer object.
//! \~russian Ставит в очередь указанный метод с тремя аргументами для выполнения объектом-исполнителем.
bool executeQueued(PIObject * performer,
const PIString & method,
const PIVariantSimple & v0,
@@ -239,8 +346,12 @@ public:
const PIVariantSimple & v2) {
return executeQueued(performer, method, PIVector<PIVariantSimple>() << v0 << v1 << v2);
}
//! \~english Executes method with four arguments queued with performer
//! \~russian Выполняет метод с четырьмя аргументами в очереди с исполнителем
//! \~\details
//! \~english Queues the specified method with four arguments to be executed by the performer object.
//! \~russian Ставит в очередь указанный метод с четырьмя аргументами для выполнения объектом-исполнителем.
bool executeQueued(PIObject * performer,
const PIString & method,
const PIVariantSimple & v0,
@@ -333,22 +444,28 @@ public:
//! \~english Returns subclass scope of this object (including this class name)
//! \~russian Возвращает цепочку наследования объекта (вместе с классом самого объекта)
//! \~\sa className() parentClassName()
PIStringList scopeList() const;
//! \~english Returns list of all event-handler methods
//! \~russian Возвращает список всех методов-обработчиков событий
//! \~\sa isMethodEHContains() methodEHArguments()
PIStringList methodsEH() const;
//! \~english Returns if method "name" is event-handler
//! \~russian Возвращает является ли метод "name" обработчиком событий
//! \~\sa methodsEH() methodEHArguments()
bool isMethodEHContains(const PIString & name) const;
//! \~english Returns arguments of event-handler method "name"
//! \~russian Возвращает аргументы метода-обработчика событий "name"
//! \~\sa methodsEH() isMethodEHContains() methodEHFullFormat()
PIString methodEHArguments(const PIString & name) const;
//! \~english Returns full format of event-handler method "name"
//! \~russian Возвращает полный формат метода-обработчика событий "name"
//! \~\sa methodsEH() isMethodEHContains() methodEHArguments()
PIString methodEHFullFormat(const PIString & name) const;
//! \~english Returns event-handler method name from address "addr"
//! \~russian Возвращает имя метода-обработчика событий по адресу "addr"
//! \~\sa methodsEH() isMethodEHContains() methodEHArguments()
PIString methodEHFromAddr(const void * addr) const;
// / Direct connect
@@ -573,7 +690,8 @@ public:
}
}
//! Returns PIObject* with name "name" or 0, if there is no object found
//! \~english Returns PIObject* with name "name" or nullptr if there is no object found
//! \~russian Возвращает PIObject* с именем "name" или nullptr если объект не найден
static PIObject * findByName(const PIString & name) {
PIMutexLocker _ml(mutexObjects());
for (auto * i: PIObject::objects()) {
@@ -626,14 +744,32 @@ public:
//! \~russian Упрощает имя типа "a" в читаемый формат
static PIString simplifyType(const char * a, bool readable = true);
//! \~english Meta information about a function/method
//! \~russian Метаинформация о функции/методе
struct PIP_EXPORT __MetaFunc {
//! \~english Constructs empty %__MetaFunc
//! \~russian Создает пустой %__MetaFunc
__MetaFunc();
//! \~english Returns if %__MetaFunc is null (no function info)
//! \~russian Возвращает, является ли %__MetaFunc пустым (нет информации о функции)
bool isNull() const { return addr == nullptr; }
//! \~english Returns count of function arguments
//! \~russian Возвращает количество аргументов функции
int argumentsCount() const;
//! \~english Returns function arguments as string
//! \~russian Возвращает аргументы функции в виде строки
PIString arguments() const;
//! \~english Returns full function format with return type and arguments
//! \~russian Возвращает полный формат функции с типом возвращаемого значения и аргументами
PIString fullFormat() const;
//! \~english Sets function name
//! \~russian Устанавливает имя функции
void __setFuncName(const char * n);
//! \~english Adds function argument with type and name
//! \~russian Добавляет аргумент функции с типом и именем
void __addArgument(const char * t, const char * n);
//! \~english Check if this function can connect to destination function
//! \~russian Проверяет, может ли эта функция подключиться к целевой функции
bool canConnectTo(const __MetaFunc & dst, int & args_count) const;
void * addr = nullptr;
void * addrV = nullptr;
@@ -646,11 +782,17 @@ public:
uint types_id[__PIOBJECT_MAX_ARGS__];
};
//! \~english Meta information about a class/object
//! \~russian Метаинформация о классе/объекте
struct PIP_EXPORT __MetaData {
//! \~english Constructs %__MetaData with PIObject scope
//! \~russian Создает %__MetaData с областью PIObject
__MetaData() {
scope_list << "PIObject";
scope_id << PIStringAscii("PIObject").hash();
}
//! \~english Adds scope to metadata
//! \~russian Добавляет область в метаданные
void addScope(const char * s, uint shash);
PIVector<const char *> scope_list;
PISet<uint> scope_id;
@@ -665,8 +807,8 @@ public:
//! \~english
//! \brief Check if any CONNECTU_QUEUED connections to this object and execute them
//! \details This function is more optimized than \a callQueuedEvents() for objects that doesn`t
//! appears as \"performer\" target at CONNECTU_QUEUED
//! \details This function is more optimized than \a callQueuedEvents() for objects that don't
//! appear as \"performer\" target at CONNECTU_QUEUED
//! \~russian
//! \brief Если было хотя бы одно CONNECTU_QUEUED соединение с исполнителем this, то выполнить события
//! \details Этот метод более оптимален, чем \a callQueuedEvents(), для объектов, которые не были в роли
@@ -680,24 +822,40 @@ public:
//! \~russian Пометить объект на удаление
void deleteLater();
EVENT1(deleted, PIObject *, o);
//! \~\handlers
//! \~\{
//! \~\fn void deleted(PIObject * o)
//! \~\brief
//! \~english Event handler for object deletion signal
//! \~russian Обработчик события удаления объекта
//! \~\details
//! \~english Handler that receives notification before object deletion
//! \~russian Обработчик, получающий уведомление перед удалением объекта
//! \~\}
//! \events
//! \{
//! \~\events
//! \~\{
//! \fn void deleted(PIObject * o)
//! \brief
//! \~\fn void deleted(PIObject * o)
//! \~\brief
//! \~english Raise before object delete
//! \~russian Вызывается перед удалением объекта
//! \~\warning
//! \~english
//! This event raised from destructor, so use only "o" numeric value,
//! don`t try to cast deleted object to some subclass!
//! \~\details
//! \~english This event is raised from destructor, so use only "o" numeric value,
//! don't try to cast deleted object to some subclass!
//! \~russian
//! Это событие вызывается из деструктора, поэтому используйте
//! только численное значение "o", не надо кастовать его в другие типы!
//! \~\warning
//! \~english
//! This event raised from destructor, so use only "o" numeric value,
//! don't try to cast deleted object to some subclass!
//! \~russian
//! Это событие вызывается из деструктора, поэтому используйте
//! только численное значение "o", не надо кастовать его в другие типы!
//! \~\}
//! \}
EVENT1(deleted, PIObject *, o);
static PIMutex & __meta_mutex();
static PIMap<uint, __MetaData> & __meta_data(); // [hash(classname)]=__MetaData
@@ -772,7 +930,11 @@ private:
};
#ifndef MICRO_PIP
//! \~english Dumps application information
//! \~russian Выводит информацию о приложении
PIP_EXPORT void dumpApplication(bool with_objects = true);
//! \~english Dumps application information to file
//! \~russian Выводит информацию о приложении в файл
PIP_EXPORT bool dumpApplicationToFile(const PIString & path, bool with_objects = true);
#endif

View File

@@ -1,9 +1,19 @@
/*! \file piobject_macros.h
* \ingroup Core
* \~\brief
* \~english PIObject macros
* \~russian Макросы PIObject
*/
//! \~\addtogroup Core
//! \~\{
//! \~\file piobject_macros.h
//! \~\brief
//! \~english PIObject macros for event system and object introspection
//! \~russian Макросы PIObject для событийной системы и интроспекции объектов
//! \~\details
//! \~english
//! This file provides macros for the event system and object introspection in PIP.
//! It includes macros for declaring events, event handlers, and connecting them.
//! The event system allows objects to communicate through signals and slots mechanism.
//! \~russian
//! Этот файл предоставляет макросы для событийной системы и интроспекции объектов в PIP.
//! Он включает макросы для объявления событий, обработчиков событий и их соединения.
//! Событийная система позволяет объектам взаимодействовать через механизм сигналов и слотов.
//! \~\}
/*
PIP - Platform Independent Primitives
Macros for PIObject
@@ -39,27 +49,62 @@
//! \relatesalso PIObject
//! \~\brief
//! \~english You should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class, and \a scopeList()
//! \~english Use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class, and \a scopeList()
//! \~russian Необходимо использовать этот макрос после объявления класса для использования событийной системы и метода \a scopeList()
//! родительского класса
//! \~\details
//! \~english
//! Enables the event system and parent class introspection capabilities for the class.
//! Must be placed in the public section after class declaration.
//! \~russian
//! Включает событийную систему и возможности интроспекции родительского класса для класса.
//! Должен быть размещен в публичной секции после объявления класса.
# define PIOBJECT_SUBCLASS(name, parent)
//! \~\handlers
//! \~\{
//! \~\brief
//! \~english Event handler macros for receiving events
//! \~russian Макросы обработчиков событий для получения событий
//! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name()
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name()
//! \~\details
//! \~english
//! Declares an event handler function that can receive events without arguments.
//! Use EVENT_HANDLER as synonym for EVENT_HANDLER0.
//! \~russian
//! Объявляет функцию обработчика событий, которая может получать события без аргументов.
//! Используйте EVENT_HANDLER как синоним для EVENT_HANDLER0.
# define EVENT_HANDLER0(ret, name) ret name()
//! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name(type0 var0)
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name(type0 var0)
//! \~\details
//! \~english
//! Declares an event handler function that can receive events with one argument.
//! Use EVENT_HANDLER1 for handlers with one parameter.
//! \~russian
//! Объявляет функцию обработчика событий, которая может получать события с одним аргументом.
//! Используйте EVENT_HANDLER1 для обработчиков с одним параметром.
# define EVENT_HANDLER1(ret, name, type0, var0) ret name(type0 var0)
//! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1)
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name(type0 var0, type1 var1)
//! \~\details
//! \~english
//! Declares an event handler function that can receive events with two arguments.
//! Use EVENT_HANDLER2 for handlers with two parameters.
//! \~russian
//! Объявляет функцию обработчика событий, которая может получать события с двумя аргументами.
//! Используйте EVENT_HANDLER2 для обработчиков с двумя параметрами.
# define EVENT_HANDLER2(ret, name, type0, var0, type1, var1) ret name(type0 var0, type1 var1)
//! \relatesalso PIObject
@@ -74,7 +119,7 @@
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name(type0 var0, type1 var1, type2 var2,
//! type3 var3)
# define EVENT_HANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) \
ret name(type0 var0, type1 var1, type2 var2, type3 var3)
ret name(type0 var0, type1 var1, type2 var2, type3 var3)
//! \relatesalso PIObject
//! \~\brief
@@ -116,7 +161,7 @@
//! \~russian Объявляет виртуальный обработчик событий с именем \"name\" и возвращаемым типом \"ret\", virtual ret name(type0 var0, type1
//! var1, type2 var2, type3 var3)
# define EVENT_VHANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) \
virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
//! \relatesalso PIObject
//! \~\brief
@@ -409,308 +454,322 @@
#else
//! \relatesalso PIObject
//! \~english Stringizes the argument
//! \~russian Строкализует аргумент
//! \~\details
//! \~english Converts the argument to a string literal
//! \~russian Преобразует аргумент в строковый литерал
# define _PI_STR(x) #x
//! \relatesalso PIObject
//! \~english Stringizes the argument using _PI_STR
//! \~russian Строкализует аргумент с использованием _PI_STR
//! \~\details
//! \~english Converts the argument to a string literal using the _PI_STR macro
//! \~russian Преобразует аргумент в строковый литерал с использованием макроса _PI_STR
# define _PI_SSTR(x) _PI_STR(x)
//! \relatesalso PIObject
//! \~english Current file and line location
//! \~russian Текущий файл и строка
//! \~\details
//! \~english Returns the current file name and line number as a string
//! \~russian Возвращает текущее имя файла и номер строки в виде строки
# define LOCATION __FILE__ ":" _PI_SSTR(__LINE__)
//! \relatesalso PIObject
//! \~english Pure type for variant
//! \~russian Чистый тип для variant
//! \~\details
//! \~english Removes const and reference qualifiers from the type
//! \~russian Удаляет квалификаторы const и reference из типа
# ifdef CC_GCC
# define __PTYPE(t) typename __PIVariantTypeInfo__<t>::PureType
# else
# define __PTYPE(t) __PIVariantTypeInfo__<t>::PureType
# endif
//! \relatesalso PIObject
//! \~english Extracts value from variant
//! \~russian Извлекает значение из variant
//! \~\details
//! \~english Extracts the value of type t from the variant v
//! \~russian Извлекает значение типа t из variant v
# define __VVALUE(t, v) v.value<__PTYPE(t)>()
//! \relatesalso PIObject
//! \~english Maximum number of arguments
//! \~russian Максимальное количество аргументов
//! \~\details
//! \~english Defines the maximum number of arguments supported by event macros (4)
//! \~russian Определяет максимальное количество аргументов, поддерживаемых макросами событий (4)
# define __PIOBJECT_MAX_ARGS__ 4
//! \relatesalso PIObject
//! \~english Macro to be used after class declaration to enable event system and correct piCoutObj output
//! \~russian Макрос, используемый после объявления класса для включения событийной системы и корректного вывода piCoutObj
//! \~\details
//! \~english Enables the event system and object introspection capabilities for the class
//! \~russian Включает событийную систему и возможности интроспекции объектов для класса
# define PIOBJECT(name) \
\
protected: \
typedef name __PIObject__; \
\
public: \
static const char * __classNameCC() { return #name; } \
static uint __classNameIDS() { \
static uint ret = PIStringAscii(#name).hash(); \
return ret; \
} \
const char * className() const override { return #name; } \
uint classNameID() const override { \
static uint ret = PIStringAscii(#name).hash(); \
return ret; \
} \
\
private: \
int ptrOffset() const override { \
name * o = (name *)100; \
return int(llong((PIObject *)o) - llong(o)); \
} \
class __BaseInitializer__ { \
public: \
__BaseInitializer__() { \
uint pid = PIObject::__classNameIDS(); \
if (pid == 0) return; \
uint id = __classNameIDS(); \
PIMutexLocker ml(__meta_mutex()); \
if (__meta_data().contains(id)) return; \
__meta_data()[pid]; \
__meta_data()[id]; \
__MetaData & ehp(__meta_data()[pid]); \
__MetaData & eh(__meta_data()[id]); \
eh.eh_set << ehp.eh_set; \
eh.eh_func << ehp.eh_func; \
eh.addScope(__classNameCC(), id); \
} \
}; \
__BaseInitializer__ __base_init__;
# define PIOBJECT(name) \
\
protected: \
typedef name __PIObject__; \
\
public: \
static const char * __classNameCC() { \
return #name; \
} \
static uint __classNameIDS() { \
static uint ret = PIStringAscii(#name).hash(); \
return ret; \
} \
const char * className() const override { \
return #name; \
} \
uint classNameID() const override { \
static uint ret = PIStringAscii(#name).hash(); \
return ret; \
} \
\
private: \
int ptrOffset() const override { \
name * o = (name *)100; \
return int(llong((PIObject *)o) - llong(o)); \
} \
class __BaseInitializer__ { \
public: \
__BaseInitializer__() { \
uint pid = PIObject::__classNameIDS(); \
if (pid == 0) return; \
uint id = __classNameIDS(); \
PIMutexLocker ml(__meta_mutex()); \
if (__meta_data().contains(id)) return; \
__meta_data()[pid]; \
__meta_data()[id]; \
__MetaData & ehp(__meta_data()[pid]); \
__MetaData & eh(__meta_data()[id]); \
eh.eh_set << ehp.eh_set; \
eh.eh_func << ehp.eh_func; \
eh.addScope(__classNameCC(), id); \
} \
}; \
__BaseInitializer__ __base_init__;
# define PIOBJECT_PARENT(name) \
class __ParentInitializer__ { \
public: \
__ParentInitializer__() { \
uint pid = name::__classNameIDS(); \
if (pid == 0) return; \
uint id = __classNameIDS(); \
PIMutexLocker ml(__meta_mutex()); \
__MetaData & eh(__meta_data()[id]); \
if (eh.scope_id.contains(pid)) return; \
__MetaData ehp(__meta_data().value(pid)); \
eh.eh_set << ehp.eh_set; \
eh.eh_func << ehp.eh_func; \
eh.scope_id = ehp.scope_id; \
eh.scope_list = ehp.scope_list; \
eh.addScope(__classNameCC(), id); \
} \
}; \
__ParentInitializer__ __parent_init__; \
\
public: \
const char * parentClassName() const override { \
return #name; \
} \
typedef name __Parent__; \
\
private:
# define PIOBJECT_PARENT(name) \
class __ParentInitializer__ { \
public: \
__ParentInitializer__() { \
uint pid = name::__classNameIDS(); \
if (pid == 0) return; \
uint id = __classNameIDS(); \
PIMutexLocker ml(__meta_mutex()); \
__MetaData & eh(__meta_data()[id]); \
if (eh.scope_id.contains(pid)) return; \
__MetaData ehp(__meta_data().value(pid)); \
eh.eh_set << ehp.eh_set; \
eh.eh_func << ehp.eh_func; \
eh.scope_id = ehp.scope_id; \
eh.scope_list = ehp.scope_list; \
eh.addScope(__classNameCC(), id); \
} \
}; \
__ParentInitializer__ __parent_init__; \
\
public: \
const char * parentClassName() const override { return #name; } \
typedef name __Parent__; \
\
private:
# define PIOBJECT_SUBCLASS(name, parent) PIOBJECT(name) PIOBJECT_PARENT(parent)
# define __EH_INIT_BASE__(ret, name) \
PIMutexLocker ml(__meta_mutex()); \
__MetaData & eh(__meta_data()[__classNameIDS()]); \
if (eh.eh_set[fp]) return; \
eh.eh_set << fp; \
__MetaFunc & f(eh.eh_func[fp]); \
f.scope = __classNameCC(); \
f.__setFuncName(#name); \
f.addr = fp; \
f.addrV = fpV; \
f.type_ret = #ret;
# define __EH_INIT_BASE__(ret, name) \
PIMutexLocker ml(__meta_mutex()); \
__MetaData & eh(__meta_data()[__classNameIDS()]); \
if (eh.eh_set[fp]) return; \
eh.eh_set << fp; \
__MetaFunc & f(eh.eh_func[fp]); \
f.scope = __classNameCC(); \
f.__setFuncName(#name); \
f.addr = fp; \
f.addrV = fpV; \
f.type_ret = #ret;
# define EH_INIT0(ret, name) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *))__stat_eh_##name##__; \
void * fpV = fp; \
__EH_INIT_BASE__(ret, name) \
STATIC_INITIALIZER_END
# define EH_INIT0(ret, name) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *))__stat_eh_##name##__; \
void * fpV = fp; \
__EH_INIT_BASE__(ret, name) \
STATIC_INITIALIZER_END
# define EH_INIT1(ret, name, a0, n0) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0))__stat_eh_##name##__; \
void * fpV = (void *)(ret(*)(void *, const PIVariantSimple &))__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
STATIC_INITIALIZER_END
# define EH_INIT1(ret, name, a0, n0) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0))__stat_eh_##name##__; \
void * fpV = (void *)(ret(*)(void *, const PIVariantSimple &))__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
STATIC_INITIALIZER_END
# define EH_INIT2(ret, name, a0, n0, a1, n1) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0, a1))__stat_eh_##name##__; \
void * fpV = (void *)(ret(*)(void *, const PIVariantSimple &, const PIVariantSimple &))__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
f.__addArgument(#a1, #n1); \
STATIC_INITIALIZER_END
# define EH_INIT2(ret, name, a0, n0, a1, n1) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0, a1))__stat_eh_##name##__; \
void * fpV = (void *)(ret(*)(void *, const PIVariantSimple &, const PIVariantSimple &))__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
f.__addArgument(#a1, #n1); \
STATIC_INITIALIZER_END
# define EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0, a1, a2))__stat_eh_##name##__; \
void * fpV = \
(void *)(ret(*)(void *, const PIVariantSimple &, const PIVariantSimple &, const PIVariantSimple &))__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
f.__addArgument(#a1, #n1); \
f.__addArgument(#a2, #n2); \
STATIC_INITIALIZER_END
# define EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0, a1, a2))__stat_eh_##name##__; \
void * fpV = \
(void *)(ret(*)(void *, const PIVariantSimple &, const PIVariantSimple &, const PIVariantSimple &))__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
f.__addArgument(#a1, #n1); \
f.__addArgument(#a2, #n2); \
STATIC_INITIALIZER_END
# define EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0, a1, a2, a3))__stat_eh_##name##__; \
void * fpV = \
(void *)(ret(*)(void *, const PIVariantSimple &, const PIVariantSimple &, const PIVariantSimple &, const PIVariantSimple &)) \
__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
f.__addArgument(#a1, #n1); \
f.__addArgument(#a2, #n2); \
f.__addArgument(#a3, #n3); \
STATIC_INITIALIZER_END
# define EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
STATIC_INITIALIZER_BEGIN \
void * fp = (void *)(ret(*)(void *, a0, a1, a2, a3))__stat_eh_##name##__; \
void * fpV = \
(void *)(ret(*)(void *, const PIVariantSimple &, const PIVariantSimple &, const PIVariantSimple &, const PIVariantSimple &)) \
__stat_eh_v_##name##__; \
__EH_INIT_BASE__(ret, name) \
f.__addArgument(#a0, #n0); \
f.__addArgument(#a1, #n1); \
f.__addArgument(#a2, #n2); \
f.__addArgument(#a3, #n3); \
STATIC_INITIALIZER_END
# define EVENT_HANDLER0(ret, name) \
EH_INIT0(ret, name) \
static ret __stat_eh_##name##__(void * __o__) { \
return ((__PIObject__ *)__o__)->name(); \
} \
ret name()
# define EVENT_HANDLER0(ret, name) \
EH_INIT0(ret, name) \
static ret __stat_eh_##name##__(void * __o__) { return ((__PIObject__ *)__o__)->name(); } \
ret name()
# define EVENT_HANDLER1(ret, name, a0, n0) \
EH_INIT1(ret, name, a0, n0) \
static ret __stat_eh_##name##__(void * __o__, a0 n0) { \
return ((__PIObject__ *)__o__)->name(n0); \
} \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
return ((__PIObject__ *)__o__)->name(tv0); \
} \
ret name(a0 n0)
# define EVENT_HANDLER1(ret, name, a0, n0) \
EH_INIT1(ret, name, a0, n0) \
static ret __stat_eh_##name##__(void * __o__, a0 n0) { return ((__PIObject__ *)__o__)->name(n0); } \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
return ((__PIObject__ *)__o__)->name(tv0); \
} \
ret name(a0 n0)
# define EVENT_HANDLER2(ret, name, a0, n0, a1, n1) \
EH_INIT2(ret, name, a0, n0, a1, n1) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1) { \
return ((__PIObject__ *)__o__)->name(n0, n1); \
} \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0, const PIVariantSimple & v1) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
__PTYPE(a1) tv1 = __VVALUE(a1, v1); \
return ((__PIObject__ *)__o__)->name(tv0, tv1); \
} \
ret name(a0 n0, a1 n1)
# define EVENT_HANDLER2(ret, name, a0, n0, a1, n1) \
EH_INIT2(ret, name, a0, n0, a1, n1) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1) { return ((__PIObject__ *)__o__)->name(n0, n1); } \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0, const PIVariantSimple & v1) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
__PTYPE(a1) tv1 = __VVALUE(a1, v1); \
return ((__PIObject__ *)__o__)->name(tv0, tv1); \
} \
ret name(a0 n0, a1 n1)
# define EVENT_HANDLER3(ret, name, a0, n0, a1, n1, a2, n2) \
EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2) { \
return ((__PIObject__ *)__o__)->name(n0, n1, n2); \
} \
static ret __stat_eh_v_##name##__(void * __o__, \
const PIVariantSimple & v0, \
const PIVariantSimple & v1, \
const PIVariantSimple & v2) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
__PTYPE(a1) tv1 = __VVALUE(a1, v1); \
__PTYPE(a2) tv2 = __VVALUE(a2, v2); \
return ((__PIObject__ *)__o__)->name(tv0, tv1, tv2); \
} \
ret name(a0 n0, a1 n1, a2 n2)
# define EVENT_HANDLER3(ret, name, a0, n0, a1, n1, a2, n2) \
EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2) { return ((__PIObject__ *)__o__)->name(n0, n1, n2); } \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0, const PIVariantSimple & v1, const PIVariantSimple & v2) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
__PTYPE(a1) tv1 = __VVALUE(a1, v1); \
__PTYPE(a2) tv2 = __VVALUE(a2, v2); \
return ((__PIObject__ *)__o__)->name(tv0, tv1, tv2); \
} \
ret name(a0 n0, a1 n1, a2 n2)
# define EVENT_HANDLER4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2, a3 n3) { \
return ((__PIObject__ *)__o__)->name(n0, n1, n2, n3); \
} \
static ret __stat_eh_v_##name##__(void * __o__, \
const PIVariantSimple & v0, \
const PIVariantSimple & v1, \
const PIVariantSimple & v2, \
const PIVariantSimple & v3) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
__PTYPE(a1) tv1 = __VVALUE(a1, v1); \
__PTYPE(a2) tv2 = __VVALUE(a2, v2); \
__PTYPE(a3) tv3 = __VVALUE(a3, v3); \
return ((__PIObject__ *)__o__)->name(tv0, tv1, tv2, tv3); \
} \
ret name(a0 n0, a1 n1, a2 n2, a3 n3)
# define EVENT_HANDLER4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2, a3 n3) { return ((__PIObject__ *)__o__)->name(n0, n1, n2, n3); } \
static ret __stat_eh_v_##name##__(void * __o__, \
const PIVariantSimple & v0, \
const PIVariantSimple & v1, \
const PIVariantSimple & v2, \
const PIVariantSimple & v3) { \
__PTYPE(a0) tv0 = __VVALUE(a0, v0); \
__PTYPE(a1) tv1 = __VVALUE(a1, v1); \
__PTYPE(a2) tv2 = __VVALUE(a2, v2); \
__PTYPE(a3) tv3 = __VVALUE(a3, v3); \
return ((__PIObject__ *)__o__)->name(tv0, tv1, tv2, tv3); \
} \
ret name(a0 n0, a1 n1, a2 n2, a3 n3)
# define EVENT_HANDLER EVENT_HANDLER0
# define EVENT_VHANDLER0(ret, name) \
EH_INIT0(ret, name) \
static ret __stat_eh_##name##__(void * __o__) { \
return ((__PIObject__ *)__o__)->name(); \
} \
virtual ret name()
# define EVENT_VHANDLER0(ret, name) \
EH_INIT0(ret, name) \
static ret __stat_eh_##name##__(void * __o__) { return ((__PIObject__ *)__o__)->name(); } \
virtual ret name()
# define EVENT_VHANDLER1(ret, name, a0, n0) \
EH_INIT1(ret, name, a0, n0) \
static ret __stat_eh_##name##__(void * __o__, a0 n0) { \
return ((__PIObject__ *)__o__)->name(n0); \
} \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0)); \
} \
virtual ret name(a0 n0)
# define EVENT_VHANDLER1(ret, name, a0, n0) \
EH_INIT1(ret, name, a0, n0) \
static ret __stat_eh_##name##__(void * __o__, a0 n0) { return ((__PIObject__ *)__o__)->name(n0); } \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0)); \
} \
virtual ret name(a0 n0)
# define EVENT_VHANDLER2(ret, name, a0, n0, a1, n1) \
EH_INIT2(ret, name, a0, n0, a1, n1) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1) { \
return ((__PIObject__ *)__o__)->name(n0, n1); \
} \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0, const PIVariantSimple & v1) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0), __VVALUE(a1, v1)); \
} \
virtual ret name(a0 n0, a1 n1)
# define EVENT_VHANDLER2(ret, name, a0, n0, a1, n1) \
EH_INIT2(ret, name, a0, n0, a1, n1) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1) { return ((__PIObject__ *)__o__)->name(n0, n1); } \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0, const PIVariantSimple & v1) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0), __VVALUE(a1, v1)); \
} \
virtual ret name(a0 n0, a1 n1)
# define EVENT_VHANDLER3(ret, name, a0, n0, a1, n1, a2, n2) \
EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2) { \
return ((__PIObject__ *)__o__)->name(n0, n1, n2); \
} \
static ret __stat_eh_v_##name##__(void * __o__, \
const PIVariantSimple & v0, \
const PIVariantSimple & v1, \
const PIVariantSimple & v2) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0), __VVALUE(a1, v1), __VVALUE(a2, v2)); \
} \
virtual ret name(a0 n0, a1 n1, a2 n2)
# define EVENT_VHANDLER3(ret, name, a0, n0, a1, n1, a2, n2) \
EH_INIT3(ret, name, a0, n0, a1, n1, a2, n2) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2) { return ((__PIObject__ *)__o__)->name(n0, n1, n2); } \
static ret __stat_eh_v_##name##__(void * __o__, const PIVariantSimple & v0, const PIVariantSimple & v1, const PIVariantSimple & v2) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0), __VVALUE(a1, v1), __VVALUE(a2, v2)); \
} \
virtual ret name(a0 n0, a1 n1, a2 n2)
# define EVENT_VHANDLER4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2, a3 n3) { \
return ((__PIObject__ *)__o__)->name(n0, n1, n2, n3); \
} \
static ret __stat_eh_v_##name##__(void * __o__, \
const PIVariantSimple & v0, \
const PIVariantSimple & v1, \
const PIVariantSimple & v2, \
const PIVariantSimple & v3) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0), __VVALUE(a1, v1), __VVALUE(a2, v2), __VVALUE(a3, v3)); \
} \
virtual ret name(a0 n0, a1 n1, a2 n2, a3 n3)
# define EVENT_VHANDLER4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
EH_INIT4(ret, name, a0, n0, a1, n1, a2, n2, a3, n3) \
static ret __stat_eh_##name##__(void * __o__, a0 n0, a1 n1, a2 n2, a3 n3) { return ((__PIObject__ *)__o__)->name(n0, n1, n2, n3); } \
static ret __stat_eh_v_##name##__(void * __o__, \
const PIVariantSimple & v0, \
const PIVariantSimple & v1, \
const PIVariantSimple & v2, \
const PIVariantSimple & v3) { \
return ((__PIObject__ *)__o__)->name(__VVALUE(a0, v0), __VVALUE(a1, v1), __VVALUE(a2, v2), __VVALUE(a3, v3)); \
} \
virtual ret name(a0 n0, a1 n1, a2 n2, a3 n3)
# define EVENT_VHANDLER EVENT_VHANDLER0
# define EVENT0(name) \
EVENT_HANDLER0(void, name) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid); \
}
# define EVENT0(name) \
EVENT_HANDLER0(void, name) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid); \
}
# define EVENT1(name, a0, n0) \
EVENT_HANDLER1(void, name, a0, n0) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0); \
}
# define EVENT1(name, a0, n0) \
EVENT_HANDLER1(void, name, a0, n0) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0); \
}
# define EVENT2(name, a0, n0, a1, n1) \
EVENT_HANDLER2(void, name, a0, n0, a1, n1) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0, n1); \
}
# define EVENT2(name, a0, n0, a1, n1) \
EVENT_HANDLER2(void, name, a0, n0, a1, n1) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0, n1); \
}
# define EVENT3(name, a0, n0, a1, n1, a2, n2) \
EVENT_HANDLER3(void, name, a0, n0, a1, n1, a2, n2) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0, n1, n2); \
}
# define EVENT3(name, a0, n0, a1, n1, a2, n2) \
EVENT_HANDLER3(void, name, a0, n0, a1, n1, a2, n2) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0, n1, n2); \
}
# define EVENT4(name, a0, n0, a1, n1, a2, n2, a3, n3) \
EVENT_HANDLER4(void, name, a0, n0, a1, n1, a2, n2, a3, n3) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0, n1, n2, n3); \
}
# define EVENT4(name, a0, n0, a1, n1, a2, n2, a3, n3) \
EVENT_HANDLER4(void, name, a0, n0, a1, n1, a2, n2, a3, n3) { \
static uint eid = PIStringAscii(#name).hash(); \
PIObject::raiseEvent(this, eid, n0, n1, n2, n3); \
}
# define EVENT EVENT0
@@ -723,136 +782,240 @@
# define RAISE_EVENT RAISE_EVENT0
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler or event \"handler\" of object \"dest\".
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" объекта \"dest\".
//! \~\details
//! \~english
//! \"handler\" can handle subset arguments of \"event\".
//! Returns \a PIObject::Connection
//! \~russian
//! \"handler\" может принимать не все аргументы от \"event\".
//! Возвращает \a PIObject::Connection
# define CONNECTU(src, event, dest, handler) \
PIObject::piConnectU(src, PIStringAscii(#event), dest, dest, PIStringAscii(#handler), LOCATION);
PIObject::piConnectU(src, PIStringAscii(#event), dest, dest, PIStringAscii(#handler), LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler or event \"handler\" of object \"dest\".
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" объекта \"dest\".
//! \~\details
//! \~english
//! \"handler\" can handle subset arguments of \"event\".
//! Event handler will be executed by \"performer\" when \a PIObject::callQueuedEvents() called.
//! All argument types should be registered by \a REGISTER_VARIANT() macro, but many
//! common and PIP types already done.
//! Returns \a PIObject::Connection
//! \~russian
//! \"handler\" может принимать не все аргументы от \"event\".
//! Обработчик будет вызван объектом \"performer\" при вызове \a PIObject::callQueuedEvents().
//! Все типы аргументов должны быть зарегистрированы с помощью макроса \a REGISTER_VARIANT(),
//! однако многие стандартные и PIP типы уже там.
//! Возвращает \a PIObject::Connection
# define CONNECTU_QUEUED(src, event, dest, handler, performer) \
PIObject::piConnectU(src, PIStringAscii(#event), dest, dest, PIStringAscii(#handler), LOCATION, performer);
PIObject::piConnectU(src, PIStringAscii(#event), dest, dest, PIStringAscii(#handler), LOCATION, performer);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to lambda-expression \"functor\".
//! \~russian Соединяет событие \"event\" объекта \"src\" к лямбда-функции \"functor\".
//! \~\details
//! \~english
//! \"event\" and \"functor\" must has equal argument lists.
//! You should parentness \"functor\" with () if this is complex lambda.
//! Returns \a PIObject::Connection
//! \~russian
//! \"event\" и \"functor\" должны иметь одинаковые аргументы.
//! В случае сложной лямбда-функции оберните её ().
//! Возвращает \a PIObject::Connection
# define CONNECTL(src, event, functor) \
PIObject::piConnectLS(src, PIStringAscii(#event), PIObject::__newFunctor(&(src)->__stat_eh_##event##__, functor), LOCATION);
PIObject::piConnectLS(src, PIStringAscii(#event), PIObject::__newFunctor(&(src)->__stat_eh_##event##__, functor), LOCATION);
# define CONNECT0(ret, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *))(&(src)->__stat_eh_##event##__), \
0, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with
//! check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
# define CONNECT0(ret, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *))(&(src)->__stat_eh_##event##__), \
0, \
LOCATION);
# define CONNECT1(ret, a0, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0))(&(src)->__stat_eh_##event##__), \
1, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with
//! check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
# define CONNECT1(ret, a0, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0))(&(src)->__stat_eh_##event##__), \
1, \
LOCATION);
# define CONNECT2(ret, a0, a1, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0, a1))(&(src)->__stat_eh_##event##__), \
2, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with
//! check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
# define CONNECT2(ret, a0, a1, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0, a1))(&(src)->__stat_eh_##event##__), \
2, \
LOCATION);
# define CONNECT3(ret, a0, a1, a2, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0, a1, a2))(&(src)->__stat_eh_##event##__), \
3, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with
//! check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
# define CONNECT3(ret, a0, a1, a2, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0, a1, a2))(&(src)->__stat_eh_##event##__), \
3, \
LOCATION);
# define CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0, a1, a2, a3))(&(src)->__stat_eh_##event##__), \
4, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with
//! check of event and handler exists.
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
# define CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), \
(void *)(void (*)(void *, a0, a1, a2, a3))(&(src)->__stat_eh_##event##__), \
4, \
LOCATION);
# define CONNECT CONNECT0
# define WEAK_CONNECT0(ret, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *))(&(dest)->__stat_eh_##handler##__), \
0, \
0, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without
//! check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" без проверки наличия события и обработчика.
# define WEAK_CONNECT0(ret, src, event, dest, handler) \
PIObject::piConnect(src, PIStringAscii(#event), dest, dest, (void *)(ret(*)(void *))(&(dest)->__stat_eh_##handler##__), 0, 0, LOCATION);
# define WEAK_CONNECT1(ret, a0, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0))(&(dest)->__stat_eh_##handler##__), \
0, \
1, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without
//! check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" без проверки наличия события и обработчика.
# define WEAK_CONNECT1(ret, a0, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0))(&(dest)->__stat_eh_##handler##__), \
0, \
1, \
LOCATION);
# define WEAK_CONNECT2(ret, a0, a1, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1))(&(dest)->__stat_eh_##handler##__), \
0, \
2, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without
//! check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" без проверки наличия события и обработчика.
# define WEAK_CONNECT2(ret, a0, a1, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1))(&(dest)->__stat_eh_##handler##__), \
0, \
2, \
LOCATION);
# define WEAK_CONNECT3(ret, a0, a1, a2, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), \
0, \
3, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without
//! check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" без проверки наличия события и обработчика.
# define WEAK_CONNECT3(ret, a0, a1, a2, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2))(&(dest)->__stat_eh_##handler##__), \
0, \
3, \
LOCATION);
# define WEAK_CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), \
0, \
4, \
LOCATION);
//! \relatesalso PIObject
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without
//! check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта
//! \"dest\" без проверки наличия события и обработчика.
# define WEAK_CONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) \
PIObject::piConnect(src, \
PIStringAscii(#event), \
dest, \
dest, \
(void *)(ret(*)(void *, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__), \
0, \
4, \
LOCATION);
# define WEAK_CONNECT WEAK_CONNECT0
# define DISCONNECT0(ret, src, event, dest, handler) \
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *))(&(dest)->__stat_eh_##handler##__));
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *))(&(dest)->__stat_eh_##handler##__));
# define DISCONNECT1(ret, a0, src, event, dest, handler) \
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0))(&(dest)->__stat_eh_##handler##__));
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0))(&(dest)->__stat_eh_##handler##__));
# define DISCONNECT2(ret, a0, a1, src, event, dest, handler) \
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0, a1))(&(dest)->__stat_eh_##handler##__));
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0, a1))(&(dest)->__stat_eh_##handler##__));
# define DISCONNECT3(ret, a0, a1, a2, src, event, dest, handler) \
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0, a1, a2))(&(dest)->__stat_eh_##handler##__));
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0, a1, a2))(&(dest)->__stat_eh_##handler##__));
# define DISCONNECT4(ret, a0, a1, a2, a3, src, event, dest, handler) \
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__));
PIObject::piDisconnect(src, PIStringAscii(#event), dest, (void *)(ret(*)(void *, a0, a1, a2, a3))(&(dest)->__stat_eh_##handler##__));
# define DISCONNECT DISCONNECT0

View File

@@ -1,9 +1,13 @@
/*! \file picrypt.h
* \ingroup Crypt
* \~\brief
* \~english Cryptographic using libsodium
* \~russian Шифрование с помощью libsodium
*/
//! \ingroup Crypt
//! \file picrypt.h
//! \brief
//! \~english Cryptographic using libsodium
//! \~russian Шифрование с помощью libsodium
//! \details
//! \~english Class providing cryptographic operations using the libsodium library, including encryption, decryption, hashing, and digital
//! signatures.
//! \~russian Класс, предоставляющий криптографические операции с использованием библиотеки libsodium, включая шифрование, дешифрование,
//! хэширование и цифровые подписи.
/*
PIP - Platform Independent Primitives
Cryptographic class using lib Sodium
@@ -29,161 +33,140 @@
#include "pip_crypt_export.h"
#include "pistring.h"
//! \ingroup Crypt
//! \~\brief
//! \~english Class for encrypting and decrypting data.
//! \~russian Класс для шифрования и дешифрования данных.
//! \details
//! \~english Class providing cryptographic operations using the libsodium library, including encryption, decryption, hashing, and digital
//! signatures. It supports both instance-based and static method-based operations.
//! \~russian Класс, предоставляющий криптографические операции с использованием библиотеки libsodium, включая шифрование, дешифрование,
//! хэширование и цифровые подписи. Поддерживаются операции как на основе экземпляра класса, так и на основе статических методов.
//! \note
//! \~english Requires libsodium library initialization. All methods are thread-safe when using different keys.
//! \~russian Требуется инициализация библиотеки libsodium. Все методы потокобезопасны при использовании различных ключей.
class PIP_CRYPT_EXPORT PICrypt {
public:
//! \~\brief
//! \~english Constructor that generates a random key
//! \~russian Конструктор, генерирующий случайный ключ
//! \~english Constructor that generates a random key.
//! \~russian Конструктор, генерирующий случайный ключ.
PICrypt();
//! \~\brief
//! \~english Destructor
//! \~russian Деструктор
//! \~english Destructor.
//! \~russian Деструктор.
~PICrypt();
//! \~\brief
//! \~english Set key to "key", key size must be a \a sizeKey()
//! \~russian Установить ключ "key", размер ключа должен быть равен \a sizeKey()
//! \~english Set key to "key", key size must be a \a sizeKey().
//! \~russian Установить ключ "key", размер ключа должен быть равен \a sizeKey().
bool setKey(const PIByteArray & key);
//! \~\brief
//! \~english Generate and set key from keyphrase "secret"
//! \~russian Генерировать и установить ключ из ключевой фразы "secret"
//! \~english Generate and set key from keyphrase "secret".
//! \~russian Генерировать и установить ключ из ключевой фразы "secret".
bool setKey(const PIString & secret);
//! \~\brief
//! \~english Returns current key
//! \~russian Возвращает текущий ключ
//! \~english Returns current key.
//! \~russian Возвращает текущий ключ.
PIByteArray key() { return key_; }
//! \~\brief
//! \~english Encrypt given data "data", result size will be increased by \a sizeCrypt()
//! \~russian Зашифровать данные "data", размер результата увеличится на \a sizeCrypt()
//! \~english Encrypt given data "data", result size will be increased by \a sizeCrypt().
//! \~russian Зашифровать данные "data", размер результата увеличится на \a sizeCrypt().
PIByteArray crypt(const PIByteArray & data);
//! \~\brief
//! \~english Decrypt given data "crypt_data"
//! \~russian Расшифровать данные "crypt_data"
//! \~english Decrypt given data "crypt_data".
//! \~russian Расшифровать данные "crypt_data".
PIByteArray decrypt(const PIByteArray & crypt_data, bool * ok = 0);
//! \~\brief
//! \~english Encrypt given data "data" with key "key", result size will be increased by \a sizeCrypt()
//! \~russian Зашифровать данные "data" ключом "key", размер результата увеличится на \a sizeCrypt()
//! \~english Encrypt given data "data" with key "key", result size will be increased by \a sizeCrypt().
//! \~russian Зашифровать данные "data" ключом "key", размер результата увеличится на \a sizeCrypt().
static PIByteArray crypt(const PIByteArray & data, PIByteArray key);
//! \~\brief
//! \~english Decrypt given data "crypt_data" with key "key"
//! \~russian Расшифровать данные "crypt_data" ключом "key"
//! \~english Decrypt given data "crypt_data" with key "key".
//! \~russian Расшифровать данные "crypt_data" ключом "key".
static PIByteArray decrypt(const PIByteArray & crypt_data, PIByteArray key, bool * ok = 0);
//! \~\brief
//! \~english Generate hash from keyphrase "secret", may be used as a key for encryption
//! \~russian Генерировать хэш из ключевой фразы "secret", может использоваться в качестве ключа для шифрования
//! \~english Generate hash from keyphrase "secret", may be used as a key for encryption.
//! \~russian Генерировать хэш из ключевой фразы "secret", может использоваться в качестве ключа для шифрования.
static PIByteArray hash(PIString secret);
//! \~\brief
//! \~english Generate hash from bytearray
//! \~russian Генерировать хэш из массива байт
//! \~english Generate hash from bytearray.
//! \~russian Генерировать хэш из массива байт.
static PIByteArray hash(const PIByteArray & data);
//! \~\brief
//! \~english Generate hash from bytearray
//! \~russian Генерировать хэш из массива байт
//! \~english Generate hash from bytearray using provided key.
//! \~russian Генерировать хэш из массива байт с использованием предоставленного ключа.
static PIByteArray hash(const PIByteArray & data, const unsigned char * key, size_t keylen);
//! \~\brief
//! \~english Returns hash size
//! \~russian Возвращает размер хэша
//! \~english Returns hash size.
//! \~russian Возвращает размер хэша.
static size_t sizeHash();
//! \~\brief
//! \~english Generate short hash from string "s", may be used for hash table
//! \~russian Генерировать короткий хэш из строки "s", может использоваться для хэш-таблиц
//! \~english Generate short hash from string "s", may be used for hash table.
//! \~russian Генерировать короткий хэш из строки "s", может использоваться для хэш-таблиц.
static ullong shorthash(const PIString & s, PIByteArray key = PIByteArray());
//! \~\brief
//! \~english Generate random key
//! \~russian Генерировать случайный ключ
//! \~english Generate random key.
//! \~russian Генерировать случайный ключ.
static PIByteArray generateKey();
//! \~\brief
//! \~english Generate random buffer
//! \~russian Генерировать случайный буфер
//! \~english Generate random buffer.
//! \~russian Генерировать случайный буфер.
static PIByteArray generateRandomBuff(int size);
//! \~\brief
//! \~english Returns key size
//! \~russian Возвращает размер ключа
//! \~english Returns key size.
//! \~russian Возвращает размер ключа.
static size_t sizeKey();
//! \~\brief
//! \~english Returns size which be added to data size in encryption process
//! \~russian Возвращает размер, который будет добавлен к размеру данных в процессе шифрования
//! \~english Returns size which be added to data size in encryption process.
//! \~russian Возвращает размер, который будет добавлен к размеру данных в процессе шифрования.
static size_t sizeCrypt();
//! \~\brief
//! \~english Function randomly generates a secret key and a corresponding public key for digital signature
//! \~russian Функция случайным образом генерирует секретный ключ и соответствующий ему открытый ключ для цифровой подписи
//! \~english Function randomly generates a secret key and a corresponding public key for digital signature.
//! \~russian Функция случайным образом генерирует секретный ключ и соответствующий ему открытый ключ для цифровой подписи.
static bool generateSignKeys(PIByteArray & public_key, PIByteArray & secret_key);
//! \~\brief
//! \~english Function generates a secret key from input data and a corresponding public key for digital signature
//! \~russian Функция генерирует секретный ключ из входных данных и соответствующий ему открытый ключ для цифровой подписи
//! \~english Function generates a secret key from input data and a corresponding public key for digital signature.
//! \~russian Функция генерирует секретный ключ из входных данных и соответствующий ему открытый ключ для цифровой подписи.
static bool generateSignKeys(PIByteArray & public_key, PIByteArray & secret_key, const PIByteArray & seed);
//! \~\brief
//! \~english Function extract sign public key from sing secret key
//! \~russian Функция извлекает открытый ключ для подписи из секретного ключа для подписи
//! \~english Function extract sign public key from sing secret key.
//! \~russian Функция извлекает открытый ключ для подписи из секретного ключа для подписи.
static PIByteArray extractSignPublicKey(const PIByteArray & secret_key);
//! \~\brief
//! \~english Calculate digital signature for data
//! \~russian Вычислить цифровую подпись для данных
//! \~english Calculate digital signature for data.
//! \~russian Вычислить цифровую подпись для данных.
PIByteArray signMessage(const PIByteArray & data, const PIByteArray & secret_key);
//! \~\brief
//! \~english Verify digital signature of signed message
//! \~russian Проверить цифровую подпись подписанного сообщения
//! \~english Verify digital signature of signed message.
//! \~russian Проверить цифровую подпись подписанного сообщения.
bool verifySign(const PIByteArray & data, const PIByteArray & signature, const PIByteArray & public_key);
//! \~\brief
//! \~english Function randomly generates a secret key and a corresponding public key for authenticated encryption
//! \~english Function randomly generates a secret key and a corresponding public key for authenticated encryption.
//! \~russian Функция случайным образом генерирует секретный ключ и соответствующий ему открытый ключ для аутентифицированного
//! шифрования
//! шифрования.
static bool generateKeypair(PIByteArray & public_key, PIByteArray & secret_key);
//! \~\brief
//! \~english Function generates a secret key from input data and a corresponding public key for authenticated encryption
//! \~english Function generates a secret key from input data and a corresponding public key for authenticated encryption.
//! \~russian Функция генерирует секретный ключ из входных данных и соответствующий ему открытый ключ для аутентифицированного
//! шифрования
//! шифрования.
static bool generateKeypair(PIByteArray & public_key, PIByteArray & secret_key, const PIByteArray & seed);
//! \~\brief
//! \~english Encrypt given data "data"
//! \~russian Зашифровать данные "data"
//! \~english Encrypt given data "data".
//! \~russian Зашифровать данные "data".
PIByteArray crypt(const PIByteArray & data, const PIByteArray & public_key, const PIByteArray & secret_key);
//! \~\brief
//! \~english Decrypt given data "crypt_data"
//! \~russian Расшифровать данные "crypt_data"
//! \~english Decrypt given data "crypt_data".
//! \~russian Расшифровать данные "crypt_data".
PIByteArray decrypt(const PIByteArray & crypt_data, const PIByteArray & public_key, const PIByteArray & secret_key, bool * ok = 0);
//! \~\brief
//! \~english Generate password hash from "password"
//! \~russian Генерировать хэш пароля из "password"
//! \~english Generate password hash from "password".
//! \~russian Генерировать хэш пароля из "password".
static PIByteArray passwordHash(PIString password, const PIByteArray & seed);
//! \~\brief
//! \~english Returns libsodium version
//! \~russian Возвращает версию libsodium
//! \~english Returns libsodium version.
//! \~russian Возвращает версию libsodium.
static PIString version();
private:
//! \~english Initialize libsodium library.
//! \~russian Инициализировать библиотеку libsodium.
static bool init();
PIByteArray nonce_, key_;

View File

@@ -16,30 +16,19 @@
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//! \defgroup Crypt Crypt
//! \~\brief
//! \~english Cryptographic support
//! \~russian Поддержка шифрования
//!
//! \~\details
//! \~english \section cmake_module_Crypt Building with CMake
//! \~russian \section cmake_module_Crypt Сборка с использованием CMake
//!
//! \~\code
//! find_package(PIP REQUIRED)
//! target_link_libraries([target] PIP::Crypt)
//! \endcode
//!
//! \~english \par Common
//! \~russian \par Общее
//!
//! \~english
//! These files provides basic and symmetric cryptographic support via [libsodium](https://doc.libsodium.org/).
//!
//! \~russian
//! Эти файлы обеспечивают базовое и симметричное шифрование с помощью [libsodium](https://doc.libsodium.org/).
//!
//! \~\authors
//! \addtogroup Crypt
//! \file picryptmodule.h
//! \brief
//! \~english Cryptographic support module
//! \~russian Модуль поддержки шифрования
//! \details
//! \~english This module provides cryptographic support via libsodium library. It includes \ref piauth.h for authentication and \ref
//! picrypt.h for encryption/decryption.
//! \~russian Этот модуль предоставляет поддержку шифрования через библиотеку libsodium. Он включает \ref piauth.h для аутентификации и \ref
//! picrypt.h для шифрования/дешифрования. \note
//! \~english Requires libsodium library initialization.
//! \~russian Требуется инициализация библиотеки libsodium.
//! \authors
//! \~english
//! Ivan Pelipenko peri4ko@yandex.ru;
//! Andrey Bychkov work.a.b@yandex.ru;

View File

@@ -1,9 +1,15 @@
/*! \file piellipsoidmodel.h
* \ingroup Geo
* \~\brief
* \~english Geographical ellipsoid Earth models
* \~russian Географическая эллипсоидная модель Земли
*/
//! \addtogroup Geo
//! \{
//! \file piellipsoidmodel.h
//! \brief
//! \~english Geographical ellipsoid Earth models
//! \~russian Географическая эллипсоидная модель Земли
//! \details
//! \~english This module provides Earth ellipsoid models used in geodesy and navigation systems. It includes standard models like WGS84,
//! PZ90, GPS, and Krasovskiy.
//! \~russian Этот модуль предоставляет модели эллипсоидов Земли, используемые в геодезии и навигационных системах. Он включает стандартные
//! модели WGS84, ПЗ-90, GPS и Красовского.
//! \~
/*
PIP - Platform Independent Primitives
Contains geo ellipsoid models
@@ -26,7 +32,6 @@
#ifndef PIELLIPSOIDMODEL_H
#define PIELLIPSOIDMODEL_H
#include "pimathbase.h"
//! \~english Geographical ellipsoid Earth model

View File

@@ -16,39 +16,16 @@
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//! \defgroup Geo Geo
//! \~\brief
//! \~english Geographical position and Earth models
//! \~russian Географическая позиция и модели Земли
//!
//! \~\details
//! \~english \section cmake_module_Geo Building with CMake
//! \~russian \section cmake_module_Geo Сборка с использованием CMake
//!
//! \~\code
//! find_package(PIP REQUIRED)
//! target_link_libraries([target] PIP)
//! \endcode
//!
//! \~english \par Common
//! \~russian \par Общее
//!
//! \~english
//! These files provides geographical position, several Earth models and converting
//! from one model to another.
//!
//! \~russian
//! Эти файлы обеспечивают географическую позицию, несколько моделей Земли и
//! преобразования из одной модели в другую.
//!
//! \~\authors
//! \~english
//! Ivan Pelipenko peri4ko@yandex.ru;
//! Andrey Bychkov work.a.b@yandex.ru;
//! \~russian
//! Иван Пелипенко peri4ko@yandex.ru;
//! Андрей Бычков work.a.b@yandex.ru;
//!
//! \addtogroup Geo
//! \{
//! \file pigeomodule.h
//! \brief
//! \~english Geographical position and Earth models module
//! \~russian Модуль географической позиции и моделей Земли
//! \details
//! \~english This module provides classes for geographical position storage, coordinate transformations, and Earth models.
//! \~russian Этот модуль предоставляет классы для хранения географической позиции, преобразования координат и моделей Земли.
//! \~\}
#ifndef PIGEOMODULE_H
#define PIGEOMODULE_H

View File

@@ -1,9 +1,16 @@
/*! \file pigeoposition.h
* \ingroup Geo
* \~\brief
* \~english Class for geo position storage and conversions
* \~russian Класс для хранения географической позиции и преобразований
*/
//! \addtogroup Geo
//! \{
//! \file pigeoposition.h
//! \brief
//! \~english Class for geo position storage and conversions
//! \~russian Класс для хранения географической позиции и преобразований
//! \details
//! \~english This class provides functionality for storing and converting between different coordinate systems including geodetic,
//! geocentric, Cartesian, and spherical coordinates. It supports various ellipsoid models for Earth representation.
//! \~russian Этот класс предоставляет функциональность для хранения и преобразования между различными системами координат, включая
//! геодезическую, геоцентрическую, декартову и сферическую. Он поддерживает различные модели эллипсоида для представления Земли.
//! \~
/*
PIP - Platform Independent Primitives
Class for geo position storage and conversions
@@ -31,10 +38,16 @@
//! \~english Geographical position class
//! \~russian Класс географической позиции
//! \details
//! \~english Class for storing and manipulating geographical positions with support for multiple coordinate systems and ellipsoid models.
//! \~russian Класс для хранения и манипулирования географическими позициями с поддержкой нескольких систем координат и моделей эллипсоида.
class PIP_EXPORT PIGeoPosition: public PIMathVectorT3d {
public:
//! \~english Coordinate system types
//! \~russian Типы систем координат
//! \details
//! \~english Enumeration of supported coordinate systems for geographical positioning.
//! \~russian Перечисление поддерживаемых систем координат для географического позиционирования.
enum CoordinateSystem {
Unknown = 0, //!< Unknown coordinate system
Geodetic, //!< Geodetic latitude, longitude, and height above ellipsoid
@@ -70,10 +83,16 @@ public:
//! \~english Get position tolerance
//! \~russian Получить допуск позиции
//! \details
//! \~english Returns the current position tolerance value used for comparisons.
//! \~russian Возвращает текущее значение допуска позиции, используемое для сравнений.
static double getPositionTolerance() { return position_tolerance; }
//! \~english Default constructor
//! \~russian Конструктор по умолчанию
//! \details
//! \~english Creates a default position with zero coordinates in Cartesian system.
//! \~russian Создает позицию по умолчанию с нулевыми координатами в декартовой системе.
PIGeoPosition();
//! \~english Constructor with coordinates
@@ -83,6 +102,9 @@ public:
//! \param c Third coordinate
//! \param s Coordinate system
//! \param ell Ellipsoid model
//! \details
//! \~english Creates a position with specified coordinates in the specified coordinate system.
//! \~russian Создает позицию с заданными координатами в указанной системе координат.
PIGeoPosition(double a, double b, double c, CoordinateSystem s = Cartesian, PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
//! \~english Constructor from vector
@@ -90,6 +112,9 @@ public:
//! \param v Vector with coordinates
//! \param s Coordinate system
//! \param ell Ellipsoid model
//! \details
//! \~english Creates a position from a 3D vector with specified coordinate system.
//! \~russian Создает позицию из 3D вектора с указанной системой координат.
PIGeoPosition(PIMathVectorT3d v, CoordinateSystem s = Cartesian, PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
@@ -97,10 +122,16 @@ public:
//! \~russian Преобразовать в указанную систему координат
//! \param sys Target coordinate system
//! \return Reference to this position
//! \details
//! \~english Transforms the current position to the specified coordinate system.
//! \~russian Преобразует текущую позицию в указанную систему координат.
PIGeoPosition & transformTo(CoordinateSystem sys);
//! \~english Convert to geodetic coordinates
//! \~russian Преобразовать в геодезические координаты
//! \details
//! \~english Converts the position to geodetic coordinates (latitude, longitude, height).
//! \~russian Преобразует позицию в геодезические координаты (широта, долгота, высота).
PIGeoPosition & asGeodetic() {
transformTo(Geodetic);
return *this;
@@ -110,6 +141,9 @@ public:
//! \~russian Преобразовать в геодезические координаты с указанным эллипсоидом
//! \param ell Ellipsoid model to use
//! \return Reference to this position
//! \details
//! \~english Converts the position to geodetic coordinates using the specified ellipsoid model.
//! \~russian Преобразует позицию в геодезические координаты с использованием указанной модели эллипсоида.
PIGeoPosition & asGeodetic(const PIEllipsoidModel & ell) {
setEllipsoidModel(ell);
transformTo(Geodetic);
@@ -118,6 +152,9 @@ public:
//! \~english Convert to ECEF (cartesian) coordinates
//! \~russian Преобразовать в координаты ECEF (декартовы)
//! \details
//! \~english Converts the position to Earth-centered, Earth-fixed (ECEF) Cartesian coordinates.
//! \~russian Преобразует позицию в декартовы координаты с центром в Земле (ECEF).
PIGeoPosition & asECEF() {
transformTo(Cartesian);
return *this;
@@ -125,47 +162,80 @@ public:
//! \~english Get X coordinate (or first coordinate in Cartesian)
//! \~russian Получить координату X (или первую координату в Декартовой)
//! \details
//! \~english Returns the X coordinate (first element) in Cartesian coordinates.
//! \~russian Возвращает координату X (первый элемент) в декартовых координатах.
double x() const;
//! \~english Get Y coordinate (or second coordinate in Cartesian)
//! \~russian Получить координату Y (или вторую координату в Декартовой)
//! \details
//! \~english Returns the Y coordinate (second element) in Cartesian coordinates.
//! \~russian Возвращает координату Y (второй элемент) в декартовых координатах.
double y() const;
//! \~english Get Z coordinate (or third coordinate in Cartesian)
//! \~russian Получить координату Z (или третью координату в Декартовой)
//! \details
//! \~english Returns the Z coordinate (third element) in Cartesian coordinates.
//! \~russian Возвращает координату Z (третий элемент) в декартовых координатах.
double z() const;
//! \~english Get geodetic latitude in degrees
//! \~russian Получить геодезическую широту в градусах
//! \details
//! \~english Returns the geodetic latitude in degrees.
//! \~russian Возвращает геодезическую широту в градусах.
double latitudeGeodetic() const;
//! \~english Get geocentric latitude in degrees
//! \~russian Получить геоцентрическую широту в градусах
//! \details
//! \~english Returns the geocentric latitude in degrees.
//! \~russian Возвращает геоцентрическую широту в градусах.
double latitudeGeocentric() const;
//! \~english Get longitude in degrees
//! \~russian Получить долготу в градусах
//! \details
//! \~english Returns the longitude in degrees.
//! \~russian Возвращает долготу в градусах.
double longitude() const;
//! \~english Get theta (angle from Z axis) in degrees
//! \~russian Получить тета (угол от оси Z) в градусах
//! \details
//! \~english Returns the theta angle (angle from Z axis) in degrees for spherical coordinates.
//! \~russian Возвращает угол тета (угол от оси Z) в градусах для сферических координат.
double theta() const;
//! \~english Get phi (angle in XY plane from X axis) in degrees
//! \~russian Получить фи (угол в плоскости XY от оси X) в градусах
//! \details
//! \~english Returns the phi angle (angle in XY plane from X axis) in degrees for spherical coordinates.
//! \~russian Возвращает угол фи (угол в плоскости XY от оси X) в градусах для сферических координат.
double phi() const;
//! \~english Get radius (distance from Earth center)
//! \~russian Получить радиус (расстояние от центра Земли)
//! \details
//! \~english Returns the radius (distance from Earth center) in meters.
//! \~russian Возвращает радиус (расстояние от центра Земли) в метрах.
double radius() const;
//! \~english Get height above ellipsoid
//! \~russian Получить высоту над эллипсоидом
//! \details
//! \~english Returns the height above the ellipsoid in meters.
//! \~russian Возвращает высоту над эллипсоидом в метрах.
double height() const;
//! \~english Set ellipsoid model for this position
//! \~russian Установить модель эллипсоида для этой позиции
//! \param ell Ellipsoid model
//! \details
//! \~english Sets the ellipsoid model used for coordinate conversions.
//! \~russian Устанавливает модель эллипсоида, используемую для преобразований координат.
void setEllipsoidModel(const PIEllipsoidModel & ell) { el = ell; }
//! \~english Set position from geodetic coordinates
@@ -175,6 +245,9 @@ public:
//! \param ht Height above ellipsoid
//! \param ell Ellipsoid model (default WGS84)
//! \return Reference to this position
//! \details
//! \~english Sets the position from geodetic coordinates (latitude, longitude, height).
//! \~russian Устанавливает позицию из геодезических координат (широта, долгота, высота).
PIGeoPosition & setGeodetic(double lat, double lon, double ht, PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
//! \~english Set position from geocentric coordinates
@@ -183,6 +256,9 @@ public:
//! \param lon Longitude in degrees
//! \param rad Radius
//! \return Reference to this position
//! \details
//! \~english Sets the position from geocentric coordinates (latitude, longitude, radius).
//! \~russian Устанавливает позицию из геоцентрических координат (широта, долгота, радиус).
PIGeoPosition & setGeocentric(double lat, double lon, double rad);
//! \~english Set position from spherical coordinates
@@ -191,6 +267,9 @@ public:
//! \param phi Angle in XY plane from X axis in degrees
//! \param rad Radius
//! \return Reference to this position
//! \details
//! \~english Sets the position from spherical coordinates (theta, phi, radius).
//! \~russian Устанавливает позицию из сферических координат (тета, фи, радиус).
PIGeoPosition & setSpherical(double theta, double phi, double rad);
//! \~english Set position from ECEF coordinates
@@ -199,18 +278,27 @@ public:
//! \param y Y coordinate in meters
//! \param z Z coordinate in meters
//! \return Reference to this position
//! \details
//! \~english Sets the position from Earth-centered, Earth-fixed (ECEF) Cartesian coordinates.
//! \~russian Устанавливает позицию из декартовых координат с центром в Земле (ECEF).
PIGeoPosition & setECEF(double x, double y, double z);
//! \~english Convert spherical to Cartesian coordinates
//! \~russian Преобразовать сферические в декартовы координаты
//! \param tpr Input spherical (theta, phi, radius)
//! \param xyz Output Cartesian (x, y, z)
//! \details
//! \~english Converts spherical coordinates (theta, phi, radius) to Cartesian (x, y, z).
//! \~russian Преобразует сферические координаты (тета, фи, радиус) в декартовы (x, y, z).
static void convertSphericalToCartesian(const PIMathVectorT3d & tpr, PIMathVectorT3d & xyz);
//! \~english Convert Cartesian to spherical coordinates
//! \~russian Преобразовать декартовы в сферические координаты
//! \param xyz Input Cartesian (x, y, z)
//! \param tpr Output spherical (theta, phi, radius)
//! \details
//! \~english Converts Cartesian coordinates (x, y, z) to spherical (theta, phi, radius).
//! \~russian Преобразует декартовы координаты (x, y, z) в сферические (тета, фи, радиус).
static void convertCartesianToSpherical(const PIMathVectorT3d & xyz, PIMathVectorT3d & tpr);
//! \~english Convert Cartesian (ECEF) to geodetic coordinates
@@ -218,6 +306,9 @@ public:
//! \param xyz Input Cartesian (x, y, z)
//! \param llh Output geodetic (latitude, longitude, height)
//! \param ell Ellipsoid model (default WGS84)
//! \details
//! \~english Converts Earth-centered, Earth-fixed (ECEF) Cartesian coordinates to geodetic coordinates.
//! \~russian Преобразует декартовы координаты с центром в Земле (ECEF) в геодезические координаты.
static void convertCartesianToGeodetic(const PIMathVectorT3d & xyz,
PIMathVectorT3d & llh,
PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
@@ -227,6 +318,9 @@ public:
//! \param llh Input geodetic (latitude, longitude, height)
//! \param xyz Output Cartesian (x, y, z)
//! \param ell Ellipsoid model (default WGS84)
//! \details
//! \~english Converts geodetic coordinates to Earth-centered, Earth-fixed (ECEF) Cartesian coordinates.
//! \~russian Преобразует геодезические координаты в декартовы координаты с центром в Земле (ECEF).
static void convertGeodeticToCartesian(const PIMathVectorT3d & llh,
PIMathVectorT3d & xyz,
PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
@@ -235,12 +329,18 @@ public:
//! \~russian Преобразовать декартовы (ECEF) в геоцентрические координаты
//! \param xyz Input Cartesian (x, y, z)
//! \param llr Output geocentric (latitude, longitude, radius)
//! \details
//! \~english Converts Earth-centered, Earth-fixed (ECEF) Cartesian coordinates to geocentric coordinates.
//! \~russian Преобразует декартовы координаты с центром в Земле (ECEF) в геоцентрические координаты.
static void convertCartesianToGeocentric(const PIMathVectorT3d & xyz, PIMathVectorT3d & llr);
//! \~english Convert geocentric to Cartesian (ECEF)
//! \~russian Преобразовать геоцентрические в декартовы (ECEF)
//! \param llr Input geocentric (latitude, longitude, radius)
//! \param xyz Output Cartesian (x, y, z)
//! \details
//! \~english Converts geocentric coordinates to Earth-centered, Earth-fixed (ECEF) Cartesian coordinates.
//! \~russian Преобразует геоцентрические координаты в декартовы координаты с центром в Земле (ECEF).
static void convertGeocentricToCartesian(const PIMathVectorT3d & llr, PIMathVectorT3d & xyz);
//! \~english Convert geocentric to geodetic
@@ -248,6 +348,9 @@ public:
//! \param llr Input geocentric (latitude, longitude, radius)
//! \param llh Output geodetic (latitude, longitude, height)
//! \param ell Ellipsoid model (default WGS84)
//! \details
//! \~english Converts geocentric coordinates to geodetic coordinates using the specified ellipsoid model.
//! \~russian Преобразует геоцентрические координаты в геодезические с использованием указанной модели эллипсоида.
static void convertGeocentricToGeodetic(const PIMathVectorT3d & llr,
PIMathVectorT3d & llh,
PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
@@ -257,6 +360,9 @@ public:
//! \param llh Input geodetic (latitude, longitude, height)
//! \param llr Output geocentric (latitude, longitude, radius)
//! \param ell Ellipsoid model (default WGS84)
//! \details
//! \~english Converts geodetic coordinates to geocentric coordinates using the specified ellipsoid model.
//! \~russian Преобразует геодезические координаты в геоцентрические с использованием указанной модели эллипсоида.
static void convertGeodeticToGeocentric(const PIMathVectorT3d & llh,
PIMathVectorT3d & llr,
PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
@@ -266,10 +372,16 @@ public:
//! \param geolat Geodetic latitude in degrees
//! \param ell Ellipsoid model (default WGS84)
//! \return Radius in meters
//! \details
//! \~english Computes the radius of the ellipsoid at the specified geodetic latitude.
//! \~russian Вычисляет радиус эллипсоида в указанной геодезической широте.
static double radiusEarth(double geolat, PIEllipsoidModel ell = PIEllipsoidModel::WGS84Ellipsoid());
//! \~english Compute radius of ellipsoid at current position
//! \~russian Вычислить радиус эллипсоида в текущей позиции
//! \details
//! \~english Computes the radius of the ellipsoid at the current position's latitude.
//! \~russian Вычисляет радиус эллипсоида в широте текущей позиции.
double radiusEarth() const {
PIGeoPosition p(*this);
p.transformTo(PIGeoPosition::Geodetic);
@@ -281,6 +393,9 @@ public:
//! \param a First position
//! \param b Second position
//! \return Range in meters
//! \details
//! \~english Computes the Euclidean distance between two positions in Cartesian coordinates.
//! \~russian Вычисляет евклидово расстояние между двумя позициями в декартовых координатах.
static double range(const PIGeoPosition & a, const PIGeoPosition & b);
//! \~english Compute range from this position to another
@@ -293,51 +408,82 @@ public:
//! \~russian Вычислить угол возвышения до целевой позиции
//! \param p Target position
//! \return Elevation angle in degrees
//! \details
//! \~english Computes the elevation angle (angle above the horizon) to the target position.
//! \~russian Вычисляет угол возвышения (угол над горизонтом) до целевой позиции.
double elevation(const PIGeoPosition & p) const;
//! \~english Compute geodetic elevation angle to target position
//! \~russian Вычислить геодезический угол возвышения до целевой позиции
//! \param p Target position
//! \return Elevation angle in degrees
//! \details
//! \~english Computes the geodetic elevation angle (angle above the local ellipsoid tangent plane) to the target position.
//! \~russian Вычисляет геодезический угол возвышения (угол над касательной плоскостью локального эллипсоида) до целевой позиции.
double elevationGeodetic(const PIGeoPosition & p) const;
//! \~english Compute azimuth angle to target position
//! \~russian Вычислить азимут до целевой позиции
//! \param p Target position
//! \return Azimuth angle in degrees
//! \details
//! \~english Computes the azimuth angle (horizontal angle from North) to the target position.
//! \~russian Вычисляет азимут (горизонтальный угол от севера) до целевой позиции.
double azimuth(const PIGeoPosition & p) const;
//! \~english Compute geodetic azimuth angle to target position
//! \~russian Вычислить геодезический азимут до целевой позиции
//! \param p Target position
//! \return Azimuth angle in degrees
//! \details
//! \~english Computes the geodetic azimuth angle (azimuth relative to the local ellipsoid tangent plane) to the target position.
//! \~russian Вычисляет геодезический азимут (азимут относительно касательной плоскости локального эллипсоида) до целевой позиции.
double azimuthGeodetic(const PIGeoPosition & p) const;
//! \~english Get radius of curvature of the meridian
//! \~russian Получить радиус кривизны меридиана
//! \return Radius in meters
//! \details
//! \~english Returns the radius of curvature of the meridian (normal section through the poles) at the current position.
//! \~russian Возвращает радиус кривизны меридиана (нормальное сечение через полюса) в текущей позиции.
double getCurvMeridian() const;
//! \~english Get radius of curvature in the prime vertical
//! \~russian Получить радиус кривизны в вертикале
//! \return Radius in meters
//! \details
//! \~english Returns the radius of curvature in the prime vertical (normal section perpendicular to the meridian) at the current
//! position.
//! \~russian Возвращает радиус кривизны в вертикале (нормальное сечение, перпендикулярное меридиану) в текущей позиции.
double getCurvPrimeVertical() const;
//! \~english Get as PIMathVectorT3d
//! \~russian Получить как PIMathVectorT3d
//! \return Reference to underlying vector
//! \details
//! \~english Returns a reference to the underlying PIMathVectorT3d object.
//! \~russian Возвращает ссылку на объект PIMathVectorT3d.
const PIMathVectorT3d & vector() const { return *this; }
//! \~english Assignment from vector
//! \~russian Присваивание из вектора
//! \details
//! \~english Assigns values from a PIMathVectorT3d object.
//! \~russian Присваивает значения из объекта PIMathVectorT3d.
PIGeoPosition & operator=(const PIMathVectorT3d & v);
//! \~english Subtraction
//! \~russian Вычитание
//! \details
//! \~english Subtracts another position from this position.
//! \~russian Вычитает другую позицию из текущей позиции.
PIGeoPosition & operator-=(const PIGeoPosition & right);
//! \~english Addition
//! \~russian Сложение
//! \details
//! \~english Adds another position to this position.
//! \~russian Добавляет другую позицию к текущей позиции.
PIGeoPosition & operator+=(const PIGeoPosition & right);
//! \~english Subtraction
@@ -357,10 +503,16 @@ public:
//! \~english Equality comparison
//! \~russian Сравнение на равенство
//! \details
//! \~english Compares two positions for equality within the current tolerance.
//! \~russian Сравнивает две позиции на равенство в пределах текущего допуска.
bool operator==(const PIGeoPosition & right) const;
//! \~english Inequality comparison
//! \~russian Сравнение на неравенство
//! \details
//! \~english Compares two positions for inequality within the current tolerance.
//! \~russian Сравнивает две позиции на неравенство в пределах текущего допуска.
bool operator!=(const PIGeoPosition & right) const { return !(operator==(right)); }
@@ -374,6 +526,9 @@ private:
//! \~english Subtraction
//! \~russian Вычитание
//! \details
//! \~english Subtracts two positions by converting them to Cartesian coordinates and performing element-wise subtraction.
//! \~russian Вычитает две позиции путем преобразования их в декартовы координаты и выполнения поэлементного вычитания.
inline PIGeoPosition operator-(const PIGeoPosition & left, const PIGeoPosition & right) {
PIGeoPosition l(left), r(right);
l.transformTo(PIGeoPosition::Cartesian);
@@ -383,6 +538,9 @@ inline PIGeoPosition operator-(const PIGeoPosition & left, const PIGeoPosition &
}
//! \~english Addition
//! \~russian Сложение
//! \details
//! \~english Adds two positions by converting them to Cartesian coordinates and performing element-wise addition.
//! \~russian Складывает две позиции путем преобразования их в декартовы координаты и выполнения поэлементного сложения.
inline PIGeoPosition operator+(const PIGeoPosition & left, const PIGeoPosition & right) {
PIGeoPosition l(left), r(right);
l.transformTo(PIGeoPosition::Cartesian);
@@ -392,6 +550,9 @@ inline PIGeoPosition operator+(const PIGeoPosition & left, const PIGeoPosition &
}
//! \~english Scalar multiplication (double)
//! \~russian Умножение на скаляр (double)
//! \details
//! \~english Multiplies a position by a double scalar value.
//! \~russian Умножает позицию на скалярное значение типа double.
inline PIGeoPosition operator*(const double & scale, const PIGeoPosition & right) {
PIMathVectorT3d tmp(right);
tmp *= scale;
@@ -399,16 +560,25 @@ inline PIGeoPosition operator*(const double & scale, const PIGeoPosition & right
}
//! \~english Scalar multiplication (double)
//! \~russian Умножение на скаляр (double)
//! \details
//! \~english Multiplies a position by a double scalar value.
//! \~russian Умножает позицию на скалярное значение типа double.
inline PIGeoPosition operator*(const PIGeoPosition & left, const double & scale) {
return operator*(scale, left);
}
//! \~english Scalar multiplication (int)
//! \~russian Умножение на скаляр (int)
//! \details
//! \~english Multiplies a position by an integer scalar value.
//! \~russian Умножает позицию на скалярное значение типа int.
inline PIGeoPosition operator*(const int & scale, const PIGeoPosition & right) {
return operator*(double(scale), right);
}
//! \~english Scalar multiplication (int)
//! \~russian Умножение на скаляр (int)
//! \details
//! \~english Multiplies a position by an integer scalar value.
//! \~russian Умножает позицию на скалярное значение типа int.
inline PIGeoPosition operator*(const PIGeoPosition & left, const int & scale) {
return operator*(double(scale), left);
}

View File

@@ -16,28 +16,20 @@
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//! \defgroup HTTPServer HTTPServer
//! \defgroup HTTPClient HTTPClient
//! \~\brief
//! \~english HTTP client
//! \~russian HTTP сервер
//!
//! \~\details
//! \~english \section cmake_module_HTTPServer Building with CMake
//! \~russian \section cmake_module_HTTPServer Сборка с использованием CMake
//! \~russian HTTP клиент
//!
//! \~\code
//! find_package(PIP REQUIRED)
//! target_link_libraries([target] PIP::HTTPServer)
//! target_link_libraries([target] PIP::HTTPClient)
//! \endcode
//!
//! \~english \par Common
//! \~russian \par Общее
//!
//! \~\details
//! \~english
//! These files provides HTTP server based on libmicrohttpd
//!
//! These files provide HTTP client functionality using libcurl for performing asynchronous HTTP requests with callbacks.
//! \~russian
//! Эти файлы обеспечивают HTTP сервер, основанный на libmicrohttpd
//! Эти файлы предоставляют функциональность HTTP клиента с использованием libcurl для выполнения асинхронных HTTP запросов с callback-ми.
//!
//! \~\authors
//! \~english
@@ -45,6 +37,19 @@
//! \~russian
//! Иван Пелипенко peri4ko@yandex.ru;
//!
//! \file pihttpclientmodule.h
//! \ingroup HTTPClient
//! \~\brief
//! \~english HTTP client module includes for PIP library
//! \~russian Модуль инклюдов HTTP клиента для библиотеки PIP
//! \details
//! \~english
//! This file includes all HTTP client module headers providing async HTTP client functionality
//! using libcurl for performing HTTP requests with callbacks.
//! \~russian
//! Этот файл включает все заголовки модуля HTTP клиента, предоставляющие функциональность
//! асинхронного HTTP клиента с использованием libcurl.
//!
#ifndef pihttpclientmodule_H
#define pihttpclientmodule_H

View File

@@ -43,28 +43,33 @@ public:
}
//! \~english Registers handler for unregistered pathes
//! \~english Registers handler for unregistered paths
//! \~russian Регистрирует обработчик для незарегистрированных путей
//! \~\details Sets the fallback handler that will be called when no registered path matches the incoming request
void registerUnhandled(RequestFunction functor);
//! \~english Registers handler for unregistered pathes
//! \~english Registers handler for unregistered paths
//! \~russian Регистрирует обработчик для незарегистрированных путей
//! \~\details Sets the fallback handler that will be called when no registered path matches the incoming request
template<typename T>
void registerUnhandled(T * o, PIHTTP::MessageMutable (T::*function)(const PIHTTP::MessageConst &)) {
registerUnhandled([o, function](const PIHTTP::MessageConst & m) { return (o->*function)(m); });
}
//! \~english Unregisters handler for specific path and method
//! \~russian Удаляет обработчик для указанного пути и метода
void unregisterPath(const PIString & path, PIHTTP::Method method);
//! \~english Unregisters all handlers for specific path
//! \~russian Удаляет все обработчики для указанного пути
//! \~\details Removes all registered endpoints that match the specified path, regardless of HTTP method
void unregisterPath(const PIString & path);
//! \~english Adds header to all server responses
//! \~russian Добавляет заголовок ко всем ответам сервера
//! \~\details The specified header will be added to every HTTP response generated by this server
void addReplyHeader(const PIString & name, const PIString & value) { reply_headers[name] = value; }
//! \~english Removes header from server responses
@@ -86,33 +91,71 @@ private:
AnyMany = 0x20
};
//! \~english Path element type
//! \~russian Тип элемента пути
Type type = Type::Fixed;
//! \~english Original path pattern string
//! \~russian Оригинальная строка шаблона пути
PIString source;
//! \~english Path parts split by wildcards
//! \~russian Части пути, разделенные по wildcard'ам
PIStringList parts;
//! \~english Argument name mapping
//! \~russian Сопоставление имен аргументов
PIMap<int, PIString> arguments;
//! \~english Constructs path element from registration string
//! \~russian Создает элемент пути из строки регистрации
PathElement(const PIString & reg = {});
//! \~english Matches input path against this element
//! \~russian Сопоставляет входной путь с этим элементом
bool match(const PIString & in, PIMap<PIString, PIString> & ext_args) const;
//! \~english Returns path matching priority
//! \~russian Возвращает приоритет сопоставления пути
uint priority() const;
};
struct Endpoint {
//! \~english Request path
//! \~russian Путь запроса
PIStringList path;
//! \~english HTTP method
//! \~russian HTTP метод
PIHTTP::Method method = PIHTTP::Method::Unknown;
//! \~english Request handler function
//! \~russian Функция обработчик запроса
RequestFunction function;
//! \~english Path element types flags
//! \~russian Флаги типов элементов пути
PIFlags<PathElement::Type> path_types;
//! \~english Prepared path elements for matching
//! \~russian Подготовленные элементы пути для сопоставления
PIVector<PathElement> prepared_path;
//! \~english Path matching priority
//! \~russian Приоритет сопоставления пути
uint priority = 0;
//! \~english Creates endpoint from path string
//! \~russian Создает эндпоинт из строки пути
bool create(const PIString & p);
//! \~english Matches path against endpoint
//! \~russian Сопоставляет путь с эндпоинтом
bool match(const PIStringList & in_path, PIMap<PIString, PIString> & ext_args) const;
};
//! \~english Splits path string into path segments
//! \~russian Разбивает строку пути на сегменты
static PIStringList splitPath(const PIString & path);
//! \~english Custom reply headers
//! \~russian Пользовательские заголовки ответов
PIMap<PIString, PIString> reply_headers;
//! \~english Registered endpoints grouped by priority
//! \~russian Зарегистрированные эндпоинты, сгруппированные по приоритету
PIMap<uint, PIVector<Endpoint>> endpoints;
//! \~english Fallback request handler
//! \~russian Функция обработчик для fallback запросов
RequestFunction unhandled;
};

View File

@@ -49,6 +49,17 @@
#ifndef pihttpservermodule_H
#define pihttpservermodule_H
//! \~\addtogroup HTTPServer
//! \~\{
//! \~\file pihttpservermodule.h
//! \~\brief HTTP server module includes
//! \~english HTTP server module includes
//! \~russian Модуль включений HTTP сервера
//! \~\details
//! \~english This file provides includes for the HTTP server module
//! \~russian Этот файл предоставляет включения для модуля HTTP сервера
//! \~\}
#include "pihttpserver.h"
#endif

View File

@@ -1,9 +1,16 @@
/*! \file pibasetransfer.h
* \ingroup IO
* \~\brief
* \~english Base class for reliable send and receive data in fixed packets with error correction, pause and resume
* \~russian Базовый класс для надежного обмена данными с помощью фиксированных пакетов с коррекцией ошибок и паузой
*/
//! \addtogroup IO
//! \{
//! \file pibasetransfer.h
//! \brief Base class for reliable send and receive data in fixed packets with error correction, pause and resume
//! \~english Base class for reliable send and receive data in fixed packets with error correction, pause and resume
//! \~russian Базовый класс для надежного обмена данными с помощью фиксированных пакетов с коррекцией ошибок и паузой
//! \details
//! \~english This class provides a foundation for reliable data transfer with features like error correction, pause/resume functionality,
//! and packet-based communication.
//! \~russian Этот класс предоставляет основу для надежной передачи данных с возможностью коррекции ошибок, паузы/возобновления и пакетной
//! коммуникации.
//! \~\}
/*
PIP - Platform Independent Primitives
Base class for reliable send and receive data in fixed packets with error correction, pause and resume
@@ -46,6 +53,26 @@ public:
#pragma pack(push, 1)
//! \~english Packet header structure
//! \~russian Структура заголовка пакета
//! \var PacketHeader::sig
//! \~english Packet signature
//! \~russian Подпись пакета
//! \var PacketHeader::type
//! \~english Packet type
//! \~russian Тип пакета
//! \var PacketHeader::session_id
//! \~english Session identifier
//! \~russian Идентификатор сессии
//! \var PacketHeader::id
//! \~english Packet identifier
//! \~russian Идентификатор пакета
//! \var PacketHeader::crc
//! \~english CRC checksum
//! \~russian Контрольная сумма CRC
//! \var PacketHeader::check_sig()
//! \~english Check if signature is valid
//! \~russian Проверка валидности подписи
//! \~english \return true if signature is valid, false otherwise
//! \~russian \return true если подпись валидна, false в противном случае
struct PIP_EXPORT PacketHeader {
uint sig;
int type; // PacketType
@@ -59,6 +86,15 @@ public:
//! \~english Part information structure
//! \~russian Структура информации о части
//! \var Part::id
//! \~english Part identifier
//! \~russian Идентификатор части
//! \var Part::size
//! \~english Part size in bytes
//! \~russian Размер части в байтах
//! \var Part::start
//! \~english Start position in bytes
//! \~russian Начальная позиция в байтах
struct PIP_EXPORT Part {
//! \~english Constructor
//! \~russian Конструктор
@@ -91,18 +127,26 @@ public:
//! \~english Set pause state
//! \~russian Установить состояние паузы
//! \~english \param pause_ Pause state to set
//! \~russian \param pause_ Состояние паузы для установки
void setPause(bool pause_);
//! \~english Set packet size
//! \~russian Установить размер пакета
//! \~english \param size Packet size in bytes
//! \~russian \param size Размер пакета в байтах
void setPacketSize(int size) { packet_size = size; }
//! \~english Get packet size
//! \~russian Получить размер пакета
//! \~english \return Packet size in bytes
//! \~russian \return Размер пакета в байтах
int packetSize() const { return packet_size; }
//! \~english Set timeout in seconds
//! \~russian Установить таймаут в секундах
//! \~english \param sec Timeout value in seconds
//! \~russian \param sec Значение таймаута в секундах
void setTimeout(double sec);
//! \~english Get timeout in seconds
@@ -111,6 +155,8 @@ public:
//! \~english Enable/disable CRC check
//! \~russian Включить/выключить проверку CRC
//! \~english \param en Enable CRC check
//! \~russian \param en Включить проверку CRC
void setCRCEnabled(bool en = true) { crc_enabled = en; }
//! \~english Check if CRC is enabled
@@ -119,50 +165,116 @@ public:
//! \~english Get state as string
//! \~russian Получить состояние в виде строки
//! \~english \return State string
//! \~russian \return Строка состояния
PIString stateString() const { return state_string; }
//! \~english Get packet map as string
//! \~russian Получить карту пакетов в виде строки
//! \~english \return Packet map string
//! \~russian \return Строка карты пакетов
PIString packetMap() const { return pm_string; }
//! \~english Get total bytes count
//! \~russian Получить общее количество байт
//! \~english \return Total bytes count
//! \~russian \return Общее количество байт
llong bytesAll() const { return bytes_all; }
//! \~english Get current bytes count
//! \~russian Получить текущее количество байт
//! \~english \return Current bytes count
//! \~russian \return Текущее количество байт
llong bytesCur() const { return bytes_cur; }
//! \~english Get diagnostics object
//! \~russian Получить объект диагностики
//! \~english \return Diagnostic object reference
//! \~russian \return Ссылка на объект диагностики
const PIDiagnostics & diagnostic() { return diag; }
//! \~english Get packet signature
//! \~russian Получить подпись пакета
//! \~english \return Packet signature value
//! \~russian \return Значение подписи пакета
static uint packetSignature() { return signature; }
//! \~english Event handler for received data
//! \~russian Обработчик события получения данных
EVENT_HANDLER1(void, received, PIByteArray, data);
//! \~english Event handler to stop send and receive operations
//! \~russian Обработчик события остановки отправки и приема
EVENT_HANDLER(void, stop) {
stopSend();
stopReceive();
}
//! \~english Event handler to pause transfer
//! \~russian Обработчик события паузы передачи
EVENT_HANDLER(void, pause) { setPause(true); }
//! \~english Event handler to resume transfer
//! \~russian Обработчик события возобновления передачи
EVENT_HANDLER(void, resume) { setPause(false); }
//! \~english Event fired when receive operation starts
//! \~russian Событие при начале операции приема
EVENT(receiveStarted);
//! \~english Event fired when transfer is paused
//! \~russian Событие при паузе передачи
EVENT(paused);
//! \~english Event fired when transfer is resumed
//! \~russian Событие при возобновлении передачи
EVENT(resumed);
//! \~english Event fired when receiving finishes
//! \~russian Событие при завершении приема
//! \~english \param ok Success status
//! \~russian \param ok Статус успешности
EVENT1(receiveFinished, bool, ok);
//! \~english Event fired when sending starts
//! \~russian Событие при начале отправки
EVENT(sendStarted);
//! \~english Event fired when sending finishes
//! \~russian Событие при завершении отправки
//! \~english \param ok Success status
//! \~russian \param ok Статус успешности
EVENT1(sendFinished, bool, ok);
//! \~english Event to request data for sending
//! \~russian Событие запроса данных для отправки
//! \~english \param data Data to send
//! \~russian \param data Данные для отправки
EVENT1(sendRequest, PIByteArray &, data);
protected:
//! \~english Build session from parts
//! \~russian Создать сессию из частей
//! \~english \param parts Vector of parts
//! \~russian \param parts Вектор частей
void buildSession(PIVector<Part> parts);
//! \~english Build packet from part
//! \~russian Создать пакет из части
//! \~english \param fi Part information
//! \~russian \param fi Информация о части
//! \~english \return Packet data
//! \~russian \return Данные пакета
virtual PIByteArray buildPacket(Part fi) = 0;
//! \~english Receive part of data
//! \~russian Получить часть данных
//! \~english \param fi Part information
//! \~russian \param fi Информация о части
//! \~english \param ba Part data
//! \~russian \param ba Данные части
//! \~english \param pheader Packet header
//! \~russian \param pheader Заголовок пакета
virtual void receivePart(Part fi, PIByteArray ba, PIByteArray pheader) = 0;
//! \~english Begin receive operation
//! \~russian Начать операцию приема
virtual void beginReceive() { ; }
//! \~english Get custom header
//! \~russian Получить пользовательский заголовок
//! \~english \return Custom header data
//! \~russian \return Данные пользовательского заголовка
virtual PIByteArray customHeader() { return PIByteArray(); }
//! \~english Process send operation
//! \~russian Обработать операцию отправки
bool send_process();
uint packet_header_size, part_header_size;

View File

@@ -1,9 +1,13 @@
/*! \file pibroadcast.h
* \ingroup IO-Utils
* \~\brief
* \~english Broadcast for all interfaces, including loopback
* \~russian Широкое вещание на все интерфейсы, включая loopback
*/
//! \addtogroup IO
//! \{
//! \file pibroadcast.h
//! \brief
//! \~english Broadcast for all interfaces, including loopback
//! \~russian Широкое вещание на все интерфейсы, включая loopback
//! \details
//! \~english Provides broadcast communication capabilities across all network interfaces including loopback
//! \~russian Предоставляет возможности широковещательной передачи данных по всем сетевым интерфейсам, включая loopback
//! \~\}
/*
PIP - Platform Independent Primitives
Broadcast for all interfaces, including loopback
@@ -39,13 +43,21 @@ class PIP_IO_UTILS_EXPORT PIBroadcast
PIOBJECT_SUBCLASS(PIBroadcast, PIThread);
public:
//! \~english %PIBroadcast channels, can be used independently
//! \~russian Каналы %PIBroadcast, могут использоваться независимо
//! \~english Channel flags enumeration
//! \~russian Перечисление флагов каналов
enum Channel {
Multicast /** Use multicast addresses */ = 0x01,
Broadcast /** Use broadcast addresses */ = 0x02,
Loopback /** Use loopback addresses */ = 0x04,
All /** Use all channels */ = 0xFFFF,
//! \~english Use multicast addresses
//! \~russian Использовать multicast адреса
Multicast = 0x01,
//! \~english Use broadcast addresses
//! \~russian Использовать broadcast адреса
Broadcast = 0x02,
//! \~english Use loopback addresses
//! \~russian Использовать loopback адреса
Loopback = 0x04,
//! \~english Use all channels
//! \~russian Использовать все каналы
All = 0xFFFF,
};
//! \~english Channels flags type

View File

@@ -4,9 +4,11 @@
//! \brief
//! \~english Complex I/O point
//! \~russian Составное устройство ввода/вывода
//! \details
//! \~\details
//! \~english
//! \~english This class provides a complex I/O point that can manage multiple devices, filters, channels, and senders.
//! \~russian Этот класс предоставляет составное устройство ввода/вывода, которое может управлять множеством устройств, фильтров, каналов и отправителей.
//! \~russian Этот класс предоставляет составное устройство ввода/вывода, которое может управлять множеством устройств, фильтров, каналов и
//! отправителей.
//! \~\}
/*
PIP - Platform Independent Primitives
@@ -37,8 +39,10 @@ class PIConfig;
//! \~english Complex I/O point
//! \~russian Составное устройство ввода/вывода
//! \details This class provides a complex I/O point that can manage multiple devices, filters, channels, and senders.
//! \~russian Этот класс предоставляет составное устройство ввода/вывода, которое может управлять множеством устройств, фильтров, каналов и отправителей.
//! \~\details
//! \~english This class provides a complex I/O point that can manage multiple devices, filters, channels, and senders.
//! \~russian Этот класс предоставляет составное устройство ввода/вывода, которое может управлять множеством устройств, фильтров, каналов и
//! отправителей.
class PIP_EXPORT PIConnection: public PIObject {
PIOBJECT_SUBCLASS(PIConnection, PIObject);
@@ -61,13 +65,15 @@ public:
//! \~english Configure connection from config file "config" from section "name". Returns if configuration was successful
//! \~russian Настраивает подключение из файла конфигурации "config" из секции "name". Возвращает успешность настройки
//! \details \b Warning: all devices, filters and channels removed before configure!
//! \~\details
//! \~english \b Warning: all devices, filters and channels removed before configure!
//! \~russian \b Внимание: все устройства, фильтры и каналы удаляются перед настройкой!
bool configureFromConfig(const PIString & config, const PIString & name = PIStringAscii("connection"));
//! \~english Configure connection from config content "string" from section "name". Returns if configuration was successful
//! \~russian Настраивает подключение из содержимого конфигурации "string" из секции "name". Возвращает успешность настройки
//! \details \b Warning: all devices, filters and channels removed before configure!
//! \~\details
//! \~english \b Warning: all devices, filters and channels removed before configure!
//! \~russian \b Внимание: все устройства, фильтры и каналы удаляются перед настройкой!
bool configureFromString(PIString * string, const PIString & name = PIStringAscii("connection"));
@@ -78,9 +84,11 @@ public:
//! \~english Add device with full path "full_path", open mode "mode" to Device pool and connection
//! \~russian Добавляет устройство с полным путем "full_path", режимом открытия "mode" в пул устройств и подключение
//! \details Returns pointer to device or null if device can not be created. If "start" is true,
//! \~english read thread is started immediately. Else, you can start read thread with functions \a startThreadedRead()
//! \~russian поток чтения запускается немедленно. В противном случае можно запустить поток чтения с помощью функций \a startThreadedRead()
//! \~\details
//! \~english Returns pointer to device or null if device can not be created. If "start" is true,
//! read thread is started immediately. Else, you can start read thread with functions \a startThreadedRead()
//! \~russian поток чтения запускается немедленно. В противном случае можно запустить поток чтения с помощью функций \a
//! startThreadedRead()
//! \~english or \a startAllThreadedReads(). By default, read thread doesn`t start
//! \~russian или \a startAllThreadedReads(). По умолчанию поток чтения не запускается
PIIODevice * addDevice(const PIString & full_path, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite, bool start = false);
@@ -95,14 +103,16 @@ public:
//! \~english Remove device with full path "full_path" from connection
//! \~russian Удаляет устройство с полным путем "full_path" из подключения
//! \details Returns if device was removed. If there is no connection bounded to this device,
//! \~english it will be removed from Device pool
//! \~\details
//! \~english Returns if device was removed. If there is no connection bounded to this device,
//! it will be removed from Device pool
//! \~russian оно будет удалено из пула устройств
bool removeDevice(const PIString & full_path);
//! \~english Remove all device from connection
//! \~russian Удаляет все устройства из подключения
//! \details If there is no connection bounded to there devices, they removed from Device pool
//! \~\details
//! \~english If there is no connection bounded to there devices, they removed from Device pool
//! \~russian Если к устройствам не привязано подключение, они удаляются из пула устройств
void removeAllDevices();
@@ -120,16 +130,18 @@ public:
//! \~english Add filter with name "name" to device with full path "full_path_name" or filter "full_path_name"
//! \~russian Добавляет фильтр с именем "name" к устройству с полным путем "full_path_name" или фильтру "full_path_name"
//! \details If there is no filter with name "name", connection create new with split mode "mode" and bound
//! \~english to it device "full_path_name" or filter "full_path_name". If filter with name "name" already exists,
//! \~english device "full_path_name" or filter "full_path_name" add to this filter.
//! \~russian к нему устройство "full_path_name" или фильтр "full_path_name". Если фильтр с именем "name" уже существует,
//! \~english This function returns PIPacketExtractor * assosiated with this filter
//! \~russian устройство "full_path_name" или фильтр "full_path_name" добавляется к этому фильтру.
//! \~english This function returns PIPacketExtractor * assosiated with this filter
//! \~russian Эта функция возвращает PIPacketExtractor *, связанный с этим фильтром
//! \~\details
//! \~english If there is no filter with name "name", connection create new with split mode "mode" and bound
//! to it device "full_path_name" or filter "full_path_name". If filter with name "name" already exists,
//! device "full_path_name" or filter "full_path_name" add to this filter.
//! This function returns PIPacketExtractor * assosiated with this filter
//! \~russian Если фильтра с именем "name" не существует, соединение создаст новый фильтр с режимом разделения "mode"
//! и привяжет к нему устройство "full_path_name" или фильтр "full_path_name". Если фильтр с именем "name" уже существует,
//! устройство "full_path_name" или фильтр "full_path_name" добавляется к этому фильтру.
//! Эта функция возвращает PIPacketExtractor *, связанный с этим фильтром
//! \~\sa PIPacketExtractor
//! \details \b Attention! "mode" is altual olny if new filter was created!
//! \~\note
//! \~english \b Attention! "mode" is altual olny if new filter was created!
//! \~russian \b Внимание! "mode" актуален только если был создан новый фильтр!
PIPacketExtractor *
addFilter(const PIString & name, const PIString & full_path_name, PIPacketExtractor::SplitMode mode = PIPacketExtractor::None);
@@ -151,7 +163,8 @@ public:
//! \~english Remove from filter with name "name" device with full path "full_path_name" or filter "full_path_name"
//! \~russian Удаляет из фильтра с именем "name" устройство с полным путем "full_path_name" или фильтр "full_path_name"
//! \details If there is no devices bounded to this filter, it will be removed. Returns if device was removed
//! \~\details
//! \~english If there is no devices bounded to this filter, it will be removed. Returns if device was removed
//! \~russian Если к этому фильтру не привязано устройств, он будет удален. Возвращает успешность удаления устройства
bool removeFilter(const PIString & name, const PIString & full_path_name);
@@ -185,7 +198,8 @@ public:
//! \~english Add to connection channel from "name_from" to "name_to"
//! \~russian Добавляет в подключение канал от "name_from" к "name_to"
//! \details "name_from" and "name_to" can be full pathes of devices or device names or filter names.
//! \~\details
//! \~english "name_from" and "name_to" can be full pathes of devices or device names or filter names.
//! \~english Returns \b false if there if no such device or filter, else create channel and returns \b true
//! \~russian Возвращает \b false, если такого устройства или фильтра нет, иначе создает канал и возвращает \b true
bool addChannel(const PIString & name_from, const PIString & name_to);
@@ -204,7 +218,8 @@ public:
//! \~english Remove from connection channel from "name_from" to "name_to"
//! \~russian Удаляет из подключения канал от "name_from" к "name_to"
//! \details "name_from" and "name_to" can be full pathes of devices or filter names.
//! \~\details
//! \~english "name_from" and "name_to" can be full pathes of devices or filter names.
//! \~english Returns \b false if there if no such device or filter, else remove channel and returns \b true
//! \~russian Возвращает \b false, если такого устройства или фильтра нет, иначе удаляет канал и возвращает \b true
bool removeChannel(const PIString & name_from, const PIString & name_to);
@@ -225,7 +240,8 @@ public:
//! \~english Remove from connection all channels from "name_from"
//! \~russian Удаляет из подключения все каналы от "name_from"
//! \details "name_from" can be full path of device or filter name.
//! \~\details
//! \~english "name_from" can be full path of device or filter name.
//! \~english Returns \b false if there if no such device or filter, else remove channels and returns \b true
//! \~russian Возвращает \b false, если такого устройства или фильтра нет, иначе удаляет каналы и возвращает \b true
bool removeChannel(const PIString & name_from);
@@ -244,17 +260,20 @@ public:
//! \~english Add to connection sender with name "name" device with full path "full_path"
//! \~russian Добавляет в подключение отправителя с именем "name" устройство с полным путем "full_path"
//! \details If there is no sender with name "name", connection create new, bound
//! \~english to it device "full_path_name" and start sender timer with frequency "frequency".
//! \~russian к нему устройство "full_path_name" и запускает таймер отправителя с частотой "frequency".
//! \~english If sender with name "name" already exists, device "full_path_name" add to this sender
//! \~russian Если отправитель с именем "name" уже существует, устройство "full_path_name" добавляется к этому отправителю
//! \~english If "start" is true, sender is started immediately. Else, you can start sender with
//! \~russian Если "start" равно true, отправитель запускается немедленно. В противном случае можно запустить отправителя с помощью
//! \~english functions \a startSender()
//! \~russian функций \a startSender()
//! \~\details
//! \~english If there is no sender with name "name", connection create new, bound
//! to it device "full_path_name" and start sender timer with frequency "frequency".
//! If sender with name "name" already exists, device "full_path_name" add to this sender
//! If "start" is true, sender is started immediately. Else, you can start sender with
//! functions \a startSender()
//! \~russian Если отправителя с именем "name" не существует, соединение создаст новый отправитель, привяжет
//! к нему устройство "full_path_name" и запускает таймер отправителя с частотой "frequency".
//! Если отправитель с именем "name" уже существует, устройство "full_path_name" добавляется к этому отправителю
//! Если "start" равно true, отправитель запускается немедленно. В противном случае можно запустить отправителя с помощью
//! функций \a startSender()
//! \~\sa startSender()
//! \details \b Attention! "frequency" is actual olny if new sender was created!
//! \~\note
//! \~english \b Attention! "frequency" is actual olny if new sender was created!
//! \~russian \b Внимание! "frequency" актуален только если был создан новый отправитель!
void addSender(const PIString & name, const PIString & full_path_name, float frequency, bool start = false);
@@ -266,7 +285,8 @@ public:
//! \~english Remove from sender with name "name" device with full path "full_path_name"
//! \~russian Удаляет из отправителя с именем "name" устройство с полным путем "full_path_name"
//! \details If there is no devices bounded to this sender, it will be removed. Returns if sender was removed
//! \~\details
//! \~english If there is no devices bounded to this sender, it will be removed. Returns if sender was removed
//! \~russian Если к этому отправителю не привязано устройств, он будет удален. Возвращает успешность удаления отправителя
bool removeSender(const PIString & name, const PIString & full_path_name);
@@ -364,8 +384,10 @@ public:
bool isEmpty() const { return device_modes.isEmpty(); }
//! \~english Returns PIDiagnostics * assosiated with device with full path "full_path_name", name "full_path_name" or filter "full_path_name"
//! \~russian Возвращает PIDiagnostics *, связанный с устройством с полным путем "full_path_name", именем "full_path_name" или фильтром "full_path_name"
//! \~english Returns PIDiagnostics * assosiated with device with full path "full_path_name", name "full_path_name" or filter
//! "full_path_name"
//! \~russian Возвращает PIDiagnostics *, связанный с устройством с полным путем "full_path_name", именем "full_path_name" или фильтром
//! "full_path_name"
PIDiagnostics * diagnostic(const PIString & full_path_name) const;
//! \~english Returns PIDiagnostics * assosiated with device or filter "dev"

View File

@@ -1,9 +1,11 @@
/*! \file pidatatransfer.h
* \ingroup IO
* \~\brief
* \~english Class for send and receive PIByteArray via \a PIBaseTransfer
* \~russian Класс для отправки и приема PIByteArray с помощью \a PIBaseTransfer
*/
//! \ingroup IO
//! \file pidatatransfer.h
//! \brief
//! \~english Class for send and receive PIByteArray via \a PIBaseTransfer
//! \~russian Класс для отправки и приема PIByteArray с помощью \a PIBaseTransfer
//! \details
//! \~english Class for send and receive PIByteArray via PIBaseTransfer
//! \~russian Класс для отправки и приема PIByteArray с помощью PIBaseTransfer
/*
PIP - Platform Independent Primitives
Class for send and receive PIByteArray via PIBaseTransfer

View File

@@ -1,9 +1,14 @@
/*! \file pifiletransfer.h
* \ingroup IO
* \~\brief
* \~english Class for send and receive files and directories via \a PIBaseTransfer
* \~russian Класс для отправки и приема файлов и папок с помощью \a PIBaseTransfer
*/
//! \addtogroup IO
//! \{
//! \file pifiletransfer.h
//! \brief
//! \~english Class for sending and receiving files and directories via \a PIBaseTransfer
//! \~russian Класс для отправки и приема файлов и папок с помощью \a PIBaseTransfer
//! \details
//! \~english PIFileTransfer provides functionality for transferring files and directories over a network using PIBaseTransfer protocol
//! \~russian PIFileTransfer предоставляет функциональность для передачи файлов и папок по сети с использованием протокола PIBaseTransfer
//! \~\}
/*
PIP - Platform Independent Primitives
Class for send and receive files and directories via PIBaseTransfer
@@ -31,7 +36,7 @@
#define __PIFILETRANSFER_VERSION 2
//! \~english Class for send and receive files and directories via \a PIBaseTransfer
//! \~english Class for sending and receiving files and directories via \a PIBaseTransfer
//! \~russian Класс для отправки и приема файлов и папок с помощью \a PIBaseTransfer
class PIP_EXPORT PIFileTransfer: public PIBaseTransfer {
PIOBJECT_SUBCLASS(PIFileTransfer, PIBaseTransfer);
@@ -59,6 +64,8 @@ public:
//! \~english Constructor
//! \~russian Конструктор
PFTFileInfo(const PIFile::FileInfo & fi = PIFile::FileInfo()): PIFile::FileInfo(fi) {}
//! \~english Destination path
//! \~russian Путь назначения
PIString dest_path;
};
@@ -73,7 +80,11 @@ public:
};
uint raw_sig;
};
int step; // PacketType
//! \~english Step type (PacketType)
//! \~russian Тип шага (PacketType)
int step;
//! \~english Session ID
//! \~russian Идентификатор сессии
int session_id;
//! \~english Check if signature is valid
//! \~russian Проверка валидности подписи
@@ -144,10 +155,20 @@ public:
//! \~russian Получить указатель на текущие байты текущего файла
const llong * bytesFileCur_ptr() const { return &bytes_file_cur; }
//! \~english Emitted when receive files started
//! \~russian Генерируется при начале приема файлов
EVENT(receiveFilesStarted);
//! \~english Emitted when receive files finished
//! \~russian Генерируется при завершении приема файлов
EVENT1(receiveFilesFinished, bool, ok);
//! \~english Emitted when send files started
//! \~russian Генерируется при начале отправки файлов
EVENT(sendFilesStarted);
//! \~english Emitted when send files finished
//! \~russian Генерируется при завершении отправки файлов
EVENT1(sendFilesFinished, bool, ok);
//! \~english Event handler for receive files request
//! \~russian Обработчик события запроса приема файлов
EVENT3(receiveFilesRequest, PIStringList, files, llong, total_bytes, bool *, ok);
private:
@@ -173,26 +194,36 @@ private:
EVENT_HANDLER1(void, receive_finished, bool, ok);
};
//! \~english Binary stream write operator for PFTHeader
//! \~russian Оператор записи в бинарный поток для PFTHeader
BINARY_STREAM_WRITE(PIFileTransfer::PFTHeader) {
s << v.raw_sig << v.step << v.session_id;
return s;
}
//! \~english Binary stream read operator for PFTHeader
//! \~russian Оператор чтения из бинарного потока для PFTHeader
BINARY_STREAM_READ(PIFileTransfer::PFTHeader) {
s >> v.raw_sig >> v.step >> v.session_id;
return s;
}
//! \~english Binary stream write operator for PFTFileInfo
//! \~russian Оператор записи в бинарный поток для PFTFileInfo
BINARY_STREAM_WRITE(PIFileTransfer::PFTFileInfo) {
s << v.dest_path << v.size << v.time_access << v.time_modification << v.flags << v.id_user << v.id_group << v.perm_user.raw
<< v.perm_group.raw << v.perm_other.raw;
return s;
}
//! \~english Binary stream read operator for PFTFileInfo
//! \~russian Оператор чтения из бинарного потока для PFTFileInfo
BINARY_STREAM_READ(PIFileTransfer::PFTFileInfo) {
s >> v.dest_path >> v.size >> v.time_access >> v.time_modification >> v.flags >> v.id_user >> v.id_group >> v.perm_user.raw >>
v.perm_group.raw >> v.perm_other.raw;
return s;
}
//! \~english Output stream operator for PFTFileInfo
//! \~russian Оператор вывода в поток для PFTFileInfo
inline PICout operator<<(PICout s, const PIFileTransfer::PFTFileInfo & v) {
s.saveAndSetControls(0);
s << "FileInfo(\"" << v.dest_path << "\", " << PIString::readableSize(v.size) << ", " << v.perm_user.toString() << " "

View File

@@ -32,12 +32,16 @@
//!
//! \~english \par Common
//! \~russian \par Общее
//!
//! \~english
//! These files provides complex transport over ethernet
//!
//! \~russian
//! Эти файлы обеспечивают сложный транспорт поверх ethernet
//! \~russian Заголовочный файл модуля утилит ввода-вывода
//! \details
//! \~english This module provides comprehensive I/O utilities including file transfer, connection management, packet extraction, and
//! diagnostics.
//! \~russian Этот модуль предоставляет комплексные утилиты ввода-вывода, включая передачу файлов, управление подключениями, извлечение
//! пакетов и диагностику.
//!
//! \~\authors
//! \~english

View File

@@ -1,9 +1,15 @@
/*! \file pipackedtcp.h
* \ingroup IO-Utils
* \~\brief
* \~english Ethernet device
* \~russian Устройство Ethernet
*/
//! \addtogroup IO
//! \{
//! \file pipackedtcp.h
//! \brief
//! \~english Packed TCP network device with streaming capabilities
//! \~russian Устройство сетевого TCP с упаковкой потоков
//! \details
//! \~english The %PIPackedTCP class provides a TCP client/server device with automatic data packing/unpacking using PIStreamPacker. It
//! supports both client and server roles with reliable byte-stream transmission over TCP connections.
//! \~russian Класс %PIPackedTCP предоставляет устройство TCP клиент/сервер с автоматической упаковкой/распаковкой данных с использованием
//! PIStreamPacker. Поддерживает обе роли: клиент и сервер с надежной передачей байтовых потоков по TCP соединениям.
//! \~\}
/*
PIP - Platform Independent Primitives
Ethernet, UDP/TCP Broadcast/Multicast
@@ -34,21 +40,33 @@
class PIEthernet;
//! \~english Ethernet device
//! \~russian Устройство Ethernet
//! \~english Packed TCP network device with streaming capabilities
//! \~russian Устройство сетевого TCP с упаковкой потоков
class PIP_IO_UTILS_EXPORT PIPackedTCP: public PIIODevice {
PIIODEVICE(PIPackedTCP, "ptcp");
public:
//! \~english Role of %PIPackedTCP
//! \~russian Роль %PIPackedTCP
//! \details
//! \~english Defines the operational mode: Client connects to a server, Server accepts connections from one client
//! \~russian Определяет режим работы: Client подключается к серверу, Server принимает соединения от одного клиента
enum Role {
//! \~english TCP client mode
//! \~russian Режим TCP клиента
Client /** TCP client */,
//! \~english TCP server mode for one client
//! \~russian Режим TCP сервера для одного клиента
Server /** TCP server for one client */
};
//! \~english Constructs %PIPackedTCP with "role" and "addr" address
//! \~russian Создает %PIPackedTCP с ролью "role" и адресом "addr"
//! \details
//! \~english Initializes the device with the specified role (Client or Server) and network address. The address will be used for
//! connecting (Client) or binding (Server).
//! \~russian Инициализирует устройство с указанным режимом (Client или Server) и сетевым адресом. Адрес будет использован для
//! подключения (Client) или привязки (Server).
explicit PIPackedTCP(Role role = Client, const PINetworkAddress & addr = {});
//! \~english Destructor
@@ -57,48 +75,99 @@ public:
//! \~english Set server address for Server role or connect address for Client
//! \~russian Установить адрес сервера для роли Server или адрес подключения для Client
//! \details
//! \~english Sets the target address for the connection. For Server role, sets the address to listen on. For Client role, sets the
//! server address to connect to.
//! \~russian Устанавливает целевой адрес для соединения. Для роли Server устанавливает адрес, на котором нужно слушать. Для роли Client
//! устанавливает адрес сервера, к которому нужно подключиться.
void setAddress(const PINetworkAddress & addr);
//! \~english Check if connected
//! \~russian Проверить подключение
//! \details
//! \~english Returns true if the TCP connection is established and active
//! \~russian Возвращает true если TCP соединение установлено и активно
bool isConnected() const;
//! \~english Check if connecting
//! \~russian Проверить подключение
//! \details
//! \~english Returns true if the device is currently attempting to establish a TCP connection
//! \~russian Возвращает true если устройство в данный момент пытается установить TCP соединение
bool isConnecting() const;
//! \~english Returns read address in format "i.i.i.i:p"
//! \~russian Возвращает адрес чтения в формате "i.i.i.i:p"
//! \details
//! \~english Returns the local address bound to this device, including IP address and port number
//! \~russian Возвращает локальный адрес, привязанный к этому устройству, включая IP-адрес и номер порта
PINetworkAddress address() const { return m_addr; }
//! \~english Returns %PIEthernet type
//! \~russian Возвращает тип %PIEthernet
//! \details
//! \~english Returns the operational role (Client or Server) configured for this device
//! \~russian Возвращает режим работы (Client или Server), настроенный для этого устройства
Role role() const { return m_role; }
//! \~english Emitted when TCP connection is successfully established
//! \~russian Генерируется при успешном установлении TCP соединения
EVENT0(connected);
//! \~english Emitted when TCP connection is closed or lost
//! \~russian Генерируется при закрытии или потере TCP соединения
EVENT0(disconnected);
protected:
//! \~english Initializes the device internals
//! \~russian Инициализирует внутренние компоненты устройства
void init();
//! \~english Returns device information flags
//! \~russian Возвращает флаги информации об устройстве
DeviceInfoFlags deviceInfoFlags() const override;
//! \~english Constructs the full device path string
//! \~russian Создает полную строку пути устройства
PIString constructFullPathDevice() const override;
//! \~english Configures device from full path string
//! \~russian Настраивает устройство из полной строки пути
void configureFromFullPathDevice(const PIString & full_path) override;
//! \~english Reads data from the device
//! \~russian Читает данные из устройства
ssize_t readDevice(void * read_to, ssize_t max_size) override;
//! \~english Writes data to the device
//! \~russian Записывает данные в устройство
ssize_t writeDevice(const void * data, ssize_t max_size) override;
//! \~english Opens the TCP connection
//! \~russian Открывает TCP соединение
bool openDevice() override;
//! \~english Closes the TCP connection
//! \~russian Закрывает TCP соединение
bool closeDevice() override;
//! \~english Target network address (server for client, bind address for server)
//! \~russian Целевой сетевой адрес (сервер для клиента, адрес привязки для сервера)
mutable PINetworkAddress m_addr;
//! \~english Operational role (Client or Server)
//! \~russian Режим работы (Client или Server)
Role m_role = Client;
//! \~english Ethernet device for TCP communication
//! \~russian Ethernet устройство для TCP коммуникации
PIEthernet *eth = nullptr, *client = nullptr;
//! \~english Stream packer for data serialization
//! \~russian Упаковщик потока для сериализации данных
PIStreamPacker packer;
//! \~english Mutex for thread-safe receive operations
//! \~russian Мьютекс для потокобезопасных операций чтения
PIMutex rec_mutex;
//! \~english Queue for received data packets
//! \~russian Очередь для полученных пакетов данных
PIQueue<PIByteArray> rec_queue;
private:
};
//! \~english Registers %PIPackedTCP as a device type in the device registry
//! \~russian Регистрирует %PIPackedTCP как тип устройства в реестре устройств
REGISTER_DEVICE(PIPackedTCP)
#endif

View File

@@ -205,7 +205,8 @@ public:
//! \{
//! \fn void packetReceived(const uchar * data, int size)
//! \brief Raise on successfull \a packetValidate() function
//! \~english Raise on successfull \a packetValidate() function
//! \~russian Вызывается при успешной проверке пакета функцией \a packetValidate()
EVENT2(packetReceived, const uchar *, data, int, size);
//! \}

View File

@@ -1,9 +1,13 @@
/*! \file pistreampacker.h
* \ingroup IO-Utils
* \~\brief
* \~english Simple packet wrap aroud any PIIODevice
* \~russian Простая фрагментация пакетов, использует любой PIIODevice
*/
//! \addtogroup IO
//! \{
//! \file pistreampacker.h
//! \brief
//! \~english Stream packet wrapper for PIIODevice
//! \~russian Упаковщик пакетов потока для PIIODevice
//! \details
//! \~english Provides packet framing and deframing for data transmission over any PIIODevice implementation
//! \~russian Предоставляет фрагментацию и дефрагментацию пакетов для передачи данных через любую реализацию PIIODevice
//! \~\}
/*
PIP - Platform Independent Primitives
Simple packet wrap aroud any PIIODevice
@@ -35,12 +39,17 @@ class PIIODevice;
//! \~english Stream packer configuration
//! \~russian Конфигурация упаковщика потока
//! \details Configuration parameters for PIStreamPacker including packet size, signature, and optimization settings
//! \~russian Параметры конфигурации для PIStreamPacker, включая размер пакета, подпись и настройки оптимизации
class PIStreamPackerConfig: public PIEthUtilBase {
friend class PIStreamPacker;
public:
//! \~english Constructs default configuration
//! \~russian Создает конфигурацию по умолчанию
//! \details Sets default values: max_packet_size=1400, packet_sign=0xAFBE, crypt_size=false, aggressive_optimization=true
//! \~russian Устанавливает значения по умолчанию: max_packet_size=1400, packet_sign=0xAFBE, crypt_size=false,
//! aggressive_optimization=true
PIStreamPackerConfig() {
crypt_size = false;
aggressive_optimization = true;
@@ -50,48 +59,70 @@ public:
//! \~english Set maximum size of single packet
//! \~russian Установить максимальный размер одного пакета
//! \param max_size Maximum packet size in bytes
//! \~russian Максимальный размер пакета в байтах
void setMaxPacketSize(int max_size) { max_packet_size = max_size; }
//! \~english Returns maximum size of single packet, default 1400 bytes
//! \~russian Возвращает максимальный размер одного пакета, по умолчанию 1400 байт
//! \return Maximum packet size in bytes
//! \~russian Максимальный размер пакета в байтах
int maxPacketSize() const { return max_packet_size; }
//! \~english Set packet signature
//! \~russian Установить подпись пакета
//! \param sign_ Packet signature value
//! \~russian Значение подписи пакета
void setPacketSign(ushort sign_) { packet_sign = sign_; }
//! \~english Returns packet signature, default 0xAFBE
//! \~russian Возвращает подпись пакета, по умолчанию 0xAFBE
//! \return Packet signature value
//! \~russian Значение подписи пакета
ushort packetSign() const { return packet_sign; }
//! \~english Set receive aggressive optimization. If yes then %PIStreamPacker doesn`t check every byte in incoming stream but check
//! \~english Set receive aggressive optimization. If yes then %PIStreamPacker doesn't check every byte in incoming stream but check
//! only begin of each read() result. Default is \b true.
//! \~russian Установить агрессивную оптимизацию приема. Если да, то %PIStreamPacker не проверяет каждый байт во входящем потоке, а
//! только начало каждого результата read(). По умолчанию \b true.
//! \param yes Enable or disable aggressive optimization
//! \~russian Включить или отключить агрессивную оптимизацию
void setaAggressiveOptimization(bool yes) { aggressive_optimization = yes; }
//! \~english Returns aggressive optimization
//! \~russian Возвращает агрессивную оптимизацию
//! \return true if aggressive optimization is enabled
//! \~russian true если агрессивная оптимизация включена
bool aggressiveOptimization() const { return aggressive_optimization; }
//! \~english Check if crypt size enabled
//! \~russian Проверить, включен ли размер шифрования
//! \return true if size encryption is enabled
//! \~russian true если шифрование размера включено
bool cryptSizeEnabled() const { return crypt_size; }
//! \~english Set crypt size enabled
//! \~russian Установить включенный размер шифрования
//! \param on Enable or disable size encryption
//! \~russian Включить или отключить шифрование размера
void setCryptSizeEnabled(bool on) { crypt_size = on; }
//! \~english Get configuration
//! \~russian Получить конфигурацию
//! \return Constant reference to current configuration
//! \~russian Константная ссылка на текущую конфигурацию
const PIStreamPackerConfig & configuration() const { return *this; }
//! \~english Get configuration
//! \~russian Получить конфигурацию
//! \return Reference to current configuration
//! \~russian Ссылка на текущую конфигурацию
PIStreamPackerConfig & configuration() { return *this; }
//! \~english Apply configuration
//! \~russian Применить конфигурацию
//! \param config Configuration to apply
//! \~russian Конфигурация для применения
void setConfiguration(const PIStreamPackerConfig & config) { *this = config; }
private:
@@ -101,8 +132,10 @@ private:
};
//! \~english Simple packet wrap around any PIIODevice
//! \~english Simple packet wrapper around any PIIODevice
//! \~russian Простая фрагментация пакетов, использует любой PIIODevice
//! \details Provides packet framing and deframing for reliable data transmission over stream-oriented devices
//! \~russian Предоставляет фрагментацию и дефрагментацию пакетов для надежной передачи данных через потоковые устройства
class PIP_IO_UTILS_EXPORT PIStreamPacker
: public PIObject
, public PIStreamPackerConfig {
@@ -111,44 +144,75 @@ class PIP_IO_UTILS_EXPORT PIStreamPacker
public:
//! \~english Constructs packer and try to assign "dev"
//! \~russian Создает упаковщик и пытается присвоить "dev"
//! \param dev Pointer to PIIODevice instance
//! \~russian Указатель на экземпляр PIIODevice
PIStreamPacker(PIIODevice * dev = nullptr);
//! \~english Returns progress of current packet receive in bytes
//! \~russian Возвращает прогресс приема текущего пакета в байтах
//! \return Number of bytes received for current packet
//! \~russian Количество байт, полученных для текущего пакета
int receivePacketProgress() const { return packet.size_s(); }
//! \~english Clear all buffers
//! \~russian Очистить все буферы
//! \details Clears internal stream and packet buffers, resetting receive state
//! \~russian Очищает внутренние буферы потока и пакета, сбрасывает состояние приема
void clear();
//! \~english Prepare data for send and raise \a sendRequest() events
//! \~russian Подготовить данные для отправки и вызвать события \a sendRequest()
//! \param data Data to be sent
//! \~russian Данные для отправки
//! \details Fragments data into packets and raises sendRequest() for each packet
//! \~russian Фрагментирует данные в пакеты и вызывает sendRequest() для каждого пакета
void send(const PIByteArray & data);
//! \~english Receive data part. If packet is ready, raise \a packetReceiveEvent() event and \a packetReceived() virtual method
//! \~russian Принять часть данных. Если пакет готов, вызвать событие \a packetReceiveEvent() и виртуальный метод \a packetReceived()
//! \param data Received data bytes
//! \~russian Байты полученных данных
//! \details Processes incoming data, defragments packets, and raises events when complete packets are received
//! \~russian Обрабатывает входящие данные, дефрагментирует пакеты и вызывает события при получении полных пакетов
void received(const PIByteArray & data);
//! \~english Handler for receiving data from device
//! \~russian Обработчик для приема данных от устройства
EVENT_HANDLER2(void, received, const uchar *, readed, ssize_t, size);
//! \~english Connect "dev" \a PIIODevice::threadedReadEvent() event to \a received() handler and \a sendRequest() event to "dev" \a
//! PIIODevice::write() handler
//! \~russian Подключить событие \a PIIODevice::threadedReadEvent() устройства "dev" к обработчику \a received() и событие \a
//! sendRequest() к обработчику \a PIIODevice::write()
//! \param dev Pointer to PIIODevice instance to connect
//! \~russian Указатель на экземпляр PIIODevice для подключения
void assignDevice(PIIODevice * dev);
//! \~english Raised when a complete packet is received
//! \~russian Вызывается при получении полного пакета
EVENT1(packetReceiveEvent, PIByteArray &, data);
//! \~english Raised when packet reception starts with known size
//! \~russian Вызывается при начале приема пакета с известным размером
EVENT1(startPacketReceive, int, size);
//! \~english Raised when packet reception completes
//! \~russian Вызывается при завершении приема пакета
EVENT0(endPacketReceive);
//! \~english Raised when data needs to be sent to device
//! \~russian Вызывается при необходимости отправить данные на устройство
EVENT1(sendRequest, PIByteArray, data);
//! \handlers
//! \{
//! \fn void received(uchar * readed, int size)
//! \brief Handler to receive data. \a PIIODevice::threadedReadEvent()
//! can be connected to this handler
//! \fn void received(uchar * readed, ssize_t size)
//! \brief Handler to receive data. \a PIIODevice::threadedReadEvent() can be connected to this handler
//! \~english Handler to receive data. \a PIIODevice::threadedReadEvent() can be connected to this handler
//! \~russian Обработчик для приема данных. Событие \a PIIODevice::threadedReadEvent() может быть подключено к этому обработчику
//! \param readed Pointer to received data bytes
//! \param size Number of bytes received
//! \~english Pointer to received data bytes
//! \~russian Указатель на байты полученных данных
//! \~english Number of bytes received
//! \~russian Количество полученных байт
//! \}
//! \events
@@ -156,22 +220,41 @@ public:
//! \fn void packetReceiveEvent(PIByteArray data)
//! \brief Raise on packet successfully received
//! \~english Raised when a complete packet is successfully received
//! \~russian Вызывается при успешном получении полного пакета
//! \param data Received packet data
//! \~russian Данные полученного пакета
//! \fn void startPacketReceive(int size)
//! \brief Raise on start receive packet with overall size \"size\"
//! \~english Raised when packet reception starts with known total size
//! \~russian Вызывается при начале приема пакета с известным общим размером
//! \param size Total packet size in bytes
//! \~russian Общий размер пакета в байтах
//! \fn void endPacketReceive()
//! \brief Raise on finish receive packet
//! \~english Raised when packet reception completes
//! \~russian Вызывается при завершении приема пакета
//! \fn void sendRequest(PIByteArray data)
//! \brief Raise from \a send() function. This data should
//! be directly sended to your device. You can
//! connect this event to \a PIIODevice::write() handler
//! \brief Raise from \a send() function. This data should be directly sended to your device. You can connect this event to \a
//! PIIODevice::write() handler
//! \~english Raised from \a send() function. This data should be directly sent to your device. You can connect this event to \a
//! PIIODevice::write() handler
//! \~russian Вызывается из функции \a send(). Эти данные должны быть непосредственно отправлены на устройство. Можно подключить это
//! событие к обработчику \a PIIODevice::write() \param data Data to be sent to device
//! \~russian Данные для отправки на устройство
//! \}
//! \~english Called when packet is successfully received
//! \~russian Вызывается при успешном получении пакета
//! \details Default implementation does nothing. Override to handle received packets.
//! \~russian Реализация по умолчанию ничего не делает. Переопределите для обработки полученных пакетов.
//! \param data Received packet data
//! \~russian Данные полученного пакета
protected:
//! Packet successfully received, by default does nothing
virtual void packetReceived(PIByteArray data) {}
private:

View File

@@ -64,10 +64,16 @@
namespace luabridge {
//! \~english Stack specialization for PIString type
//! \~russian Специализация Stack для типа PIString
template<>
struct Stack<PIString> {
//! \~english Push PIString to Lua stack
//! \~russian Записать PIString в стек Lua
static void push(lua_State * L, PIString const & str) { lua_pushstring(L, str.dataUTF8()); }
//! \~english Get PIString from Lua stack
//! \~russian Получить PIString из стека Lua
static PIString get(lua_State * L, int index) {
if (lua_type(L, index) == LUA_TSTRING) {
const char * str = lua_tostring(L, index);
@@ -81,6 +87,8 @@ struct Stack<PIString> {
return string;
}
//! \~english Check if value on Lua stack is a string
//! \~russian Проверить, является ли значение в стеке Lua строкой
static bool isInstance(lua_State * L, int index) { return lua_type(L, index) == LUA_TSTRING; }
};

View File

@@ -254,6 +254,8 @@ public:
return t;
}
//! \~english Bitwise AND operator with scalar types
//! \~russian Побитовый оператор И со скалярными типами
uint_cl<L> operator&(const uchar & v) const { return *this & uint_cl<L>(v); }
uint_cl<L> operator&(const ushort & v) const { return *this & uint_cl<L>(v); }
uint_cl<L> operator&(const uint & v) const { return *this & uint_cl<L>(v); }
@@ -274,6 +276,8 @@ public:
return t;
}
//! \~english Bitwise OR operator with scalar types
//! \~russian Побитовый оператор ИЛИ со скалярными типами
uint_cl<L> operator|(const uchar & v) const { return *this | uint_cl<L>(v); }
uint_cl<L> operator|(const ushort & v) const { return *this | uint_cl<L>(v); }
uint_cl<L> operator|(const uint & v) const { return *this | uint_cl<L>(v); }
@@ -294,6 +298,8 @@ public:
return t;
}
//! \~english Bitwise XOR operator with scalar types
//! \~russian Побитовый оператор исключающее ИЛИ со скалярными типами
uint_cl<L> operator^(const uchar & v) const { return *this ^ uint_cl<L>(v); }
uint_cl<L> operator^(const ushort & v) const { return *this ^ uint_cl<L>(v); }
uint_cl<L> operator^(const uint & v) const { return *this ^ uint_cl<L>(v); }
@@ -361,6 +367,8 @@ public:
return false;
}
//! \~english Less than or equal operator (specialized for 8-bit)
//! \~russian Оператор меньше или равно (специализация для 8 бит)
bool operator<=(const uint_cl<8> & v1) { return (*(uchar *)data()) <= (*(uchar *)v1.data()); }
//! \~english Right shift operator
@@ -380,6 +388,8 @@ public:
return t;
}
//! \~english Left shift operator (alias for right shift)
//! \~russian Оператор побитового сдвига влево (алиас для сдвига вправо)
uint_cl<L> operator>>(const uint & c) const { return (*this << (int)c); }
//! \~english Left shift operator
@@ -399,6 +409,8 @@ public:
return t;
}
//! \~english Right shift operator (alias for left shift)
//! \~russian Оператор побитового сдвига вправо (алиас для сдвига влево)
uint_cl<L> operator<<(const uint & c) const { return (*this >> (int)c); }
//! \~english In-place bitwise inversion

View File

@@ -247,11 +247,9 @@ struct PIP_EXPORT Element {
//! \~english Element type (number, operator, variable or function)
//! \~russian Тип элемента (число, оператор, переменная или функция)
eType type;
//! Numeric value or operator index
//! \~english Numeric value or operator index
//! \~russian Числовое значение или индекс оператора
short num;
//! Variable index (for variables)
//! \~english Variable index (for variables)
//! \~russian Индекс переменной (для переменных)
short var_num;
@@ -306,6 +304,7 @@ struct PIP_EXPORT Variable {
//! \~english Constructs variable with value 0
//! \~russian Создает переменную со значением 0
Variable() { value = 0.; }
//! \~english Constructs variable with name and value
//! \~russian Создает переменную с именем и значением
Variable(const PIString & var_name, complexd val) {

View File

@@ -5,8 +5,10 @@
//! \~english Basic mathematical functions and defines
//! \~russian Базовые математические функции и дефайны
//! \details
//! \~english Common mathematical constants, conversion functions and utility functions
//! \~russian Общие математические константы, функции преобразования и утилиты
//! \~english This header provides common mathematical constants, angle conversion functions, special functions (Bessel, sinc),
//! and utility functions for linear regression, random number generation, and angle normalization.
//! \~russian Этот заголовочный файл предоставляет общие математические константы, функции преобразования углов, специальные функции
//! (Бесселя, sinc), и утилиты для линейной регрессии, генерации случайных чисел и нормализации углов.
//! \}
/*
PIP - Platform Independent Primitives
@@ -45,151 +47,323 @@
# include <cmath>
#endif
//! \name Mathematical constants
//! \{
//! \~english Natural logarithm of 2
//! \~russian Натуральный логарифм 2
#ifndef M_LN2
# define M_LN2 0.69314718055994530942
#endif
//! \~english Natural logarithm of 10
//! \~russian Натуральный логарифм 10
#ifndef M_LN10
# define M_LN10 2.30258509299404568402
#endif
//! \~english Square root of 2
//! \~russian Квадратный корень из 2
#ifndef M_SQRT2
# define M_SQRT2 1.41421356237309514547
#endif
//! \~english Square root of 3
//! \~russian Квадратный корень из 3
#ifndef M_SQRT3
# define M_SQRT3 1.73205080756887719318
#endif
//! \~english 1 divided by square root of 2
//! \~russian 1 делить на квадратный корень из 2
#ifndef M_1_SQRT2
# define M_1_SQRT2 0.70710678118654746172
#endif
//! \~english 1 divided by square root of 3
//! \~russian 1 делить на квадратный корень из 3
#ifndef M_1_SQRT3
# define M_1_SQRT3 0.57735026918962584208
#endif
//! \~english Pi constant
//! \~russian Число Пи
#ifndef M_PI
# define M_PI 3.141592653589793238462643383280
#endif
//! \~english 2 times Pi
//! \~russian 2 times Пи
#ifndef M_2PI
# define M_2PI 6.283185307179586476925286766559
#endif
//! \~english Pi divided by 3
//! \~russian Пи делить на 3
#ifndef M_PI_3
# define M_PI_3 1.04719755119659774615
#endif
//! \~english 2 times Pi divided by 3
//! \~russian 2 times Пи делить на 3
#ifndef M_2PI_3
# define M_2PI_3 2.0943951023931954923
#endif
//! \~english 180 divided by Pi (degrees to radians conversion factor)
//! \~russian 180 делить на Пи (коэффициент преобразования градусов в радианы)
#ifndef M_180_PI
# define M_180_PI 57.2957795130823208768
#endif
//! \~english Pi divided by 180 (radians to degrees conversion factor)
//! \~russian Пи делить на 180 (коэффициент преобразования радианов в градусы)
#ifndef M_PI_180
# define M_PI_180 1.74532925199432957692e-2
#endif
//! \~english Square root of Pi
//! \~russian Квадратный корень из Пи
#ifndef M_SQRT_PI
# define M_SQRT_PI 1.772453850905516027298167483341
#endif
//! \~english Euler's number
//! \~russian Число Эйлера
#ifndef M_E
# define M_E 2.7182818284590452353602874713527
#endif
//! \~english Speed of light in vacuum
//! \~russian Скорость света в вакууме
#ifndef M_LIGHT_SPEED
# define M_LIGHT_SPEED 2.99792458e+8
#endif
//! \~english Relative gas constant
//! \~russian Газовая постоянная
#ifndef M_RELATIVE_CONST
# define M_RELATIVE_CONST -4.442807633e-10;
#endif
//! \~english Gravitational constant
//! \~russian Гравитационная постоянная
#ifndef M_GRAVITY_CONST
# define M_GRAVITY_CONST 398600.4418e9;
#endif
//! \}
//! \~english Conversion factor from degrees to radians
//! \~russian Коэффициент преобразования градусов в радианы
const double deg2rad = M_PI_180;
//! \~english Conversion factor from radians to degrees
//! \~russian Коэффициент преобразования радианов в градусы
const double rad2deg = M_180_PI;
// clang-format off
inline int sign(const float & x) {return (x < 0.f) ? -1 : (x > 0.f ? 1 : 0);}
inline int sign(const double & x) {return (x < 0. ) ? -1 : (x > 0. ? 1 : 0);}
inline int sign(const ldouble & x) {return (x < 0.L) ? -1 : (x > 0.L ? 1 : 0);}
//! \name Sign functions
//! \{
//! \~english Returns the sign of a float value (-1, 0, or 1)
//! \~russian Возвращает знак значения float (-1, 0, или 1)
inline int sign(const float & x) {
return (x < 0.f) ? -1 : (x > 0.f ? 1 : 0);
}
//! \~english Returns the sign of a double value (-1, 0, or 1)
//! \~russian Возвращает знак значения double (-1, 0, или 1)
inline int sign(const double & x) {
return (x < 0.) ? -1 : (x > 0. ? 1 : 0);
}
//! \~english Returns the sign of a long double value (-1, 0, or 1)
//! \~russian Возвращает знак значения long double (-1, 0, или 1)
inline int sign(const ldouble & x) {
return (x < 0.L) ? -1 : (x > 0.L ? 1 : 0);
}
//! \}
inline int pow2 (const int p ) {return 1 << p;}
inline float pow10(const float & e) {return powf(10.f, e);}
inline double pow10(const double & e) {return pow (10. , e);}
inline ldouble pow10(const ldouble & e) {return powl(10.L, e);}
//! \name Power functions
//! \{
//! \~english Returns 2 raised to the power p
//! \~russian Возвращает 2 в степени p
inline int pow2(const int p) {
return 1 << p;
}
//! \~english Returns 10 raised to the power e for float
//! \~russian Возвращает 10 в степени e для float
inline float pow10(const float & e) {
return powf(10.f, e);
}
//! \~english Returns 10 raised to the power e for double
//! \~russian Возвращает 10 в степени e для double
inline double pow10(const double & e) {
return pow(10., e);
}
//! \~english Returns 10 raised to the power e for long double
//! \~russian Возвращает 10 в степени e для long double
inline ldouble pow10(const ldouble & e) {
return powl(10.L, e);
}
//! \}
// clang-format on
//! \name Special functions
//! \{
//! \~english Sinc function: sin(pi*x)/(pi*x)
//! \~russian Синусоидальная функция sinc: sin(pi*x)/(pi*x)
//! \details
//! \~english The sinc function is defined as sin(pi*x)/(pi*x), with sinc(0) = 1
//! \~russian Функция sinc определяется как sin(pi*x)/(pi*x), при sinc(0) = 1
inline double sinc(const double & v) {
if (v == 0.) return 1.;
double t = M_PI * v;
return sin(t) / t;
}
//! \}
//! Bessel function of the first kind of order 0
//! \~english Bessel function J0(x)
//! \name Bessel functions
//! \{
//! \~english Bessel function of the first kind of order 0
//! \~russian Функция Бесселя первого рода порядка 0
//! \details
//! \~english Bessel function of the first kind J0(x), solution to Bessel's differential equation
//! \~russian Функция Бесселя первого рода J0(x), решение уравнения Бесселя
//! \~\sa piJ1(), piJn()
PIP_EXPORT double piJ0(const double & v);
//! Bessel function of the first kind of order 1
//! \~english Bessel function J1(x)
//! \~english Bessel function of the first kind of order 1
//! \~russian Функция Бесселя первого рода порядка 1
//! \details
//! \~english Bessel function of the first kind J1(x), solution to Bessel's differential equation
//! \~russian Функция Бесселя первого рода J1(x), решение уравнения Бесселя
//! \~\sa piJ0(), piJn()
PIP_EXPORT double piJ1(const double & v);
//! Bessel function of the first kind of order n
//! \~english Bessel function Jn(n, x)
//! \~english Bessel function of the first kind of order n
//! \~russian Функция Бесселя первого рода порядка n
//! \details
//! \~english Bessel function of the first kind Jn(n, x), solution to Bessel's differential equation
//! \~russian Функция Бесселя первого рода Jn(n, x), решение уравнения Бесселя
//! \~\sa piJ0(), piJ1()
PIP_EXPORT double piJn(int n, const double & v);
//! Bessel function of the second kind of order 0
//! \~english Bessel function Y0(x)
//! \~english Bessel function of the second kind of order 0
//! \~russian Функция Бесселя второго рода порядка 0
//! \details
//! \~english Bessel function of the second kind Y0(x), also known as Neumann function
//! \~russian Функция Бесселя второго рода Y0(x), также известная как функция Неймана
//! \~\sa piY1(), piYn()
PIP_EXPORT double piY0(const double & v);
//! Bessel function of the second kind of order 1
//! \~english Bessel function Y1(x)
//! \~english Bessel function of the second kind of order 1
//! \~russian Функция Бесселя второго рода порядка 1
//! \details
//! \~english Bessel function of the second kind Y1(x), also known as Neumann function
//! \~russian Функция Бесселя второго рода Y1(x), также известная как функция Неймана
//! \~\sa piY0(), piYn()
PIP_EXPORT double piY1(const double & v);
//! Bessel function of the second kind of order n
//! \~english Bessel function Yn(n, x)
//! \~english Bessel function of the second kind of order n
//! \~russian Функция Бесселя второго рода порядка n
//! \details
//! \~english Bessel function of the second kind Yn(n, x), also known as Neumann function
//! \~russian Функция Бесселя второго рода Yn(n, x), также известная как функция Неймана
//! \~\sa piY0(), piY1()
PIP_EXPORT double piYn(int n, const double & v);
//! \}
// clang-format off
inline constexpr float toRad(float deg) {return deg * M_PI_180;}
inline constexpr double toRad(double deg) {return deg * M_PI_180;}
inline constexpr ldouble toRad(ldouble deg) {return deg * M_PI_180;}
inline constexpr float toDeg(float rad) {return rad * M_180_PI;}
inline constexpr double toDeg(double rad) {return rad * M_180_PI;}
inline constexpr ldouble toDeg(ldouble rad) {return rad * M_180_PI;}
// clang-format on
//! \name Angle conversion functions
//! \{
//! \~english Convert degrees to radians
//! \~russian Преобразовать градусы в радианы
//! \param deg Angle in degrees
//! \return Angle in radians
//! \~english
//! \~russian
inline constexpr float toRad(float deg) {
return deg * M_PI_180;
}
//! \~english Convert degrees to radians
//! \~russian Преобразовать градусы в радианы
//! \param deg Angle in degrees
//! \return Angle in radians
//! \~english
//! \~russian
inline constexpr double toRad(double deg) {
return deg * M_PI_180;
}
//! \~english Convert degrees to radians
//! \~russian Преобразовать градусы в радианы
//! \param deg Angle in degrees
//! \return Angle in radians
//! \~english
//! \~russian
inline constexpr ldouble toRad(ldouble deg) {
return deg * M_PI_180;
}
//! \~english Convert radians to degrees
//! \~russian Преобразовать радианы в градусы
//! \param rad Angle in radians
//! \return Angle in degrees
//! \~english
//! \~russian
inline constexpr float toDeg(float rad) {
return rad * M_180_PI;
}
//! \~english Convert radians to degrees
//! \~russian Преобразовать радианы в градусы
//! \param rad Angle in radians
//! \return Angle in degrees
//! \~english
//! \~russian
inline constexpr double toDeg(double rad) {
return rad * M_180_PI;
}
//! \~english Convert radians to degrees
//! \~russian Преобразовать радианы в градусы
//! \param rad Angle in radians
//! \return Angle in degrees
//! \~english
//! \~russian
inline constexpr ldouble toDeg(ldouble rad) {
return rad * M_180_PI;
}
//! \}
//! Square of a value
//! \~english Returns the square of value v (v * v)
//! \~russian Возвращает квадрат значения v (v * v)
//! \name Mathematical utility functions
//! \{
//! \~english Square of a value
//! \~russian Квадрат значения
//! \param v Input value
//! \return Returns v * v
//! \~english
//! \~russian
template<typename T>
inline constexpr T sqr(const T & v) {
return v * v;
}
//! Convert linear value to decibels
//! \~english Convert linear value to decibels: 10 * log10(val)
//! \~russian Преобразовать линейное значение в децибелы: 10 * log10(val)
//! \~english Convert linear value to decibels
//! \~russian Преобразовать линейное значение в децибелы
//! \param val Linear value
//! \return Value in decibels: 10 * log10(val)
//! \~english
//! \~russian
template<typename T>
inline constexpr T toDb(T val) {
return T(10.) * std::log10(val);
}
//! Convert decibels to linear value
//! \~english Convert decibels to linear value: 10^(val/10)
//! \~russian Преобразовать децибелы в линейное значение: 10^(val/10)
//! \~english Convert decibels to linear value
//! \~russian Преобразовать децибелы в линейное значение
//! \param val Value in decibels
//! \return Linear value: 10^(val/10)
//! \~english
//! \~russian
template<typename T>
inline constexpr T fromDb(T val) {
return std::pow(T(10.), val / T(10.));
}
//! \}
// [-1 ; 1]
//! Generate random double in range [-1, 1]
//! \name Random number generation
//! \{
//! \~english Returns random double in range [-1, 1]
//! \~russian Генерирует случайное число double в диапазоне [-1, 1]
//! \details
//! \~english Generates uniformly distributed random double number in the interval [-1, 1]
//! \~russian Генерирует равномерно распределенное случайное число double в интервале [-1, 1]
PIP_EXPORT double randomd();
// [-1 ; 1] normal
//! Generate random double with normal (Gaussian) distribution
//! \~english Returns random double with normal distribution, mean=dv, stddev=sv
//! \~russian Генерирует случайное число double с нормальным распределением, среднее=dv, стандартное отклонение=sv
//! \details
//! \~english Generates random double with normal (Gaussian) distribution
//! \~russian Генерирует случайное число double с нормальным (гауссовым) распределением
//! \~\sa randomd()
PIP_EXPORT double randomn(double dv = 0., double sv = 1.);
//! \}
//! Absolute value of vector elements
//! \name Vector operations
//! \{
//! \~english Returns vector with absolute values of each element
//! \~russian Возвращает вектор с абсолютными значениями каждого элемента
//! \details
//! \~english Computes absolute value for each element of the input vector
//! \~russian Вычисляет абсолютное значение для каждого элемента входного вектора
template<typename T>
inline PIVector<T> piAbs(const PIVector<T> & v) {
PIVector<T> result;
@@ -200,9 +374,13 @@ inline PIVector<T> piAbs(const PIVector<T> & v) {
}
//! Normalize angle to [0, 360) range (in-place)
//! \name Angle normalization
//! \{
//! \~english Normalizes angle to range [0, 360) degrees
//! \~russian Нормализует угол в диапазон [0, 360) градусов (на месте)
//! \details
//! \~english Normalizes angle to the range [0, 360) degrees using modulo arithmetic
//! \~russian Нормализует угол в диапазон [0, 360) градусов с использованием модульной арифметики
template<typename T>
void normalizeAngleDeg360(T & a) {
while (a < 0.)
@@ -210,9 +388,12 @@ void normalizeAngleDeg360(T & a) {
while (a > 360.)
a -= 360.;
}
//! Normalize angle to [0, 360) range
//! \~english Returns angle normalized to range [0, 360) degrees
//! \~russian Возвращает угол нормализованный в диапазон [0, 360) градусов
//! \details
//! \~english Returns angle normalized to the range [0, 360) degrees
//! \~russian Возвращает угол, нормализованный в диапазон [0, 360) градусов
//! \~\sa normalizeAngleDeg360()
template<typename T>
double normalizedAngleDeg360(T a) {
normalizeAngleDeg360(a);
@@ -220,9 +401,11 @@ double normalizedAngleDeg360(T a) {
}
//! Normalize angle to (-180, 180] range (in-place)
//! \~english Normalizes angle to range (-180, 180] degrees
//! \~russian Нормализует угол в диапазон (-180, 180] градусов (на месте)
//! \details
//! \~english Normalizes angle to the range (-180, 180] degrees using modulo arithmetic
//! \~russian Нормализует угол в диапазон (-180, 180] градусов с использованием модульной арифметики
template<typename T>
void normalizeAngleDeg180(T & a) {
while (a < -180.)
@@ -230,16 +413,21 @@ void normalizeAngleDeg180(T & a) {
while (a > 180.)
a -= 360.;
}
//! Normalize angle to (-180, 180] range
//! \~english Returns angle normalized to range (-180, 180] degrees
//! \~russian Возвращает угол нормализованный в диапазон (-180, 180] градусов
//! \details
//! \~english Returns angle normalized to the range (-180, 180] degrees
//! \~russian Возвращает угол, нормализованный в диапазон (-180, 180] градусов
//! \~\sa normalizeAngleDeg180()
template<typename T>
double normalizedAngleDeg180(T a) {
normalizeAngleDeg180(a);
return a;
}
//! \}
//! \name Linear regression
//! \{
//! Ordinary Least Squares linear regression
//! \~english Calculates linear regression coefficients using OLS method
//! \~russian Вычисляет коэффициенты линейной регрессии методом наименьших квадратов
@@ -247,6 +435,10 @@ double normalizedAngleDeg180(T a) {
//! \param out_a Output pointer for slope coefficient (a), can be nullptr
//! \param out_b Output pointer for intercept coefficient (b), can be nullptr
//! \return true on success
//! \details
//! \~english Computes linear regression using the Ordinary Least Squares method
//! \~russian Вычисляет линейную регрессию методом наименьших квадратов
//! \~\sa WLS_Linear()
template<typename T>
bool OLS_Linear(const PIVector<PIPair<T, T>> & input, T * out_a, T * out_b) {
static_assert(std::is_arithmetic<T>::value, "Type must be arithmetic");
@@ -277,6 +469,10 @@ bool OLS_Linear(const PIVector<PIPair<T, T>> & input, T * out_a, T * out_b) {
//! \param out_a Output pointer for slope coefficient (a), can be nullptr
//! \param out_b Output pointer for intercept coefficient (b), can be nullptr
//! \return true on success
//! \details
//! \~english Computes linear regression using the Weighted Least Squares method
//! \~russian Вычисляет линейную регрессию методом взвешенных наименьших квадратов
//! \~\sa OLS_Linear()
template<typename T>
bool WLS_Linear(const PIVector<PIPair<T, T>> & input, const PIVector<T> & weights, T * out_a, T * out_b) {
static_assert(std::is_arithmetic<T>::value, "Type must be arithmetic");

View File

@@ -1,9 +1,13 @@
/*! \file pimathcomplex.h
* \ingroup Math
* \~\brief
* \~english Complex numbers
* \~russian Комплексные числа
*/
//! \~\addtogroup Math
//! \~\{
//! \~\file pimathcomplex.h
//! \~\brief
//! \~english Complex numbers
//! \~russian Комплексные числа
//! \~\details
//! \~english This module provides support for complex number operations, including various mathematical functions and stream output.
//! \~russian Этот модуль предоставляет поддержку операций с комплексными числами, включая различные математические функции и вывод в поток.
//! \~\}
/*
PIP - Platform Independent Primitives
PIP math complex
@@ -36,9 +40,13 @@
using std::complex;
//! \~english Template struct to check if type is std::complex.
//! \~russian Шаблонная структура для проверки, является ли тип std::complex.
template<typename T>
struct is_complex: std::false_type {};
//! \~english Template struct to check if type is std::complex (specialization for std::complex<T>).
//! \~russian Шаблонная структура для проверки, является ли тип std::complex (специализация для std::complex<T>).
template<typename T>
struct is_complex<std::complex<T>>: std::true_type {};
@@ -57,6 +65,11 @@ const complexld complexld_i(0., 1.);
const complexld complexld_0(0.);
const complexld complexld_1(1.);
//! \~english Returns the sign of a complex number.
//! \~russian Возвращает знак комплексного числа.
//! \details The sign of a complex number is defined as the complex number whose real and imaginary parts are the sign of the corresponding
//! parts of the original number.
//! \~\sa round(), floor(), ceil()
inline complexd sign(const complexd & x) {
return complexd(sign(x.real()), sign(x.imag()));
}
@@ -88,21 +101,41 @@ inline complexd ceil(const complexd & c) {
#ifdef CC_GCC
# if CC_GCC_VERSION <= 0x025F
//! \~english Tangent of a complex number (GCC-specific implementation for older versions).
//! \~russian Тангенс комплексного числа (специфичная реализация GCC для старых версий).
//! \details Computes tan(c) = sin(c) / cos(c) for complex numbers.
//! \~\sa sin(), cos()
inline complexd tan(const complexd & c) {
return sin(c) / cos(c);
}
//! \~english Hyperbolic tangent of a complex number (GCC-specific implementation for older versions).
//! \~russian Гиперболический тангенс комплексного числа (специфичная реализация GCC для старых версий).
//! \details Computes tanh(c) = sinh(c) / cosh(c) for complex numbers.
//! \~\sa sinh(), cosh()
inline complexd tanh(const complexd & c) {
return sinh(c) / cosh(c);
}
//! \~english Base-2 logarithm of a complex number (GCC-specific implementation for older versions).
//! \~russian Логарифм по основанию 2 комплексного числа (специфичная реализация GCC для старых версий).
//! \details Computes log2(c) = log(c) / M_LN2 for complex numbers.
//! \~\sa log(), log10()
inline complexd log2(const complexd & c) {
return log(c) / M_LN2;
}
//! \~english Base-10 logarithm of a complex number (GCC-specific implementation for older versions).
//! \~russian Логарифм по основанию 10 комплексного числа (специфичная реализация GCC для старых версий).
//! \details Computes log10(c) = log(c) / M_LN10 for complex numbers.
//! \~\sa log(), log2()
inline complexd log10(const complexd & c) {
return log(c) / M_LN10;
}
# endif
#endif
//! \~english Stream output operator for complex numbers.
//! \~russian Оператор вывода в поток для комплексных чисел.
//! \details Outputs the complex number in the format "(real; imag)".
//! \~\sa is_complex
template<typename T>
inline PICout operator<<(PICout s, const complex<T> & v) {
s.space();
@@ -113,6 +146,9 @@ inline PICout operator<<(PICout s, const complex<T> & v) {
}
//! \~english Computes the absolute value of each element in a PIVector of complex numbers.
//! \~russian Вычисляет модуль каждого элемента в PIVector комплексных чисел.
//! \details Returns a PIVector<double> containing the absolute values of the complex numbers.
inline PIVector<double> abs(const PIVector<complexd> & v) {
PIVector<double> result;
result.resize(v.size());
@@ -122,6 +158,9 @@ inline PIVector<double> abs(const PIVector<complexd> & v) {
}
//! \~english Computes the absolute value of each element in a PIVector2D of complex numbers.
//! \~russian Вычисляет модуль каждого элемента в PIVector2D комплексных чисел.
//! \details Returns a PIVector2D<double> containing the absolute values of the complex numbers.
inline PIVector2D<double> abs(const PIVector2D<complexd> & v) {
PIVector2D<double> result(v.rows(), v.cols());
for (uint i = 0; i < v.rows(); i++)
@@ -131,24 +170,20 @@ inline PIVector2D<double> abs(const PIVector2D<complexd> & v) {
}
/**
* \brief floating point number specific comparison between value passed as parameter and zero
*
* @param v floating point parameter for comparison
* @return true if v in locality of zero, otherwise false
*/
//! \~english Floating point number specific comparison between value and zero.
//! \~russian Специфичное сравнение числа с плавающей точкой с нулём.
//! \details Compares a floating point value with zero using a threshold of 1E-200.
//! \~\sa PIMathFloatNullCompare() for complex numbers
template<typename T, typename std::enable_if<std::is_floating_point<T>::value, int>::type = 0>
inline bool PIMathFloatNullCompare(const T v) {
static_assert(std::is_floating_point<T>::value, "Type must be floating point");
return (piAbs(v) < T(1E-200));
}
/**
* \brief floating point number specific comparison between parameter value and zero.
*
* @param v complex with floating point real and imag parts
* @return true if absolute of v in locality of zero, otherwise false
*/
//! \~english Floating point number specific comparison between parameter value and zero.
//! \~russian Специфичное сравнение значения параметра с нулём для чисел с плавающей точкой.
//! \details Compares the absolute value of a complex number with floating point components with zero using a threshold of 1E-200.
//! \~\sa PIMathFloatNullCompare() for floating point types
template<typename T,
typename std::enable_if<std::is_floating_point<decltype(T::real)>::value && std::is_floating_point<decltype(T::imag)>::value,
int>::type = 0>

View File

@@ -148,6 +148,7 @@ public:
//! \details Если вы введете индекс вне границ матрицы, то поведение не определено ("undefined behavior").
//! \param index номер выбранной строки.
//! \return строка в формате \a PIMathVectorT.
//! \sa col()
PIMathVectorT<Cols, Type> row(uint index) {
PIMathVectorT<Cols, Type> tv;
PIMM_FOR_C tv[i] = m[index][i];
@@ -200,6 +201,7 @@ public:
//! \param rf номер первой выбранной строки.
//! \param rs номер второй выбранной строки.
//! \return матрица типа \a PIMathMatrixT<Rows, Cols, Type>.
//! \sa swapCols()
PIMathMatrixT<Rows, Cols, Type> & swapRows(uint rf, uint rs) {
PIMM_FOR_C piSwap<Type>(m[rf][i], m[rs][i]);
return *this;
@@ -214,9 +216,10 @@ public:
//! \~russian
//! \brief Метод, меняющий местами выбранные столбцы в матрице.
//! \details Если вы введете индекс вне границ матрицы, то поведение не определено ("undefined behavior").
//! \param rf номер первого выбранного столбца.
//! \param rs номер второго выбранного столбца.
//! \param cf номер первого выбранного столбца.
//! \param cs номер второго выбранного столбца.
//! \return матрица типа \a PIMathMatrixT<Rows, Cols, Type>.
//! \sa swapRows()
PIMathMatrixT<Rows, Cols, Type> & swapCols(uint cf, uint cs) {
PIMM_FOR_R piSwap<Type>(m[i][cf], m[i][cs]);
return *this;
@@ -260,6 +263,7 @@ public:
//! \~russian
//! \brief Метод, являются ли все элементы матрицы нулями.
//! \return true если матрица нулевая, иначе false.
//! \sa isIdentity()
bool isNull() const {
PIMM_FOR if (m[r][c] != Type(0)) return false;
return true;
@@ -292,6 +296,7 @@ public:
//! \param row номер строки матрицы.
//! \param col номер столбца матрицы.
//! \return элемент матрицы.
//! \sa at(), element(uint, uint) const
inline Type & element(uint row, uint col) { return m[row][col]; }
//! \~english
@@ -306,6 +311,7 @@ public:
//! \param row номер строки матрицы.
//! \param col номер столбца матрицы.
//! \return копия элемента матрицы.
//! \sa at(), element(uint, uint)
inline const Type & element(uint row, uint col) const { return m[row][col]; }
//! \~english
@@ -1113,6 +1119,7 @@ public:
//! \~russian
//! \brief Метод, проверяющий содержит ли главная диагональ единицы и все остальные поля нули.
//! \return true если матрица единичная, иначе false.
//! \sa isNull(), isValid()
bool isIdentity() const {
PIMM_FOR if ((c == r) ? _V2D::element(r, c) != Type(1) : _V2D::element(r, c) != Type(0)) return false;
return true;
@@ -1124,6 +1131,7 @@ public:
//! \~russian
//! \brief Метод, являются ли все элементы матрицы нулями.
//! \return true если матрица нулевая, иначе false.
//! \sa isIdentity()
bool isNull() const {
PIMM_FOR_A if (_V2D::mat[i] != Type(0)) return false;
return true;
@@ -1135,6 +1143,7 @@ public:
//! \~russian
//! \brief Метод, который проверяет является ли матрица пустой.
//! \return true если матрица действительна, иначе false.
//! \sa isNull(), isIdentity()
bool isValid() const { return !PIVector2D<Type>::isEmpty(); }
//! \~english

View File

@@ -21,23 +21,18 @@
//! \~english Basic mathematical functions and defines
//! \~russian Базовые математические функции и дефайны
//!
//! \~\details
//! \~english \section cmake_module_Math Building with CMake
//! \~russian \section cmake_module_Math Сборка с использованием CMake
//!
//! \~\code
//! find_package(PIP REQUIRED)
//! target_link_libraries([target] PIP)
//! \endcode
//!
//! \~english \par Common
//! \~russian \par Общее
//!
//! \file pimathmodule.h
//! \details
//! \~english
//! These files provides vectors, matrices, complex numbers, quaternions, FFT and geometry classes
//!
//! The Math module provides classes for mathematical computations including vectors, matrices, complex numbers, quaternions, FFT, and
//! statistical analysis. This header aggregates all Math module headers for convenient inclusion.
//! \~russian
//! Эти файлы обеспечивают вектора, матрицы, комплексные числа, кватернионы, БПФ и классы геометрических фигур
//! Модуль Math предоставляет классы для математических вычислений, включая векторы, матрицы, комплексные числа, кватернионы, БПФ и
//! статистический анализ. Этот заголовочный файл агрегирует все заголовочные файлы модуля Math для удобного подключения.
//!
//! \~\sa
//! \~english picrc.h, pievaluator.h, pifft.h, pimathsolver.h, piquaternion.h, pistatistic.h
//! \~russian picrc.h, pievaluator.h, pifft.h, pimathsolver.h, piquaternion.h, pistatistic.h
//!
//! \~\authors
//! \~english

View File

@@ -1,9 +1,9 @@
//! \addtogroup Math
//! \{
//! \file pimathvector.h
//! \brief
//! \~english Math vector
//! \~russian Математический вектор
//! \brief Mathematical vector classes with fixed-size and dynamic-size support
//! \~english Mathematical vector classes with fixed-size and dynamic-size support
//! \~russian Классы математических векторов с фиксированным и динамическим размером
//! \details
//! \~english Fixed-size and dynamic mathematical vector implementations. Provides PIMathVectorT for compile-time fixed-size vectors and
//! PIMathVector for runtime dynamic-size vectors with support for arithmetic and complex number types.
@@ -573,6 +573,8 @@ private:
//! \param x Scalar
//! \param v Vector
//! \returns Scaled vector
//! \details Performs element-wise multiplication of vector by scalar. Equivalent to v * x.
//! \~russian Выполняет покомпонентное умножение вектора на скаляр. Эквивалентно v * x.
template<uint Size, typename Type>
inline PIMathVectorT<Size, Type> operator*(const Type & x, const PIMathVectorT<Size, Type> & v) {
return v * x;
@@ -583,6 +585,8 @@ inline PIMathVectorT<Size, Type> operator*(const Type & x, const PIMathVectorT<S
//! \param s The PIP output stream
//! \param v The vector to output
//! \returns Reference to the stream
//! \details Outputs vector in format "Vector{e1, e2, ..., eN}" where eN are vector elements
//! \~russian Выводит вектор в формате "Vector{e1, e2, ..., eN}" где eN — элементы вектора
template<uint Size, typename Type>
inline PICout operator<<(PICout s, const PIMathVectorT<Size, Type> & v) {
s.space();
@@ -599,21 +603,45 @@ inline PICout operator<<(PICout s, const PIMathVectorT<Size, Type> & v) {
//! \~english 2D integer vector
//! \~russian 2D целочисленный вектор
//! \brief 2D vector with integer elements
//! \~english 2D vector with integer elements
//! \~russian Вектор из 2 элементов целочисленного типа
//! \sa PIMathVectorT
typedef PIMathVectorT<2u, int> PIMathVectorT2i;
//! \~english 3D integer vector
//! \~russian 3D целочисленный вектор
//! \brief 3D vector with integer elements
//! \~english 3D vector with integer elements
//! \~russian Вектор из 3 элементов целочисленного типа
//! \sa PIMathVectorT
typedef PIMathVectorT<3u, int> PIMathVectorT3i;
//! \~english 4D integer vector
//! \~russian 4D целочисленный вектор
//! \brief 4D vector with integer elements
//! \~english 4D vector with integer elements
//! \~russian Вектор из 4 элементов целочисленного типа
//! \sa PIMathVectorT
typedef PIMathVectorT<4u, int> PIMathVectorT4i;
//! \~english 2D double vector
//! \~russian 2D вектор с числами двойной точности
//! \brief 2D vector with double precision elements
//! \~english 2D vector with double precision elements
//! \~russian Вектор из 2 элементов типа double
//! \sa PIMathVectorT
typedef PIMathVectorT<2u, double> PIMathVectorT2d;
//! \~english 3D double vector
//! \~russian 3D вектор с числами двойной точности
//! \brief 3D vector with double precision elements
//! \~english 3D vector with double precision elements
//! \~russian Вектор из 3 элементов типа double
//! \sa PIMathVectorT
typedef PIMathVectorT<3u, double> PIMathVectorT3d;
//! \~english 4D double vector
//! \~russian 4D вектор с числами двойной точности
//! \brief 4D vector with double precision elements
//! \~english 4D vector with double precision elements
//! \~russian Вектор из 4 элементов типа double
//! \sa PIMathVectorT
typedef PIMathVectorT<4u, double> PIMathVectorT4d;
@@ -1108,6 +1136,8 @@ private:
PIVector<Type> c;
};
//! \details Performs element-wise multiplication of dynamic vector by scalar. Equivalent to v * x.
//! \~russian Выполняет покомпонентное умножение динамического вектора на скаляр. Эквивалентно v * x.
template<typename Type>
inline PIMathVector<Type> operator*(const Type & x, const PIMathVector<Type> & v) {
return v * x;
@@ -1138,6 +1168,8 @@ inline std::ostream & operator<<(std::ostream & s, const PIMathVector<Type> & v)
//! \param s The PIP output stream
//! \param v The vector to output
//! \returns Reference to the stream
//! \details Outputs vector in format "Vector{e1, e2, ..., eN}" where eN are vector elements
//! \~russian Выводит вектор в формате "Vector{e1, e2, ..., eN}" где eN — элементы вектора
template<typename Type>
inline PICout operator<<(PICout s, const PIMathVector<Type> & v) {
s.space();
@@ -1176,9 +1208,17 @@ inline PIBinaryStream<P> & operator>>(PIBinaryStream<P> & s, PIMathVector<T> & v
//! \~english 32-bit integer dynamic vector
//! \~russian Динамический вектор с 32-битными целыми числами
//! \brief Dynamic vector with 32-bit integer elements
//! \~english Dynamic vector with 32-bit integer elements
//! \~russian Динамический вектор из элементов 32-битного целочисленного типа
//! \sa PIMathVector
typedef PIMathVector<int> PIMathVectori;
//! \~english Double precision dynamic vector
//! \~russian Динамический вектор с числами двойной точности
//! \brief Dynamic vector with double precision elements
//! \~english Dynamic vector with double precision elements
//! \~russian Динамический вектор из элементов типа double
//! \sa PIMathVector
typedef PIMathVector<double> PIMathVectord;
#endif // PIMATHVECTOR_H

View File

@@ -3,6 +3,10 @@
//! \brief
//! \~english Two-dimensional point class
//! \~russian Класс двумерной точки
//! \details
//! \~english The PIPoint class provides a two-dimensional point on the plane.
//! \~russian Класс PIPoint представляет точку на плоскости с двумя координатами.
//! \~\sa PIPointF
/*
PIP - Platform Independent Primitives
Two-dimensional point class
@@ -24,32 +28,45 @@
#include "pimathbase.h"
//! \brief
//! \~english Two-dimensional point class
//! \~russian Класс двумерной точки
//! \details
//! Данный класс позволяет хранить и работать с двумерными точками.
//! Для работы с объектами реализованы операторы сложения, вычитания и проверки на ревенство и неравенство.
//! Также доступны методы для перемещения точек \a translate(), \a translated(), \a move(), \a moved()
//! и перевода из декартовой системы координат в полярную \a toPolar() и обратно \a fromPolar().
//! \~english Two-dimensional point class.
//! \~russian Класс двумерной точки.
//! \~\details
//! \~english The PIPoint class provides a two-dimensional point on the plane.
//! \~english Supports arithmetic operations, coordinate transformations, and point movement.
//! \~russian Класс PIPoint представляет точку на плоскости с двумя координатами.
//! \~russian Поддерживаются арифметические операции, преобразования координат и перемещение точек.
template<typename Type>
class PIP_EXPORT PIPoint {
static_assert(std::is_arithmetic<Type>::value, "Type must be arithmetic");
public:
//! \~english X coordinate.
//! \~russian Координата X.
Type x;
//! \~english Y coordinate.
//! \~russian Координата Y.
Type y;
//! \~english Creates a new point.
//! \~russian Создает новую точку.
//! \~\details
//! \~english Initializes coordinates to zero.
//! \~russian Инициализирует координаты нулями.
PIPoint() { x = y = Type(); }
//! \~english Creates a new point with given coordinates.
//! \~russian Создает новую точку с заданными координатами.
//! \~\details
//! \~english Constructs a point with specified \a x_ and \a y_ values.
//! \~russian Создает точку с заданными значениями координат \a x_ и \a y_.
PIPoint(Type x_, Type y_) { set(x_, y_); }
//! \~english Set new coordinates for the point.
//! \~russian Задать новые координаты точке.
//! \~\details
//! \~english Sets the point coordinates to \a x_ and \a y_.
//! \~russian Устанавливает координаты точки \a x_ и \a y_.
//! \~\sa set(const PIPoint<Type> &)
PIPoint<Type> & set(Type x_, Type y_) {
x = x_;
y = y_;
@@ -58,6 +75,9 @@ public:
//! \~english Set new coordinates from another point.
//! \~russian Задать новые координаты точке.
//! \~\details
//! \~english Sets the point coordinates from point \a p.
//! \~russian Устанавливает координаты точки из точки \a p.
PIPoint<Type> & set(const PIPoint<Type> & p) {
x = p.x;
y = p.y;
@@ -66,6 +86,9 @@ public:
//! \~english Translate the point by x and y.
//! \~russian Переместить точку.
//! \~\details
//! \~english Adds \a x_ and \a y_ to the current coordinates.
//! \~russian Прибавляет \a x_ и \a y_ к текущим координатам.
PIPoint<Type> & translate(Type x_, Type y_) {
x += x_;
y += y_;
@@ -74,6 +97,9 @@ public:
//! \~english Translate the point by another point.
//! \~russian Переместить точку.
//! \~\details
//! \~english Adds the coordinates of point \a p to the current coordinates.
//! \~russian Прибавляет координаты точки \a p к текущим координатам.
PIPoint<Type> & translate(const PIPoint<Type> & p) {
x += p.x;
y += p.y;
@@ -82,6 +108,9 @@ public:
//! \~english Create a copy of the point and translate it.
//! \~russian Создать копию точки и переместить её.
//! \~\details
//! \~english Returns a copy of the point translated by \a x_ and \a y_.
//! \~russian Возвращает копию точки, перемещенную на \a x_ и \a y_.
PIPoint<Type> translated(Type x_, Type y_) const {
PIPoint<Type> rp(*this);
rp.translate(x_, y_);
@@ -90,6 +119,9 @@ public:
//! \~english Create a copy of the point and translate it by another point.
//! \~russian Создать копию точки и переместить её.
//! \~\details
//! \~english Returns a copy of the point translated by point \a p.
//! \~russian Возвращает копию точки, перемещенную на точку \a p.
PIPoint<Type> translated(const PIPoint<Type> & p) const {
PIPoint<Type> rp(*this);
rp.translate(p);
@@ -98,17 +130,23 @@ public:
//! \~english Translate the point. Alias for \a translate().
//! \~russian Переместить точку.
//! \details Является копией метода \a translate().
//! \~\details
//! \~english Alias for \a translate(Type, Type).
//! \~russian Алиас метода \a translate(Type, Type).
PIPoint<Type> & move(Type x_, Type y_) { return translate(x_, y_); }
//! \~english Translate the point by another point. Alias for \a translate().
//! \~russian Переместить точку.
//! \details Является копией метода \a translate().
//! \~\details
//! \~english Alias for \a translate(const PIPoint<Type> &).
//! \~russian Алиас метода \a translate(const PIPoint<Type> &).
PIPoint<Type> & move(const PIPoint<Type> & p) { return translate(p); }
//! \~english Create a copy of the point and translate it. Alias for \a translated().
//! \~russian Создать копию точки и переместить её.
//! \details Является копией метода \a translated().
//! \~\details
//! \~english Alias for \a translated(Type, Type).
//! \~russian Алиас метода \a translated(Type, Type).
PIPoint<Type> moved(Type x_, Type y_) const {
PIPoint<Type> rp(*this);
rp.translate(x_, y_);
@@ -117,7 +155,9 @@ public:
//! \~english Create a copy of the point and translate it by another point. Alias for \a translated().
//! \~russian Создать копию точки и переместить её.
//! \details Является копией метода \a translated().
//! \~\details
//! \~english Alias for \a translated(const PIPoint<Type> &).
//! \~russian Алиас метода \a translated(const PIPoint<Type> &).
PIPoint<Type> moved(const PIPoint<Type> & p) const {
PIPoint<Type> rp(*this);
rp.translate(p);
@@ -126,29 +166,48 @@ public:
//! \~english Calculate angle in radians in polar coordinate system.
//! \~russian Посчитать угол(радианы) в поолярной системе координат.
//! \~\details
//! \~english Returns the angle (in radians) between the positive x-axis and the vector to the point.
//! \~russian Возвращает угол (в радианах) между положительной осью x и вектором к точке.
double angleRad() const { return atan2(y, x); }
//! \~english Calculate angle in degrees in polar coordinate system.
//! \~russian Посчитать угол(градусы) в поолярной системе координат.
//! \~\details
//! \~english Returns the angle (in degrees) between the positive x-axis and the vector to the point.
//! \~russian Возвращает угол (в градусах) между положительной осью x и вектором к точке.
double angleDeg() const { return toDeg(atan2(y, x)); }
//! \~english Convert copy of point to polar coordinate system.
//! \~russian Перевести копию точки в полярную систему координат.
//! \~\details
//! \~english Converts the point to polar coordinates.
//! \~russian Преобразует точку в полярную систему координат.
//! \~\sa fromPolar()
PIPoint<Type> toPolar(bool isDeg = false) const { return PIPoint<Type>(sqrt(x * x + y * y), isDeg ? angleDeg() : angleRad()); }
//! \~english Convert point from polar to cartesian coordinate system.
//! \~russian Перевести копию точки из полярной системы координат в декартовую.
//! \~\details
//! \~english Converts a point from polar coordinates to cartesian coordinates.
//! \~russian Преобразует точку из полярной системы координат в декартову.
//! \~\sa toPolar()
static PIPoint<Type> fromPolar(const PIPoint<Type> & p) { return PIPoint<Type>(p.y * cos(p.x), p.y * sin(p.x)); }
//! \~english Add second point coordinates and save.
//! \~russian Прибавить координаты второй точки и сохранить.
//! \details Является копией метода \a translate().
//! \~\details
//! \~english Adds the coordinates of point \a p to the current coordinates. Alias for \a translate(const PIPoint<Type> &).
//! \~russian Прибавляет координаты точки \a p к текущим координатам. Алиас метода \a translate(const PIPoint<Type> &).
PIPoint<Type> & operator+=(const PIPoint<Type> & p) {
translate(p);
return *this;
}
//! \~english Multiply coordinates by value.
//! \~\details
//! \~english Multiplies both coordinates by value \a v.
//! \~russian Умножает обе координаты на значение \a v.
PIPoint<Type> & operator*=(Type v) {
x *= v;
y *= v;
@@ -156,6 +215,9 @@ public:
}
//! \~english Divide coordinates by value.
//! \~\details
//! \~english Divides both coordinates by value \a v.
//! \~russian Делит обе координаты на значение \a v.
PIPoint<Type> & operator/=(Type v) {
x /= v;
y /= v;
@@ -164,43 +226,73 @@ public:
//! \~english Add coordinates of two points.
//! \~russian Сложить координаты двух точек.
//! \~\details
//! \~english Returns a new point with coordinates equal to the sum of the coordinates.
//! \~russian Возвращает новую точку с координатами, равными сумме координат.
PIPoint<Type> operator+(const PIPoint<Type> & p) { return PIPoint<Type>(x + p.x, y + p.y); }
//! \~english Add value to both coordinates.
//! \~russian Прибавить к координатам одинаковое значение.
//! \~\details
//! \~english Returns a new point with \a p added to both coordinates.
//! \~russian Возвращает новую точку с \a p, прибавленным к обеим координатам.
PIPoint<Type> operator+(const Type & p) { return PIPoint<Type>(x + p, y + p); }
//! \~english Subtract second point coordinates - get offset.
//! \~russian Вычесть из координат координаты второй точки - найти смещение.
//! \~\details
//! \~english Returns a new point with coordinates equal to the difference of the coordinates.
//! \~russian Возвращает новую точку с координатами, равными разности координат.
PIPoint<Type> operator-(const PIPoint<Type> & p) { return PIPoint<Type>(x - p.x, y - p.y); }
//! \~english Subtract value from both coordinates.
//! \~russian Вычесть из координат одинаковое значение.
//! \~\details
//! \~english Returns a new point with \a p subtracted from both coordinates.
//! \~russian Возвращает новую точку с \a p, вычтенным из обеих координат.
PIPoint<Type> operator-(const Type & p) { return PIPoint<Type>(x - p, y - p); }
//! \~english Invert point coordinates.
//! \~russian Инвертировать координаты точки.
//! \~\details
//! \~english Returns a new point with inverted coordinates.
//! \~russian Возвращает новую точку с инвертированными координатами.
PIPoint<Type> operator-() { return PIPoint<Type>(-x, -y); }
//! \~english Multiply point coordinates.
//! \~russian Умножить координаты точки.
//! \~\details
//! \~english Returns a new point with coordinates multiplied by \a v.
//! \~russian Возвращает новую точку с координатами, умноженными на \a v.
PIPoint<Type> operator*(Type v) { return PIPoint<Type>(x * v, y * v); }
//! \~english Divide point coordinates.
//! \~russian Делить координаты точки.
//! \~\details
//! \~english Returns a new point with coordinates divided by \a v.
//! \~russian Возвращает новую точку с координатами, деленными на \a v.
PIPoint<Type> operator/(Type v) { return PIPoint<Type>(x / v, y / v); }
//! \~english Check equality of two points.
//! \~russian Проверить равенство координат двух точек.
//! \~\details
//! \~english Returns \c true if both coordinates are equal.
//! \~russian Возвращает \c true, если обе координаты равны.
bool operator==(const PIPoint<Type> & p) const { return (x == p.x && y == p.y); }
//! \~english Check inequality of two points.
//! \~russian Проверить неравенство координат двух точек.
//! \~\details
//! \~english Returns \c true if at least one coordinate is different.
//! \~russian Возвращает \c true, если хотя бы одна координата отличается.
bool operator!=(const PIPoint<Type> & p) const { return (x != p.x || y != p.y); }
};
//! \~english Stream output operator for PIPoint.
//! \~russian Перегруженный оператор для вывода координат в \a PICout.
//! \~\details
//! \~english Outputs the point in format "Point{x, y}" to the stream.
//! \~russian Выводит точку в формате "Point{x, y}" в поток.
template<typename Type>
PICout operator<<(PICout & s, const PIPoint<Type> & v) {
s.space();

View File

@@ -59,10 +59,12 @@ public:
//! \~russian Нормализовать кватернион к единичной длине
void normalize();
//! Get/Set scalar component
//! \~english Get/Set scalar component
//! \~russian Получить/установить скалярную компоненту
double & scalar() { return q[0]; }
//! Get scalar component
//! \~english Get scalar component
//! \~russian Получить скалярную компоненту
double scalar() const { return q[0]; }
//! \~english Returns vector part of quaternion
@@ -101,14 +103,39 @@ protected:
double q[4];
};
//! \~english Scalar multiplication with quaternion
//! \~russian Умножение скаляра на кватернион
PIP_EXPORT PIQuaternion operator*(const double & a, const PIQuaternion & q);
//! \~english Quaternion multiplication
//! \~russian Умножение кватернионов
//! \details Performs quaternion multiplication (Hamilton product)
//! \~\sa operator+(const PIQuaternion &, const PIQuaternion &)
//! \~\sa operator-(const PIQuaternion &, const PIQuaternion &)
PIP_EXPORT PIQuaternion operator*(const PIQuaternion & q0, const PIQuaternion & q1);
//! \~english Quaternion addition
//! \~russian Сложение кватернионов
//! \details Adds corresponding components of two quaternions
//! \~\sa operator*(const PIQuaternion &, const PIQuaternion &)
//! \~\sa operator-(const PIQuaternion &, const PIQuaternion &)
inline PIQuaternion operator+(const PIQuaternion & q0, const PIQuaternion & q1) {
return PIQuaternion(q0.vector() + q1.vector(), q0.scalar() + q1.scalar());
}
//! \~english Quaternion subtraction
//! \~russian Вычитание кватернионов
//! \details Subtracts corresponding components of two quaternions
//! \~\sa operator*(const PIQuaternion &, const PIQuaternion &)
//! \~\sa operator+(const PIQuaternion &, const PIQuaternion &)
inline PIQuaternion operator-(const PIQuaternion & q0, const PIQuaternion & q1) {
return PIQuaternion(q0.vector() - q1.vector(), q0.scalar() - q1.scalar());
}
//! \~english Quaternion negation
//! \~russian Унарный минус кватерниона
//! \details Negates both vector and scalar parts of the quaternion
//! \~\sa conjugate()
inline PIQuaternion operator-(const PIQuaternion & q0) {
return PIQuaternion(-q0.vector(), -q0.scalar());
}

View File

@@ -92,17 +92,36 @@ public:
bool calculate(const PIVector<T> & val) { return calculate(val, calculateMean(val)); }
//! Arithmetic mean
//! \~english Arithmetic mean (first moment)
//! \~russian Среднее арифметическое (первый момент)
T mean;
//! Variance
//! \~english Variance (second moment, squared deviation from mean)
//! \~russian Дисперсия (второй момент, квадрат отклонения от среднего)
T variance;
//! Skewness (third standardized moment)
//! \~english Skewness (third standardized moment, measure of asymmetry)
//! \~russian Асимметрия (третий стандартизованный момент, мера асимметрии)
T skewness;
//! Kurtosis (fourth standardized moment)
//! \~english Kurtosis (fourth standardized moment, measure of tailedness)
//! \~russian Эксцесс (четвертый стандартизованный момент, мера тяжести хвостов)
T kurtosis;
};
//! Statistical calculator for int values
//! \~english Type definition for PIStatistic<int>
//! \~russian Определение типа для PIStatistic<int>
typedef PIStatistic<int> PIStatistici;
//! Statistical calculator for float values
//! \~english Type definition for PIStatistic<float>
//! \~russian Определение типа для PIStatistic<float>
typedef PIStatistic<float> PIStatisticf;
//! Statistical calculator for double values
//! \~english Type definition for PIStatistic<double>
//! \~russian Определение типа для PIStatistic<double>
typedef PIStatistic<double> PIStatisticd;
#endif // PISTATISTIC_H

View File

@@ -17,11 +17,24 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//! \~\addtogroup Core
//! \~\{
//! \~\file piplatform.h
//! \~\brief
//! \~english Platform and compiler detection macros.
//! \~russian Макросы для определения платформы и компилятора.
//! \~\details
//! \~english This header provides platform detection and compiler feature macros for cross-platform development.
//! \~russian Этот заголовочный файл предоставляет макросы для определения платформы и возможностей компилятора для кросс-платформенной
//! разработки.
#ifndef PIPLATFORM_H
#define PIPLATFORM_H
#include <pip_export.h>
//! \~english Windows platform detection macro.
//! \~russian Макрос определения платформы Windows.
#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
# define WINDOWS
# define ARCH_BITS_64
@@ -31,29 +44,43 @@
# define ARCH_BITS_32
# endif
#endif
//! \~english QNX platform detection macro.
//! \~russian Макрос определения платформы QNX.
#if defined(__QNX__) || defined(__QNXNTO__)
# define QNX
# ifdef Q_OS_BLACKBERRY
# define BLACKBERRY
# endif
#endif
//! \~english FreeBSD platform detection macro.
//! \~russian Макрос определения платформы FreeBSD.
#ifdef __FreeBSD__
# define FREE_BSD
#endif
//! \~english macOS platform detection macro.
//! \~russian Макрос определения платформы macOS.
#if defined(__APPLE__) || defined(__MACH__)
# define MAC_OS
#endif
//! \~english Android platform detection macro.
//! \~russian Макрос определения платформы Android.
#if defined(__ANDROID__) || defined(_ANDROID_) || defined(ANDROID)
# ifndef ANDROID
# define ANDROID
# endif
#endif
//! \~english FreeRTOS platform detection macro.
//! \~russian Макрос определения платформы FreeRTOS.
#ifdef PIP_FREERTOS
# define FREERTOS
#endif
//! \~english MicroPIP platform detection macro.
//! \~russian Макрос определения платформы MicroPIP.
#if defined(FREERTOS) || defined(PLATFORMIO)
# define MICRO_PIP
#endif
//! \~english Linux platform detection macro.
//! \~russian Макрос определения платформы Linux.
#ifndef WINDOWS
# ifndef QNX
# ifndef FREE_BSD
@@ -70,6 +97,8 @@
# endif
#endif
//! \~english 64-bit architecture detection macro.
//! \~russian Макрос определения 64-битной архитектуры.
#ifndef WINDOWS
# if defined(__LP64__) || defined(_LP64_) || defined(LP64)
# define ARCH_BITS_64
@@ -78,19 +107,29 @@
# endif
#endif
//! \~english GCC compiler detection macro.
//! \~russian Макрос определения компилятора GCC.
#ifdef __GNUC__
# define CC_GCC
# define CC_GCC_VERSION ((__GNUC__ << 8) | __GNUC_MINOR__)
#elif defined(_MSC_VER)
//! \~english MSVC compiler detection macro.
//! \~russian Макрос определения компилятора MSVC.
# define CC_VC
#else
//! \~english Other compiler detection macro.
//! \~russian Макрос определения другого компилятора.
# define CC_OTHER
#endif
//! \~english AVR GCC compiler detection macro.
//! \~russian Макрос определения компилятора AVR GCC.
#ifdef __AVR__
# define CC_AVR_GCC
#endif
//! \~english Typeof macro definition for different platforms.
//! \~russian Определение макроса typeof для различных платформ.
#ifdef WINDOWS
# ifdef CC_GCC
# define typeof __typeof
@@ -100,8 +139,12 @@
#endif
//! \~english POSIX signals support detection macro.
//! \~russian Макрос определения поддержки POSIX сигналов.
#if defined(LINUX) || defined(MAC_OS) || defined(ANDROID)
# define POSIX_SIGNALS
#endif
//! \~\}
#endif // PIPLATFORM_H

View File

@@ -123,6 +123,8 @@ private:
// helper class to detect default operators
//! \~english Helper class to detect default operators
//! \~russian Вспомогательный класс для обнаружения операторов по умолчанию
template<typename P>
class PIBinaryStreamTrivialRef {
public:

View File

@@ -33,48 +33,77 @@
//! \~\brief
//! \~english Class for binary de/serialization.
//! \~russian Класс для бинарной де/сериализации.
//! \~\details
//! \~english PIChunkStream provides a binary markup serialization stream that allows reading and writing structured data chunks with IDs.
//! \~russian PIChunkStream обеспечивает бинарный поток с разметкой для чтения и записи структурированных данных-чанков с ID.
class PIP_EXPORT PIChunkStream {
public:
//! \~english
//! Version of data packing. Read-access %PIChunkStream automatic detect version, but write-access
//! %PIChunkStream by default write in new version, be careful!
//! \~russian
//! Версия хранения данных. %PIChunkStream на чтение автоматически определяет версию, но для записи
//! использует по умолчанию новую, осторожно!
//! \~english Version of data packing.
//! \~russian Версия хранения данных.
//! \~\details
//! \~english Read-access %PIChunkStream automatic detect version, but write-access %PIChunkStream by default write in new version, be
//! careful!
//! \~russian %PIChunkStream на чтение автоматически определяет версию, но для записи использует по умолчанию новую, осторожно!
enum Version {
Version_1 /*! \~english First, old version \~russian Первая, старая версия */,
Version_2 /*! \~english Second, more optimized version \~russian Вторая, более оптимизированная версия */ = 2,
//! \~english First, old version
//! \~russian Первая, старая версия
Version_1,
//! \~english Second, more optimized version
//! \~russian Вторая, более оптимизированная версия
Version_2 = 2,
};
//! \~english Contructs stream for read from "data"
//! \~english Constructs stream for read from "data"
//! \~russian Создает поток на чтение из "data"
PIChunkStream(const PIByteArray & data): version_(Version_2) { setSource(data); }
//! \~english Contructs stream for read or write to/from "data", or empty stream for write if "data" = 0
//! \~english Constructs stream for read or write to/from "data", or empty stream for write if "data" = 0
//! \~russian Создает поток на чтение или запись из/в "data", или пустой поток на запись если "data" = 0
PIChunkStream(PIByteArray * data = 0, Version v = Version_2): version_(v) { setSource(data); }
//! \~english Contructs empty stream for write with version \"v\"
//! \~english Constructs empty stream for write with version \"v\"
//! \~russian Создает пустой поток на запись с версией \"v\"
PIChunkStream(Version v): version_(v) { setSource(0); }
//! \~english Destructor
//! \~russian Деструктор
~PIChunkStream();
//! \~english Nested template struct for chunk data
//! \~russian Вложенный шаблонный структура для данных чанка
template<typename T>
struct Chunk {
//! \~english Constructor with ID and data
//! \~russian Конструктор с ID и данными
Chunk(int i, const T & d): id(i), data(d) {}
//! \~english Chunk ID
//! \~russian ID чанка
int id;
//! \~english Chunk data
//! \~russian Данные чанка
T data;
};
//! \~english Nested template struct for constant chunk data
//! \~russian Вложенный шаблонный структура для константных данных чанка
template<typename T>
struct ChunkConst {
//! \~english Constructor with ID and data
//! \~russian Конструктор с ID и данными
ChunkConst(int i, const T & d): id(i), data(d) {}
//! \~english Chunk ID
//! \~russian ID чанка
int id;
//! \~english Constant chunk data reference
//! \~russian Константная ссылка на данные чанка
const T & data;
};
//! \~english Returns chunk with ID "id" and value "data" for write to stream
//! \~russian Возвращает чанк с ID "id" и значением "data" для записи в поток
//! \~\details
//! \~english This static method creates a ChunkConst object that can be used with operator<<
//! \~russian Этот статический метод создает объект ChunkConst, который можно использовать с оператором <<
//! \~\sa chunk()
template<typename T>
static ChunkConst<T> chunk(int id, const T & data) {
return ChunkConst<T>(id, data);
@@ -82,20 +111,25 @@ public:
//! \~english Add to this stream chunk with ID "id" and value "data"
//! \~russian Добавляет в этот поток чанк с ID "id" и значением "data"
//! \~\details
//! \~english This method adds a chunk to the stream using the operator<<
//! \~russian Этот метод добавляет чанк в поток с помощью оператора <<
//! \~\sa chunk()
template<typename T>
PIChunkStream & add(int id, const T & data) {
*this << ChunkConst<T>(id, data);
return *this;
}
//! \~english
//! Extract %PIByteArray from "stream" and set it current stream.
//! If "read_all" then call \a readAll() after extract.
//! Returns if has data to read.
//! \~russian
//! Извлекает %PIByteArray из "stream" и инициализирует им поток.
//! Если указан "read_all", то вызывает \a readAll() после инициализации.
//! Возвращает если ли данные для чтения.
//! \~english Extracts %PIByteArray from "stream" and sets it as current stream
//! \~russian Извлекает %PIByteArray из "stream" и устанавливает его в качестве текущего потока
//! \~\details
//! \~english If "read_all" is true, then calls \a readAll() after extraction.
//! \~russian Если "read_all" установлен в true, вызывает \a readAll() после извлечения.
//! \~\return true if data was successfully extracted and stream is ready, false otherwise
//! \~russian true если данные были успешно извлечены и поток готов, false в противном случае
//! \~\note You should call \a readAll() before using \a getData() or \a get() methods
//! \~russian Перед использованием методов \a getData() или \a get() следует вызвать \a readAll()
template<typename T>
bool extract(PIBinaryStream<T> & stream, bool read_all = false) {
stream >> tmp_data;
@@ -106,41 +140,66 @@ public:
return true;
}
//! \~english Set source buffer for read from "data"
//! \~english Sets source buffer for read from "data"
//! \~russian Устанавливает исходный буфер для чтения из "data"
void setSource(const PIByteArray & data);
//! \~english Set source buffer for read or write to/from "data", or empty stream for write if "data" = 0
//! \~english Sets source buffer for read or write to/from "data", or empty stream for write if "data" = 0
//! \~russian Устанавливает исходный буфер для чтения или записи из/в "data", или пустой поток на запись если "data" = 0
void setSource(PIByteArray * data);
//! \~english Returns internal buffer with written data
//! \~russian Возвращает внутренний буфер с записанными данными
//! \~\details
//! \~english Returns the PIByteArray containing all the data written to the stream
//! \~russian Возвращает PIByteArray, содержащий все данные, записанные в поток
PIByteArray data() const;
//! \~english Returns if there is end of stream
//! \~russian Возвращает достигнут ли конец потока
//! \~\details
//! \~english Returns true if the stream has reached its end (data size <= 1 byte)
//! \~russian Возвращает true если поток достиг конца (размер данных <= 1 байт)
bool atEnd() const { return data_->size_s() <= 1; }
//! \~english Returns stream version
//! \~russian Возвращает версию потока
//! \~\details
//! \~english Returns the version of the stream (Version_1 or Version_2)
//! \~russian Возвращает версию потока (Version_1 или Version_2)
Version version() const { return (Version)version_; }
//! \~english Read one chunk from stream and returns its ID
//! \~english Reads one chunk from stream and returns its ID
//! \~russian Читает один чанк из потока и возвращает его ID
//! \~\details
//! \~english Reads the next chunk from the stream and stores its ID for subsequent \a getData() or \a get() calls
//! \~russian Читает следующий чанк из потока и сохраняет его ID для последующих вызовов \a getData() или \a get()
//! \~\return The ID of the read chunk
//! \~russian ID прочитанного чанка
int read();
//! \~english Read all chunks from stream. This function just index input data
//! \~russian Читает все чанки из потока. Данный метод лишь индексирует данные
//! \~english Reads all chunks from stream
//! \~russian Читает все чанки из потока
//! \~\details
//! \~english This function indexes input data to allow random access via \a getData(int id) and \a get(int id, T & v)
//! \~russian Эта функция индексирует входные данные для возможности случайного доступа через \a getData(int id) и \a get(int id, T & v)
void readAll();
//! \~english Returns last readed chunk ID
//! \~english Returns last read chunk ID
//! \~russian Возвращает ID последнего прочитанного чанка
//! \~\details
//! \~english Returns the ID of the last chunk read by \a read() method
//! \~russian Возвращает ID последнего чанка, прочитанного методом \a read()
int getID() { return last_id; }
//! \~english Returns value of last readed chunk
//! \~english Returns value of last read chunk
//! \~russian Возвращает значение последнего прочитанного чанка
//! \~\details
//! \~english Extracts the value of the last read chunk using operator>> from PIByteArray
//! \~russian Извлекает значение последнего прочитанного чанка с помощью оператора >> из PIByteArray
//! \~\note Call \a read() first to read a chunk before using this method
//! \~russian Сначала вызовите \a read() для чтения чанка перед использованием этого метода
template<typename T>
T getData() const {
T ret{};
@@ -149,8 +208,13 @@ public:
return ret;
}
//! \~english Returns value of chunk with ID \"id\". You should call \a readAll() before using this function!
//! \~russian Возвращает значение чанка с ID \"id\". Необходимо вызвать \a readAll() перед использованием этого метода!
//! \~english Returns value of chunk with ID \"id\"
//! \~russian Возвращает значение чанка с ID \"id\"
//! \~\details
//! \~english Retrieves the value of a specific chunk by its ID from the indexed data
//! \~russian Извлекает значение конкретного чанка по его ID из индексированных данных
//! \~\note You should call \a readAll() before using this function!
//! \~russian Необходимо вызвать \a readAll() перед использованием этого метода!
template<typename T>
T getData(int id) const {
T ret{};
@@ -161,15 +225,25 @@ public:
return ret;
}
//! \~english Place value of last readed chunk into \"v\"
//! \~english Places value of last read chunk into \"v\"
//! \~russian Записывает значение последнего прочитанного чанка в \"v\"
//! \~\details
//! \~english Copies the value of the last read chunk to the reference parameter \"v\"
//! \~russian Копирует значение последнего прочитанного чанка в параметр-ссылку \"v\"
//! \~\note Call \a read() first to read a chunk before using this method
//! \~russian Сначала вызовите \a read() для чтения чанка перед использованием этого метода
template<typename T>
void get(T & v) const {
v = getData<T>();
}
//! \~english Place value of chunk with ID \"id\" into \"v\". You should call \a readAll() before using this function!
//! \~russian Записывает значение чанка с ID \"id\" в \"v\". Необходимо вызвать \a readAll() перед использованием этого метода!
//! \~english Places value of chunk with ID \"id\" into \"v\"
//! \~russian Записывает значение чанка с ID \"id\" в \"v\"
//! \~\details
//! \~english Retrieves the value of a specific chunk by its ID and stores it in the reference parameter \"v\"
//! \~russian Извлекает значение конкретного чанка по его ID и сохраняет его в параметре-ссылке \"v\"
//! \~\note You should call \a readAll() before using this function!
//! \~russian Необходимо вызвать \a readAll() перед использованием этого метода!
template<typename T>
const PIChunkStream & get(int id, T & v) const {
CacheEntry pos = data_map.value(id);
@@ -179,8 +253,13 @@ public:
return *this;
}
//! \~english Replace value of chunk with ID \"id\" to \"v\". You should call \a readAll() before using this function!
//! \~russian Заменяет значение чанка с ID \"id\" на \"v\". Необходимо вызвать \a readAll() перед использованием этого метода!
//! \~english Replaces value of chunk with ID \"id\" to \"v\"
//! \~russian Заменяет значение чанка с ID \"id\" на \"v\"
//! \~\details
//! \~english Replaces the value of an existing chunk with ID \"id\" with new value \"v\"
//! \~russian Заменяет значение существующего чанка с ID \"id\" новым значением \"v\"
//! \~\note You should call \a readAll() before using this function!
//! \~russian Необходимо вызвать \a readAll() перед использованием этого метода!
template<typename T>
PIChunkStream & set(int id, const T & v) {
PIByteArray ba;
@@ -190,32 +269,73 @@ public:
}
private:
//! \~english Initializes the stream after setting source
//! \~russian Инициализирует поток после установки источника
void _init();
//! \~english Cache entry structure for chunk position tracking
//! \~russian Структура записи кэша для отслеживания позиции чанка
struct CacheEntry {
//! \~english Constructor with start position, length, and size bytes
//! \~russian Конструктор с начальной позицией, длиной и байтами размера
CacheEntry(int s = 0, int l = 0, int b = 0): start(s), length(l), size_bytes(b) {}
//! \~english Start position in the data buffer
//! \~russian Начальная позиция в буфере данных
int start;
//! \~english Length of the chunk data
//! \~russian Длина данных чанка
int length;
//! \~english Number of bytes used to encode the size
//! \~russian Количество байт, использованных для кодирования размера
int size_bytes;
};
//! \~english Reads a variable-length integer from the byte array
//! \~russian Читает целое число переменной длины из байтового массива
static uint readVInt(PIByteArray & s, uchar * bytes = 0);
//! \~english Writes a variable-length integer to the byte array
//! \~russian Записывает целое число переменной длины в байтовый массив
static void writeVInt(PIByteArray & s, uint val);
//! \~english Peeks a variable-length integer without consuming it
//! \~russian Просматривает целое число переменной длины без его извлечения
static int peekVInt(Version version_, uchar * data_, int sz, uint & ret);
//! \~english Replaces a chunk with new data
//! \~russian Заменяет чанк новыми данными
void replaceChunk(int id, const PIByteArray & v);
//! \~english ID of the last read chunk
//! \~russian ID последнего прочитанного чанка
int last_id;
//! \~english Stream version (Version_1 or Version_2)
//! \~russian Версия потока (Version_1 или Version_2)
uchar version_;
//! \~english Pointer to current data buffer
//! \~russian Указатель на текущий буфер данных
mutable PIByteArray *data_, last_data, tmp_data;
//! \~english Map of chunk IDs to cache entries for random access
//! \~russian Карта ID чанков к записям кэша для случайного доступа
PIMap<int, CacheEntry> data_map;
//! \~english Flag indicating if first byte was already read
//! \~russian Флаг, указывающий, был ли прочитан первый байт
bool first_byte_taken;
//! \~english Stream output operator for Chunk
//! \~russian Оператор вывода в поток для Chunk
template<typename T>
friend PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::Chunk<T> & c);
//! \~english Stream output operator for ChunkConst
//! \~russian Оператор вывода в поток для ChunkConst
template<typename T>
friend PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::ChunkConst<T> & c);
};
//! \~\{
//! \~\fn template<typename T> PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::Chunk<T> & c)
//! \~english Stream output operator for Chunk
//! \~russian Оператор вывода в поток для Chunk
template<typename T>
PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::Chunk<T> & c) {
PIByteArray ba;
@@ -232,6 +352,10 @@ PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::Chunk<T> & c)
}
return s;
}
//! \~\}
//! \~\fn template<typename T> PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::ChunkConst<T> & c)
//! \~english Stream output operator for ChunkConst
//! \~russian Оператор вывода в поток для ChunkConst
template<typename T>
PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::ChunkConst<T> & c) {
PIByteArray ba;
@@ -248,5 +372,6 @@ PIChunkStream & operator<<(PIChunkStream & s, const PIChunkStream::ChunkConst<T>
}
return s;
}
//! \~\}
#endif // PICHUNKSTREAM_H

View File

@@ -1,9 +1,19 @@
/*! \file pijson.h
* \ingroup Serialization
* \brief
* \~english JSON class
* \~russian Класс JSON
*/
//! \~\addtogroup Serialization
//! \~\{
//! \~\file pijson.h
//! \~\brief
//! \~english JSON class
//! \~russian Класс JSON
//! \~\details
//! \~english \section PIJSON_sec0 Synopsis
//!
//! %PIJSON class provides a tree structure for JSON data representation.
//! Each element can be a value (with name), an array, or an object.
//! \~russian \section PIJSON_sec0 Краткий обзор
//!
//! Класс %PIJSON предоставляет древовидную структуру для представления данных JSON.
//! Каждый элемент может быть значением (с именем), массивом или объектом.
//! \~\}
/*
PIP - Platform Independent Primitives
JSON class
@@ -29,35 +39,58 @@
#include "pivariant.h"
//! \ingroup Serialization
//! \~\brief
//! \~english JSON class.
//! \~russian Класс JSON.
//! \~english JSON class
//! \~russian Класс JSON
//! \~\details
//! \~english %PIJSON class provides a tree structure for JSON data representation.
//! Each element can be a value (with name), an array, or an object.
//! \~russian Класс %PIJSON предоставляет древовидную структуру для представления данных JSON.
//! Каждый элемент может быть значением (с именем), массивом или объектом.
class PIP_EXPORT PIJSON {
friend PICout operator<<(PICout s, const PIJSON & v);
public:
//! \~english
//! Type of JSON tree element
//! \~russian
//! Тип элемента дерева JSON
//! \~english Type of JSON tree element
//! \~russian Тип элемента дерева JSON
//! \~\details
//! \~english Defines the type of a JSON element: invalid, null, boolean, number, string, object, or array.
//! \~russian Определяет тип элемента JSON: недействительный, null, логический, числовой, текстовый, объект или массив.
enum Type {
Invalid /*! \~english Invalid type \~russian Недействительный тип */,
Null /*! \~english Without value, null \~russian Без значения, null */,
Boolean /*! \~english Boolean, /b true or /b false \~russian Логическое, /b true или /b false */,
Number /*! \~english Integer or floating-point number \~russian Целое либо число с плавающей точкой */,
String /*! \~english Text \~russian Текст */,
Object /*! \~english Object, {} \~russian Объект, {} */,
Array /*! \~english Array, [] \~russian Массив, [] */
//! \~english Invalid type
//! \~russian Недействительный тип
Invalid,
//! \~english Without value, null
//! \~russian Без значения, null
Null,
//! \~english Boolean, /b true or /b false
//! \~russian Логическое, /b true или /b false
Boolean,
//! \~english Integer or floating-point number
//! \~russian Целое либо число с плавающей точкой
Number,
//! \~english Text
//! \~russian Текст
String,
//! \~english Object, {}
//! \~russian Объект, {}
Object,
//! \~english Array, []
//! \~russian Массив, []
Array
};
//! \~english
//! Generate JSON variant
//! \~russian
//! Вариант генерации JSON
//! \~english Generate JSON variant
//! \~russian Вариант генерации JSON
//! \~\details
//! \~english Defines the print format for JSON output: compact or tree (human-readable).
//! \~russian Определяет формат вывода JSON: компактный или древовидный (читаемый человеком).
enum PrintType {
Compact /*! \~english Without spaces, minimum size \~russian Без пробелов, минимальный размер */,
Tree /*! \~english With spaces and new-lines, human-readable \~russian С пробелами и новыми строками, читаемый человеком */
//! \~english Without spaces, minimum size
//! \~russian Без пробелов, минимальный размер
Compact,
//! \~english With spaces and new-lines, human-readable
//! \~russian С пробелами и новыми строками, читаемый человеком
Tree
};
//! \~english Contructs invalid %PIJSON.
@@ -187,13 +220,22 @@ public:
//! \~russian Разбирает текстовое представление JSON "str" и возвращает его корневой элемент.
static PIJSON fromJSON(PIString str);
//! \~english Creates a new JSON object with optional fields.
//! \~russian Создает новый JSON-объект с необязательными полями.
static PIJSON newObject(const PIVariantMap & fields = {});
//! \~english Creates a new JSON array with optional elements.
//! \~russian Создает новый JSON-массив с необязательными элементами.
static PIJSON newArray(const PIVariantVector & fields = {});
//! \~english Creates a new JSON string value.
//! \~russian Создает новое JSON-значение строки.
static PIJSON newString(const PIString & v = PIString());
//! \~english Serializes a value of type T to JSON.
//! \~russian Сериализует значение типа T в JSON.
template<typename T>
static PIJSON serialize(const T & v);
//! \~english Deserializes JSON to a value of type T.
//! \~russian Десериализует JSON в значение типа T.
template<typename T>
static T deserialize(const PIJSON & json);

View File

@@ -41,11 +41,15 @@
// enum & arithmetic
//! \~english Serializes an enum value to PIJSON.
//! \~russian Сериализует значение перечисления в PIJSON.
template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
inline PIJSON piSerializeJSON(const T & v) {
return PIJSON() = (int)v;
}
//! \~english Serializes an arithmetic value to PIJSON.
//! \~russian Сериализует арифметическое значение в PIJSON.
template<typename T,
typename std::enable_if<!std::is_enum<T>::value, int>::type = 0,
typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0>
@@ -53,6 +57,10 @@ inline PIJSON piSerializeJSON(const T & v) {
return PIJSON() = v;
}
//! \~english Serializes a complex type to PIJSON.
//! \~russian Сериализует сложный тип в PIJSON.
//! \~\details This overload triggers a compile-time error for types that are neither enum nor arithmetic.
//! \~\note Use \~\sa piSerializeJSON for supported types.
template<typename T,
typename std::enable_if<!std::is_enum<T>::value, int>::type = 0,
typename std::enable_if<!std::is_arithmetic<T>::value, int>::type = 0>
@@ -65,13 +73,19 @@ inline PIJSON piSerializeJSON(const T & v) {
// known types
//! \~english Serializes a PIJSON value to PIJSON (identity).
//! \~russian Сериализует значение PIJSON в PIJSON (идентичность).
inline PIJSON piSerializeJSON(const PIJSON & v) {
return v;
}
//! \~english Serializes a PIVariant to PIJSON.
//! \~russian Сериализует PIVariant в PIJSON.
template<>
inline PIJSON piSerializeJSON(const PIVariant & v) {
return PIJSON() = v;
}
//! \~english Serializes a complex number to PIJSON as an array of real and imaginary parts.
//! \~russian Сериализует комплексное число в PIJSON как массив действительной и мнимой частей.
template<typename T>
inline PIJSON piSerializeJSON(const complex<T> & v) {
PIJSON ret;
@@ -79,26 +93,36 @@ inline PIJSON piSerializeJSON(const complex<T> & v) {
return ret;
}
//! \~english Serializes PIFlags to PIJSON as an integer.
//! \~russian Сериализует PIFlags в PIJSON как целое число.
template<typename T>
inline PIJSON piSerializeJSON(const PIFlags<T> & v) {
return PIJSON() = (int)v;
}
//! \~english Serializes a PIString to PIJSON.
//! \~russian Сериализует PIString в PIJSON.
template<>
inline PIJSON piSerializeJSON(const PIString & v) {
return PIJSON() = v;
}
//! \~english Serializes PIConstChars to PIJSON by converting to string.
//! \~russian Сериализует PIConstChars в PIJSON путем преобразования в строку.
template<>
inline PIJSON piSerializeJSON(const PIConstChars & v) {
return PIJSON() = v.toString();
}
//! \~english Serializes PIByteArray to PIJSON as Base64-encoded string.
//! \~russian Сериализует PIByteArray в PIJSON как строку в кодировке Base64.
template<>
inline PIJSON piSerializeJSON(const PIByteArray & v) {
return PIJSON() = PIStringAscii(v.toBase64());
}
//! \~english Serializes PISystemTime to PIJSON with seconds and nanoseconds fields.
//! \~russian Сериализует PISystemTime в PIJSON с полями seconds и nanoseconds.
template<>
inline PIJSON piSerializeJSON(const PISystemTime & v) {
PIJSON ret;
@@ -107,6 +131,8 @@ inline PIJSON piSerializeJSON(const PISystemTime & v) {
return ret;
}
//! \~english Serializes PITime to PIJSON with hours, minutes, seconds, and milliseconds fields.
//! \~russian Сериализует PITime в PIJSON с полями hours, minutes, seconds и milliseconds.
template<>
inline PIJSON piSerializeJSON(const PITime & v) {
PIJSON ret;
@@ -117,6 +143,8 @@ inline PIJSON piSerializeJSON(const PITime & v) {
return ret;
}
//! \~english Serializes PIDate to PIJSON with year, month, and day fields.
//! \~russian Сериализует PIDate в PIJSON с полями year, month и day.
template<>
inline PIJSON piSerializeJSON(const PIDate & v) {
PIJSON ret;
@@ -126,6 +154,8 @@ inline PIJSON piSerializeJSON(const PIDate & v) {
return ret;
}
//! \~english Serializes PIDateTime to PIJSON with date and time fields.
//! \~russian Сериализует PIDateTime в PIJSON с полями даты и времени.
template<>
inline PIJSON piSerializeJSON(const PIDateTime & v) {
PIJSON ret;
@@ -139,11 +169,15 @@ inline PIJSON piSerializeJSON(const PIDateTime & v) {
return ret;
}
//! \~english Serializes PINetworkAddress to PIJSON as a string representation.
//! \~russian Сериализует PINetworkAddress в PIJSON как строковое представление.
template<>
inline PIJSON piSerializeJSON(const PINetworkAddress & v) {
return PIJSON() = v.toString();
}
//! \~english Serializes PIPoint to PIJSON with x and y coordinates.
//! \~russian Сериализует PIPoint в PIJSON с координатами x и y.
template<typename T>
inline PIJSON piSerializeJSON(const PIPoint<T> & v) {
PIJSON ret;
@@ -152,6 +186,8 @@ inline PIJSON piSerializeJSON(const PIPoint<T> & v) {
return ret;
}
//! \~english Serializes PILine to PIJSON with p0 and p1 points.
//! \~russian Сериализует PILine в PIJSON с точками p0 и p1.
template<typename T>
inline PIJSON piSerializeJSON(const PILine<T> & v) {
PIJSON ret;
@@ -160,6 +196,8 @@ inline PIJSON piSerializeJSON(const PILine<T> & v) {
return ret;
}
//! \~english Serializes PIRect to PIJSON with bottom-left and top-right points.
//! \~russian Сериализует PIRect в PIJSON с точками bottom-left и top-right.
template<typename T>
inline PIJSON piSerializeJSON(const PIRect<T> & v) {
PIJSON ret;
@@ -232,11 +270,15 @@ inline PIJSON piSerializeJSON(const PIMap<K, T> & v) {
// enum & arithmetic
//! \~english Deserializes an enum value from PIJSON.
//! \~russian Десериализует значение перечисления из PIJSON.
template<typename T, typename std::enable_if<std::is_enum<T>::value, int>::type = 0>
inline void piDeserializeJSON(T & v, const PIJSON & js) {
v = (T)js.toInt();
}
//! \~english Deserializes an arithmetic value from PIJSON.
//! \~russian Десериализует арифметическое значение из PIJSON.
template<typename T,
typename std::enable_if<!std::is_enum<T>::value, int>::type = 0,
typename std::enable_if<std::is_arithmetic<T>::value, int>::type = 0>
@@ -244,6 +286,10 @@ inline void piDeserializeJSON(T & v, const PIJSON & js) {
v = js.value().value<T>();
}
//! \~english Deserializes a complex type from PIJSON.
//! \~russian Десериализует сложный тип из PIJSON.
//! \~\details This overload triggers a compile-time error for types that are neither enum nor arithmetic.
//! \~\note Use \~\sa piDeserializeJSON for supported types.
template<typename T,
typename std::enable_if<!std::is_enum<T>::value, int>::type = 0,
typename std::enable_if<!std::is_arithmetic<T>::value, int>::type = 0>
@@ -256,14 +302,20 @@ inline void piDeserializeJSON(T & v, const PIJSON & js) {
// known types
//! \~english Deserializes a PIJSON value from PIJSON (identity).
//! \~russian Десериализует значение PIJSON из PIJSON (идентичность).
inline void piDeserializeJSON(PIJSON & v, const PIJSON & js) {
v = js;
}
//! \~english Deserializes a PIVariant from PIJSON.
//! \~russian Десериализует PIVariant из PIJSON.
template<>
inline void piDeserializeJSON(PIVariant & v, const PIJSON & js) {
v = js.value();
}
//! \~english Deserializes a complex number from PIJSON array of real and imaginary parts.
//! \~russian Десериализует комплексное число из массива PIJSON действительной и мнимой частей.
template<typename T>
inline void piDeserializeJSON(complex<T> & v, const PIJSON & js) {
if (!js.isArray()) return;
@@ -271,27 +323,37 @@ inline void piDeserializeJSON(complex<T> & v, const PIJSON & js) {
piDeserializeJSON(reinterpret_cast<T(&)[2]>(v)[1], js[1]);
}
//! \~english Deserializes PIFlags from PIJSON as an integer.
//! \~russian Десериализует PIFlags из PIJSON как целое число.
template<typename T>
inline void piDeserializeJSON(PIFlags<T> & v, const PIJSON & js) {
v = js.toInt();
}
//! \~english Deserializes a PIString from PIJSON.
//! \~russian Десериализует PIString из PIJSON.
template<>
inline void piDeserializeJSON(PIString & v, const PIJSON & js) {
v = js.toString();
}
//! \~english Deserializes PIByteArray from PIJSON by decoding from Base64.
//! \~russian Десериализует PIByteArray из PIJSON путем декодирования из Base64.
template<>
inline void piDeserializeJSON(PIByteArray & v, const PIJSON & js) {
v = PIByteArray::fromBase64(js.toString());
}
//! \~english Deserializes PISystemTime from PIJSON with seconds and nanoseconds fields.
//! \~russian Десериализует PISystemTime из PIJSON с полями seconds и nanoseconds.
template<>
inline void piDeserializeJSON(PISystemTime & v, const PIJSON & js) {
piDeserializeJSON(v.seconds, js["s"]);
piDeserializeJSON(v.nanoseconds, js["ns"]);
}
//! \~english Deserializes PITime from PIJSON with hours, minutes, seconds, and milliseconds fields.
//! \~russian Десериализует PITime из PIJSON с полями hours, minutes, seconds и milliseconds.
template<>
inline void piDeserializeJSON(PITime & v, const PIJSON & js) {
v.hours = js["h"].toInt();
@@ -300,6 +362,8 @@ inline void piDeserializeJSON(PITime & v, const PIJSON & js) {
v.milliseconds = js["z"].toInt();
}
//! \~english Deserializes PIDate from PIJSON with year, month, and day fields.
//! \~russian Десериализует PIDate из PIJSON с полями year, month и day.
template<>
inline void piDeserializeJSON(PIDate & v, const PIJSON & js) {
v.year = js["y"].toInt();
@@ -307,6 +371,8 @@ inline void piDeserializeJSON(PIDate & v, const PIJSON & js) {
v.day = js["d"].toInt();
}
//! \~english Deserializes PIDateTime from PIJSON with date and time fields.
//! \~russian Десериализует PIDateTime из PIJSON с полями даты и времени.
template<>
inline void piDeserializeJSON(PIDateTime & v, const PIJSON & js) {
v.year = js["y"].toInt();
@@ -318,23 +384,31 @@ inline void piDeserializeJSON(PIDateTime & v, const PIJSON & js) {
v.milliseconds = js["z"].toInt();
}
//! \~english Deserializes PINetworkAddress from PIJSON string representation.
//! \~russian Десериализует PINetworkAddress из строкового представления PIJSON.
template<>
inline void piDeserializeJSON(PINetworkAddress & v, const PIJSON & js) {
v = PINetworkAddress(js.toString());
}
//! \~english Deserializes PIPoint from PIJSON with x and y coordinates.
//! \~russian Десериализует PIPoint из PIJSON с координатами x и y.
template<typename T>
inline void piDeserializeJSON(PIPoint<T> & v, const PIJSON & js) {
piDeserializeJSON(v.x, js["x"]);
piDeserializeJSON(v.y, js["y"]);
}
//! \~english Deserializes PILine from PIJSON with p0 and p1 points.
//! \~russian Десериализует PILine из PIJSON с точками p0 и p1.
template<typename T>
inline void piDeserializeJSON(PILine<T> & v, const PIJSON & js) {
piDeserializeJSON(v.p0, js["p0"]);
piDeserializeJSON(v.p1, js["p1"]);
}
//! \~english Deserializes PIRect from PIJSON with bottom-left and top-right points.
//! \~russian Десериализует PIRect из PIJSON с точками bottom-left и top-right.
template<typename T>
inline void piDeserializeJSON(PIRect<T> & v, const PIJSON & js) {
PIPoint<T> bl, tr;
@@ -346,6 +420,8 @@ inline void piDeserializeJSON(PIRect<T> & v, const PIJSON & js) {
// containers
//! \~english Deserializes PIPair from PIJSON array.
//! \~russian Десериализует PIPair из массива PIJSON.
template<typename T1, typename T2>
inline void piDeserializeJSON(PIPair<T1, T2> & v, const PIJSON & js) {
v = {};
@@ -354,6 +430,8 @@ inline void piDeserializeJSON(PIPair<T1, T2> & v, const PIJSON & js) {
piDeserializeJSON(v.second, js[1]);
}
//! \~english Deserializes PIVector from PIJSON array.
//! \~russian Десериализует PIVector из массива PIJSON.
template<typename T>
inline void piDeserializeJSON(PIVector<T> & v, const PIJSON & js) {
v.clear();
@@ -363,6 +441,8 @@ inline void piDeserializeJSON(PIVector<T> & v, const PIJSON & js) {
piDeserializeJSON(v[i], js[i]);
}
//! \~english Deserializes PIDeque from PIJSON array.
//! \~russian Десериализует PIDeque из массива PIJSON.
template<typename T>
inline void piDeserializeJSON(PIDeque<T> & v, const PIJSON & js) {
v.clear();
@@ -372,6 +452,8 @@ inline void piDeserializeJSON(PIDeque<T> & v, const PIJSON & js) {
piDeserializeJSON(v[i], js[i]);
}
//! \~english Deserializes PIVector2D from PIJSON object with matrix data.
//! \~russian Десериализует PIVector2D из объекта PIJSON с данными матрицы.
template<typename T>
inline void piDeserializeJSON(PIVector2D<T> & v, const PIJSON & js) {
v.clear();
@@ -382,6 +464,8 @@ inline void piDeserializeJSON(PIVector2D<T> & v, const PIJSON & js) {
v.resize(js["rows"].toInt(), js["cols"].toInt());
}
//! \~english Deserializes PISet from PIJSON array.
//! \~russian Десериализует PISet из массива PIJSON.
template<typename T>
inline void piDeserializeJSON(PISet<T> & v, const PIJSON & js) {
v.clear();
@@ -393,6 +477,8 @@ inline void piDeserializeJSON(PISet<T> & v, const PIJSON & js) {
}
}
//! \~english Deserializes PIMap from PIJSON object.
//! \~russian Десериализует PIMap из объекта PIJSON.
template<typename K, typename T>
inline void piDeserializeJSON(PIMap<K, T> & v, const PIJSON & js) {
v.clear();
@@ -409,11 +495,15 @@ inline void piDeserializeJSON(PIMap<K, T> & v, const PIJSON & js) {
// ---
//! \~english Static wrapper to serialize a value to PIJSON.
//! \~russian Статическая обертка для сериализации значения в PIJSON.
template<typename T>
PIJSON PIJSON::serialize(const T & v) {
return piSerializeJSON(v);
}
//! \~english Static wrapper to deserialize a value from PIJSON.
//! \~russian Статическая обертка для десериализации значения из PIJSON.
template<typename T>
T PIJSON::deserialize(const PIJSON & json) {
T ret;

View File

@@ -18,8 +18,8 @@
*/
//! \defgroup Serialization Serialization
//! \~\brief
//! \~english Serialization.
//! \~russian Сериализация.
//! \~english Serialization module providing JSON and binary serialization support.
//! \~russian Модуль сериализации с поддержкой JSON и бинарной сериализации.
//!
//! \~\details
//! \~english \section cmake_module_Serialization Building with CMake
@@ -34,10 +34,17 @@
//! \~russian \par Общее
//!
//! \~english
//!
//!
//! This module provides serialization support through:
//! - PIJSON class for JSON parsing and generation
//! - PIBinaryStream for binary serialization
//! - PIChunkStream for chunk-based binary serialization
//! - PIValueTree conversions for hierarchical data
//! \~russian
//!
//! Этот модуль предоставляет поддержку сериализации через:
//! - Класс PIJSON для разбора и генерации JSON
//! - PIBinaryStream для бинарной сериализации
//! - PIChunkStream для блочной бинарной сериализации
//! - Конверсии PIValueTree для иерархических данных
//!
//! \~\authors
//! \~english

View File

@@ -1,14 +1,13 @@
/*! \file pivaluetree_conversions.h
* \addtogroup Serialization
* \brief
* \~english PIValueTree conversion functions
* \~russian Функции преобразования PIValueTree
* \details
* \~english This file provides functions for converting PIValueTree to and from
* various formats (JSON, text, property storage).
* \~russian Этот файл предоставляет функции для преобразования PIValueTree в различные
* форматы (JSON, текст, хранилище свойств) и из них.
*/
//! \file pivaluetree_conversions.h
//! \ingroup Serialization
//! \~\brief
//! \~english PIValueTree conversion functions
//! \~russian Функции преобразования PIValueTree
//! \~\details
//! \~english This file provides functions for converting PIValueTree to and from
//! various formats (JSON, text, property storage).
//! \~russian Этот файл предоставляет функции для преобразования PIValueTree в различные
//! форматы (JSON, текст, хранилище свойств) и из них.
/*
PIP - Platform Independent Primitives
PIValueTree conversions
@@ -41,7 +40,11 @@ class PIIODevice;
//! \~russian Пространство имён преобразований PIValueTree.
namespace PIValueTreeConversions {
//! \~english Conversion options. \~russian Параметры преобразования.
//! \~english Conversion options.
//! \~russian Параметры преобразования.
//! \~\details
//! \~english These options control what data is included when converting PIValueTree to text or JSON format.
//! \~russian Эти параметры управляют тем, какие данные включаются при преобразовании PIValueTree в текстовый или JSON формат.
enum Option {
WithAttributes = 0x1, //!< \~english Include attributes \~russian Включить атрибуты
WithComment = 0x2, //!< \~english Include comments \~russian Включить комментарии
@@ -50,52 +53,106 @@ enum Option {
IncludeRoot = 0x1000, //!< \~english Include root node \~russian Включить корневой узел
Default = WithAll //!< \~english Default options \~russian Параметры по умолчанию
};
//! \~english WithAttributes - Include node attributes in conversion.
//! \~russian WithAttributes - Включать атрибуты узлов при преобразовании.
//! \~english WithComment - Include node comments in conversion.
//! \~russian WithComment - Включать комментарии узлов при преобразовании.
//! \~english WithType - Include type information in conversion.
//! \~russian WithType - Включать информацию о типе при преобразовании.
//! \~english WithAll - Include all optional data in conversion.
//! \~russian WithAll - Включать все дополнительные данные при преобразовании.
//! \~english IncludeRoot - Include root node in conversion.
//! \~russian IncludeRoot - Включать корневой узел при преобразовании.
//! \~english Default - Default conversion options (WithAll).
//! \~russian Default - Параметры преобразования по умолчанию (WithAll).
//! \~english Options flags type.
//! \~russian Тип флагов параметров.
//! \~\sa Option
typedef PIFlags<Option> Options;
//! \~english Convert PIPropertyStorage to PIValueTree.
//! \~russian Преобразование PIPropertyStorage в PIValueTree.
//! \~\details
//! \~english Converts property storage data to PIValueTree structure.
//! \~russian Преобразует данные хранилища свойств в структуру PIValueTree.
PIP_EXPORT PIValueTree fromPropertyStorage(const PIPropertyStorage & ps);
//! \~english Convert PIVariantMap to PIValueTree.
//! \~russian Преобразование PIVariantMap в PIValueTree.
//! \~\details
//! \~english Converts variant map data to PIValueTree structure.
//! \~russian Преобразует данные variant map в структуру PIValueTree.
PIP_EXPORT PIValueTree fromVariantMap(const PIVariantMap & vm);
//! \~english Convert PIJSON to PIValueTree.
//! \~russian Преобразование PIJSON в PIValueTree.
//! \~\details
//! \~english Converts PIJSON object to PIValueTree structure.
//! \~russian Преобразует объект PIJSON в структуру PIValueTree.
PIP_EXPORT PIValueTree fromJSON(const PIJSON & json);
//! \~english Read PIValueTree from IODevice as text.
//! \~russian Чтение PIValueTree из IODevice как текст.
//! \~\details
//! \~english Reads PIValueTree data from IODevice in text format.
//! \~russian Читает данные PIValueTree из IODevice в текстовом формате.
PIP_EXPORT PIValueTree fromText(PIIODevice * device);
//! \~english Parse PIValueTree from text string.
//! \~russian Разбор PIValueTree из текстовой строки.
//! \~\details
//! \~english Parses PIValueTree from text string.
//! \~russian Разбирает PIValueTree из текстовой строки.
PIP_EXPORT PIValueTree fromText(const PIString & str);
//! \~english Load PIValueTree from JSON file.
//! \~russian Загрузка PIValueTree из JSON файла.
//! \~\details
//! \~english Loads PIValueTree from JSON file at specified path.
//! \~russian Загружает PIValueTree из JSON файла по указанному пути.
PIP_EXPORT PIValueTree fromJSONFile(const PIString & path);
//! \~english Load PIValueTree from text file.
//! \~russian Загрузка PIValueTree из текстового файла.
//! \~\details
//! \~english Loads PIValueTree from text file at specified path.
//! \~russian Загружает PIValueTree из текстового файла по указанному пути.
PIP_EXPORT PIValueTree fromTextFile(const PIString & path);
//! \~english Convert PIValueTree to JSON.
//! \~russian Преобразование PIValueTree в JSON.
//! \~\details
//! \~english Converts PIValueTree to PIJSON object with specified options.
//! \~russian Преобразует PIValueTree в объект PIJSON с указанными параметрами.
//! \~\sa Options
PIP_EXPORT PIJSON toJSON(const PIValueTree & root, Options options = Default);
//! \~english Convert PIValueTree to text.
//! \~russian Преобразование PIValueTree в текст.
//! \~\details
//! \~english Converts PIValueTree to text string with specified options.
//! \~russian Преобразует PIValueTree в текстовую строку с указанными параметрами.
//! \~\sa Options
PIP_EXPORT PIString toText(const PIValueTree & root, Options options = Default);
//! \~english Save PIValueTree to JSON file.
//! \~russian Сохранение PIValueTree в JSON файл.
//! \~\details
//! \~english Saves PIValueTree to JSON file at specified path with given options.
//! \~russian Сохраняет PIValueTree в JSON файл по указанному пути с заданными параметрами.
//! \~\note Returns true if save operation succeeded, false otherwise.
//! \~russian Возвращает true если операция сохранения успешна, false в противном случае.
//! \~\sa Options
PIP_EXPORT bool toJSONFile(const PIString & path, const PIValueTree & root, Options options = Default);
//! \~english Save PIValueTree to text file.
//! \~russian Сохранение PIValueTree в текстовый файл.
//! \~\details
//! \~english Saves PIValueTree to text file at specified path with given options.
//! \~russian Сохраняет PIValueTree в текстовый файл по указанному пути с заданными параметрами.
//! \~\note Returns true if save operation succeeded, false otherwise.
//! \~russian Возвращает true если операция сохранения успешна, false в противном случае.
//! \~\sa Options
PIP_EXPORT bool toTextFile(const PIString & path, const PIValueTree & root, Options options = Default);
} // namespace PIValueTreeConversions

View File

@@ -3,6 +3,10 @@
* \~\brief
* \~english HID device
* \~russian HID устройство
* \details
* \~english Provides access to HID (Human Interface Device) devices such as game controllers, joysticks, and other input devices.
* \~russian Предоставляет доступ к HID (Human Interface Device) устройствам, таким как геймконтроллеры, джойстики и другие устройства
* ввода.
*/
/*
PIP - Platform Independent Primitives
@@ -47,15 +51,25 @@ struct PIP_EXPORT PIHIDeviceInfo {
//! \~english Axis information
//! \~russian Информация об оси
struct PIP_EXPORT AxisInfo: public ValueInfoBase {
//! \~english Number of bits
//! \~russian Количество бит
int bits = 0;
//! \~english Minimum value
//! \~russian Минимальное значение
int min = 0;
//! \~english Maximum value
//! \~russian Максимальное значение
int max = 1;
//! \~english Indicates if axis is relative
//! \~russian Указывает, является ли ось относительной
bool is_relative = false;
};
//! \~english Button information
//! \~russian Информация о кнопке
struct PIP_EXPORT ButtonInfo: public ValueInfoBase {
//! \~english Button code
//! \~russian Код кнопки
int code = 0;
};
@@ -195,6 +209,13 @@ public:
//! \~russian Событие при событии устройства
EVENT1(event, PIHIDevice::Event, e);
//! \~handlers
//! \~{
//! \~fn void event(const Event & e)
//! \~english Event handler for HID device events
//! \~russian Обработчик событий HID устройства
//! \~\}
//! \~english Returns all available HID devices
//! \~russian Возвращает все доступные HID устройства
static PIVector<PIHIDeviceInfo> allDevices(bool try_open = true);

View File

@@ -1,9 +1,13 @@
/*! \file piplugin.h
* \ingroup System
* \~\brief
* \~english Plugin control
* \~russian Управление плагинами
*/
//! \~\addtogroup System
//! \~\{
//! \~\file piplugin.h
//! \~\brief
//! \~english Plugin control
//! \~russian Управление плагинами
//! \~\details
//! \~english Plugin helpers for dynamic library loading and plugin management
//! \~russian Вспомогательные средства для загрузки динамических библиотек и управления плагинами
//! \~\}
/*
PIP - Platform Independent Primitives
Plugin helpers
@@ -117,6 +121,9 @@
//! \~english Plugin information
//! \~russian Информация о плагине
//! \details
//! \~english Contains plugin metadata including user version and static sections
//! \~russian Содержит метаданные плагина, включая пользовательскую версию и статические секции
class PIP_EXPORT PIPluginInfo {
public:
//! \~english Constructs empty plugin info
@@ -125,18 +132,28 @@ public:
//! \~english Sets user version
//! \~russian Устанавливает пользовательскую версию
//! \param v User version string
//! \~english Строка с пользовательской версией
void setUserVersion(const PIString & v);
//! \~english Sets static section pointer
//! \~russian Устанавливает указатель статической секции
//! \param type Section type identifier
//! \~english Идентификатор типа секции
//! \param ptr Pointer to static section data
//! \~english Указатель на данные статической секции
void setStaticSection(int type, void * ptr);
//! \~english Returns user version
//! \~russian Возвращает пользовательскую версию
//! \returns User version string
//! \~english Строка с пользовательской версией
PIString userVersion() const;
//! \~english Returns all static sections
//! \~russian Возвращает все статические секции
//! \returns Map of section types to pointers
//! \~english Карта типов секций к указателям
PIMap<int, void *> staticSections() const;
private:
@@ -147,6 +164,9 @@ private:
//! \~english Plugin info storage
//! \~russian Хранилище информации о плагинах
//! \details
//! \~english Manages plugin information storage with singleton pattern
//! \~russian Управляет хранилищем информации о плагинах с паттерном синглтон
class PIP_EXPORT PIPluginInfoStorage {
public:
//! \~english Constructs storage
@@ -155,26 +175,42 @@ public:
//! \~english Returns current plugin info
//! \~russian Возвращает информацию о текущем плагине
//! \returns Pointer to current plugin info or nullptr
//! \~english Указатель на информацию о текущем плагине или nullptr
PIPluginInfo * currentInfo();
//! \~english Returns plugin info by pointer
//! \~russian Возвращает информацию о плагине по указателю
//! \param p Pointer to plugin
//! \~english Указатель на плагин
//! \returns Pointer to plugin info or nullptr
//! \~english Указатель на информацию о плагине или nullptr
PIPluginInfo * pluginInfo(void * p);
//! \~english Returns application plugin info
//! \~russian Возвращает информацию о приложении
//! \returns Pointer to application plugin info
//! \~english Указатель на информацию о плагине приложения
PIPluginInfo * applicationInfo();
//! \~english Enters plugin context
//! \~russian Входит в контекст плагина
//! \param p Pointer to plugin
//! \~english Указатель на плагин
//! \returns Pointer to plugin info
//! \~english Указатель на информацию о плагине
PIPluginInfo * enterPlugin(void * p);
//! \~english Unloads plugin
//! \~russian Выгружает плагин
//! \param p Pointer to plugin
//! \~english Указатель на плагин
void unloadPlugin(void * p);
//! \~english Returns singleton instance
//! \~russian Возвращает синглтон
//! \returns Pointer to singleton instance
//! \~english Указатель на экземпляр синглтона
static PIPluginInfoStorage * instance();
private:
@@ -189,13 +225,24 @@ private:
//! \~\brief
//! \~english Plugin loader.
//! \~russian Загрузчик плагина.
//! \details
//! \~english Handles dynamic library loading, symbol resolution, and plugin lifecycle management
//! \~russian Управляет загрузкой динамических библиотек, разрешением символов и жизненным циклом плагинов
class PIP_EXPORT PIPluginLoader {
public:
//! \~english Function pointer type for loader version check
//! \~russian Тип указателя на функцию проверки версии загрузчика
typedef int (*FunctionLoaderVersion)();
//! \~english Function pointer type for static section merge
//! \~russian Тип указателя на функцию слияния статических секций
typedef void (*FunctionStaticMerge)(int, void *, void *);
//! \~english Possible load plugin error
//! \~russian Возможные ошибки загрузки плагина
//! \details
//! \~english Error codes for plugin loading operations
//! \~russian Коды ошибок для операций загрузки плагина
enum Error {
Unknown /** \~english No \a load() call yet \~russian Не было вызова \a load() */,
NoError /** \~english No error \~russian Нет ошибки */,
@@ -208,6 +255,8 @@ public:
//! \~english Contruct loader with base filename "name" and call \a load() if "name" not empty
//! \~russian Создает загрузчик с базовым именем файла "name" и вызывает \a load() если "name" не пустое
//! \param name Base filename for plugin library
//! \~english Базовое имя файла библиотеки плагина
PIPluginLoader(const PIString & name = PIString());
//! \~english Destructor, unload library
@@ -217,6 +266,10 @@ public:
//! \~english Load plugin with base filename "name"
//! \~russian Загружает плагин с базовым именем "name"
//! \param name Base filename for plugin library
//! \~english Базовое имя файла библиотеки плагина
//! \returns true if plugin loaded successfully, false otherwise
//! \~english true если плагин загружен успешно, false в противном случае
bool load(const PIString & name);
//! \~english Unload plugin and free library
@@ -225,39 +278,62 @@ public:
//! \~english Returns if plugin is successfully loaded
//! \~russian Возвращает успешно ли загружен плагин
//! \returns true if plugin is loaded, false otherwise
//! \~english true если плагин загружен, false в противном случае
bool isLoaded() const;
//! \~english Returns error of last \a load() call
//! \~russian Возвращает ошибку последнего вызова \a load()
//! \returns Last error code
//! \~english Код последней ошибки
Error lastError() const;
//! \~english Returns error message of last \a load() call
//! \~russian Возвращает сообщение об ошибке последнего вызова \a load()
//! \returns Human-readable error message
//! \~english Читаемое сообщение об ошибке
PIString lastErrorText() const;
//! \~english Set if %PIPluginLoader should print load messages, \b true by default
//! \~russian Устанавливает должен ли %PIPluginLoader выводить сообщения, \b true по умолчанию
//! \param yes Enable or disable message output
//! \~english Включить или отключить вывод сообщений
void setMessages(bool yes);
//! \~english Returns if %PIPluginLoader should print load messages, \b true by default
//! \~russian Возвращает должен ли %PIPluginLoader выводить сообщения, \b true по умолчанию
//! \returns true if messages are enabled, false otherwise
//! \~english true если сообщения включены, false в противном случае
bool isMessages() const;
//! \~english Returns loaded plugin library path
//! \~russian Возвращает путь к загруженной библиотеке
//! \returns Path to loaded library
//! \~english Путь к загруженной библиотеке
PIString libPath();
//! \~english Obtain exported library method with name "symbol"
//! \~russian Получает экспортированный метод библиотеки с именем "symbol"
//! \~\sa PILibrary::resolve()
//! \param name Symbol name to resolve
//! \~english Имя символа для разрешения
//! \returns Pointer to symbol or nullptr if not found
//! \~english Указатель на символ или nullptr если не найден
void * resolve(const char * name);
//! \~english Invoke plugin \a PIP_PLUGIN_STATIC_SECTION_MERGE
//! \~russian Вызывает у плагина \a PIP_PLUGIN_STATIC_SECTION_MERGE
//! \details
//! \~english Calls the plugin's static section merge function to synchronize application and plugin data
//! \~russian Вызывает функцию слияния статических секций плагина для синхронизации данных приложения и плагина
void mergeStatic();
//! \~english Returns directories where plugins can be located
//! \~russian Возвращает директории где могут располагаться плагины
//! \param name Plugin name for directory search
//! \~english Имя плагина для поиска директорий
//! \returns List of directories to search for plugins
//! \~english Список директорий для поиска плагинов
static PIStringList pluginsDirectories(const PIString & name);
private:

View File

@@ -84,6 +84,8 @@ public:
//! \~english Returns current attached execution process ID
//! \~russian Возвращает ID процесса текущего выполнения
//! \details Returns the process identifier of the currently running attached process
//! \~russian Возвращает идентификатор процесса текущего запущенного присоединенного процесса
int pID() const;
//! \~english Returns current attached execution working directory or empty string if it wasn`t set
@@ -100,18 +102,28 @@ public:
//! \~english Returns all attached execution output stream
//! \~russian Возвращает весь вывод из стандартного потока вывода (stdout)
//! \details Returns all data available from the stdout stream of the attached process
//! \~russian Возвращает все данные, доступные из потока stdout присоединенного процесса
PIByteArray readOutput();
//! \~english Returns all attached execution error stream
//! \~russian Возвращает весь вывод из потока ошибок (stderr)
//! \details Returns all data available from the stderr stream of the attached process
//! \~russian Возвращает все данные, доступные из потока stderr присоединенного процесса
PIByteArray readError();
//! \~english Write data to attached execution input stream
//! \~russian Записывает данные в стандартный поток ввода (stdin)
//! \param data Data to write to stdin
//! \~russian Данные для записи в stdin
//! \details Writes data to the stdin stream of the attached process
//! \~russian Записывает данные в поток stdin присоединенного процесса
bool writeInput(const PIByteArray & data);
//! \~english Close attached execution input stream and send EOF
//! \~russian Закрывает поток ввода (stdin) и отправляет EOF
//! \details Closes the stdin stream and sends end-of-file signal to the attached process
//! \~russian Закрывает поток stdin и отправляет сигнал конца файла присоединенному процессу
void closeInput();
//! \~english Enable or disable writing to process stdin
@@ -128,6 +140,8 @@ public:
//! \~english Returns current attached execution environment
//! \~russian Возвращает текущее окружение выполнения
//! \details Returns the environment variables used for the attached process execution
//! \~russian Возвращает переменные окружения, используемые для выполнения присоединенного процесса
PIStringList environment() { return env; }
//! \~english Clear current attached execution environment. Call before \a exec()
@@ -136,14 +150,24 @@ public:
//! \~english Remove variable "variable" from current attached execution environment. Call before \a exec()
//! \~russian Удаляет переменную "variable" из окружения выполнения. Вызывать перед \a exec()
//! \param variable Name of the environment variable to remove
//! \~russian Имя переменной окружения для удаления
void removeEnvironmentVariable(const PIString & variable);
//! \~english Set variable "variable" to "value" in current attached execution environment. Call before \a exec()
//! \~russian Устанавливает значение "value" для переменной "variable" в окружении выполнения. Вызывать перед \a exec()
//! \param variable Name of the environment variable
//! \~russian Имя переменной окружения
//! \param value Value to set for the environment variable
//! \~russian Значение для установки в переменную окружения
void setEnvironmentVariable(const PIString & variable, const PIString & value);
//! \~english Start attached execution "program" with one argument "arg"
//! \~russian Запускает выполнение "program" с одним аргументом "arg"
//! \param program Path to the program to execute
//! \~russian Путь к программе для выполнения
//! \param arg Single argument to pass to the program
//! \~russian Один аргумент для передачи программе
void exec(const PIString & program, const PIString & arg) {
args.clear();
args << program << arg;
@@ -169,27 +193,43 @@ public:
//! \~english Check if attached execution has finished
//! \~russian Проверяет, завершилось ли выполнение процесса
//! \details Returns true if the attached process execution has completed
//! \~russian Возвращает true, если выполнение присоединенного процесса завершено
bool isExecFinished() const { return exec_finished; }
//! \~english Check if attached execution has started
//! \~russian Проверяет, запущен ли процесс выполнения
//! \details Returns true if the attached process execution has started
//! \~russian Возвращает true, если выполнение присоединенного процесса началось
bool isExecStarted() const { return exec_start; }
//! \~english Start detached execution "program" without arguments
//! \~russian Запускает независимое выполнение "program" без аргументов
//! \param program Path to the program to execute
//! \~russian Путь к программе для выполнения
static void execIndependent(const PIString & program) { execIndependent(program, PIStringList()); }
//! \~english Start detached execution "program" with one argument "arg"
//! \~russian Запускает независимое выполнение "program" с одним аргументом "arg"
//! \param program Path to the program to execute
//! \~russian Путь к программе для выполнения
//! \param arg Single argument to pass to the program
//! \~russian Один аргумент для передачи программе
static void execIndependent(const PIString & program, const PIString & arg) { execIndependent(program, PIStringList() << arg); }
//! \~english Start detached execution "program" with arguments "args"
//! \~russian Запускает независимое выполнение "program" с аргументами "args"
//! \param program Path to the program to execute
//! \~russian Путь к программе для выполнения
//! \param args List of arguments to pass to the program
//! \~russian Список аргументов для передачи программе
static void execIndependent(const PIString & program, const PIStringList & args);
//! \~english Returns application environment
//! \~russian Возвращает окружение текущего приложения
//! \details Returns the environment variables of the current application process
//! \~russian Возвращает переменные окружения текущего процесса приложения
static PIStringList currentEnvironment();
//! \~english Returns application process ID
@@ -198,6 +238,10 @@ public:
//! \~english Returns variable "variable" value from application environment
//! \~russian Возвращает значение переменной "variable" из окружения приложения
//! \param variable Name of the environment variable
//! \~russian Имя переменной окружения
//! \returns Value of the environment variable or empty string if not found
//! \~russian Значение переменной окружения или пустая строка, если не найдена
static PIString getEnvironmentVariable(const PIString & variable);
//! \handlers

View File

@@ -1,9 +1,16 @@
/*! \file pisignals.h
* \ingroup System
* \~\brief
* \~english System signals
* \~russian Сигналы системы
*/
//! \addtogroup System
//! \{
//! \file pisignals.h
//! \brief
//! \~english System signals
//! \~russian Сигналы системы
//! \details
//! \~english System signals handler for handling OS signals like Interrupt, Illegal, Abort, FPE, SegFault, Termination, Hangup, Quit, Kill,
//! BrokenPipe, Timer, UserDefined1, UserDefined2, ChildStopped, Continue, StopProcess, StopTTY, StopTTYInput, StopTTYOutput
//! \~russian Обработчик системных сигналов операционной системы для перехвата таких сигналов как Interrupt, Illegal, Abort, FPE, SegFault,
//! Termination, Hangup, Quit, Kill, BrokenPipe, Timer, UserDefined1, UserDefined2, ChildStopped, Continue, StopProcess, StopTTY,
//! StopTTYInput, StopTTYOutput
//! \~\}
/*
PIP - Platform Independent Primitives
Signals

View File

@@ -1,9 +1,13 @@
/*! \file pisysteminfo.h
* \ingroup System
* \~\brief
* \~english System information
* \~russian Информация о системе
*/
//! \~\addtogroup System
//! \~\{
//! \~\file pisysteminfo.h
//! \~\brief
//! \~english System information
//! \~russian Информация о системе
//! \~\details
//! \~english Provides system information such as mount points, machine key, and system details
//! \~russian Предоставляет информацию о системе, такую как точки монтирования, уникальный ключ и детали системы
//! \~\}
/*
PIP - Platform Independent Primitives
System information
@@ -28,17 +32,12 @@
#include "pitime.h"
//! \ingroup System
//! \~\brief
//! \~english Information about system.
//! \~russian Информация о системе.
//! \~english System information class.
//! \~russian Класс информации о системе.
class PIP_EXPORT PISystemInfo {
public:
//! \ingroup System
//! \~\brief
//! \~english Mount point information.
//! \~russian Информация о точке монтирования.
//! \~english Mount point information structure.
//! \~russian Структура информации о точке монтирования.
struct PIP_EXPORT MountInfo {
//! \~english Absolute path to mount point
//! \~russian Абсолютный путь к точке монтирования
@@ -73,62 +72,60 @@ public:
bool removable = false;
};
//! \~english Absolute path to "ifconfig" utility
//! \~russian Абсолютный путь к утилите "ifconfig"
//! \~english Absolute path to "ifconfig" utility.
//! \~russian Абсолютный путь к утилите "ifconfig".
PIString ifconfigPath;
//! \~english Application execution path (\c argv[0])
//! \~russian Путь вызова приложения (\c argv[0])
//! \~english Application execution path (\c argv[0]).
//! \~russian Путь вызова приложения (\c argv[0]).
PIString execCommand;
//! \~english System hostname
//! \~russian Hostname системы
//! \~english System hostname.
//! \~russian Hostname системы.
PIString hostname;
//! \~english Username that starts application
//! \~russian Имя пользователя, запустившего приложение
//! \~english Username that starts application.
//! \~russian Имя пользователя, запустившего приложение.
PIString user;
//! \~english System name (Windows, MacOS, ...)
//! \~russian Имя системы (Windows, MacOS, ...)
//! \~english System name (Windows, MacOS, ...).
//! \~russian Имя системы (Windows, MacOS, ...).
PIString OS_name;
//! \~english System version
//! \~russian Версия системы
//! \~english System version.
//! \~russian Версия системы.
PIString OS_version;
//! \~english System architecture (x86, x86_64, ...)
//! \~russian Архитектура системы (x86, x86_64, ...)
//! \~english System architecture (x86, x86_64, ...).
//! \~russian Архитектура системы (x86, x86_64, ...).
PIString architecture;
//! \~english Application start date and time
//! \~russian Дата и время запуска приложения
//! \~english Application start date and time.
//! \~russian Дата и время запуска приложения.
PIDateTime execDateTime;
//! \~english System logical processors count
//! \~russian Количество логических процессоров системы
//! \~english System logical processors count.
//! \~russian Количество логических процессоров системы.
int processorsCount = 1;
//! \~english Returns all mount points absolute pathes
//! \~russian Возвращает абсолютные пути всех точек монтирования
//! \~english Returns all mount points absolute pathes.
//! \~russian Возвращает абсолютные пути всех точек монтирования.
static PIStringList mountRoots();
//! \~english Returns information of all mount points
//! \~russian Возвращает информацию о всех точках монтирования
//! \~english Returns information of all mount points.
//! \~russian Возвращает информацию о всех точках монтирования.
static PIVector<MountInfo> mountInfo(bool ignore_cache = false);
//! \~english Returns system unique key
//! \~russian Возвращает уникальный ключ системы
//! \~english Returns system unique key.
//! \~russian Возвращает уникальный ключ системы.
static PIString machineKey();
//! \~english Returns system unique key hash
//! \~russian Возвращает хэш уникального ключа системы
//! \~english Returns system unique key hash.
//! \~russian Возвращает хэш уникального ключа системы.
static uint machineID();
//! \~english Returns singleton of %PISystemInfo
//! \~russian Возвращает синглтон %PISystemInfo
//! \~english Returns singleton of %PISystemInfo.
//! \~russian Возвращает синглтон %PISystemInfo.
static PISystemInfo * instance();
private:
@@ -136,10 +133,9 @@ private:
NO_COPY_CLASS(PISystemInfo);
};
//! \relatesalso PICout
//! \~english Output operator to \a PICout
//! \~russian Оператор вывода в \a PICout
//! \~english Output operator to \a PICout.
//! \~russian Оператор вывода в \a PICout.
inline PICout operator<<(PICout s, const PISystemInfo::MountInfo & v) {
s.saveAndSetControls(0);
s << "MountInfo(" << v.device << " mounted on \"" << v.mount_point << "\", type " << v.filesystem << ", label \"" << v.label

View File

@@ -1,3 +1,13 @@
//! \~\addtogroup System
//! \~\{
//! \~\file pisystemtests.h
//! \~\brief
//! \~english System tests results
//! \~russian Результаты системных тестов
//! \~\details
//! \~english Provides access to system test results and timing information
//! \~russian Предоставляет доступ к результатам системных тестов и информации о времени
/*
PIP - Platform Independent Primitives
System tests results (see system_test folder)
@@ -17,16 +27,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//! \addtogroup System
//! \{
//! \file pisystemtests.h
//! \brief System tests results
//! \~english Provides access to system test results and timing information
//! \~russian Предоставляет доступ к результатам системных тестов и информации о времени
//! \details
//! \~english This module contains functionality for reading system test results, including timing information
//! \~russian Этот модуль содержит функциональность для чтения результатов системных тестов, включая информацию о времени
#ifndef PISYSTEMTESTS_H
# define PISYSTEMTESTS_H

View File

@@ -32,10 +32,6 @@
#include "piconditionvar.h"
#include "piqueue.h"
/**
* \brief A Queue that supports operations that wait for the queue to become non-empty when retrieving an element, and
* wait for space to become available in the queue when storing an element.
*/
//! \~english Thread-safe blocking queue template class
//! \~russian Шаблонный класс потокобезопасной блокирующей очереди
template<typename T>
@@ -43,7 +39,7 @@ class PIBlockingQueue: private PIQueue<T> {
public:
//! \~english Constructs queue with specified capacity
//! \~russian Создает очередь с указанной емкостью
explicit inline PIBlockingQueue(size_t capacity = SIZE_MAX,
explicit inline PIBlockingQueue(size_t capacity = SIZE_MAX,
PIConditionVariable * cond_var_add = new PIConditionVariable(),
PIConditionVariable * cond_var_rem = new PIConditionVariable())
: cond_var_add(cond_var_add)
@@ -63,7 +59,8 @@ public:
//! \~english Thread-safe copy constructor from another PIBlockingQueue
//! \~russian Потокобезопасный конструктор копирования из другой PIBlockingQueue
inline PIBlockingQueue(PIBlockingQueue<T> & other): cond_var_add(new PIConditionVariable()), cond_var_rem(new PIConditionVariable()) {
inline PIBlockingQueue(PIBlockingQueue<T> & other)
: cond_var_add(new PIConditionVariable()), cond_var_rem(new PIConditionVariable()) {
other.mutex.lock();
mutex.lock();
max_size = other.max_size;
@@ -72,6 +69,8 @@ public:
other.mutex.unlock();
}
//! \~english Destructor
//! \~russian Деструктор
~PIBlockingQueue() {
delete cond_var_add;
delete cond_var_rem;
@@ -88,6 +87,8 @@ public:
return *this;
}
//! \~english Alias for put method
//! \~russian Алиас для метода put
PIBlockingQueue<T> & enqueue(const T & v) { return put(v); }
//! \~english Inserts element if possible without exceeding capacity
@@ -105,11 +106,8 @@ public:
return isOk;
}
/**
* \brief Retrieves and removes the head of this queue, waiting if necessary until an element becomes available.
*
* @return the head of this queue
*/
//! \~english Retrieves and removes the head of this queue, waiting if necessary until an element becomes available
//! \~russian Извлекает и удаляет голову очереди, ожидая пока элемент станет доступным
T take() {
T t;
mutex.lock();
@@ -120,6 +118,8 @@ public:
return t;
}
//! \~english Alias for take method
//! \~russian Алиас для метода take
T dequeue() { return take(); }
//! \~english Retrieves and removes head, waiting until element becomes available
@@ -183,7 +183,7 @@ public:
size_t drainTo(PIBlockingQueue<T> & other, size_t maxCount = SIZE_MAX) {
mutex.lock();
other.mutex.lock();
size_t count = maxCount > PIDeque<T>::size() ? PIDeque<T>::size() : maxCount;
size_t count = maxCount > PIDeque<T>::size() ? PIDeque<T>::size() : maxCount;
size_t otherRemainingCapacity = other.max_size - static_cast<PIDeque<T>>(other).size();
if (count > otherRemainingCapacity) count = otherRemainingCapacity;
for (size_t i = 0; i < count; ++i)
@@ -199,5 +199,4 @@ private:
size_t max_size;
};
#endif // PIBLOCKINGQUEUE_H
#endif // PIBLOCKINGQUEUE_H

View File

@@ -1,12 +1,16 @@
//! \addtogroup Thread
//! \{
//! \file pipipelinethread.h
//! \ingroup Thread
//! \brief
//! \~english Class for creating multithread pipeline
//! \~russian Класс для создания многопоточного конвейера
//! \~english Thread-based pipeline for multi-stage data processing
//! \~russian Потоковый конвейер для многоэтапной обработки данных
//!
//! \details
//! \~english Pipeline thread for processing data through stages in separate threads.
//! \~russian Конвейерный поток для обработки данных через этапы в отдельных потоках.
//! \~english Pipeline thread template class for processing data through multiple stages in separate threads.
//! \~english Each stage processes incoming data and passes it to the next stage via event notification.
//! \~russian Шаблонный класс конвейерного потока для многоэтапной обработки данных в отдельных потоках.
//! \~russian Каждый этап обрабатывает входные данные и передает их следующему этапу через event-уведомления.
//! \~\}
/*
PIP - Platform Independent Primitives
Class for create multihread pipeline
@@ -34,8 +38,8 @@
#include "pithread.h"
//! \~english Pipeline thread template class
//! \~russian Шаблонный класс конвейерного потока
//! \~english Thread-based pipeline template class for multi-stage data processing
//! \~russian Шаблонный класс потокового конвейера для многоэтапной обработки данных
template<typename Tin, typename Tout>
class PIPipelineThread: public PIThread {
PIOBJECT_SUBCLASS(PIPipelineThread, PIThread);
@@ -58,13 +62,17 @@ public:
terminate();
}
}
//! \~english Connect to next pipeline stage
//! \~russian Подключает к следующему этапу конвейера
//! \~english Connects to next pipeline stage via event notification
//! \~russian Подключает к следующему этапу конвейера через event-уведомления
template<typename T>
void connectTo(PIPipelineThread<Tout, T> * next) {
CONNECT3(void, Tout, bool, bool *, this, calculated, next, enqueue);
}
//! \~english Emitted when processing result is ready
//! \~russian Генерируется когда результат обработки готов
EVENT3(calculated, const Tout &, v, bool, wait, bool *, overload);
//! \~english Event handler for data enqueue
//! \~russian Обработчик события добавления данных в очередь
EVENT_HANDLER3(void, enqueue, const Tin &, v, bool, wait, bool *, overload) {
mutex.lock();
// piCoutObj << "enque" << overload;
@@ -127,8 +135,8 @@ public:
mutex.unlock();
}
//! \~english Stop calculation
//! \~russian Останавливает вычисления
//! \~english Stops calculation and waits for thread finish
//! \~russian Останавливает вычисления и ожидает завершения потока
void stopCalc(int wait_delay = 100) {
if (isRunning()) {
stop();
@@ -151,11 +159,11 @@ public:
return ret;
}
//! \~english Returns max queue size
//! \~english Returns maximum queue size
//! \~russian Возвращает максимальный размер очереди
uint maxQueSize() { return max_size; }
//! \~english Set max queue size
//! \~english Sets maximum queue size
//! \~russian Устанавливает максимальный размер очереди
void setMaxQueSize(uint count) {
mutex.lock();
@@ -164,23 +172,30 @@ public:
mutex.unlock();
}
//! \~english Returns if waiting for next pipeline
//! \~russian Возвращает ожидает ли следующий конвейер
//! \~english Returns if waiting for next pipeline stage
//! \~russian Возвращает ожидает ли следующий этап конвейера
bool isWaitNextPipe() { return wait_next_pipe; }
//! \~english Set waiting for next pipeline
//! \~russian Устанавливает ожидание следующего конвейера
//! \~english Sets whether to wait for next pipeline stage
//! \~russian Устанавливает флаг ожидания следующего этапа конвейера
void setWaitNextPipe(bool wait) { wait_next_pipe = wait; }
protected:
//! \~english Processing function - must be implemented
//! \~russian Функция обработки - должна быть реализована
//! \~english Processing function - must be implemented by derived class
//! \~russian Функция обработки - должна быть реализована в производном классе
virtual Tout calc(Tin & v, bool & ok) = 0;
//! \~english Maximum queue size (0 means unlimited)
//! \~russian Максимальный размер очереди (0 означает без ограничений)
uint max_size;
private:
//! \~english Called once at thread start to reset counter
//! \~russian Вызывается один раз при старте потока для сброса счетчика
void begin() override { cnt = 0; }
//! \~english Thread execution function - processes data from input queue
//! \~russian Функция выполнения потока - обрабатывает данные из входной очереди
void run() override {
mutex.lock();
while (in.isEmpty()) {
@@ -207,12 +222,32 @@ private:
}
// piCoutObj << "run ok";
}
//! \~english Main mutex for thread synchronization
//! \~russian Основной мьютекс для синхронизации потока
PIMutex mutex, mutex_wait;
//! \~english Condition variable for data availability notification
//! \~russian Условная переменная для уведомления о доступности данных
PIConditionVariable cv, cv_wait;
//! \~english Mutex for last result access
//! \~russian Мьютекс для доступа к последнему результату
PIMutex mutex_last;
//! \~english Flag for waiting for next pipeline stage
//! \~russian Флаг ожидания следующего этапа конвейера
bool wait_next_pipe;
//! \~english Items processed counter
//! \~russian Счетчик обработанных элементов
ullong cnt;
//! \~english Input queue for incoming data
//! \~russian Входная очередь для входящих данных
PIQueue<Tin> in;
//! \~english Last processed result
//! \~russian Последний обработанный результат
Tout last;
};

View File

@@ -69,8 +69,8 @@ public:
int counter = 0;
};
//! \~english Sets value to \"v\"
//! \~russian Устанавливает значение как \"v\"
//! \~english Sets value to "v"
//! \~russian Устанавливает значение как "v"
void set(T v) {
PIMutexLocker _ml(mutex);
var = std::move(v);
@@ -90,8 +90,8 @@ public:
return var;
}
//! \~english Sets value to \"v\"
//! \~russian Устанавливает значение как \"v\"
//! \~english Sets value to "v"
//! \~russian Устанавливает значение как "v"
PIProtectedVariable<T> & operator=(T v) {
set(std::move(v));
return *this;
@@ -104,4 +104,4 @@ private:
};
#endif
#endif

View File

@@ -1,8 +1,15 @@
/*! \file pispinlock.h
* \ingroup Thread
* \~\brief
* \~english Fast and full-load lock
* \~russian Быстрая блокировка с полной нагрузкой
* \brief Spinlock and spinlock locker classes
* \~english Spinlock and spinlock locker classes
* \~russian Классы спинлока и захватчика спинлока
* \details
* \~english
* PISpinlock provides a simple spinlock implementation using atomic operations.
* PISpinlockLocker provides RAII-style lock management for PISpinlock.
* \~russian
* PISpinlock предоставляет простую реализацию спинлока с использованием атомарных операций.
* PISpinlockLocker предоставляет управление блокировкой по стилю RAII для PISpinlock.
*/
/*
PIP - Platform Independent Primitives
@@ -37,6 +44,8 @@ public:
//! \~english Constructs unlocked spinlock
//! \~russian Создает незаблокированный спинлок
//! \note Not copyable
//! \note Thread-safe constructor
explicit PISpinlock() { flag.clear(); }
//! \~english Destroy spinlock
@@ -44,27 +53,27 @@ public:
~PISpinlock() {}
//! \~english Lock spinlock
//! \~english Locks the spinlock
//! \~russian Блокирует спинлок
//! \~\details
//! \details
//! \~english
//! If spinlock is unlocked it set to locked state and returns immediate.
//! If spinlock is already locked function blocks until spinlock will be unlocked
//! If spinlock is unlocked, it is set to locked state and returns immediately.
//! If spinlock is already locked, the function blocks until it becomes unlocked.
//! \~russian
//! Если спинлок свободен, то блокирует его и возвращает управление немедленно.
//! Если спинлок заблокирован, то ожидает разблокировки, затем блокирует и возвращает управление
//! Если спинлок свободен, он блокируется и функция возвращает управление немедленно.
//! Если спинлок уже заблокирован, функция блокируется до его разблокировки.
void lock() {
while (flag.test_and_set(std::memory_order_acquire))
;
}
//! \~english Unlock spinlock
//! \~english Unlocks the spinlock
//! \~russian Разблокирует спинлок
//! \~\details
//! \details
//! \~english
//! In any case this function returns immediate
//! This function always returns immediately regardless of spinlock state.
//! \~russian
//! В любом случае возвращает управление немедленно
//! В любом случае функция возвращает управление немедленно независимо от состояния спинлока.
void unlock() { flag.clear(std::memory_order_release); }
private:
@@ -76,14 +85,14 @@ class PIP_EXPORT PISpinlockLocker {
public:
NO_COPY_CLASS(PISpinlockLocker);
//! \~english Constructs and lock "s" if "condition" is \c true
//! \~russianСоздает и блокирует спинлок "m" если "condition" \c true
//! \~english Constructs and locks spinlock if condition is \c true
//! \~russian Создает и блокирует спинлок, если условие \c true
PISpinlockLocker(PISpinlock & s, bool condition = true): spinlock(s), cond(condition) {
if (cond) spinlock.lock();
}
//! \~english Unlock "s" if "condition" was \c true
//! \~russian Разблокирует спинлок "m" если "condition" был \c true
//! \~english Unlocks spinlock if condition was \c true
//! \~russian Разблокирует спинлок, если условие было \c true
~PISpinlockLocker() {
if (cond) spinlock.unlock();
}

View File

@@ -1,9 +1,23 @@
/*! \file pithread.h
* \ingroup Thread
* \~\brief
* \~english Thread class
* \~russian Класс потока
*/
//! \addtogroup Thread
//! \{
//! \file pithread.h
//! \brief
//! \~english Thread management and execution
//! \~russian Управление и выполнение потоков
//! \details
//! \~english This module provides cross-platform thread management with support for:
//! \~english - Thread creation and control (start, stop, terminate)
//! \~english - Thread priority management
//! \~english - Thread synchronization with internal mutex
//! \~english - Event-based notifications (started, stopped)
//! \~english - Lambda and function callback support
//! \~russian Этот модуль предоставляет кроссплатформенное управление потоками с поддержкой:
//! \~russian - Создания и управления потоками (старт, стоп, завершение)
//! \~russian - Управления приоритетами потоков
//! \~russian - Синхронизации потоков с внутренним мьютексом
//! \~russian - Event-объектов уведомлений (старт, стоп)
//! \~russian - Поддержки лямбда-выражений и функций обратного вызова
//! \~\}
/*
PIP - Platform Independent Primitives
Thread
@@ -36,17 +50,35 @@ class PIThread;
#ifndef MICRO_PIP
class PIIntrospectionThreads;
//! \~english Thread collection for internal tracking of all running threads
//! \~russian Коллекция потоков для внутреннего отслеживания всех запущенных потоков
class PIP_EXPORT __PIThreadCollection: public PIObject {
PIOBJECT(__PIThreadCollection)
public:
//! \~english Returns singleton instance of thread collection
//! \~russian Возвращает единственный экземпляр коллекции потоков
static __PIThreadCollection * instance();
//! \~english Registers thread in collection
//! \~russian Регистрирует поток в коллекции
void registerThread(PIThread * t);
//! \~english Unregisters thread from collection
//! \~russian Удаляет поток из коллекции
void unregisterThread(PIThread * t);
//! \~english Returns list of all registered threads
//! \~russian Возвращает список всех зарегистрированных потоков
PIVector<PIThread *> threads() const;
//! \~english Lock internal mutex
//! \~russian Блокирует внутренний мьютекс
void lock() { mutex.lock(); }
//! \~english Unlock internal mutex
//! \~russian Разблокирует внутренний мьютекс
void unlock() { mutex.unlock(); }
//! \~english Event handler for thread start notification
//! \~russian Обработчик события старта потока
void startedAuto(PIThread * t);
//! \~english Event handler for thread stop notification
//! \~russian Обработчик события остановки потока
EVENT_HANDLER(void, stoppedAuto);
private:
@@ -55,9 +87,15 @@ private:
};
//! \~english Initializer for thread collection singleton
//! \~russian Инициализатор синглтона коллекции потоков
class PIP_EXPORT __PIThreadCollection_Initializer__ {
public:
//! \~english Constructor, creates singleton instance
//! \~russian Конструктор, создает единственный экземпляр
__PIThreadCollection_Initializer__();
//! \~english Destructor, destroys singleton instance
//! \~russian Деструктор, уничтожает единственный экземпляр
~__PIThreadCollection_Initializer__();
static int count_;
static __PIThreadCollection * __instance__;
@@ -69,104 +107,122 @@ static __PIThreadCollection_Initializer__ __PIThreadCollection_initializer__;
typedef std::function<void(void *)> ThreadFunc;
//! \~english Cross-platform thread management class
//! \~russian Класс кроссплатформенного управления потоками
class PIP_EXPORT PIThread: public PIObject {
PIOBJECT_SUBCLASS(PIThread, PIObject);
#ifndef MICRO_PIP
//! \~english Friend class for thread introspection
//! \~russian Дружественный класс для интроспекции потоков
friend class PIIntrospectionThreads;
#endif
public:
//! \~english Disable copy constructor and assignment operator
//! \~russian Отключает конструктор копирования и оператор присваивания
NO_COPY_CLASS(PIThread);
//! \~english Contructs thread with custom data "data", external function "func" and main loop delay "loop_delay"
//! \~english Constructs thread with custom data "data", external function "func" and main loop delay "loop_delay"
//! \~russian Создает поток с данными "data", функцией "func" и задержкой цикла "loop_delay"
PIThread(void * data, ThreadFunc func, bool startNow = false, PISystemTime loop_delay = {});
//! \~english Contructs thread with external function "func" and main loop delay "loop_delay"
//! \~english Constructs thread with external function "func" and main loop delay "loop_delay"
//! \~russian Создает поток с функцией "func" и задержкой цикла "loop_delay"
PIThread(std::function<void()> func, bool startNow = false, PISystemTime loop_delay = {});
//! \~english Contructs thread with main loop delay "loop_delay"
//! \~english Constructs thread with main loop delay "loop_delay"
//! \~russian Создает поток с задержкой цикла "loop_delay"
PIThread(bool startNow = false, PISystemTime loop_delay = {});
virtual ~PIThread();
//! \~english Priority of thread
//! \~russian Приоритет потока
//! \~english Thread priority enumeration
//! \~russian Перечисление приоритетов потока
enum Priority {
piLowerst /** \~english Lowest \~russian Низший */,
piLow /** \~english Low \~russian Низкий */,
piNormal /** \~english Normal, this is default priority of threads and timers \~russian Нормальный, это приоритет по умолчанию для
потоков и таймеров */
,
piHigh /** \~english High \~russian Высокий */,
piHighest /** \~english Highest \~russian Высший */
//! \~english Lowest priority
//! \~russian Низший приоритет
piLowerst,
//! \~english Low priority
//! \~russian Низкий приоритет
piLow,
//! \~english Normal priority, default for threads and timers
//! \~russian Нормальный приоритет, используется по умолчанию для потоков и таймеров
piNormal,
//! \~english High priority
//! \~russian Высокий приоритет
piHigh,
//! \~english Highest priority
//! \~russian Высший приоритет
piHighest
};
//! \~english Start thread
//! \~russian Запускает поток
//! \~english Starts thread execution
//! \~russian Запускает выполнение потока
bool start();
//! \~english Start thread
//! \~russian Запускает поток
//! \~english Starts thread with specified loop delay
//! \~russian Запускает поток с указанной задержкой цикла
bool start(PISystemTime loop_delay);
//! \~english Start thread
//! \~russian Запускает поток
//! \~english Starts thread with external function
//! \~russian Запускает поток с внешней функцией
bool start(ThreadFunc func);
//! \~english Start thread
//! \~russian Запускает поток
//! \~english Starts thread with external function and loop delay
//! \~russian Запускает поток с внешней функцией и задержкой цикла
bool start(ThreadFunc func, PISystemTime loop_delay);
//! \~english Start thread
//! \~russian Запускает поток
//! \~english Starts thread with lambda function
//! \~russian Запускает поток с лямбда-функцией
bool start(std::function<void()> func);
//! \~english Start thread
//! \~russian Запускает поток
//! \~english Starts thread with lambda function and loop delay
//! \~russian Запускает поток с лямбда-функцией и задержкой цикла
bool start(std::function<void()> func, PISystemTime loop_delay);
//! \~english Start thread without internal loop
//! \~russian Запускает поток без внутреннего цикла
//! \~english Starts thread without internal loop (single execution)
//! \~russian Запускает поток без внутреннего цикла (однократное выполнение)
bool startOnce();
//! \~english Start thread without internal loop
//! \~russian Запускает поток без внутреннего цикла
//! \~english Starts thread without internal loop with external function (single execution)
//! \~russian Запускает поток без внутреннего цикла с внешней функцией (однократное выполнение)
bool startOnce(ThreadFunc func);
//! \~english Start thread without internal loop
//! \~russian Запускает поток без внутреннего цикла
//! \~english Starts thread without internal loop with lambda function (single execution)
//! \~russian Запускает поток без внутреннего цикла с лямбда-функцией (однократное выполнение)
bool startOnce(std::function<void()> func);
//! \~english Stops thread execution gracefully
//! \~russian Останавливает выполнение потока корректным способом
EVENT_HANDLER0(void, stop);
//! \~english Terminates thread execution forcefully
//! \~russian Принудительно завершает выполнение потока
EVENT_HANDLER0(void, terminate);
//! \~english Stops thread and waits for finish with timeout
//! \~russian Останавливает поток и ожидает завершения с таймаутом
bool stopAndWait(PISystemTime timeout = {});
bool stopAndWait(int timeout_ms) DEPRECATEDM("use stopAndWait(PISystemTime)") {
return stopAndWait(PISystemTime::fromMilliseconds(timeout_ms));
}
//! \~english Stop thread and wait for finish. Returns \b false if timeout expired.
//! \~russian Останавливает поток и ожидает завершения. Возвращает \b false если таймаут истек.
bool stopAndWait(PISystemTime timeout = {});
//! \~english Set common data passed to external function
//! \~english Sets common data passed to external function
//! \~russian Устанавливает данные, передаваемые в функцию потока
void setData(void * d) { data_ = d; }
//! \~english Set external function that will be executed after every \a run()
//! \~english Sets external function that will be executed after every \a run()
//! \~russian Устанавливает функцию потока, вызываемую после каждого \a run()
void setSlot(ThreadFunc func) { ret_func = func; }
//! \~english Set external function that will be executed after every \a run()
//! \~russian Устанавливает функцию потока, вызываемую после каждого \a run()
//! \~english Sets lambda function that will be executed after every \a run()
//! \~russian Устанавливает лямбда-функцию, вызываемую после каждого \a run()
void setSlot(std::function<void()> func) {
ret_func = [func](void *) { func(); };
}
//! \~english Set thread priority
//! \~english Sets thread priority
//! \~russian Устанавливает приоритет потока
void setPriority(PIThread::Priority prior);
@@ -174,59 +230,74 @@ public:
//! \~russian Возвращает данные, передаваемые в функцию потока
void * data() const { return data_; }
//! \~english Return thread priority
//! \~english Returns thread priority
//! \~russian Возвращает приоритет потока
PIThread::Priority priority() const { return priority_; }
//! \~english Return if thread is running
//! \~russian Возвращает исполняется ли поток
//! \~english Returns thread execution status
//! \~russian Возвращает статус выполнения потока
bool isRunning() const { return running_; }
//! \~english Return if thread is stopping
//! \~russian Возвращает останавливается ли поток
//! \~english Returns thread stopping status
//! \~russian Возвращает статус остановки потока
bool isStopping() const { return running_ && terminating; }
//! \~english Wait for thread start
//! \~russian Ожидает старта потока
//! \~english Waits for thread start with timeout
//! \~russian Ожидает старта потока с таймаутом
bool waitForStart(PISystemTime timeout = {});
bool waitForStart(int timeout_msecs) DEPRECATEDM("use waitForStart(PISystemTime)") {
return waitForStart(PISystemTime::fromMilliseconds(timeout_msecs));
}
//! \~english Wait for thread finish. Returns \b false if timeout expired.
//! \~russian Ожидает завершения потока. Возвращает \b false если таймаут истек.
//! \~english Waits for thread finish with timeout
//! \~russian Ожидает завершения потока с таймаутом
bool waitForFinish(PISystemTime timeout = {});
bool waitForFinish(int timeout_msecs) DEPRECATEDM("use waitForFinish(PISystemTime)") {
return waitForFinish(PISystemTime::fromMilliseconds(timeout_msecs));
}
//! \~english Set necessity of lock every \a run() with internal mutex
//! \~russian Устанавливает необходимость блокировки внутреннего мьютекса каждый \a run()
//! \~english Sets necessity of locking internal mutex during \a run()
//! \~russian Устанавливает необходимость блокировки внутреннего мьютекса во время \a run()
void needLockRun(bool need) { lockRun = need; }
//! \~english Locks internal mutex
//! \~russian Блокирует внутренний мьютекс
EVENT_HANDLER0(void, lock) const { thread_mutex.lock(); }
//! \~english Unlocks internal mutex
//! \~russian Разблокирует внутренний мьютекс
EVENT_HANDLER0(void, unlock) const { thread_mutex.unlock(); }
//! \~english Returns internal mutex
//! \~russian Возвращает внутренний мьютекс
//! \~english Returns internal mutex reference
//! \~russian Возвращает ссылку на внутренний мьютекс
PIMutex & mutex() const { return thread_mutex; }
//! \~english Returns thread ID
//! \~russian Возвращает ID потока
//! \~english Returns thread identifier
//! \~russian Возвращает идентификатор потока
llong tid() const { return tid_; }
//! \~english Internal thread function for continuous execution
//! \~russian Внутренняя функция потока для непрерывного выполнения
void __thread_func__();
//! \~english Internal thread function for single execution
//! \~russian Внутренняя функция потока для однократного выполнения
void __thread_func_once__();
//! \~english Emitted when thread starts execution
//! \~russian Генерируется при старте выполнения потока
EVENT(started);
//! \~english Emitted when thread stops execution
//! \~russian Генерируется при остановке выполнения потока
EVENT(stopped);
//! \~english Call event handler "handler" of object "object" in separate thread
//! \~russian Вызывает обработчик "handler" объекта "object" в отдельном потоке
//! \~english Calls event handler in separate thread
//! \~russian Вызывает обработчик события в отдельном потоке
static void runOnce(PIObject * object, const char * handler, const PIString & name = PIString());
//! \~english Call [lambda expression](https://en.cppreference.com/w/cpp/language/lambda) "func" in separate thread
//! \~russian Вызывает [лямбда-выражение](https://ru.cppreference.com/w/cpp/language/lambda) "func" в отдельном потоке
//! \~english Calls lambda expression in separate thread
//! \~russian Вызывает лямбда-выражение в отдельном потоке
static void runOnce(std::function<void()> func, const PIString & name = PIString());
//! \handlers
@@ -234,13 +305,13 @@ public:
//! \fn void stop()
//! \brief
//! \~english Stop thread
//! \~russian Останавливает поток
//! \~english Stop thread execution
//! \~russian Останавливает выполнение потока
//! \fn void terminate()
//! \brief
//! \~english Strongly stop thread
//! \~russian Жёстко прерывает поток
//! \~english Forcefully terminate thread execution
//! \~russian Принудительно завершает выполнение потока
//! \fn void lock()
//! \brief
@@ -258,49 +329,104 @@ public:
//! \fn void started()
//! \brief
//! \~english Raise on thread start
//! \~russian Вызывается при старте потока
//! \~english Emitted when thread starts
//! \~russian Генерируется при старте потока
//! \fn void stopped()
//! \brief
//! \~english Raise on thread stop
//! \~russian Вызывается при завершении потока
//! \~english Emitted when thread stops
//! \~russian Генерируется при остановке потока
//! \}
protected:
//! \~english Converts priority to system-specific value
//! \~russian Преобразует приоритет в системное значение
static int priority2System(PIThread::Priority p);
//! \~english Function executed once at the start of thread
//! \~russian Метод выполняется один раз при старте потока
//! \~english Called once at thread start
//! \~russian Вызывается один раз при старте потока
virtual void begin() { ; }
//! \~english Function executed at every "loop_delay" msecs until thread was stopped
//! \~russian Метод выполняется каждые "loop_delay" миллисекунд
//! \~english Called repeatedly during thread execution
//! \~russian Вызывается многократно во время выполнения потока
virtual void run() { ; }
//! \~english Function executed once at the end of thread
//! \~russian Метод выполняется один раз при остановке потока
//! \~english Called once at thread end
//! \~russian Вызывается один раз при завершении потока
virtual void end() { ; }
std::atomic_bool terminating, running_, lockRun;
//! \~english Thread termination flag
//! \~russian Флаг завершения потока
std::atomic_bool terminating;
//! \~english Thread running flag
//! \~russian Флаг выполнения потока
std::atomic_bool running_;
//! \~english Flag for mutex locking during run
//! \~russian Флаг блокировки мьютекса во время выполнения
std::atomic_bool lockRun;
//! \~english Loop delay time
//! \~russian Время задержки цикла
PISystemTime delay_;
//! \~english Thread identifier
//! \~russian Идентификатор потока
llong tid_ = -1;
//! \~english User data passed to thread function
//! \~russian Пользовательские данные, передаваемые в функцию потока
void * data_ = nullptr;
//! \~english Internal mutex for thread synchronization
//! \~russian Внутренний мьютекс для синхронизации потока
mutable PIMutex thread_mutex;
//! \~english Thread priority
//! \~russian Приоритет потока
PIThread::Priority priority_ = piNormal;
//! \~english External function callback
//! \~russian Внешняя функция обратного вызова
ThreadFunc ret_func = nullptr;
//! \~english Thread state notification mechanism
//! \~russian Механизм уведомления о состоянии потока
PIThreadNotifier state_notifier;
//! \~english Private declaration for implementation details
//! \~russian Приватное объявление для деталей реализации
PRIVATE_DECLARATION(PIP_EXPORT)
private:
//! \~english Starts internal thread
//! \~russian Запускает внутренний поток
bool _startThread(void * func);
//! \~english Initializes thread execution
//! \~russian Инициализирует выполнение потока
void _beginThread();
//! \~english Executes thread loop
//! \~russian Выполняет цикл потока
void _runThread();
//! \~english Finalizes thread execution
//! \~russian Завершает выполнение потока
void _endThread();
//! \~english Waits for thread finish with timeout
//! \~russian Ожидает завершения потока с таймаутом
bool _waitForFinish(PISystemTime max_tm);
//! \~english Creates thread name string
//! \~russian Создает строку имени потока
PIByteArray createThreadName(int size = 16) const;
//! \~english Sets platform-specific thread name
//! \~russian Устанавливает имя потока в системе
void setThreadName();
};

View File

@@ -29,6 +29,8 @@
#include "piconditionvar.h"
//! \~english Thread notifier class for synchronization between threads
//! \~russian Класс уведомления потоков для синхронизации между потоками
class PIP_EXPORT PIThreadNotifier {
public:
PIThreadNotifier();

View File

@@ -1,9 +1,14 @@
/*! \file pithreadpoolloop.h
* \ingroup Thread
* \~\brief
* \~english Thread pool loop
* \~russian Пул потоков
*/
//! \addtogroup Thread
//! \{
//! \file pithreadpoolloop.h
//! \brief
//! \~english Thread pool loop
//! \~russian Пул потоков
//! \details
//! \~english Thread pool loop with functions execution by integer argument range
//! \~russian Пул потоков с исполнением функций по диапазону целочисленных аргументов
//! \~\}
/*
PIP - Platform Independent Primitives
Thread pool loop
@@ -33,12 +38,13 @@ class PIThread;
class PIP_EXPORT PIThreadPoolLoop {
public:
//! \~english
//! Contructs thread pool with threads count "thread_cnt".
//! If "thread_cnt" = -1 then system processors count used
//! \~russian
//! Создает пул из "thread_cnt" потоков. Если "thread_cnt" = -1
//! то используется количество процессоров системы
//! \~english Constructs thread pool with threads count "thread_cnt".
//! If "thread_cnt" = -1 then system processors count used.
//! \~russian Создает пул из "thread_cnt" потоков. Если "thread_cnt" = -1
//! то используется количество процессоров системы.
//! \details
//! \~english Thread pool loop for parallel execution of functions with integer arguments.
//! \~russian Пул потоков для параллельного исполнения функций с целочисленными аргументами.
PIThreadPoolLoop(int thread_cnt = -1);
virtual ~PIThreadPoolLoop();
@@ -53,32 +59,20 @@ public:
//! \~russian Ожидает завершения всех потоков
void wait();
//! \~english
//! Start functions execution with integer argument range
//! from "index_start" to "index_start + index_count - 1"
//! \~russian
//! Начинает исполнение потоков с аргументами по диапазону
//! от "index_start" до "index_start + index_count - 1"
//! \~english Start functions execution with integer argument range from "index_start" to "index_start + index_count - 1"
//! \~russian Начинает исполнение потоков с аргументами по диапазону от "index_start" до "index_start + index_count - 1"
void start(int index_start, int index_count);
//! \~english
//! Start functions execution with integer argument range
//! from "index_start" to "index_start + index_count - 1"
//! and wait for finish
//! \~russian
//! Начинает исполнение потоков с аргументами по диапазону
//! от "index_start" до "index_start + index_count - 1"
//! и ожидает завершения
//! \~english Start functions execution with integer argument range from "index_start" to "index_start + index_count - 1" and wait for
//! finish
//! \~russian Начинает исполнение потоков с аргументами по диапазону от "index_start" до "index_start + index_count - 1" и ожидает
//! завершения
void exec(int index_start, int index_count);
//! \~english
//! Start functions "f" execution with integer argument range
//! from "index_start" to "index_start + index_count - 1"
//! and wait for finish
//! \~russian
//! Начинает исполнение потоками функции "f" с аргументами по диапазону
//! от "index_start" до "index_start + index_count - 1"
//! и ожидает завершения
//! \~english Start functions "f" execution with integer argument range from "index_start" to "index_start + index_count - 1" and wait
//! for finish
//! \~russian Начинает исполнение потоками функции "f" с аргументами по диапазону от "index_start" до "index_start + index_count - 1" и
//! ожидает завершения
void exec(int index_start, int index_count, std::function<void(int)> f);
private:
@@ -89,5 +83,4 @@ private:
std::atomic_int counter = {0}, wait_count = {0};
};
#endif
#endif

View File

@@ -51,10 +51,8 @@
//! \~\authors
//! \~english
//! Ivan Pelipenko peri4ko@yandex.ru;
//! Andrey Bychkov work.a.b@yandex.ru;
//! \~russian
//! Иван Пелипенко peri4ko@yandex.ru;
//! Андрей Бычков work.a.b@yandex.ru;
//!
#ifndef PIUNITS_BASE_H