Utils/Daemon: BUGFIX: Fix command line argument parsing
[senf.git] / Packets / ParseVariant.ih
index c022af5..1166077 100644 (file)
 namespace senf {
 namespace detail {
 
+#   define SENF_PARSE_VARIANT_TPL_ARGS_DFL(n)                                                     \
+        BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT( SENF_LIMIT_PARSE_VARIANT,                            \
+                                             n,                                                   \
+                                             boost::mpl::na )
+
+#   define SENF_PARSE_VARIANT_TPL_ARGS(n) BOOST_PP_ENUM_PARAMS( SENF_LIMIT_PARSE_VARIANT, n )
+
+#   ifndef DOXYGEN
+
     template <class Variant, unsigned N>
     struct VariantBytes {
         static PacketParserBase::size_type bytes(Variant const & v, unsigned n);
@@ -43,8 +52,11 @@ namespace detail {
     struct VariantBytes<Variant,0> {
         static PacketParserBase::size_type bytes(Variant const & v, unsigned n);
     };
+
+#   endif
     
-    template <class ChooserType, unsigned Distance>
+    /** \brief Internal: Variant Policy used by senf::Parse_Variant_Direct */
+    template <class ChooserType, unsigned Distance, class Translator>
     struct Parse_Variant_Direct
     {
         typedef PacketParserBase::data_iterator data_iterator;
@@ -60,14 +72,31 @@ namespace detail {
         }
         
         unsigned variant(data_iterator i, state_type s) const {
-            return chooser(i,s).value();
+            return Translator::fromChooser(chooser(i,s).value());
         }
 
         void variant(unsigned v, data_iterator i, state_type s) {
-            chooser(i,s).value(v);
+            chooser(i,s).value(Translator::toChooser(v));
         }
     };
 
+    /** \brief Internal: Identity chooser translator */
+    struct Parse_Variant_IdentityTranslator {
+        static unsigned fromChooser(unsigned value) { return value; }
+        static unsigned toChooser(unsigned value) { return value; }
+    };
+
+#   define SENF_PARSER_VARIANT_(r, data, elem) ,elem
+
+#   define SENF_PARSER_VARIANT_I(field, name, chooser, translator, types)                         \
+        typedef senf::Parse_Variant_Direct<                                                       \
+            BOOST_PP_CAT(chooser, _t),                                                            \
+            SENF_PARSER_CURRENT_FIXED_OFFSET() - SENF_PARSER_FIXED_OFFSET(chooser),               \
+            translator                                                                            \
+            BOOST_PP_SEQ_FOR_EACH( SENF_PARSER_VARIANT_, _, types )                               \
+            >::parser BOOST_PP_CAT(name, _variant_t);                                             \
+        field( name, BOOST_PP_CAT(name, _variant_t) )
+
 }}
 
 ///////////////////////////////ih.e////////////////////////////////////////