X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketParser.mpp;h=d445ebfdf14e6d48e588ebd557b06916789c3db7;hb=81ffa1c459b96dd44472bcef37e1e373934ee138;hp=7c72a9635a35dcc997318f50b95737124ae2ba5b;hpb=47368f306a577d1e46df69a7f729bd3893cbe5e7;p=senf.git diff --git a/Packets/PacketParser.mpp b/Packets/PacketParser.mpp index 7c72a96..d445ebf 100644 --- a/Packets/PacketParser.mpp +++ b/Packets/PacketParser.mpp @@ -47,80 +47,94 @@ # define SENF_PACKET_PARSER_I_GET_TYPE_1(x) SENF_PACKET_PARSER_I_GET_TYPE_2 # define SENF_PACKET_PARSER_I_GET_TYPE_2(name,type) type # -# define SENF_PACKET_PARSER_I_DEFINE_INIT_C(_0,_1,elt) \ +# define SENF_PACKET_PARSER_I_DEFINE_INIT_C(_0,_1,elt) \ SENF_PACKET_PARSER_I_GET_NAME(elt) ().init(); # -# define SENF_PACKET_PARSER_I_DEFINE_INIT(fields) \ - void defaultInit() const { \ - BOOST_PP_SEQ_FOR_EACH( SENF_PACKET_PARSER_I_DEFINE_INIT_C, _, fields) \ +# define SENF_PACKET_PARSER_I_DEFINE_INIT(fields) \ + void defaultInit() const { \ + BOOST_PP_SEQ_FOR_EACH( SENF_PACKET_PARSER_I_DEFINE_INIT_C, _, fields) \ } # -# define SENF_PACKET_PARSER_I_FIELD_DISPATCH(n,t,name,type) \ +# define SENF_PACKET_PARSER_I_FIELD_DISPATCH(n,t,name,type) \ SENF_PACKET_PARSER_I_ ## t(n,name,type) # -# define SENF_PACKET_PARSER_I_FIELD_C(_0,_1,n,elt) \ - BOOST_PP_EXPAND( \ +# define SENF_PACKET_PARSER_I_FIELD_C(_0,_1,n,elt) \ + BOOST_PP_EXPAND( \ SENF_PACKET_PARSER_I_FIELD_DISPATCH SENF_PACKET_PARSER_I_UNWRAP(n,elt)) # -# define SENF_PACKET_PARSER_I_INITSIZE_C(_0,_1,n,elt) \ +# define SENF_PACKET_PARSER_I_INITSIZE_C(_0,_1,n,elt) \ BOOST_PP_IF(n,+,) senf::init_bytes< SENF_PACKET_PARSER_I_GET_TYPE(elt) >::value # -# define SENF_PACKET_PARSER_I_DEFINE_FIELDS(fields) \ - size_type offset_0_() const { return 0; } \ - BOOST_PP_SEQ_FOR_EACH_I(SENF_PACKET_PARSER_I_FIELD_C, _, fields) \ - size_type bytes() const { \ - return BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_SEQ_SIZE(fields),_)) (); \ - } \ - SENF_PACKET_PARSER_I_DEFINE_INIT(fields) \ - static const size_type init_bytes = \ +# define SENF_PACKET_PARSER_I_DEFINE_FIELDS(offset,fields) \ + size_type offset_0_() const { return offset; } \ + BOOST_PP_SEQ_FOR_EACH_I(SENF_PACKET_PARSER_I_FIELD_C, _, fields) \ + size_type bytes() const { \ + return BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_SEQ_SIZE(fields),_)) (); \ + } \ + SENF_PACKET_PARSER_I_DEFINE_INIT(fields) \ + static const size_type init_bytes = \ BOOST_PP_SEQ_FOR_EACH_I(SENF_PACKET_PARSER_I_INITSIZE_C, _, fields) ; # -# define SENF_PACKET_PARSER_I_FIXED_FIELD_DISPATCH(n,t,name,type) \ +# define SENF_PACKET_PARSER_I_FIXED_FIELD_DISPATCH(n,t,name,type) \ SENF_PACKET_PARSER_I_FIXED_ ## t(n,name,type) # -# define SENF_PACKET_PARSER_I_FIXED_FIELD_C(_0,_1,n,elt) \ - BOOST_PP_EXPAND( \ +# define SENF_PACKET_PARSER_I_FIXED_FIELD_C(_0,_1,n,elt) \ + BOOST_PP_EXPAND( \ SENF_PACKET_PARSER_I_FIXED_FIELD_DISPATCH SENF_PACKET_PARSER_I_UNWRAP(n,elt)) # -# define SENF_PACKET_PARSER_I_DEFINE_FIXED_FIELDS(fields) \ - static const size_type offset_0_ = 0; \ - BOOST_PP_SEQ_FOR_EACH_I(SENF_PACKET_PARSER_I_FIXED_FIELD_C, _, fields) \ - static const size_type fixed_bytes = \ - BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_SEQ_SIZE(fields),_)); \ +# define SENF_PACKET_PARSER_I_DEFINE_FIXED_FIELDS(offset,fields) \ + static const size_type offset_0_ = offset; \ + BOOST_PP_SEQ_FOR_EACH_I(SENF_PACKET_PARSER_I_FIXED_FIELD_C, _, fields) \ + static const size_type fixed_bytes = \ + BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_SEQ_SIZE(fields),_)); \ SENF_PACKET_PARSER_I_DEFINE_INIT(fields) # # /////////////////////////////////////////////////////////////////////////// # // Definition of the field types # -# define SENF_PACKET_PARSER_I_Field(n,name,type) \ - type name () const { \ - return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) () ); \ - } \ - size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) () const { \ - return BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) () + senf::bytes( name () ); \ +# define SENF_PACKET_PARSER_I_Field(n,name,type) \ + typedef type BOOST_PP_CAT(name,_t) ; \ + type name () const { \ + return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) () ); \ + } \ + size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) () const { \ + return BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) () + senf::bytes( name () ); \ + } \ + size_type BOOST_PP_CAT(name, _offset) () const { \ + return BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) () ; \ } # -# define SENF_PACKET_PARSER_I_FIXED_Field(n,name,type) \ - type name () const { \ - return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) ); \ - } \ - static const size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) = \ - BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) + type::fixed_bytes; -# -# define SENF_PACKET_PARSER_I_OverlayField(n,name,type) \ - type name () const { \ - return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) () ); \ - } \ - size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) () const { \ - return BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) (); \ +# define SENF_PACKET_PARSER_I_FIXED_Field(n,name,type) \ + typedef type BOOST_PP_CAT(name,_t) ; \ + type name () const { \ + return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) ); \ + } \ + static const size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) = \ + BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) + type::fixed_bytes; \ + static const size_type BOOST_PP_CAT(name,_offset) = \ + BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)); +# +# define SENF_PACKET_PARSER_I_OverlayField(n,name,type) \ + typedef type BOOST_PP_CAT(name,_t) ; \ + type name () const { \ + return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) () ); \ + } \ + size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) () const { \ + return BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) (); \ + } \ + size_type BOOST_PP_CAT(name, _offset) () const { \ + return BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) () ; \ } # -# define SENF_PACKET_PARSER_I_FIXED_OverlayField(n,name,type) \ - type name () const { \ - return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) ); \ - } \ - static const size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) = \ - BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)); +# define SENF_PACKET_PARSER_I_FIXED_OverlayField(n,name,type) \ + typedef type BOOST_PP_CAT(name,_t) ; \ + type name () const { \ + return parse< type >( BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)) ); \ + } \ + static const size_type BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)) = \ + BOOST_PP_CAT(offset_,BOOST_PP_CAT(n,_)); \ + static const size_type BOOST_PP_CAT(name,_offset) = \ + BOOST_PP_CAT(offset_,BOOST_PP_CAT(BOOST_PP_INC(n),_)); # # ///////////////////////////////mpp.e/////////////////////////////////////// # endif