// conversion constructors
template <class PacketType>
-prefix_ senf::Packet::Packet(ConcretePacket<PacketType> packet)
+prefix_ senf::Packet::Packet(ConcretePacket<PacketType> const & packet)
: packet_(packet.ptr())
{}
prefix_ bool senf::Packet::is()
const
{
- return ptr()->is<typename OtherPacket::type>();
+ return valid() && ptr()->is<typename OtherPacket::type>();
}
template <class OtherPacket>
}
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 (next(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>
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>
template <class PacketType>
prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size,
+senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size,
senf::NoInit_t)
{
return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit));
return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit));
}
+template <class PacketType>
+prefix_ senf::ConcretePacket<PacketType>
+senf::ConcretePacket<PacketType>::createInsertBefore(Packet const & packet)
+{
+ return ConcretePacket(interpreter::createInsertBefore(packet.ptr()));
+}
+
+template <class PacketType>
+prefix_ senf::ConcretePacket<PacketType>
+senf::ConcretePacket<PacketType>::createInsertBefore(Packet const & packet, senf::NoInit_t)
+{
+ return ConcretePacket(interpreter::createInsertBefore(packet.ptr(), senf::noinit));
+}
+
// Create a clone of the current packet
template <class PacketType>
// private members
template <class PacketType>
-prefix_ senf::ConcretePacket<PacketType>::ConcretePacket(typename interpreter::ptr packet_)
+prefix_ senf::ConcretePacket<PacketType>::ConcretePacket(typename interpreter::ptr const & packet_)
: Packet(packet_)
{}