Utils/Console: Add SENF_CONSOLE_REGISTER_ENUM 'key()' support
[senf.git] / senf / PPI / Module.cci
index 3f0817d..78b7be3 100644 (file)
@@ -28,6 +28,9 @@
 #include "Connectors.hh"
 #include "EventManager.hh"
 #include "ModuleManager.hh"
+#include <boost/lambda/lambda.hpp>
+#include <boost/lambda/bind.hpp>
+#include <algorithm>
 
 #define prefix_ inline
 ///////////////////////////////cci.p///////////////////////////////////////
@@ -55,13 +58,28 @@ prefix_ senf::ppi::ModuleManager & senf::ppi::module::Module::moduleManager()
 
 prefix_ void senf::ppi::module::Module::registerConnector(connector::Connector & connector)
 {
-    if (std::find(connectorRegistry_.begin(), connectorRegistry_.end(), &connector) 
+    if (std::find(connectorRegistry_.begin(), connectorRegistry_.end(), &connector)
         == connectorRegistry_.end()) {
         connectorRegistry_.push_back(&connector);
         connector.setModule(*this);
     }
 }
 
+prefix_ void senf::ppi::module::Module::unregisterConnector(connector::Connector & connector)
+{
+    ConnectorRegistry::iterator i (std::find(connectorRegistry_.begin(), connectorRegistry_.end(),
+                                             &connector));
+    if (i != connectorRegistry_.end())
+        connectorRegistry_.erase(i);
+
+    routes_.erase_if(boost::bind(&RouteBase::hasConnector, _1, boost::cref(connector)));
+}
+
+prefix_ void senf::ppi::module::Module::unregisterEvent(EventDescriptor & event)
+{
+    routes_.erase_if(boost::bind(&RouteBase::hasEvent, _1, boost::cref(event)));
+}
+
 prefix_ senf::ppi::RouteBase &
 senf::ppi::module::Module::addRoute(std::auto_ptr<RouteBase> route)
 {
@@ -74,6 +92,11 @@ senf::ppi::module::Module::addRoute(std::auto_ptr<RouteBase> route)
 
 prefix_ senf::ppi::module::Module::~Module()
 {
+    SENF_ASSERT(connectorRegistry_.empty(),
+                "Internal failure: connectors still registered in Module destructor ??");
+    SENF_ASSERT(routes_.empty(),
+                "internal failure: routes still registered in Module destructor ??");
+
     moduleManager().unregisterModule(*this);
 }