X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketInterpreter.hh;h=2760b9d1f483403d3c8db4d9054e7e6547acb2f5;hb=7ee689fe38d66aa3a0004d55e8708750d35adc0b;hp=e2591cff59d644f4331cf6be19dcbc21bec6bcc4;hpb=82e794070d4f3ae8aacb1827b21a93b9d48ce57f;p=senf.git diff --git a/senf/Packets/PacketInterpreter.hh b/senf/Packets/PacketInterpreter.hh index e2591cf..2760b9d 100644 --- a/senf/Packets/PacketInterpreter.hh +++ b/senf/Packets/PacketInterpreter.hh @@ -27,7 +27,7 @@ #define HH_SENF_Packets_PacketInterpreter_ 1 // Custom includes -#include +#include #include #include #include @@ -37,26 +37,26 @@ #include //#include "PacketInterpreter.mpp" -///////////////////////////////hh.p//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// namespace senf { template class PacketInterpreter; /** \brief Internal: Base packet interpreter class - + \internal This is the base class for the persistent interpreter. This class encapsulates all the functionality accessible via the packet handle, most handle operations are just forwarded. */ class PacketInterpreterBase - : protected PacketData, + : protected PacketData, public detail::packet::interpreter_list_base, public intrusive_refcount_t { public: - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// // Types typedef senf::detail::packet::smart_pointer< @@ -83,7 +83,7 @@ namespace senf { almost any one of the create / createAfter / createBefore static PacketInterpreter without static information on the type of packet to create. */ - struct Factory { + struct Factory { virtual ~Factory(); // Create completely new packet @@ -94,23 +94,26 @@ namespace senf { virtual ptr create(size_type size, senf::NoInit_t) const = 0; template ptr create(ForwardReadableRange const & range) const; - + // Create packet as new packet after a given packet virtual ptr createAfter(PacketInterpreterBase::ptr packet) const = 0; virtual ptr createAfter(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0; virtual ptr createAfter(PacketInterpreterBase::ptr packet, size_type size) const = 0; - virtual ptr createAfter(PacketInterpreterBase::ptr packet, size_type size, + virtual ptr createAfter(PacketInterpreterBase::ptr packet, size_type size, senf::NoInit_t) const = 0; template - ptr createAfter(PacketInterpreterBase::ptr packet, + ptr createAfter(PacketInterpreterBase::ptr packet, ForwardReadableRange const & range) const; - + // Create packet as new packet (header) const before a given packet virtual ptr createBefore(PacketInterpreterBase::ptr packet) const = 0; virtual ptr createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0; + virtual ptr createInsertBefore(PacketInterpreterBase::ptr packet) const = 0; + virtual ptr createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t) const = 0; + // Parse next packet in chain virtual ptr parseNext(ptr packet) const = 0; @@ -118,9 +121,9 @@ namespace senf { typedef Factory const * factory_t; - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// ///\name Structors and default members - ///@{ + //\{ // protected constructors // no copy @@ -129,14 +132,14 @@ namespace senf { virtual ~PacketInterpreterBase(); static factory_t no_factory(); - + ptr clone(); - - ///@} - /////////////////////////////////////////////////////////////////////////// + + //\} + //-//////////////////////////////////////////////////////////////////////// ///\name Interpreter chain access - ///@{ + //\{ ptr next(); ptr prev(); @@ -150,26 +153,30 @@ namespace senf { ptr append(ptr packet); - ///@} + void reparse(); + + //\} ///\name Data access - ///@{ + //\{ using PacketData::valid; PacketData & data(); - - ///@} + + //\} ///\name Annotations - ///@{ + //\{ template Annotation & annotation(); - ///@} + void clearAnnotations(); + + //\} ///\name Access to the abstract interface - ///@{ + //\{ optional_range nextPacketRange(); void finalizeThis(); @@ -179,13 +186,14 @@ namespace senf { factory_t factory(); factory_t nextPacketType(); - ///@} + //\} protected: // protected structors PacketInterpreterBase(detail::PacketImpl * impl, iterator b, iterator e, Append_t); PacketInterpreterBase(detail::PacketImpl * impl, iterator b, iterator e, Prepend_t); + PacketInterpreterBase(detail::PacketImpl * impl, iterator b, iterator e, ptr before); ptr appendClone(detail::PacketImpl * impl, iterator base, iterator new_base); ptr appendClone(detail::PacketImpl * impl, range r); @@ -210,7 +218,7 @@ namespace senf { // reference/memory management. Only to be called by intrusive_refcount_t. void add_ref(); - bool release(); + void release(); // containment management. Only to be called by PacketImpl. @@ -222,8 +230,14 @@ namespace senf { template friend class PacketInterpreter; friend class detail::packet::test::TestDriver; friend class PacketParserBase; + + friend void senf::intrusive_ptr_add_ref(PacketInterpreterBase const *); + friend void senf::intrusive_ptr_release(PacketInterpreterBase const *); }; + void intrusive_ptr_add_ref(PacketInterpreterBase const * p); + void intrusive_ptr_release(PacketInterpreterBase const * p); + /** \brief Internal: Concrete packet interpreter \internal @@ -240,7 +254,7 @@ namespace senf { public pool_alloc_mixin< PacketInterpreter > { public: - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// // Types typedef typename senf::detail::packet::smart_pointer< @@ -248,9 +262,9 @@ namespace senf { typedef PacketType type; typedef typename type::parser parser; - /////////////////////////////////////////////////////////////////////////// + //-//////////////////////////////////////////////////////////////////////// ///\name Structors and default members - ///@{ + //\{ // private constructors // no copy @@ -274,7 +288,7 @@ namespace senf { static ptr createAfter(PacketInterpreterBase::ptr packet, size_type size); static ptr createAfter(PacketInterpreterBase::ptr packet, size_type size, senf::NoInit_t); template - static ptr createAfter(PacketInterpreterBase::ptr packet, + static ptr createAfter(PacketInterpreterBase::ptr packet, ForwardReadableRange const & range); // Create packet as new packet (header) before a given packet @@ -282,12 +296,15 @@ namespace senf { static ptr createBefore(PacketInterpreterBase::ptr packet); static ptr createBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t); + static ptr createInsertBefore(PacketInterpreterBase::ptr packet); + static ptr createInsertBefore(PacketInterpreterBase::ptr packet, senf::NoInit_t); + // Create a clone of the current packet ptr clone(); - ///@} - /////////////////////////////////////////////////////////////////////////// + //\} + //-//////////////////////////////////////////////////////////////////////// // Packet field access @@ -305,9 +322,13 @@ namespace senf { PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, Append_t); PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, Prepend_t); + PacketInterpreter(detail::PacketImpl * impl, iterator b, iterator e, + PacketInterpreterBase::ptr before); static ptr create(detail::PacketImpl * impl, iterator b, iterator e, Append_t); static ptr create(detail::PacketImpl * impl, iterator b, iterator e, Prepend_t); + static ptr create(detail::PacketImpl * impl, iterator b, iterator e, + PacketInterpreterBase::ptr before); // PacketType access @@ -316,7 +337,7 @@ namespace senf { // virtual interface virtual optional_range v_nextPacketRange(); - virtual PacketInterpreterBase::ptr v_appendClone(detail::PacketImpl * impl, + virtual PacketInterpreterBase::ptr v_appendClone(detail::PacketImpl * impl, iterator base, iterator new_base); virtual PacketInterpreterBase::ptr v_appendClone(detail::PacketImpl * impl, range r); virtual void v_finalize(); @@ -328,7 +349,7 @@ namespace senf { // factory /** \brief Internal: Implementation of abstract factory interface - + \internal Implements the abstract factory interface for \a PacketType @@ -340,29 +361,35 @@ namespace senf { virtual PacketInterpreterBase::ptr create(senf::NoInit_t) const; virtual PacketInterpreterBase::ptr create(size_type size) const; virtual PacketInterpreterBase::ptr create(size_type size,senf::NoInit_t) const; - + // Create packet as new packet after a given packet - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet) + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet) const; - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, senf::NoInit_t) const; - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, size_type size) const; - virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, + virtual PacketInterpreterBase::ptr createAfter(PacketInterpreterBase::ptr packet, size_type size, senf::NoInit_t) const; - + // Create packet as new packet (header) before a given packet - virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr packet) + virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr packet) const; virtual PacketInterpreterBase::ptr createBefore(PacketInterpreterBase::ptr packet, - senf::NoInit_t) + senf::NoInit_t) + const; + + virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr packet) + const; + virtual PacketInterpreterBase::ptr createInsertBefore(PacketInterpreterBase::ptr packet, + senf::NoInit_t) const; // Parse next packet in chain - virtual PacketInterpreterBase::ptr parseNext(PacketInterpreterBase::ptr packet) + virtual PacketInterpreterBase::ptr parseNext(PacketInterpreterBase::ptr packet) const; }; @@ -376,14 +403,14 @@ namespace senf { /** \brief Invalid packet chain operation This exception signals an invalid operation on the chain like trying to find a non-existent - chain member and other similar error conditions. + chain member and other similar error conditions. */ struct InvalidPacketChainException : public senf::Exception { InvalidPacketChainException() : senf::Exception("invalid packet chain") {} }; - + } -///////////////////////////////hh.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #endif #if !defined(HH_SENF_Packets_Packets__decls_) && !defined(HH_SENF_Packets_PacketInterpreter_i_) #define HH_SENF_Packets_PacketInterpreter_i_