Packets: Add StringParser ostream operation
[senf.git] / Packets / Packet.cci
index ea4f549..001f69c 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institute for Open Communication Systems (FOKUS) 
-// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+// Copyright (C) 2007
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
 //     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
@@ -24,6 +24,7 @@
     \brief Packet inline non-template implementation */
 
 // Custom includes
+#include "../Utils/senfassert.hh"
 
 #define prefix_ inline
 ///////////////////////////////cci.p///////////////////////////////////////
 ///////////////////////////////////////////////////////////////////////////
 // senf::Packet
 
+// protected members
+
+prefix_  senf::Packet::Packet(PacketInterpreterBase::ptr packet)
+    : packet_(packet)
+{}
+
+prefix_ senf::PacketInterpreterBase::ptr senf::Packet::ptr()
+    const
+{
+    SENF_ASSERT(packet_);
+    return packet_;
+}
+
 // public structors
 
 prefix_ senf::Packet::Packet()
 {}
 
+// public members
+
 prefix_ senf::Packet senf::Packet::clone()
     const
 {
@@ -44,6 +60,13 @@ prefix_ senf::Packet senf::Packet::clone()
 
 // Interpreter chain access
 
+prefix_ senf::Packet senf::Packet::next(NoThrow_t)
+    const
+{
+    PacketInterpreterBase::ptr p (ptr()->next());
+    return !p && ptr()->nextPacketRange() ? checkNext() : Packet(p);
+}
+
 prefix_ senf::Packet senf::Packet::next()
     const
 {
@@ -52,11 +75,10 @@ prefix_ senf::Packet senf::Packet::next()
     return p;
 }
 
-prefix_ senf::Packet senf::Packet::next(NoThrow_t)
+prefix_ senf::Packet senf::Packet::prev(NoThrow_t)
     const
 {
-    PacketInterpreterBase::ptr p (ptr()->next());
-    return !p && ptr()->nextPacketRange() ? checkNext() : Packet(p);
+    return Packet(ptr()->prev());
 }
 
 prefix_ senf::Packet senf::Packet::prev()
@@ -67,12 +89,6 @@ prefix_ senf::Packet senf::Packet::prev()
     return p;
 }
 
-prefix_ senf::Packet senf::Packet::prev(NoThrow_t)
-    const
-{
-    return Packet(ptr()->prev());
-}
-
 prefix_ senf::Packet senf::Packet::first()
     const
 {
@@ -92,7 +108,7 @@ prefix_ senf::Packet senf::Packet::parseNextAs(factory_t factory)
     return Packet(ptr()->parseNextAs(factory));
 }
 
-prefix_ senf::Packet senf::Packet::append(Packet packet)
+prefix_ senf::Packet senf::Packet::append(Packet const & packet)
     const
 {
     return Packet(ptr()->append(packet.ptr()));
@@ -115,17 +131,25 @@ prefix_ senf::Packet::size_type senf::Packet::size()
 
 // Other methods
 
-prefix_ bool senf::Packet::operator==(Packet other)
+prefix_ bool senf::Packet::operator==(Packet const & other)
     const
 {
     return ptr() == other.ptr();
 }
 
-prefix_ void senf::Packet::finalize()
-    const
+prefix_ void senf::Packet::finalizeThis()
 {
-    last(); // Make sure the packet is complete
-    ptr()->finalize();
+    ptr()->finalizeThis();
+}
+
+prefix_ void senf::Packet::finalizeTo(Packet const & other)
+{
+    ptr()->finalizeTo(other.ptr());
+}
+
+prefix_ void senf::Packet::finalizeAll()
+{
+    ptr()->finalizeTo(last().ptr());
 }
 
 prefix_ void senf::Packet::dump(std::ostream & os)
@@ -153,17 +177,17 @@ prefix_ bool senf::Packet::boolean_test()
     return packet_ && packet_->valid();
 }
 
-// protected members
-
-prefix_  senf::Packet::Packet(PacketInterpreterBase::ptr packet)
-    : packet_(packet)
-{}
-
-prefix_ senf::PacketInterpreterBase::ptr senf::Packet::ptr()
+prefix_ bool senf::Packet::valid()
     const
 {
-    BOOST_ASSERT(packet_);
-    return packet_;
+    return *this;
+}
+
+template <class PacketType, class Parser>
+prefix_ Parser senf::operator<<(Parser target, ConcretePacket<PacketType> const & packet)
+{
+    target << packet.parser();
+    return target;
 }
 
 ///////////////////////////////cci.e///////////////////////////////////////