X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPackets%2FPacket.cti;h=8184317b55dbceefd839631076fd5b3276ba154b;hb=7ee689fe38d66aa3a0004d55e8708750d35adc0b;hp=21600c66040371b0608a92b0b34999b35cfd2818;hpb=3a3350157a52c268d5082a4aac4aba643417071f;p=senf.git diff --git a/senf/Packets/Packet.cti b/senf/Packets/Packet.cti index 21600c6..8184317 100644 --- a/senf/Packets/Packet.cti +++ b/senf/Packets/Packet.cti @@ -29,15 +29,15 @@ #include #define prefix_ inline -///////////////////////////////cti.p/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::Packet // 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 @@ -62,7 +62,18 @@ prefix_ OtherPacket senf::Packet::as() const { if (!is()) - throw WrapException(std::bad_cast()); + throw WrapException(std::bad_cast()) + << ": called packet::as() with wrong PacketType: " + << (valid() ? typeId().prettyName() : "invalid packet") + << " != " << prettyName(typeid(OtherPacket)); + return OtherPacket(ptr()->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()); } @@ -78,7 +89,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 +114,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 @@ -148,7 +161,7 @@ prefix_ Annotation const & senf::Packet::annotation() return ptr()->annotation(); } -/////////////////////////////////////////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// // senf::ConcretePacket // structors and default members @@ -232,7 +245,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)); @@ -312,19 +325,18 @@ 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/////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_