removed some useless spaces; not very important, I know :)
[senf.git] / Packets / Packet.hh
index 4fc2e1e..566c219 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institute for Open Communication Systems (FOKUS) 
-// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
@@ -30,6 +30,7 @@
 #include <boost/operators.hpp>
 
 #include "../Utils/Exception.hh"
+#include "../Utils/Tags.hh"
 #include "../Utils/safe_bool.hh"
 #include "PacketInterpreter.hh"
 
@@ -149,9 +150,6 @@ namespace senf {
                                         ///< Unsigned type to represent packet size
         typedef PacketInterpreterBase::factory_t factory_t; ///< Packet factory type (see below)
 
-        enum NoInit_t { noinit };       ///< Special argument flag
-                                        /**< Used in some ConcretePacket constructors */
-
         ///////////////////////////////////////////////////////////////////////////
         ///\name Structors and default members
         ///@{
@@ -186,64 +184,64 @@ namespace senf {
 
                                      Packet      next() const; 
                                         ///< Get next packet in chain
-                                        /**< \returns in - valid() packet, if no next packet 
+                                        /**< \throws InvalidPacketChainException if no next packet 
                                              exists */
                                      Packet      next(NoThrow_t) const; 
                                         ///< Get next packet in chain
-                                        /**< \returns in - valid() packet, if no next packet 
+                                        /**< \returns in - valid() packet if no next packet 
                                              exists */
         template <class OtherPacket> OtherPacket next() const; 
                                         ///< Get next packet in chain and cast to \a OtherPacket
                                         /**< \throws std::bad_cast if the next() packet is not of
                                              type \a OtherPacket
-                                             \returns in - valid() packet, if no next packet
+                                             \throws InvalidPacketChainException if no next packet
                                                  exists */
         template <class OtherPacket> OtherPacket next(NoThrow_t) const; 
                                         ///< Get next packet in chain and cast to \a OtherPacket
                                         /**< \throws std::bad_cast if the next() packet is not of
                                              type \a OtherPacket
-                                             \returns in - valid() packet, if no next packet
+                                             \returns in - valid() packet if no next packet
                                                  exists */
         template <class OtherPacket> OtherPacket find() const;
                                         ///< Search chain forward for packet of type \a OtherPacket
                                         /**< The search will start with the current packet.
-                                             \returns in - valid() packet, if no packet of type \a
-                                                 OtherPacket can be found. */
+                                             \throws InvalidPacketChainException if no packet of
+                                                 type \a OtherPacket can be found. */
         template <class OtherPacket> OtherPacket find(NoThrow_t) const;
                                         ///< Search chain forward for packet of type \a OtherPacket
                                         /**< The search will start with the current packet.
-                                             \returns in - valid() packet, if no packet of type \a
+                                             \returns in - valid() packet if no packet of type \a
                                                  OtherPacket can be found. */
         
                                      Packet      prev() const; 
                                         ///< Get previous packet in chain
-                                        /**< \returns in - valid() packet, if no previous packet 
-                                             exists */
+                                        /**< \throws InvalidPacketChainException if no previous
+                                             packet exists */
                                      Packet      prev(NoThrow_t) const; 
                                         ///< Get previous packet in chain
-                                        /**< \returns in - valid() packet, if no previous packet 
+                                        /**< \returns in - valid() packet if no previous packet
                                              exists */
         template <class OtherPacket> OtherPacket prev() const; 
                                         ///< Get previous packet in chain and cast to \a OtherPacket
                                         /**< \throws std::bad_cast, if the previous packet is not of
                                              type \a OtherPacket
-                                             \returns in - valid() packet, if no previous packet 
-                                                 exists */
+                                             \throws InvalidPacketChainException if no previous
+                                                 packet exists */
         template <class OtherPacket> OtherPacket prev(NoThrow_t) const; 
                                         ///< Get previous packet in chain and cast to \a OtherPacket
                                         /**< \throws std::bad_cast, if the previous packet is not of
                                              type \a OtherPacket
-                                             \returns in - valid() packet, if no previous packet 
+                                             \returns in - valid() packet if no previous packet 
                                                  exists */
         template <class OtherPacket> OtherPacket rfind() const;
                                         ///< Search chain backwards for packet of type \a OtherPacket
                                         /**< The search will start with the current packet.
-                                             \returns in - valid() packet, if no packet of type \a
-                                                 OtherPacket can be found. */
+                                             \throws InvalidPacketChainException if no packet of
+                                                 type \a OtherPacket can be found. */
         template <class OtherPacket> OtherPacket rfind(NoThrow_t) const;
                                         ///< Search chain backwards for packet of type \a OtherPacket
                                         /**< The search will start with the current packet.
-                                             \returns in - valid() packet, if no packet of type \a
+                                             \returns in - valid() packet if no packet of type \a
                                                  OtherPacket can be found. */
 
 
@@ -446,10 +444,10 @@ namespace senf {
         static ConcretePacket create(); ///< Create default initialized packet
                                         /**< The packet will be initialized to it's default empty
                                              state. */
-        static ConcretePacket create(NoInit_t); ///< Create uninitialized empty packet
+        static ConcretePacket create(senf::NoInit_t); ///< Create uninitialized empty packet
                                         /**< This will create a completely empty and uninitialized
                                              packet with <tt>size() == 0</tt>.
-                                             \param[in] noinit This parameter must always have the
+                                             \param[in] senf::noinit This parameter must always have the
                                                  value \c senf::noinit. */
         static ConcretePacket create(size_type size); ///< Create default initialized packet
                                         /**< This member will create a default initialized packet
@@ -460,11 +458,12 @@ namespace senf {
                                              \throws TruncatedPacketException if \a size is smaller
                                                  than the smallest permissible size for this type of
                                                  packet. */
-        static ConcretePacket create(size_type size, NoInit_t); ///< Create uninitialized packet
+        static ConcretePacket create(size_type size, senf::NoInit_t); 
+                                        ///< Create uninitialized packet
                                         /**< Creates an uninitialized (all-zero) packet of the exact
                                              given size. 
                                              \param[in] size Size of the packet to create in bytes
-                                             \param[in] noinit This parameter must always have the
+                                             \param[in] senf::noinit This parameter must always have the
                                                  value \c senf::noinit. */
         template <class ForwardReadableRange>
         static ConcretePacket create(ForwardReadableRange const & range); 
@@ -485,14 +484,14 @@ namespace senf {
                                              state. It will be appended as next header/interpreter
                                              after \a packet in that packets interpreter chain.
                                              \param[in] packet Packet to append new packet to. */
-        static ConcretePacket createAfter(Packet packet, NoInit_t);
+        static ConcretePacket createAfter(Packet packet, senf::NoInit_t);
                                         ///< Create uninitialized empty packet after\a packet
                                         /**< This will create a completely empty and uninitialized
                                              packet with <tt>size() == 0</tt>. It will be appended
                                              as next header/interpreter after \a packet in that
                                              packets interpreter chain.
                                              \param[in] packet Packet to append new packet to.
-                                             \param[in] noinit This parameter must always have the
+                                             \param[in] senf::noinit This parameter must always have the
                                                  value \c senf::noinit. */
         static ConcretePacket createAfter(Packet packet, size_type size);
                                         ///< Create default initialized packet after \a packet
@@ -507,7 +506,7 @@ namespace senf {
                                              \throws TruncatedPacketException if \a size is smaller
                                                  than the smallest permissible size for this type of
                                                  packet. */
-        static ConcretePacket createAfter(Packet packet, size_type size, NoInit_t);
+        static ConcretePacket createAfter(Packet packet, size_type size, senf::NoInit_t);
                                         ///< Create uninitialized packet after \a packet
                                         /**< Creates an uninitialized (all-zero) packet of the exact
                                              given size.  It will be appended as next
@@ -515,7 +514,7 @@ namespace senf {
                                              interpreter chain.
                                              \param[in] packet Packet to append new packet to.
                                              \param[in] size Size of the packet to create in bytes
-                                             \param[in] noinit This parameter must always have the
+                                             \param[in] senf::noinit This parameter must always have the
                                                  value \c senf::noinit. */
         template <class ForwardReadableRange>
         static ConcretePacket createAfter(Packet packet, 
@@ -541,7 +540,7 @@ namespace senf {
                                              header/interpreter before \a packet in that packets
                                              interpreter chain.
                                              \param[in] packet Packet to prepend new packet to. */
-        static ConcretePacket createBefore(Packet packet, NoInit_t);
+        static ConcretePacket createBefore(Packet packet, senf::NoInit_t);
                                         ///< Create uninitialized empty packet before \a packet
                                         /**< Creates a completely empty and uninitialized packet. It
                                              will be prepended as previous header/interpreter before
@@ -569,6 +568,13 @@ namespace senf {
                                              / recreation ...)
                                              \see \ref packetparser for the parser interface. */
 
+        Parser parser() const;          ///< Access packet field parser directly
+                                        /**< Access the parser of the packet. This is the same
+                                             object returned by the operator->() operator. The
+                                             operator however does not allow to access this object
+                                             itself, only it's members.
+                                             \see \ref packetparser for the parser interface */
+
     protected:
 
     private: