Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members

Iterator.h

00001 // Copyright (C) 1999 Jean-Marc Valin and Dominic Letourneau
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       //nothing to do
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      //handled by BufferedNode
00044    }
00045    
00046    
00047    virtual ObjectRef getOutput(int output_id, int count) {
00048      return BufferedNode::getOutput(output_id,internal_processCount);
00049    }//getOutput
00050    
00051 
00052    virtual void calculate(int output_id, int count, Buffer &out) {
00053 
00054      int outputID = inputs[output_id].outputID;
00055      
00056      //same as the collector's job!
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      // Simply call translateInput because it should return
00077      // the same integer...
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       //request propagation to nodes before the iterator
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 }//namespace FD
00183 #endif

Generated on Wed Oct 5 14:28:55 2005 for FlowDesigner by  doxygen 1.4.4