now senf could also be located in ../senf
[senf.git] / PPI / Joins.cc
index fb8defd..653149a 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
 ////////////////////////////////////////
 // private members
 
-prefix_ senf::ppi::connector::GenericPassiveInput & senf::ppi::module::PassiveJoin::newInput()
+prefix_ void senf::ppi::module::PassiveJoin::connectorSetup(connector::PassiveInput<> & conn)
 {
-    inputs_.push_back(new connector::GenericPassiveInput());
-    connector::GenericPassiveInput & 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::GenericPassiveInput & input)
@@ -62,7 +57,7 @@ prefix_ void senf::ppi::module::PassiveJoin::onThrottle()
 {
     using boost::lambda::_1;
     using boost::lambda::bind;
-    std::for_each(inputs_.begin(), inputs_.end(),
+    std::for_each(connectors().begin(), connectors().end(),
                   bind(&connector::GenericPassiveInput::throttle, _1));
 }
 
@@ -70,7 +65,7 @@ prefix_ void senf::ppi::module::PassiveJoin::onUnthrottle()
 {
     using boost::lambda::_1;
     using boost::lambda::bind;
-    std::for_each(inputs_.begin(), inputs_.end(),
+    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::GenericActiveInput & senf::ppi::module::PriorityJoin::newInput()
+prefix_ void
+senf::ppi::module::PriorityJoin::connectorSetup(PriorityJoin::ConnectorType & conn,
+                                                int priority)
 {
-    inputs_.push_back(new connector::GenericActiveInput());
-    connector::GenericActiveInput & 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::GenericActiveInput::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::GenericActiveInput::throttled, _1)) == inputs_.end())
+    if (std::find_if(connectors().begin(), connectors().end(),
+                     ! bind(&connector::GenericActiveInput::throttled, _1)) == connectors().end())
         output.throttle();
 }