X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacket.cti;h=902681b3deea940c84a1a79972c7d86c7f8723ce;hb=78a6e233083efa63a9cd0684a92abc64202a9ee7;hp=8e56512640b03274aa5eee3ce0f435f5e828d594;hpb=26610f603ebdd465307b9621f532c1fe19fd5571;p=senf.git diff --git a/senf/Packets/Packet.cti b/senf/Packets/Packet.cti index 8e56512..902681b 100644 --- a/senf/Packets/Packet.cti +++ b/senf/Packets/Packet.cti @@ -37,7 +37,7 @@ // conversion constructors template -prefix_ senf::Packet::Packet(ConcretePacket packet) +prefix_ senf::Packet::Packet(ConcretePacket const & packet) : packet_(packet.ptr()) {} @@ -54,7 +54,7 @@ template prefix_ bool senf::Packet::is() const { - return ptr()->is(); + return valid() && ptr()->is(); } template @@ -67,6 +67,14 @@ prefix_ OtherPacket senf::Packet::as() } template +prefix_ OtherPacket senf::Packet::as(NoThrow_t) + const +{ + SENF_ASSERT( is(), "Bad cast, called packet::as(nothrow) with wrong PacketType"); + return OtherPacket(ptr()->as()); +} + +template prefix_ OtherPacket senf::Packet::next() const { @@ -78,7 +86,8 @@ prefix_ OtherPacket senf::Packet::next(NoThrow_t) const { Packet p (next(nothrow)); - return p && p.is() ? p.as() : OtherPacket(); + return p && p.is() ? + OtherPacket(p.ptr()->as()) : OtherPacket(); } template @@ -102,7 +111,8 @@ prefix_ OtherPacket senf::Packet::prev(NoThrow_t) const { Packet p (prev(nothrow)); - return p && p.is() ? p.as() : OtherPacket(); + return p && p.is() ? + OtherPacket(p.ptr()->as()) : OtherPacket(); } template @@ -232,7 +242,7 @@ senf::ConcretePacket::createAfter(Packet const & packet, size_type s template prefix_ senf::ConcretePacket -senf::ConcretePacket::createAfter(Packet const & packet, size_type size, +senf::ConcretePacket::createAfter(Packet const & packet, size_type size, senf::NoInit_t) { return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit)); @@ -267,6 +277,20 @@ senf::ConcretePacket::createBefore(Packet const & packet, senf::NoIn return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit)); } +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createInsertBefore(Packet const & packet) +{ + return ConcretePacket(interpreter::createInsertBefore(packet.ptr())); +} + +template +prefix_ senf::ConcretePacket +senf::ConcretePacket::createInsertBefore(Packet const & packet, senf::NoInit_t) +{ + return ConcretePacket(interpreter::createInsertBefore(packet.ptr(), senf::noinit)); +} + // Create a clone of the current packet template @@ -298,16 +322,15 @@ senf::ConcretePacket::operator->() // private members template -prefix_ senf::ConcretePacket::ConcretePacket(typename interpreter::ptr packet_) +prefix_ senf::ConcretePacket::ConcretePacket(typename interpreter::ptr const & packet_) : Packet(packet_) {} template -prefix_ typename senf::ConcretePacket::interpreter::ptr -senf::ConcretePacket::ptr() +prefix_ typename senf::ConcretePacket::interpreter * senf::ConcretePacket::ptr() const { - return boost::static_pointer_cast< PacketInterpreter >(Packet::ptr()); + return static_cast< PacketInterpreter *>( Packet::ptr().get()); } ///////////////////////////////cti.e///////////////////////////////////////