PIP 5.9.0
Platform-Independent Primitives
Загрузка...
Поиск...
Не найдено
Шаблон класса PIParseHelper< Key >

Связывает ключи пакетов с обработчиками и десериализует полезную нагрузку перед вызовом. Подробнее...

#include <piparsehelper.h>

Открытые члены

 PIParseHelper ()
 Создает пустой вспомогательный парсер.
void assign (Key key, std::function< void()> func)
 Связывает ключ "key" с callback-функцией "func" без аргументов полезной нагрузки.
template<typename T>
void assign (Key key, std::function< void(const T &)> func)
 Связывает ключ "key" с callback-функцией "func" с одним десериализуемым аргументом.
template<typename O>
void assign (Key key, O *obj, void(O::*member_func)())
 Связывает ключ "key" с методом объекта "obj" без аргументов.
template<typename T, typename O>
void assign (Key key, O *obj, void(O::*member_func)(const T &))
 Связывает ключ "key" с методом объекта "obj" с одним десериализуемым аргументом.
template<typename L>
void assign (Key key, L func)
 Связывает ключ "key" с функтором или lambda с нулем или одним аргументом.
void parse (Key key, PIByteArray ba)
 Десериализует полезную нагрузку "ba" и вызывает обработчики, назначенные ключу "key".

Подробное описание

template<typename Key>
class PIParseHelper< Key >

Связывает ключи пакетов с обработчиками и десериализует полезную нагрузку перед вызовом.

PIParseHelper помогает заменить ручную диспетчеризацию пакетов через switch набором вызовов assign(). Обработчиками могут быть обычные callback-функции, функторы или методы объекта. Тип полезной нагрузки восстанавливается из PIByteArray по сигнатуре выбранного обработчика.

Пример:

enum Header {
hInt = 1,
hString,
hVoid
};
class MyObj: public PIObject, public PIParseHelper<uchar> {
PIOBJECT(MyObj);
public:
MyObj(): PIParseHelper<uchar>(this) {
// Keys with 1 argument
assign(hInt, std::function<void(int)>([this](int i){piCout << "lambda type Int" << i;}));
assign(hInt, HANDLER(methodI));
assign(hString, HANDLER(methodS));
// hVoid key, without arguments
assign(hVoid, [](){piCout << "type void";});
assign(hVoid, HANDLER(method));
}
EVENT_HANDLER1(void, methodI, int, i) {piCout << "methodI" << i;}
EVENT_HANDLER1(void, methodS, PIString, s) {piCout << "methodS" << s;}
EVENT_HANDLER0(void, method) {piCout << "method";}
};
int main() {
MyObj o;
data.clear();
data << 11;
o.parse(hInt, data);
// lambda type Int 11
// methodI 11
data.clear();
data << PIString("text");
o.parse(hString, data);
// methodS text
data.clear();
o.parse(hVoid, data);
// type void
// method
}
enum Header {
hInt = 1,
hString,
hVoid
};
class MyObj: public PIObject {
PIOBJECT(MyObj);
public:
EVENT_HANDLER1(void, methodI, int, i) {piCout << "methodI" << i;}
EVENT_HANDLER1(void, methodS, PIString, s) {piCout << "methodS" << s;}
EVENT_HANDLER0(void, method) {piCout << "method";}
};
int main() {
MyObj obj;
PIParseHelper<int> parser(&obj);
parser.assign(hInt, obj.HANDLER(methodI));
parser.assign(hString, obj.HANDLER(methodS));
parser.assign(hVoid, obj.HANDLER(method));
data.clear();
data << 11;
parser.parse(hInt, data);
// methodI 11
data.clear();
data << PIString("text");
parser.parse(hString, data);
// methodS text
data.clear();
parser.parse(hVoid, data);
// method
}