libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
anctranslator.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <promeki/namespace.h>
14#include <promeki/ancdetails.h>
15#include <promeki/ancformat.h>
16#include <promeki/ancpacket.h>
18#include <promeki/enums_anc.h>
20#include <promeki/list.h>
21#include <promeki/result.h>
22#include <promeki/string.h>
23#include <promeki/variant.h>
24#include <promeki/util.h>
25
26PROMEKI_NAMESPACE_BEGIN
27
107class AncTranslator {
108 public:
109 // -- Return-type aliases --------------------------------------
110
116 using ParseResult = Result<Variant>;
117
129 using PacketsResult = Result<AncPacket::List>;
130
131 // -- Handler signatures ---------------------------------------
132
134 using ParserFn = ParseResult (*)(const AncPacket &, const AncTranslateConfig &);
135
154 using MultiParserFn = ParseResult (*)(const AncPacket::List &,
155 const AncTranslateConfig &);
156
169 using BuilderFn = PacketsResult (*)(const Variant &, const AncTranslateConfig &);
170
183 using TranslatorFn = PacketsResult (*)(const AncPacket &, AncTransport,
184 const AncTranslateConfig &);
185
216 using SyncPolicyFn = PacketsResult (*)(const AncPacket &,
217 FrameSyncDisposition,
218 uint8_t repeatIndex,
219 const AncTranslateConfig &);
220
248 using DetailerFn = AncDetails (*)(const AncPacket &, const AncTranslateConfig &);
249
250 // -- Construction --------------------------------------------
251
253 AncTranslator() = default;
254
256 explicit AncTranslator(AncTranslateConfig cfg) : _cfg(std::move(cfg)) {}
257
259 const AncTranslateConfig &config() const { return _cfg; }
260
262 void setConfig(AncTranslateConfig cfg) { _cfg = std::move(cfg); }
263
264 // -- Dispatch -------------------------------------------------
265
278 ParseResult parse(const AncPacket &pkt) const;
279
305 String describe(const AncPacket &pkt, Error *err = nullptr) const;
306
343 AncDetails details(const AncPacket &pkt) const;
344
365 ParseResult parseGroup(const AncPacket::List &pkts) const;
366
385 PacketsResult build(const Variant &v, const AncFormat &fmt,
386 const AncTransport &target) const;
387
405 PacketsResult translate(const AncPacket &pkt, const AncTransport &target) const;
406
426 PacketsResult applySyncPolicy(const AncPacket &pkt,
427 FrameSyncDisposition disposition,
428 uint8_t repeatIndex) const;
429
430 // -- Static registration -------------------------------------
431
443 static void registerParser(AncFormat::ID format, const AncTransport &src, ParserFn fn);
444
456 static void registerMultiParser(AncFormat::ID format, const AncTransport &src,
457 MultiParserFn fn);
458
468 static void registerBuilder(AncFormat::ID format, const AncTransport &dst, BuilderFn fn);
469
480 static void registerTranslator(AncFormat::ID format, const AncTransport &src,
481 const AncTransport &dst, TranslatorFn fn);
482
493 static void registerSyncPolicy(AncFormat::ID format, SyncPolicyFn fn);
494
506 static void registerDetailer(AncFormat::ID format, const AncTransport &src, DetailerFn fn);
507
508 // -- Static capability queries -------------------------------
509
516 static bool hasParser(const AncFormat &format, const AncTransport &src);
517
519 static bool hasMultiParser(const AncFormat &format, const AncTransport &src);
520
522 static bool hasBuilder(const AncFormat &format, const AncTransport &dst);
523
525 static bool hasDirectTranslator(const AncFormat &format, const AncTransport &src,
526 const AncTransport &dst);
527
529 static bool hasSyncPolicy(const AncFormat &format);
530
540 static bool hasDetailer(const AncFormat &format, const AncTransport &src);
541
551 static bool canTranslate(const AncFormat &format, const AncTransport &src,
552 const AncTransport &dst);
553
555 static List<AncTransport> registeredParserTransports(const AncFormat &format);
556
558 static List<AncTransport> registeredBuilderTransports(const AncFormat &format);
559
560 private:
561 AncTranslateConfig _cfg;
562};
563
564PROMEKI_NAMESPACE_END
565
566// ============================================================================
567// Static-init registration macros
568// ============================================================================
569
584#define PROMEKI_REGISTER_ANC_PARSER(Tag, Format, Transport, Fn) \
585 namespace { \
586 struct AncParserRegistrar_##Tag { \
587 AncParserRegistrar_##Tag() { \
588 ::promeki::AncTranslator::registerParser(::promeki::AncFormat::Format, \
589 Transport, Fn); \
590 } \
591 }; \
592 static AncParserRegistrar_##Tag s_anc_parser_registrar_##Tag; \
593 }
594
605#define PROMEKI_REGISTER_ANC_MULTI_PARSER(Tag, Format, Transport, Fn) \
606 namespace { \
607 struct AncMultiParserRegistrar_##Tag { \
608 AncMultiParserRegistrar_##Tag() { \
609 ::promeki::AncTranslator::registerMultiParser( \
610 ::promeki::AncFormat::Format, Transport, Fn); \
611 } \
612 }; \
613 static AncMultiParserRegistrar_##Tag s_anc_multi_parser_registrar_##Tag; \
614 }
615
622#define PROMEKI_REGISTER_ANC_BUILDER(Tag, Format, Transport, Fn) \
623 namespace { \
624 struct AncBuilderRegistrar_##Tag { \
625 AncBuilderRegistrar_##Tag() { \
626 ::promeki::AncTranslator::registerBuilder(::promeki::AncFormat::Format, \
627 Transport, Fn); \
628 } \
629 }; \
630 static AncBuilderRegistrar_##Tag s_anc_builder_registrar_##Tag; \
631 }
632
646#define PROMEKI_REGISTER_ANC_TRANSLATOR(Tag, Format, Src, Dst, Fn) \
647 namespace { \
648 struct AncTranslatorRegistrar_##Tag { \
649 AncTranslatorRegistrar_##Tag() { \
650 ::promeki::AncTranslator::registerTranslator(::promeki::AncFormat::Format, \
651 Src, Dst, Fn); \
652 } \
653 }; \
654 static AncTranslatorRegistrar_##Tag s_anc_translator_registrar_##Tag; \
655 }
656
670#define PROMEKI_REGISTER_ANC_SYNC_POLICY(Tag, Format, Fn) \
671 namespace { \
672 struct AncSyncPolicyRegistrar_##Tag { \
673 AncSyncPolicyRegistrar_##Tag() { \
674 ::promeki::AncTranslator::registerSyncPolicy(::promeki::AncFormat::Format, \
675 Fn); \
676 } \
677 }; \
678 static AncSyncPolicyRegistrar_##Tag s_anc_sync_policy_registrar_##Tag; \
679 }
680
694#define PROMEKI_REGISTER_ANC_DETAILER(Tag, Format, Transport, Fn) \
695 namespace { \
696 struct AncDetailerRegistrar_##Tag { \
697 AncDetailerRegistrar_##Tag() { \
698 ::promeki::AncTranslator::registerDetailer(::promeki::AncFormat::Format, \
699 Transport, Fn); \
700 } \
701 }; \
702 static AncDetailerRegistrar_##Tag s_anc_detailer_registrar_##Tag; \
703 }
704
705#endif // PROMEKI_ENABLE_PROAV