}
template <class OtherPacket>
+prefix_ OtherPacket senf::Packet::as(NoThrow_t)
+ const
+{
+ SENF_ASSERT( is<OtherPacket>(), "Bad cast, called packet::as(nothrow) with wrong PacketType");
+ return OtherPacket(ptr()->as<typename OtherPacket::type>());
+}
+
+template <class OtherPacket>
prefix_ OtherPacket senf::Packet::next()
const
{
const
{
Packet p (prev(nothrow));
- return p && p.is<OtherPacket>() ? p.as<OtherPacket>() : OtherPacket();
+ return p && p.is<OtherPacket>() ?
+ OtherPacket(p.ptr()->as<typename OtherPacket::type>()) : OtherPacket();
}
template <class OtherPacket>
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
- exists */
+ /**< \returns in - valid() packet if no next packet
+ exists or if next() packet is not of
+ type \a OtherPacket */
template <class OtherPacket> OtherPacket find() const;
///< Search chain forward for packet of type \a OtherPacket
/**< The search will start with the current packet.
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
- exists */
+ /**< \returns in - valid() packet if no previous packet
+ exists or if the previous packet is not of
+ type \a OtherPacket */
template <class OtherPacket> OtherPacket rfind() const;
///< Search chain backwards for packet of type \a OtherPacket
/**< The search will start with the current packet.
before.
\throws std::bad_cast if the current packet is not of
type \a OtherPacket */
+ template <class OtherPacket> OtherPacket as(NoThrow_t) const;
+ ///< Cast current packet to the given type
+ /**< This operations returns a handle to the same packet
+ header/interpreter however upcast to the given
+ ConcretePacket type which have been instantiated
+ before.
+ \warning You must make absolutely sure that the packet
+ is of the given type. If not, calling this member
+ crashes your program in a unkindly way. */
Packet append(Packet const & packet) const; ///< Append the given packet to \c this packet
/**< This operation will replace the payload section of \c
// Custom includes
#include <signal.h>
#include <time.h>
+#include <cassert>
#include <senf/Utils/Exception.hh>
#include <senf/Utils/senfassert.hh>
#ifdef SENF_DEBUG
// At the moment, the FIFORunner is not very efficient with many non-runnable tasks since the
// complete list of tasks is traversed on each run().
//
-// To optimize this, we woould need a way to find the relative ordering of two tasks in O(1) (at the
+// To optimize this, we would need a way to find the relative ordering of two tasks in O(1) (at the
// moment, this is an O(N) operation by traversing the list).
//
// One idea is, to give each task an 'order' value. Whenever a task is added at the end, it's order