// 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>
// 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_)
{}
template <class PacketType>
-prefix_ typename senf::ConcretePacket<PacketType>::interpreter::ptr
-senf::ConcretePacket<PacketType>::ptr()
+prefix_ typename senf::ConcretePacket<PacketType>::interpreter * senf::ConcretePacket<PacketType>::ptr()
const
{
- return boost::static_pointer_cast< PacketInterpreter<PacketType> >(Packet::ptr());
+ return static_cast< PacketInterpreter<PacketType> *>( Packet::ptr().get());
}
///////////////////////////////cti.e///////////////////////////////////////