now senf could also be located in ../senf
[senf.git] / PPI / Joins.cc
index 4be6c97..653149a 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
-// Copyright (C) 2007 
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
+// 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
 ////////////////////////////////////////
 // private members
 
-prefix_ senf::ppi::connector::PassiveInput & senf::ppi::module::PassiveJoin::newInput()
+prefix_ void senf::ppi::module::PassiveJoin::connectorSetup(connector::PassiveInput<> & conn)
 {
-    inputs_.push_back(new connector::PassiveInput());
-    connector::PassiveInput & input (inputs_.back());
-
-    noroute(input);
-    input.onRequest(boost::bind(&PassiveJoin::request,this,boost::ref(input)));
-
-    return input;
+    noroute(conn);
+    conn.onRequest(boost::bind(&PassiveJoin::request,this,boost::ref(conn)));
 }
 
-prefix_ void senf::ppi::module::PassiveJoin::request(connector::PassiveInput & input)
+prefix_ void senf::ppi::module::PassiveJoin::request(connector::GenericPassiveInput & input)
 {
     output(input());
 }
@@ -62,16 +57,16 @@ prefix_ void senf::ppi::module::PassiveJoin::onThrottle()
 {
     using boost::lambda::_1;
     using boost::lambda::bind;
-    std::for_each(inputs_.begin(), inputs_.end(),
-                  bind(&connector::PassiveInput::throttle, _1));
+    std::for_each(connectors().begin(), connectors().end(),
+                  bind(&connector::GenericPassiveInput::throttle, _1));
 }
 
 prefix_ void senf::ppi::module::PassiveJoin::onUnthrottle()
 {
     using boost::lambda::_1;
     using boost::lambda::bind;
-    std::for_each(inputs_.begin(), inputs_.end(),
-                  bind(&connector::PassiveInput::unthrottle, _1));
+    std::for_each(connectors().begin(), connectors().end(),
+                  bind(&connector::GenericPassiveInput::unthrottle, _1));
 }
 
 ///////////////////////////////////////////////////////////////////////////
@@ -80,32 +75,40 @@ prefix_ void senf::ppi::module::PassiveJoin::onUnthrottle()
 ////////////////////////////////////////
 // private members
 
-prefix_ senf::ppi::connector::ActiveInput & senf::ppi::module::PriorityJoin::newInput()
+prefix_ void
+senf::ppi::module::PriorityJoin::connectorSetup(PriorityJoin::ConnectorType & conn,
+                                                int priority)
 {
-    inputs_.push_back(new connector::ActiveInput());
-    connector::ActiveInput & input (inputs_.back());
-
-    noroute(input);
-    input.onThrottle(&PriorityJoin::onThrottle);
-    input.onUnthrottle(&PriorityJoin::onUnthrottle);
-
-    return input;
+    noroute(conn);
+    conn.onThrottle(&PriorityJoin::onThrottle);
+    conn.onUnthrottle(&PriorityJoin::onUnthrottle);
+
+    if (priority < 0) {
+        priority = connectors().size() + priority;
+        if (priority < 0) 
+            priority = 0;
+    }
+    if (priority >= int(connectors().size())-1)
+        return;
+    
+    connectors().insert(connectors().begin()+priority, connectors().pop_back().release());
 }
 
 prefix_ void senf::ppi::module::PriorityJoin::request()
 {
     using boost::lambda::_1;
     using boost::lambda::bind;
-    Inputs::iterator i (std::find_if(inputs_.begin(), inputs_.end(),
-                                     ! bind(&connector::ActiveInput::throttled, _1)));
-    if (i != inputs_.end())
+    PriorityJoin::ContainerType::iterator i (
+        std::find_if(connectors().begin(), connectors().end(),
+                     ! bind(&connector::GenericActiveInput::throttled, _1)));
+    if (i != connectors().end())
         output((*i)());
 }
 
 prefix_ void senf::ppi::module::PriorityJoin::onThrottle()
 {
-    if (std::find_if(inputs_.begin(), inputs_.end(),
-                     ! bind(&connector::ActiveInput::throttled, _1)) == inputs_.end())
+    if (std::find_if(connectors().begin(), connectors().end(),
+                     ! bind(&connector::GenericActiveInput::throttled, _1)) == connectors().end())
         output.throttle();
 }