// protected members
-prefix_ senf::Packet::Packet(PacketInterpreterBase::ptr packet)
+prefix_ senf::Packet::Packet(PacketInterpreterBase::ptr const & packet)
: packet_(packet)
{}
-prefix_ senf::PacketInterpreterBase::ptr senf::Packet::ptr()
+prefix_ senf::PacketInterpreterBase::ptr const & senf::Packet::ptr()
const
{
SENF_ASSERT(packet_, "Invalid operation (dereferencing) on in-valid() Packet");
const
{
PacketInterpreterBase::ptr p (ptr()->next());
- return !p && ptr()->nextPacketRange() ? checkNext() : Packet(p);
+ if (p) return Packet(p);
+ PacketInterpreterBase::optional_range r (ptr()->nextPacketRange());
+ return (r && ! r->empty()) ? getNext() : Packet();
}
prefix_ senf::Packet senf::Packet::next()
const
{
Packet p (ptr()->last());
- return p.next(nothrow) ? checkLast() : p;
+ return p.next(nothrow) ? getLast() : p;
}
prefix_ senf::Packet senf::Packet::parseNextAs(factory_t factory)
return *this;
}
+prefix_ bool senf::Packet::is_shared()
+ const
+{
+ return ptr()->is_shared() || (ptr()->impl().refcount() > 1);
+}
+
template <class PacketType, class Parser>
prefix_ Parser senf::operator<<(Parser target, ConcretePacket<PacketType> const & packet)
{