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);
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;
}
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////////////////////////////////////////