00001
00002 #ifndef _ITERATOR_H_
00003 #define _ITERATOR_H_
00004
00005 #include "Network.h"
00006 #include "Collector.h"
00007 #include "BufferedNode.h"
00008
00009 namespace FD {
00010
00012 class InputTranslator : public BufferedNode {
00013
00014 protected:
00015
00016 int internal_processCount;
00017
00018 public:
00019
00021 InputTranslator (std::string nodeName, ParameterSet params)
00022 :BufferedNode(nodeName, params) {
00023
00024 ;
00025 }
00026
00028 void setProcessCount(int pc) {internal_processCount = pc;}
00029
00031 int getProcessCount() {return internal_processCount;}
00032
00033
00034 virtual void request(int outputID, const ParameterSet &req)
00035 {
00036 if (req.exist("LOOKAHEAD"))
00037 outputs[outputID].lookAhead = std::max(outputs[outputID].lookAhead,dereference_cast<int> (req.get("LOOKAHEAD")));
00038 if (req.exist("LOOKBACK"))
00039 outputs[outputID].lookBack = std::max(outputs[outputID].lookBack,dereference_cast<int> (req.get("LOOKBACK")));
00040 if (req.exist("INORDER"))
00041 inOrder = true;
00042
00043
00044 }
00045
00046
00047 virtual ObjectRef getOutput(int output_id, int count) {
00048 return BufferedNode::getOutput(output_id,internal_processCount);
00049 }
00050
00051
00052 virtual void calculate(int output_id, int count, Buffer &out) {
00053
00054 int outputID = inputs[output_id].outputID;
00055
00056
00057 out[count] = (inputs[output_id].node)->getOutput(outputID,internal_processCount);
00058 }
00059
00060 int addInput (const std::string &inputName)
00061 {
00062 BufferedNode::addInput(inputName);
00063 return BufferedNode::addOutput(inputName);
00064 }
00065
00066 virtual int translateInput (std::string inputName) {
00067 for (unsigned int i=0; i< inputs.size(); i++) {
00068 if (inputs[i].name == inputName) {
00069 return i;
00070 }
00071 }
00072 return addInput(inputName);
00073 }
00074
00075 virtual int translateOutput (std::string outputName) {
00076
00077
00078 return translateInput(outputName);
00079 }
00080
00081 virtual bool hasOutput(int output_id) const {
00082 return(int(inputs.size()) > output_id);
00083 }
00084
00085
00086 virtual void requestForIterator(const ParameterSet &req)
00087 {
00088
00089 for (int i=0;i<inputs.size();i++)
00090 {
00091 inputs[i].node->request(inputs[i].outputID,req);
00092 }
00093
00094
00095 }
00096
00097 private:
00098
00100 InputTranslator () {
00101 throw new NodeException (NULL,"The default constructor should not be called from InputTranslator",__FILE__,__LINE__);
00102 }
00103 };
00104
00106 class Iterator : public Network {
00107
00108 protected:
00109
00110 int processCount;
00111
00112 public:
00113
00115 Iterator (std::string nodeName, ParameterSet params);
00116
00118 virtual ObjectRef getOutput (int output_id, int count);
00119
00121 virtual void connectToNode(std::string in, Node *inNode, std::string out) {
00122 if (!inputNode) {
00123 throw new NodeException(this,std::string("No input node in iterator :") + name, __FILE__,__LINE__);
00124 }
00125 connectToNode(inputNode->translateInput(in), inNode, inNode->translateOutput(out));
00126 }
00127
00128 virtual void request(int outputID, const ParameterSet &req)
00129 {
00130 ParameterSet r;
00131 Collector *col = dynamic_cast<Collector*> (sinkNode);
00132 if (col)
00133 col->requestAll(r);
00134 else
00135 throw NodeException(this, "Iterator output should be a collector", __FILE__, __LINE__);
00136 conditionNode->request(0,r);
00137 if (translator)
00138 translator->requestForIterator(req);
00139 }
00140
00142 void setConditionNode(Node* aNode) {conditionNode = aNode;}
00143
00145 Node* getConditionNode() {return conditionNode;}
00146
00148 virtual void initialize();
00149
00151 virtual void reset();
00152
00154 virtual void stop();
00155
00156 protected:
00157
00159 virtual void connectToNode(unsigned int in, Node *inNode, unsigned int out);
00160
00162 bool doWhile;
00163
00164 bool exit_status;
00165
00167 Node *conditionNode;
00168
00170 InputTranslator *translator;
00171
00173 std::vector<ObjectRef> output;
00174
00176 Iterator() {
00177 throw new NodeException (NULL,"The default constructor should not be called from Iterator",__FILE__,__LINE__);
00178 }
00179
00180 };
00181
00182 }
00183 #endif