Doxygen generated by local qwen3-coder-next, part 2
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -37,8 +37,6 @@ namespace PIClientServer {
|
||||
|
||||
class Server;
|
||||
|
||||
class ClientInterface {};
|
||||
|
||||
//! \brief
|
||||
//! \~english Base class for client and server-side client
|
||||
//! \~russian Базовый класс для клиента и клиента на стороне сервера
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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_;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() << " "
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
//! \}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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; }
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
#include "piconditionvar.h"
|
||||
|
||||
|
||||
//! \~english Thread notifier class for synchronization between threads
|
||||
//! \~russian Класс уведомления потоков для синхронизации между потоками
|
||||
class PIP_EXPORT PIThreadNotifier {
|
||||
public:
|
||||
PIThreadNotifier();
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user