Utils/Termlib: Extend the completion API
[senf.git] / Packets / Packet.cti
index 6dec365..afae606 100644 (file)
@@ -128,6 +128,26 @@ prefix_ OtherPacket senf::Packet::first()
     return first().as<OtherPacket>();
 }
 
+template <class Other>
+prefix_ void senf::Packet::finalizeTo()
+{
+    Packet p (find<Other>(nothrow));
+    ptr()->finalizeTo(p ? p.ptr() : last().ptr());
+}
+
+template <class Annotation>
+prefix_ Annotation & senf::Packet::annotation()
+{
+    return ptr()->annotation<Annotation>();
+}
+
+template <class Annotation>
+prefix_ Annotation const & senf::Packet::annotation()
+    const
+{
+    return ptr()->annotation<Annotation>();
+}
+
 ///////////////////////////////////////////////////////////////////////////
 // senf::ConcretePacket<PacketType>
 
@@ -191,28 +211,29 @@ create(ForwardReadableRange const & range,
 
 template <class PacketType>
 prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createAfter(Packet packet)
+senf::ConcretePacket<PacketType>::createAfter(Packet const & packet)
 {
     return ConcretePacket(interpreter::createAfter(packet.ptr()));
 }
 
 template <class PacketType>
 prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createAfter(Packet packet, senf::NoInit_t)
+senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, senf::NoInit_t)
 {
     return ConcretePacket(interpreter::createAfter(packet.ptr(),senf::noinit));
 }
 
 template <class PacketType>
 prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createAfter(Packet packet, size_type size)
+senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size)
 {
     return ConcretePacket(interpreter::createAfter(packet.ptr(), size));
 }
 
 template <class PacketType>
 prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createAfter(Packet packet, size_type size, senf::NoInit_t)
+senf::ConcretePacket<PacketType>::createAfter(Packet const & packet, size_type size, 
+                                              senf::NoInit_t)
 {
     return ConcretePacket(interpreter::createAfter(packet.ptr(), size, senf::noinit));
 }
@@ -222,7 +243,7 @@ senf::ConcretePacket<PacketType>::createAfter(Packet packet, size_type size, sen
 template <class PacketType>
 template <class ForwardReadableRange>
 prefix_ senf::ConcretePacket<PacketType> senf::ConcretePacket<PacketType>::
-createAfter(Packet packet, ForwardReadableRange const & range,
+createAfter(Packet const & packet, ForwardReadableRange const & range,
             typename boost::disable_if< boost::is_integral<ForwardReadableRange> >::type *)
 {
     return ConcretePacket(interpreter::createAfter(packet.ptr(), range));
@@ -234,14 +255,14 @@ createAfter(Packet packet, ForwardReadableRange const & range,
 
 template <class PacketType>
 prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createBefore(Packet packet)
+senf::ConcretePacket<PacketType>::createBefore(Packet const & packet)
 {
     return ConcretePacket(interpreter::createBefore(packet.ptr()));
 }
 
 template <class PacketType>
 prefix_ senf::ConcretePacket<PacketType>
-senf::ConcretePacket<PacketType>::createBefore(Packet packet, senf::NoInit_t)
+senf::ConcretePacket<PacketType>::createBefore(Packet const & packet, senf::NoInit_t)
 {
     return ConcretePacket(interpreter::createBefore(packet.ptr(), senf::noinit));
 }
@@ -259,19 +280,19 @@ senf::ConcretePacket<PacketType>::clone()
 // Field access
 
 template <class PacketType>
-prefix_ typename senf::ConcretePacket<PacketType>::Parser *
-senf::ConcretePacket<PacketType>::operator->()
+prefix_ typename senf::ConcretePacket<PacketType>::Parser
+senf::ConcretePacket<PacketType>::parser()
     const
 {
-    return ptr()->fields_p();
+    return ptr()->fields();
 }
 
 template <class PacketType>
-prefix_ typename senf::ConcretePacket<PacketType>::Parser
-senf::ConcretePacket<PacketType>::parser()
+prefix_ typename senf::ConcretePacket<PacketType>::ParserProxy
+senf::ConcretePacket<PacketType>::operator->()
     const
 {
-    return ptr()->fields();
+    return ParserProxy(parser());
 }
 
 // private members