X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacketInterpreter.hh;h=17621a480780450408fe08ef32fd2dc601e8b3a7;hb=961cf85a6abf2b5f0a7958bbfcd8f72e7b32721b;hp=e2591cff59d644f4331cf6be19dcbc21bec6bcc4;hpb=82e794070d4f3ae8aacb1827b21a93b9d48ce57f;p=senf.git diff --git a/senf/Packets/PacketInterpreter.hh b/senf/Packets/PacketInterpreter.hh index e2591cf..17621a4 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 @@ -44,14 +44,14 @@ 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 { @@ -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; @@ -129,9 +132,9 @@ namespace senf { virtual ~PacketInterpreterBase(); static factory_t no_factory(); - + ptr clone(); - + ///@} /////////////////////////////////////////////////////////////////////////// @@ -157,7 +160,7 @@ namespace senf { using PacketData::valid; PacketData & data(); - + ///@} ///\name Annotations @@ -186,6 +189,7 @@ namespace senf { 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); @@ -274,7 +278,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,6 +286,9 @@ 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(); @@ -305,9 +312,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 +327,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 +339,7 @@ namespace senf { // factory /** \brief Internal: Implementation of abstract factory interface - + \internal Implements the abstract factory interface for \a PacketType @@ -340,29 +351,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,11 +393,11 @@ 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////////////////////////////////////////