Всем привет.
Как сейчас принято писать инкрементальные бинарные парсеры/сериализаторы под устоявшийся протокол из RFC? Мой вариант, это иерархия сообщений для разбора данных, фабрика + двойная диспетчеризация для обработки сообщений и всё ручками пишется. Может есть что-то получше? Версия С++ 14/17.
Здравствуйте, Kernan, Вы писали:
K>Как сейчас принято писать инкрементальные бинарные парсеры с под устоявшийся протокол? Мой вариант, это иерархия сообщений для разбора данных, фабрика + двойная диспетчеризация для обработки сообщений и всё ручками. Может есть что-то получше? Версия С++ 14/17.
Обычно протокол описывается в DSL и по нему генерится код. Ничего руками не делается.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, AndrewJD, Вы писали:
AJD>Обычно протокол описывается в DSL и по нему генерится код. Ничего руками не делается.
Ну тутоверкил, 1.5 сообщения и 3.5 поля. В любом случае, DSL тоже на С++ по традиции? Я смотрю сейчас либу где всё декларативно написано через шаблоны, всякие эндианесы задают, размеры, констреинты.
Здравствуйте, Kernan, Вы писали:
K>В любом случае, DSL тоже на С++ по традиции?
XML, json или свой язык.
K>Я смотрю сейчас либу где всё декларативно написано через шаблоны, всякие эндианесы задают, размеры, констреинты.
Посмотри на google protobuf, cap'n proto, SBE.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, AndrewJD, Вы писали:
K>>В любом случае, DSL тоже на С++ по традиции? AJD>XML, json или свой язык.
Ясно. K>>Я смотрю сейчас либу где всё декларативно написано через шаблоны, всякие эндианесы задают, размеры, констреинты. AJD>Посмотри на google protobuf, cap'n proto, SBE.
Ты меня не понял. Обновил задачу в стартовом топике .
Здравствуйте, Kernan, Вы писали:
K>Как сейчас принято писать инкрементальные бинарные парсеры/сериализаторы под устоявшийся протокол из RFC? Мой вариант, это иерархия сообщений для разбора данных, фабрика + двойная диспетчеризация для обработки сообщений и всё ручками пишется. Может есть что-то получше? Версия С++ 14/17.
Я в одном проекте вместо иерархии сообщений хранил variant в очереди сообщений + visit для их диспетчеризации. Compile-time рефлексия была на boost.fusion для структур сообщений, чтобы не писать руками стерилизацию. Сейчас наверно и что-то типа https://github.com/apolukhin/magic_get можно было бы попробовать применить, пока C++23 не вышел.