Doxygen generated by local qwen3-coder-next
This commit is contained in:
@@ -1,9 +1,16 @@
|
||||
/*! \file piparsehelper.h
|
||||
* \ingroup IO
|
||||
* \~\brief
|
||||
* \~english Helper class to automate structs receive
|
||||
* \~russian Класс для автоматизации приема структур
|
||||
*/
|
||||
//! \addtogroup IO
|
||||
//! \{
|
||||
//! \file piparsehelper.h
|
||||
//! \brief
|
||||
//! \~english Template helper class to automate structs receive and data packet deserialization
|
||||
//! \~russian Шаблонный класс для автоматизации приема структур и десериализации пакетов данных
|
||||
//! \details
|
||||
//! \~english The PIParseHelper class provides a mechanism to deserialize data packets and automatically invoke assigned handler methods. It
|
||||
//! supports member functions, lambda functions, and functors with 0 or 1 arguments.
|
||||
//! \~russian Класс PIParseHelper предоставляет механизм для десериализации пакетов данных и автоматического вызова назначаемых
|
||||
//! обработчиков. Поддерживаются member-функции, lambda-функции и функторы с 0 или 1 аргументами.
|
||||
//! \~\}
|
||||
|
||||
/*
|
||||
PIP - Platform Independent Primitives
|
||||
Helper class to automate structs receive
|
||||
@@ -30,62 +37,49 @@
|
||||
#include "pip_io_utils_export.h"
|
||||
|
||||
|
||||
/** \class PIParseHelper
|
||||
* \brief Helper class to automate structs receive
|
||||
*
|
||||
*
|
||||
* \section PIParseHelper_synopsis Synopsis
|
||||
* This class helps to deserialize and invoke neccessarily methods.
|
||||
*
|
||||
* Data packets with header and various data types can be automated by this class.
|
||||
* Every key value mapped to object member function, lambda-function or functor.
|
||||
*
|
||||
* This class can remove \b switch-case with deserialization code and
|
||||
* replace it with several \a assign() calls, binded to ready-to-use event handlers.
|
||||
* Moreover data type automatic takes from event handler or lambda argument. One should
|
||||
* only make \"PIByteArray & operator <<()\" with used types, deserialization will be
|
||||
* performed by %PIParseHelper.
|
||||
*
|
||||
*
|
||||
* \section PIParseHelper_usage Usage
|
||||
*
|
||||
* Create instance of %PIParseHelper, or subclass.
|
||||
*
|
||||
* In \a assign() methods you can use object member function, lambda-function
|
||||
* or functor with 0 or 1 arguments,
|
||||
*
|
||||
*
|
||||
* \section PIParseHelper_lambda Lambda-functions
|
||||
* \code assign(1, [this](const SomeStruct & s){}) \endcode
|
||||
*
|
||||
*
|
||||
* \section PIParseHelper_examples Examples
|
||||
* First example describes subclass variant. As one can see, it`s a single place to change
|
||||
* type of received data - event handler argument.
|
||||
* \snippet piparsehelper.cpp 0
|
||||
*
|
||||
* Second example show separate variant:
|
||||
* \snippet piparsehelper.cpp 1
|
||||
*
|
||||
**/
|
||||
//! \class PIParseHelper
|
||||
//! \~english Template helper class to automate structs receive and data packet deserialization
|
||||
//! \~russian Шаблонный класс для автоматизации приема структур и десериализации пакетов данных
|
||||
//! \details
|
||||
//! \~english The PIParseHelper class provides a mechanism to deserialize data packets and automatically invoke assigned handler methods. It
|
||||
//! supports member functions, lambda functions, and functors with 0 or 1 arguments. The class eliminates the need for switch-case
|
||||
//! statements by mapping keys to event handlers via assign() calls. Data type extraction is automatically performed from the handler
|
||||
//! signature.
|
||||
//! \~russian Класс PIParseHelper предоставляет механизм для десериализации пакетов данных и автоматического вызова назначаемых
|
||||
//! обработчиков. Поддерживаются member-функции, lambda-функции и функторы с 0 или 1 аргументами. Класс устраняет необходимость операторов
|
||||
//! switch-case, сопоставляя ключи с обработчиками событий через вызовы assign(). Извлечение типа данных автоматически выполняется из
|
||||
//! сигнатуры обработчика.
|
||||
|
||||
//! \~english Template helper class to automate structs receive
|
||||
//! \~russian Шаблонный класс для автоматизации приема структур
|
||||
template<typename Key>
|
||||
class PIParseHelper {
|
||||
public:
|
||||
//! \brief Construct %PIParseHelper
|
||||
//! \~english Construct PIParseHelper
|
||||
//! \~russian Создать PIParseHelper
|
||||
PIParseHelper() {}
|
||||
|
||||
|
||||
//! \brief Assign key \"key\" to lambda-function \"func\" without arguments
|
||||
//! \~english Assign key to lambda-function without arguments
|
||||
//! \~russian Сопоставить ключ с lambda-функцией без аргументов
|
||||
//! \param key The key to assign
|
||||
//! \param func The lambda function to call when key is parsed
|
||||
//! \~english \param key Ключ для сопоставления
|
||||
//! \~russian \param key Ключ для сопоставления
|
||||
//! \~english \param func Lambda-функция, вызываемая при разборе ключа
|
||||
//! \~russian \param func Lambda-функция, вызываемая при разборе ключа
|
||||
void assign(Key key, std::function<void()> func) {
|
||||
auto lf = [func](PIByteArray) { func(); };
|
||||
functions[key] << lf;
|
||||
}
|
||||
|
||||
|
||||
//! \brief Assign key \"key\" to lambda-function \"func\" with 1 argument
|
||||
//! \~english Assign key to lambda-function with 1 argument
|
||||
//! \~russian Сопоставить ключ с lambda-функцией с 1 аргументом
|
||||
//! \param key The key to assign
|
||||
//! \param func The lambda function to call when key is parsed
|
||||
//! \~english \param key Ключ для сопоставления
|
||||
//! \~russian \param key Ключ для сопоставления
|
||||
//! \~english \param func Lambda-функция, вызываемая при разборе ключа
|
||||
//! \~russian \param func Lambda-функция, вызываемая при разборе ключа
|
||||
template<typename T>
|
||||
void assign(Key key, std::function<void(const T &)> func) {
|
||||
auto lf = [func](PIByteArray data) {
|
||||
@@ -99,7 +93,17 @@ public:
|
||||
}
|
||||
|
||||
|
||||
//! \brief Assign key \"key\" to member function of object \"obj\" without arguments
|
||||
//! \~english Assign key to member function of object without arguments
|
||||
//! \~russian Сопоставить ключ с member-функцией объекта без аргументов
|
||||
//! \param key The key to assign
|
||||
//! \param obj Pointer to the object
|
||||
//! \param member_func Pointer to the member function
|
||||
//! \~english \param key Ключ для сопоставления
|
||||
//! \~russian \param key Ключ для сопоставления
|
||||
//! \~english \param obj Указатель на объект
|
||||
//! \~russian \param obj Указатель на объект
|
||||
//! \~english \param member_func Указатель на member-функцию
|
||||
//! \~russian \param member_func Указатель на member-функцию
|
||||
template<typename O>
|
||||
void assign(Key key, O * obj, void (O::*member_func)()) {
|
||||
auto lf = [member_func, obj](PIByteArray) { (obj->*member_func)(); };
|
||||
@@ -107,7 +111,17 @@ public:
|
||||
}
|
||||
|
||||
|
||||
//! \brief Assign key \"key\" to member function of object \"obj\" with 1 argument
|
||||
//! \~english Assign key to member function of object with 1 argument
|
||||
//! \~russian Сопоставить ключ с member-функцией объекта с 1 аргументом
|
||||
//! \param key The key to assign
|
||||
//! \param obj Pointer to the object
|
||||
//! \param member_func Pointer to the member function
|
||||
//! \~english \param key Ключ для сопоставления
|
||||
//! \~russian \param key Ключ для сопоставления
|
||||
//! \~english \param obj Указатель на объект
|
||||
//! \~russian \param obj Указатель на объект
|
||||
//! \~english \param member_func Указатель на member-функцию
|
||||
//! \~russian \param member_func Указатель на member-функцию
|
||||
template<typename T, typename O>
|
||||
void assign(Key key, O * obj, void (O::*member_func)(const T &)) {
|
||||
auto lf = [member_func, obj](PIByteArray data) {
|
||||
@@ -121,14 +135,28 @@ public:
|
||||
}
|
||||
|
||||
|
||||
//! \brief Assign key \"key\" to functor \"func\" with 0 or 1 argument
|
||||
//! \~english Assign key to functor with 0 or 1 argument
|
||||
//! \~russian Сопоставить ключ с функтором с 0 или 1 аргументом
|
||||
//! \param key The key to assign
|
||||
//! \param func The functor to call when key is parsed
|
||||
//! \~english \param key Ключ для сопоставления
|
||||
//! \~russian \param key Ключ для сопоставления
|
||||
//! \~english \param func Функтор, вызываемый при разборе ключа
|
||||
//! \~russian \param func Функтор, вызываемый при разборе ключа
|
||||
template<typename L>
|
||||
void assign(Key key, L func) {
|
||||
return assign(key, toStdFunction(func));
|
||||
}
|
||||
|
||||
|
||||
//! \brief Deserialize data and invoke assigned to \"key\" methods
|
||||
//! \~english Deserialize data and invoke assigned methods
|
||||
//! \~russian Десериализовать данные и вызвать назначенные методы
|
||||
//! \param key The key to look up
|
||||
//! \param ba The byte array to deserialize
|
||||
//! \~english \param key Ключ для поиска
|
||||
//! \~russian \param key Ключ для поиска
|
||||
//! \~english \param ba Байтовый массив для десериализации
|
||||
//! \~russian \param ba Байтовый массив для десериализации
|
||||
void parse(Key key, PIByteArray ba) {
|
||||
auto fl = functions.value(key);
|
||||
for (auto f: fl)
|
||||
@@ -136,8 +164,11 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
//! \~english Map of assigned functions
|
||||
//! \~russian Карта назначенных функций
|
||||
PIMap<Key, PIVector<std::function<void(PIByteArray)>>> functions;
|
||||
};
|
||||
//! \}
|
||||
|
||||
|
||||
#endif // PIPARSEHELPER_H
|
||||
|
||||
Reference in New Issue
Block a user