// Custom includes
#include <boost/operators.hpp>
-
+#include <boost/utility.hpp>
+#include <boost/type_traits/is_integral.hpp>
#include "../Utils/Exception.hh"
#include "../Utils/Tags.hh"
#include "../Utils/safe_bool.hh"
This is an alias for boolean_test() which is called
when using a packet in a boolean context. */
- void finalize() const; ///< Update calculated fields
+ void finalizeThis(); ///< Update calculated fields
+ /**< This call will update all calculated fields of the
+ packet. This includes checksums, payload size fields or
+ other fields, which can be set from other information
+ in the packet. Each concrete packet type should
+ document, which fields are set by finalize().
+
+ finalizeThis() will \e only process the current
+ header. Even if only changing fields in this protocol,
+ depending on the protocol it may not be enough to
+ finalize this header only. See the packet type
+ documentation. */
+
+ template <class Other>
+ void finalizeTo(); ///< Update calculated fields
+ /**< This call will update all calculated fields of the
+ packet. This includes checksums, payload size fields or
+ other fields, which can be set from other information
+ in the packet. Each concrete packet type should
+ document, which fields are set by finalize().
+
+ finalizeTo() will automatically process all
+ packets/headers/interpreters from the first occurrence
+ of packet type \a Other backwards up to \c this. */
+
+ void finalizeTo(Packet other); ///< Update calculated fields
+ /**< This call will update all calculated fields of the
+ packet. This includes checksums, payload size fields or
+ other fields, which can be set from other information
+ in the packet. Each concrete packet type should
+ document, which fields are set by finalize().
+
+ finalizeAll(other) will automatically process all
+ packets/headers/interpreters from \a other backwards up
+ to \c this. */
+
+ void finalizeAll(); ///< Update calculated fields
/**< This call will update all calculated fields of the
- packet after it has been created or changed. This
- includes checksums, payload size fields or other
- fields, which can be set from other information in the
- packet. Each concrete packet type should document,
- which fields are set by finalize().
+ packet. This includes checksums, payload size fields or
+ other fields, which can be set from other information
+ in the packet. Each concrete packet type should
+ document, which fields are set by finalize().
- finalize() will automatically process all
+ finalizeAll() will automatically process all
packets/headers/interpreters from the end of the chain
backwards up to \c this. */
\param[in] size Size of the packet to create in bytes
\param[in] senf::noinit This parameter must always have the
value \c senf::noinit. */
+#ifndef DOXYGEN
+ template <class ForwardReadableRange>
+ static ConcretePacket create(
+ ForwardReadableRange const & range,
+ typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type * = 0);
+#else
template <class ForwardReadableRange>
static ConcretePacket create(ForwardReadableRange const & range);
///< Create packet from given data
\param[in] range <a
href="http://www.boost.org/libs/range/index.html">Boost.Range</a>
of data to construct packet from. */
+#endif
// Create packet as new packet after a given packet
\param[in] size Size of the packet to create in bytes
\param[in] senf::noinit This parameter must always have the
value \c senf::noinit. */
+#ifndef DOXYGEN
+ template <class ForwardReadableRange>
+ static ConcretePacket createAfter(
+ Packet packet,
+ ForwardReadableRange const & range,
+ typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type * = 0);
+#else
template <class ForwardReadableRange>
static ConcretePacket createAfter(Packet packet,
ForwardReadableRange const & range);
\param[in] range <a
href="http://www.boost.org/libs/range/index.html">Boost.Range</a>
of data to construct packet from. */
+#endif
// Create packet as new packet (header) before a given packet