X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FAuxParser.hh;h=fdf47c84add4bdafa187401bea3e7fcefa148a9e;hb=7a5841bb928db440280cf91bbb3ea0230fd0e911;hp=162657e15ef37bd4a44c4144c51254e1b7f48a92;hpb=4ee78597a1dae53669f5295cbb686c58146d2449;p=senf.git diff --git a/Packets/AuxParser.hh b/Packets/AuxParser.hh index 162657e..fdf47c8 100644 --- a/Packets/AuxParser.hh +++ b/Packets/AuxParser.hh @@ -40,63 +40,112 @@ namespace senf { namespace detail { + /** \brief Internal: Prefix aux-parser policy + + Place auxiliary field directly before a container/collection. + */ template struct PrefixAuxParserPolicy { typedef PrefixAuxParserPolicy WrapperPolicy; - typedef P ParserType; + typedef PrefixAuxParserPolicy ParserPolicy; - static PacketParserBase::size_type const aux_bytes = ParserType::fixed_bytes; + static PacketParserBase::size_type const aux_bytes = P::fixed_bytes; - ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; }; + /** \brief Internal: Fixed distance aux-parser policy + + Place auxiliary field a fixed distance before the container/collection + */ template struct FixedAuxParserPolicy { typedef FixedAuxParserPolicy WrapperPolicy; - typedef P ParserType; + typedef FixedAuxParserPolicy ParserPolicy; static PacketParserBase::size_type const aux_bytes = 0; - ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; }; template struct DynamicWrapperAuxParserPolicy; + /** \brief Internal: Dynamic aux-parser policy + + Place auxiliary field at a variable distance before the container/collection + */ template struct DynamicAuxParserPolicy { typedef DynamicWrapperAuxParserPolicy

WrapperPolicy; - typedef P ParserType; + typedef DynamicAuxParserPolicy

ParserPolicy; static PacketParserBase::size_type const aux_bytes = 0; - DynamicAuxParserPolicy(ParserType p); + DynamicAuxParserPolicy(P p); DynamicAuxParserPolicy(WrapperPolicy const & other); - ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; - ParserType p_; + mutable P p_; }; + /** \brief Internal: Dynamic aux-parser policy (container wrapper) + + Place auxiliary field at a variable distance before the container/collection. This is the + wrapper policy used by DynamicAuxParserPolicy + */ template struct DynamicWrapperAuxParserPolicy { + typedef DynamicWrapperAuxParserPolicy

WrapperPolicy; typedef DynamicAuxParserPolicy

ParserPolicy; - typedef P ParserType; static PacketParserBase::size_type const aux_bytes = 0; DynamicWrapperAuxParserPolicy(ParserPolicy const & other); - ParserType aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + typename P::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + void aux(typename P::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; PacketParserBase::data_iterator adjust(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; - SafePacketParserWrapper p_; + mutable SafePacketParserWrapper

p_; + }; + + /** \brief Internal: Apply transformation to arbitrary aux-parser policy + + Transform must statisfy the interface + \code + struct Transform + { + typedef unspecified value_type; + static value_type get(unspecified v); + static unspecified set(value_type v); + }; + \endcode + */ + template + struct TransformAuxParserPolicy + : public Policy + { + typedef TransformAuxParserPolicy WrapperPolicy; + typedef TransformAuxParserPolicy ParserPolicy; + + static PacketParserBase::size_type const aux_bytes = Policy::aux_bytes; + + TransformAuxParserPolicy(); + template TransformAuxParserPolicy(Arg const & arg); + + typename Transform::value_type aux(PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; + void aux(typename Transform::value_type const & v, PacketParserBase::data_iterator i, PacketParserBase::state_type s) const; }; }}