SENF_MPL_SLOT_DEF_ZERO(offset); \
SENF_MPL_SLOT_DEF_ZERO(bit); \
SENF_MPL_SLOT_DEF_ZERO(bitfield_size); \
- void init_chain(senf::mpl::rv<0>*) {} \
+ void init_chain(senf::mpl::rv<0>*) const {} \
public:
#
# define SENF_PARSER_INITIALIZE_var() \
SENF_MPL_SLOT_DEF_ZERO(init_bytes); \
SENF_MPL_SLOT_DEF_ZERO(bit); \
SENF_MPL_SLOT_DEF_ZERO(bitfield_size); \
- void init_chain(senf::mpl::rv<0>*) {} \
+ void init_chain(senf::mpl::rv<0>*) const {} \
size_type field_offset_(senf::mpl::rv<0>*) const { return 0; } \
public:
#
size_type field_offset_(senf::mpl::rv<1>*) const { \
return senf::bytes( *static_cast<name const*>(this) ); \
} \
- void init_chain(senf::mpl::rv<1>*) { \
+ void init_chain(senf::mpl::rv<1>*) const { \
name::init(); \
} \
public:
private: \
SENF_MPL_SLOT_SET(offset, name::fixed_bytes); \
SENF_MPL_SLOT_SET(index, 1); \
- void init_chain(senf::mpl::rv<1>*) { \
+ void init_chain(senf::mpl::rv<1>*) const { \
name::init(); \
} \
public:
#
# ///////////////////////////////////////////////////////////////////////////
-# // SENF_PARSER_FIELD_*
+# // SENF_PARSER_FIELD*
# // SENF_PARSER_P_FIELD_*
#
# define SENF_PARSER_FIELD_var(name, type) SENF_PARSER_FIELD_I(name, type, var, rw, public)
BOOST_PP_CAT(SENF_PARSER_I_SIZE_, ofstype) (name, type), \
BOOST_PP_CAT(SENF_PARSER_I_INITBYTES_, ofstype) (name, type), \
access ) \
- BOOST_PP_CAT(SENF_PARSER_I_FIELD_VAL_, rwtype) (name, type, ofstype, access) \
+ BOOST_PP_CAT(SENF_PARSER_I_FIELD_VAL_, rwtype) (name, type, access) \
public:
#
# ////////////////////////////////////////
#
# define SENF_PARSER_I_FIELD_INIT_rw(name, type, access) \
private: \
- void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) { \
+ void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) const { \
init_chain(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0)); \
name().init(); \
} \
#
# define SENF_PARSER_I_FIELD_INIT_ro(name, type, access) \
private: \
- void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) { \
+ void init_chain(senf::mpl::rv<BOOST_PP_CAT(name,_index)>*) const { \
init_chain(static_cast<senf::mpl::rv<BOOST_PP_CAT(name,_index)-1>*>(0)); \
} \
access:
# ////////////////////////////////////////
# // SENF_PARSER_I_FIELD_VAL_*
#
-# define SENF_PARSER_I_MAYBECALL_var() ()
-# define SENF_PARSER_I_MAYBECALL_fix()
-#
-# define SENF_PARSER_I_FIELD_VAL_rw(name, type, ofstype, access) \
+# define SENF_PARSER_I_FIELD_VAL_rw(name, type, access) \
BOOST_PP_CAT(name, _t) name() const { \
- return parse<type>( \
- BOOST_PP_CAT(name,_offset) BOOST_PP_CAT(SENF_PARSER_I_MAYBECALL_, ofstype)()); \
+ return parse<type>( SENF_PARSER_OFFSET(name) ); \
}
#
-# define SENF_PARSER_I_FIELD_VAL_ro(name, type, ofstype, access) \
+# define SENF_PARSER_I_FIELD_VAL_ro(name, type, access) \
BOOST_PP_CAT(name, _t)::value_type name() const { \
- return parse<type>( \
- BOOST_PP_CAT(name,_offset) BOOST_PP_CAT(SENF_PARSER_I_MAYBECALL_, ofstype)()) \
- .value(); \
+ return parse<type>( SENF_PARSER_OFFSET(name) ).value(); \
}
#
# ///////////////////////////////////////////////////////////////////////////
private: \
SENF_MPL_SLOT_SET(bitfield_size, BOOST_PP_CAT(name, _t)::fixed_bytes); \
access: \
- BOOST_PP_CAT(SENF_PARSER_I_FIELD_VAL_, rwtype) (name, type, ofstype, access) \
+ BOOST_PP_CAT(SENF_PARSER_I_FIELD_VAL_, rwtype) (name, type, access) \
public:
#
# ////////////////////////////////////////
SENF_MPL_SLOT_SET(bitfield_size, 0);
#
# ///////////////////////////////////////////////////////////////////////////
-# // SENF_PARSER_FINALIZE_*
-#
-# define SENF_PARSER_FINALIZE_var(name) \
- SENF_PARSER_FINALIZE_GENERIC(name) \
- size_type bytes() const { \
- return field_offset_(static_cast<senf::mpl::rv<SENF_MPL_SLOT_GET(index)>*>(0)); \
- } \
- static size_type const init_bytes = SENF_MPL_SLOT_GET(init_bytes)
-#
-# define SENF_PARSER_FINALIZE_fix(name) \
- SENF_PARSER_FINALIZE_GENERIC(name) \
- static size_type const fixed_bytes = SENF_MPL_SLOT_GET(offset);
-#
-# define SENF_PARSER_FINALIZE_GENERIC(name) \
- void defaultInit() { \
- init_chain(static_cast<senf::mpl::rv<SENF_MPL_SLOT_GET(index)>*>(0)); \
- } \
- name(data_iterator i, state_type s) : parser_base_type(i,s) {} \
- private: \
- template <class T> void init(T) { defaultInit(); } \
- public: \
- void init() { init(0); }
-#
-# ///////////////////////////////////////////////////////////////////////////
# // SENF_PARSER_SKIP_*
#
# define SENF_PARSER_SKIP_var(bytes, ibytes) \
BOOST_PP_CAT(SENF_PARSER_I_ADVANCE_OFS_, ofstype) (name, void, 0, 0,access) \
public:
#
+# ///////////////////////////////////////////////////////////////////////////
+# // SENF_PARSER_OFFSET_*
+#
+# define SENF_PARSER_OFFSET_fix(name) BOOST_PP_CAT(name, _offset)
+# define SENF_PARSER_OFFSET_var(name) BOOST_PP_CAT(name, _offset)()
+#
+# ///////////////////////////////////////////////////////////////////////////
+# // SENF_PARSER_FIXED_OFFSET_*
+#
+# define SENF_PARSER_FIXED_OFFSET_fix(name) BOOST_PP_CAT(name, _offset)
+# define SENF_PARSER_FIXED_OFFSET_var(name) BOOST_PP_CAT(name, _init_bytes)
+#
+# ///////////////////////////////////////////////////////////////////////////
+# // SENF_PARSER_FIXED_OFFSET_*
+#
+# define SENF_PARSER_CURRENT_FIXED_OFFSET_fix() SENF_MPL_SLOT_GET(offset)
+# define SENF_PARSER_CURRENT_FIXED_OFFSET_var() SENF_MPL_SLOT_GET(init_bytes)
+#
+# ///////////////////////////////////////////////////////////////////////////
+# // SENF_PARSER_FINALIZE_*
+#
+# define SENF_PARSER_FINALIZE_var(name) \
+ SENF_PARSER_FINALIZE_GENERIC(name) \
+ size_type bytes() const { \
+ return field_offset_(static_cast<senf::mpl::rv<SENF_MPL_SLOT_GET(index)>*>(0)); \
+ } \
+ static size_type const init_bytes = SENF_MPL_SLOT_GET(init_bytes)
+#
+# define SENF_PARSER_FINALIZE_fix(name) \
+ SENF_PARSER_FINALIZE_GENERIC(name) \
+ static size_type const fixed_bytes = SENF_MPL_SLOT_GET(offset);
+#
+# define SENF_PARSER_FINALIZE_GENERIC(name) \
+ void defaultInit() const { \
+ init_chain(static_cast<senf::mpl::rv<SENF_MPL_SLOT_GET(index)>*>(0)); \
+ } \
+ name(data_iterator i, state_type s) : parser_base_type(i,s) {} \
+ private: \
+ template <class T> void init(T) const { defaultInit(); } \
+ public: \
+ void init() const { init(0); }
+#
# ////////////////////////////////ih.e///////////////////////////////////////
# endif
#