X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2FPacketParser.hh;h=8c218e06bb347e236034e959d69eaff8675a2ffd;hb=c45c112ae88196ea8da9c5a9efb0e167196744d2;hp=3e568438acdef2ecac06a726c2aba9b59ba37258;hpb=2cf8d7ad86c57dd87314c1ea7bf980a189d48552;p=senf.git diff --git a/Packets/PacketParser.hh b/Packets/PacketParser.hh index 3e56843..8c218e0 100644 --- a/Packets/PacketParser.hh +++ b/Packets/PacketParser.hh @@ -136,22 +136,22 @@ parsers). When defining composite parsers without the help of the \ref packetparsermacros, you should provide those same members. - \subsection parserimpl_packet Packet parsers + \subsection parserimpl_packet Protocol parsers - Packet parsers are composite parsers with relaxed requirements. Since a packet parser will never - be used as a sub-parser (it will not be used within another composite parser or as value type in - a collection parser), the value returned by senf::bytes for this parser must not necessarily - cover the complete packet (e.g. if the packet has a trailer, the trailer will live outside the - range given by senf::bytes). You may define any member you want to have in your packets field - interface. These members may access the packet data in any way. You just need to ensure, that - the integration into the packet-type is correct (the senf::PacketTypeMixin will by default use - senf::bytes() to find the end of the header). + Protocol parsers are composite parsers with relaxed requirements. Since a Protocol parser will + never be used as a sub-parser (it will not be used within another composite parser or as value + type in a collection parser), the value returned by senf::bytes for this parser must not + necessarily cover the complete packet (e.g. if the packet has a trailer, the trailer will live + outside the range given by senf::bytes). You may define any member you want to have in your + packets field interface. These members may access the packet data in any way. You just need to + ensure, that the integration into the packet-type is correct (the senf::PacketTypeMixin will by + default use senf::bytes() to find the end of the header).
*/ -#ifndef HH_PacketParser_ -#define HH_PacketParser_ 1 +#ifndef HH_SENF_Packets_PacketParser_ +#define HH_SENF_Packets_PacketParser_ 1 // Custom includes #include @@ -328,11 +328,22 @@ namespace senf { beginning at \a i. Automatically passes \a state() to the new parser. */ + template Parser parse(Arg const & arg, data_iterator i) const; + ///< Create sub-parser + /**< This is like parse(data_iterator), however it passes + the extra argument \a arg to the \a Parser + constructor. */ + template Parser parse(size_type n) const; ///< Create sub-parser /**< Creates a new instance of \a Parser to parse data * beginning at i() + \a n. Automatically passes \a state() to the new parser. */ + template Parser parse(Arg const & arg, size_type n) const; + ///< Create sub-parser + /**< This is like parse(size_type), however it passes the + extra argument \a arg to the \a Parser constructor. */ + void defaultInit() const; ///< Default implementation /**< This is just an empty default implementation. Re-implement this member in your own @@ -370,6 +381,7 @@ namespace senf { PacketParserBase::size_type bytes(Parser p); namespace detail { template class ParserInitBytes; } + namespace detail { template class ParserIsFixed; } /** \brief Return number of bytes to allocate to new object of given type @@ -390,6 +402,24 @@ namespace senf { struct init_bytes : public detail::ParserInitBytes {}; + /** \brief Test, whether a parser is a fixed-size parser + + This meta-function is called like + \code + senf::is_fixed::value + \endcode + + This expression evaluates to a compile-time constant boolean expression which is \c true, if + \a SomeParser is a fixed size parser, \c false otherwise + + \param[in] Parser The Parser to test + \returns \c true, if \a Parser is fixed size, \c false otherwise + \ingroup packetparser + */ + template + struct is_fixed : public detail::ParserIsFixed + {}; + # ifndef DOXYGEN template typename boost::enable_if< @@ -465,69 +495,12 @@ namespace senf { SENF_PARSER_FINALIZE(VoidPacketParser); }; - /** \brief Iterator re-validating Parser wrapper - - An ordinary parser will be invalidated whenever the raw data container's size is - changed. This can complicate some algorithms considerably. - - This wrapper will update the parsers iterator (the value returned by the i() member) on - every access. This ensures that the iterator will stay valid. - - \attention Beware however, if you insert or remove data before the safe wrapper, the - location will \e not be updated accordingly and therefore the parser will be - invalid. - - Additionally a SafePacketParserWrapper has an uninitialized state. The only allowed operations in - this state are the boolean test for validity and assigning another parser. - - \ingroup packetparser - */ - template - class SafePacketParserWrapper - : public safe_bool< SafePacketParserWrapper > - { - public: - /////////////////////////////////////////////////////////////////////////// - // Types - - /////////////////////////////////////////////////////////////////////////// - ///\name Structors and default members - ///@{ - - // default copy constructor - // default copy assignment - // default destructor - SafePacketParserWrapper(); ///< Create an empty uninitialized SafePacketParserWrapper - - // conversion constructors - SafePacketParserWrapper(Parser parser); ///< Initialize SafePacketParserWrapper from \a parser - - SafePacketParserWrapper & operator=(Parser parser); ///< Assign \a parser to \c this - - ///@} - /////////////////////////////////////////////////////////////////////////// - - Parser operator*() const; ///< Access the stored parser - /**< On every access, the stored parsers iterator will be - updated / re-validated. */ - Parser const * operator->() const; ///< Access the stored parser - /**< On every access, the stored parsers iterator will be - updated / re-validated. */ - bool boolean_test() const; ///< Check validity - - protected: - - private: - mutable boost::optional parser_; - senf::safe_data_iterator i_; - }; - } ///////////////////////////////hh.e//////////////////////////////////////// #endif -#if !defined(HH_Packets__decls_) && !defined(HH_PacketParser_i_) -#define HH_PacketParser_i_ +#if !defined(HH_SENF_Packets_Packets__decls_) && !defined(HH_SENF_Packets_PacketParser_i_) +#define HH_SENF_Packets_PacketParser_i_ #include "PacketParser.cci" #include "PacketParser.ct" #include "PacketParser.cti"