# include <boost/preprocessor/if.hpp>
# include <boost/preprocessor/expand.hpp>
# include <boost/preprocessor/facilities/is_empty.hpp>
+# include <boost/preprocessor/punctuation/comma.hpp>
# include "../Utils/mpl.hh"
#
# ////////////////////////////////ih.p///////////////////////////////////////
size_type BOOST_PP_CAT(name,_offset)() const { \
return field_offset_(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0)); \
} \
- static size_type const BOOST_PP_CAT(name, _init_bytes) = SENF_MPL_SLOT_GET(init_bytes);
+ static size_type const BOOST_PP_CAT(name, _init_bytes) = \
+ SENF_MPL_SLOT_GET(init_bytes);
#
# define SENF_PARSER_I_FIELD_OFS_fix(name, type, access) \
- static size_type const BOOST_PP_CAT(name, _offset) = SENF_MPL_SLOT_GET(offset);
+ static size_type const BOOST_PP_CAT(name, _offset) = \
+ SENF_MPL_SLOT_GET(offset);
#
# ////////////////////////////////////////
# // SENF_PARSER_I_ADVANCE_OFS_*
return field_offset_(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0)) \
- SENF_MPL_SLOT_GET(bitfield_size); \
} \
- static size_type const BOOST_PP_CAT(name, _init_bytes) = SENF_MPL_SLOT_GET(init_bytes) \
- - SENF_MPL_SLOT_GET(bitfield_size);
+ static size_type const BOOST_PP_CAT(name, _init_bytes) = \
+ SENF_MPL_SLOT_GET(init_bytes) - SENF_MPL_SLOT_GET(bitfield_size);
#
# define SENF_PARSER_I_BITFIELD_OFS_fix(name, type, access) \
- static size_type const BOOST_PP_CAT(name, _offset) = SENF_MPL_SLOT_GET(offset) \
- - SENF_MPL_SLOT_GET(bitfield_size);
+ static size_type const BOOST_PP_CAT(name, _offset) = \
+ SENF_MPL_SLOT_GET(offset) - SENF_MPL_SLOT_GET(bitfield_size);
#
# ////////////////////////////////////////
# // SENF_PARSER_I_BITFIELD_RESET
# define SENF_PARSER_SKIP_BITS_fix(bits) SENF_PARSER_I_SKIP_BITS(bits, fix)
#
# define SENF_PARSER_I_SKIP_BITS(bits, ofstype) \
- SENF_MPL_SLOT_SET(bit, SENF_MPL_SLOT_GET(bit) + bits)
+ private: \
+ SENF_MPL_SLOT_SET(bit, SENF_MPL_SLOT_GET(bit) + bits); \
+ public:
#
# ///////////////////////////////////////////////////////////////////////////
# // SENF_PARSER_GOTO_*
# ///////////////////////////////////////////////////////////////////////////
# // SENF_PARSER_COLLECTION_I
#
- namespace senf { namespace detail { namespace auxtag {
+# ifndef DOXYGEN
+#
+ namespace senf { namespace detail { namespace auxtag {
struct none {}; } } }
- namespace senf { namespace detail { namespace auxtag {
+ namespace senf { namespace detail { namespace auxtag {
struct bytes {}; } } }
- namespace senf { namespace detail { namespace auxtag {
- template <class T>
+ namespace senf { namespace detail { namespace auxtag {
+ template <class Transform, class Tag>
struct transform {}; } } }
#
+# endif
+#
# define SENF_PARSER_COLLECTION_TAG_GOBBLE__bytes(x)
-# define SENF_PARSER_COLLECTION_TAG__bytes(x) senf::detail::auxtag::bytes
+# define SENF_PARSER_COLLECTION_TAG__bytes(x) bytes()
+# define SENF_PARSER_COLLECTION_TAG_EXPAND__bytes() senf::detail::auxtag::bytes
# define SENF_PARSER_COLLECTION_TAG_GETAUX__bytes(x) x
#
+# // No recursive call so we need some more of theese ... ARGH !!!
+# define SENF_CAT_RECURS1(a, b) SENF_CAT_RECURS1_I(a,b)
+# define SENF_CAT_RECURS1_I(a, b) a ## b
+# define SENF_CAT_RECURS2(a, b) SENF_CAT_RECURS2_I(a,b)
+# define SENF_CAT_RECURS2_I(a, b) a ## b
+# define SENF_CAT_RECURS3(a, b) SENF_CAT_RECURS3_I(a,b)
+# define SENF_CAT_RECURS3_I(a, b) a ## b
+#
# define SENF_PARSER_COLLECTION_TAG_GOBBLE__transform(x,y)
-# define SENF_PARSER_COLLECTION_TAG__transform(x,y) senf::detail::auxtag::transform<x>
-# define SENF_PARSER_COLLECTION_TAG_GETAUX__transform(x,y) y
+# define SENF_PARSER_COLLECTION_TAG__transform(x,y) \
+ transform(x, SENF_PARSER_COLLECTION_TAG_RECURS1(y))
+# define SENF_PARSER_COLLECTION_TAG_EXPAND__transform(x,y) \
+ senf::detail::auxtag::transform< \
+ x, \
+ SENF_CAT_RECURS1(SENF_PARSER_COLLECTION_TAG_EXPAND__, y)>
+# define SENF_PARSER_COLLECTION_TAG_GETAUX__transform(x,y) \
+ SENF_PARSER_COLLECTION_TAG_GETAUX_RECURS1(y)
+#
+# define SENF_PARSER_COLLECTION_TAG_EXPAND__none() senf::detail::auxtag::none
+#
+# define SENF_PARSER_COLLECTION_TAG_RECURS1(aux) \
+ BOOST_PP_IF( \
+ SENF_PARSER_COLLECTION_HAS_KEYWORD(aux), \
+ BOOST_PP_CAT(SENF_PARSER_COLLECTION_TAG__, aux), \
+ none() )
+#
+# define SENF_PARSER_COLLECTION_TAG_GETAUX_RECURS1(aux) \
+ BOOST_PP_IF( \
+ SENF_PARSER_COLLECTION_HAS_KEYWORD(aux), \
+ BOOST_PP_CAT(SENF_PARSER_COLLECTION_TAG_GETAUX__, aux), \
+ aux)
#
# define SENF_PARSER_COLLECTION_HAS_KEYWORD(x) \
- BOOST_PP_IS_EMPTY( BOOST_PP_CAT(SENF_PARSER_COLLECTION_TAG_GOBBLE__, x) )
+ BOOST_PP_IS_EMPTY( SENF_CAT_RECURS1(SENF_PARSER_COLLECTION_TAG_GOBBLE__, x) )
#
+# define SENF_PARSER_COLLECTION_GETAUX(aux) \
+ BOOST_PP_IF( SENF_PARSER_COLLECTION_HAS_KEYWORD(aux), \
+ SENF_CAT_RECURS2(SENF_PARSER_COLLECTION_TAG_GETAUX__, aux), \
+ aux )
+
# define SENF_PARSER_COLLECTION_I(access, name, aux, traits) \
BOOST_PP_EXPAND( \
SENF_PARSER_COLLECTION_II \
SENF_PARSER_COLLECTION_HAS_KEYWORD(aux), \
( access, \
name, \
- BOOST_PP_CAT(SENF_PARSER_COLLECTION_TAG_GETAUX__, aux), \
- BOOST_PP_CAT(SENF_PARSER_COLLECTION_TAG__, aux), \
+ SENF_CAT_RECURS2(SENF_PARSER_COLLECTION_TAG_GETAUX__, aux), \
+ SENF_CAT_RECURS2(SENF_PARSER_COLLECTION_TAG__, aux), \
traits ), \
( access, \
name, \
aux, \
- senf::detail::auxtag::none, \
+ none(), \
traits ) ))
#
# define SENF_PARSER_COLLECTION_II(access, name, aux, tag, traits) \
BOOST_PP_CAT(name,_aux_policy); \
typedef traits::parser< \
BOOST_PP_CAT(name,_aux_policy), \
- tag \
+ BOOST_PP_CAT(SENF_PARSER_COLLECTION_TAG_EXPAND__, tag) \
>::type BOOST_PP_CAT(name, _collection_t); \
access: \
SENF_PARSER_FIELD_SETUP_I( name, \
#
# define SENF_PARSER_COLLECTION_AUXTYPE_fix(name, aux)
#
+# ifndef DOXYGEN
+#
namespace senf { namespace detail {
template <class Parser> struct DynamicAuxParserPolicy;
template <class Parser, unsigned offset> struct FixedAuxParserPolicy;
template <class Parser, unsigned fixedOffset, bool fixedDelta>
- struct ParserAuxPolicySelect
+ struct ParserAuxPolicySelect
{ typedef senf::detail::DynamicAuxParserPolicy<Parser> type; };
template <class Parser, unsigned fixedOffset>
- struct ParserAuxPolicySelect<Parser, fixedOffset, true>
+ struct ParserAuxPolicySelect<Parser, fixedOffset, true>
{ typedef senf::detail::FixedAuxParserPolicy<Parser, fixedOffset> type; };
}};
#
+# endif
+#
# define SENF_PARSER_COLLECTION_AUX_I_var(name, aux) \
senf::detail::ParserAuxPolicySelect< BOOST_PP_CAT(aux, _t), \
SENF_PARSER_CURRENT_FIXED_OFFSET() \
template <class T> T BOOST_PP_CAT(name, _dispatch)(boost::true_type) const \
{ return parse<T>( SENF_PARSER_OFFSET(name) ); } \
template <class T> T BOOST_PP_CAT(name, _dispatch)(boost::false_type) const \
- { return parse<T>( aux(), SENF_PARSER_OFFSET(name) ); } \
+ { return parse<T>( BOOST_PP_CAT(aux,_)(), SENF_PARSER_OFFSET(name) ); } \
BOOST_PP_CAT(name, _t) BOOST_PP_CAT(name, _)() const \
{ return BOOST_PP_CAT(name, _dispatch) <BOOST_PP_CAT(name, _t)>( \
boost::integral_constant<bool, BOOST_PP_CAT(name, _aux_fixed)>()); } \