From b7f0c35815d3441d282e8339cc8f9cc9e5ce3358 Mon Sep 17 00:00:00 2001
From: g0dil <g0dil@wiback.org>
Date: Thu, 22 Jan 2009 10:22:44 +0000
Subject: [PATCH] PPI: Add PacketType template argument to MonitorModule
 Packets: Allow const access to annotations

---
 PPI/{MonitorModule.cc => MonitorModule.ct}   | 20 ++++++++++----------
 PPI/{MonitorModule.cci => MonitorModule.cti} |  9 +++++----
 PPI/MonitorModule.hh                         | 13 +++++++------
 PPI/MonitorModule.test.cc                    |  2 +-
 Packets/Packet.cti                           |  7 +++++++
 Packets/Packet.hh                            |  4 ++++
 6 files changed, 34 insertions(+), 21 deletions(-)
 rename PPI/{MonitorModule.cc => MonitorModule.ct} (73%)
 rename PPI/{MonitorModule.cci => MonitorModule.cti} (83%)

diff --git a/PPI/MonitorModule.cc b/PPI/MonitorModule.ct
similarity index 73%
rename from PPI/MonitorModule.cc
rename to PPI/MonitorModule.ct
index 2a5420a3c..1945293d9 100644
--- a/PPI/MonitorModule.cc
+++ b/PPI/MonitorModule.ct
@@ -21,40 +21,40 @@
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 /** \file
-    \brief MonitorModule non-inline non-template implementation */
+    \brief MonitorModule non-inline template implementation  */
 
-#include "MonitorModule.hh"
 //#include "MonitorModule.ih"
 
 // Custom includes
 
-//#include "MonitorModule.mpp"
 #define prefix_
-///////////////////////////////cc.p////////////////////////////////////////
+///////////////////////////////ct.p////////////////////////////////////////
 
-prefix_ void senf::ppi::module::MonitorModule::request()
+template <class PacketType>
+prefix_ void senf::ppi::module::MonitorModule<PacketType>::request()
 {
-    Packet p (input());
+    PacketType p (input());
     v_handlePacket(p);
     if (output.connected())
         output(p);
 }
 
-prefix_ void senf::ppi::module::MonitorModule::throttle()
+template <class PacketType>
+prefix_ void senf::ppi::module::MonitorModule<PacketType>::throttle()
 {
     if (output.connected())
         input.throttle();
 }
 
-prefix_ void senf::ppi::module::MonitorModule::unthrottle()
+template <class PacketType>
+prefix_ void senf::ppi::module::MonitorModule<PacketType>::unthrottle()
 {
     if (output.connected())
         input.unthrottle();
 }
 
-///////////////////////////////cc.e////////////////////////////////////////
+///////////////////////////////ct.e////////////////////////////////////////
 #undef prefix_
-//#include "MonitorModule.mpp"
 
 
 // Local Variables:
diff --git a/PPI/MonitorModule.cci b/PPI/MonitorModule.cti
similarity index 83%
rename from PPI/MonitorModule.cci
rename to PPI/MonitorModule.cti
index 9c0e62c38..e2f101ad1 100644
--- a/PPI/MonitorModule.cci
+++ b/PPI/MonitorModule.cti
@@ -21,16 +21,17 @@
 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 /** \file
-    \brief MonitorModule inline non-template implementation */
+    \brief MonitorModule inline template implementation */
 
 //#include "MonitorModule.ih"
 
 // Custom includes
 
 #define prefix_ inline
-///////////////////////////////cci.p///////////////////////////////////////
+///////////////////////////////cti.p///////////////////////////////////////
 
-prefix_ senf::ppi::module::MonitorModule::MonitorModule()
+template <class PacketType>
+prefix_ senf::ppi::module::MonitorModule<PacketType>::MonitorModule()
 {
     route(input, output).autoThrottling(false);
     input.onRequest(&MonitorModule::request);
@@ -38,7 +39,7 @@ prefix_ senf::ppi::module::MonitorModule::MonitorModule()
     output.onUnthrottle(&MonitorModule::unthrottle);
 }
 
-///////////////////////////////cci.e///////////////////////////////////////
+///////////////////////////////cti.e///////////////////////////////////////
 #undef prefix_
 
 
diff --git a/PPI/MonitorModule.hh b/PPI/MonitorModule.hh
index c5517eb80..30c8ff1d5 100644
--- a/PPI/MonitorModule.hh
+++ b/PPI/MonitorModule.hh
@@ -37,16 +37,17 @@ namespace senf {
 namespace ppi {
 namespace module {
 
+    template <class PacketType=Packet>
     class MonitorModule : public Module
     {
     public:
-        senf::ppi::connector::PassiveInput<> input;
-        senf::ppi::connector::ActiveOutput<> output;
+        senf::ppi::connector::PassiveInput<PacketType> input;
+        senf::ppi::connector::ActiveOutput<PacketType> output;
 
     protected:
         MonitorModule();
 
-        virtual void v_handlePacket(Packet const & p) = 0;
+        virtual void v_handlePacket(PacketType const & p) = 0;
 
     private:
         void request();
@@ -58,9 +59,9 @@ namespace module {
 }}}
 
 ///////////////////////////////hh.e////////////////////////////////////////
-#include "MonitorModule.cci"
-//#include "MonitorModule.ct"
-//#include "MonitorModule.cti"
+//#include "MonitorModule.cci"
+#include "MonitorModule.ct"
+#include "MonitorModule.cti"
 #endif
 
 
diff --git a/PPI/MonitorModule.test.cc b/PPI/MonitorModule.test.cc
index b0f47c21d..9fd3ee7b5 100644
--- a/PPI/MonitorModule.test.cc
+++ b/PPI/MonitorModule.test.cc
@@ -38,7 +38,7 @@
 
 namespace {
     
-    class PacketCounter : public senf::ppi::module::MonitorModule
+    class PacketCounter : public senf::ppi::module::MonitorModule<>
     {
         SENF_PPI_MODULE(PacketCounter);
     public:
diff --git a/Packets/Packet.cti b/Packets/Packet.cti
index 0eb6ddcfb..afae6069d 100644
--- a/Packets/Packet.cti
+++ b/Packets/Packet.cti
@@ -141,6 +141,13 @@ 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>
 
diff --git a/Packets/Packet.hh b/Packets/Packet.hh
index d3b42a402..4a25789f1 100644
--- a/Packets/Packet.hh
+++ b/Packets/Packet.hh
@@ -376,6 +376,10 @@ namespace senf {
 
         ///@}
 
+        template <class Annotation>
+        Annotation const & annotation() const; ///< Get packet annotation
+                                        /**< \see annotation() */
+
         ///\name Other methods
         ///@{
 
-- 
GitLab