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

Node.h

00001 // Copyright (C) 1999 Jean-Marc Valin & Dominic Letourneau
00002 
00003 #ifndef _NODE_H_
00004 #define _NODE_H_
00005 
00006 #include "Object.h"
00007 #include <string>
00008 #include <map>
00009 #include <vector>
00010 #include "ObjectRef.h"
00011 #include "BaseException.h"
00012 #include <typeinfo>
00013 #include "ParameterSet.h"
00014 #include "NodeFactory.h"
00015 
00016 namespace FD {
00017 
00019 typedef std::map<std::string, Node*>::value_type nodeEntry;
00020 typedef std::map<std::string, _NodeFactory*>::value_type factoryEntry; 
00021 
00022 
00023 //must be defined
00024 class Node;
00025 
00030 class NodeInput {
00031 public:
00033    int outputID;
00035    Node *node;
00037    std::string name;
00039    NodeInput(Node *n, int t, const std::string &inputName) :outputID(t),node(n),name(inputName) {}
00041    NodeInput (const NodeInput &in) {
00042       node = in.node; 
00043       outputID = in.outputID;
00044       name = in.name;
00045    }
00047    NodeInput& operator= (const NodeInput &in) {
00048       if (&in != this)
00049       {
00050          node = in.node; 
00051          outputID = in.outputID; 
00052          name = in.name;
00053       }
00054       return *this;
00055    }
00057    NodeInput() : outputID(-1), node(NULL) {} //-1 means unused
00058 
00060    NodeInput(const std::string &inputName) : outputID(-1), node(NULL), name(inputName) {}
00061 
00062 private:   
00063 };
00064 
00065 class UINode;
00066 
00072 class Node : public Object {
00073 
00075    friend class Network;
00076    friend class Iterator;
00077 
00078 protected:
00079    
00081    std::string name;
00082 
00084    std::vector<NodeInput> inputs;
00085 
00087    std::vector<std::string> outputNames;
00088 
00090    ParameterSet parameters;
00091 
00093    UINode *uinode;
00094 
00096    virtual void connectToNode(unsigned int in, Node *inputNode, unsigned int out);
00097 
00099    virtual int addOutput (const std::string &outputName);
00100  
00102    virtual int addInput (const std::string &inputName);
00103    
00104 
00106    virtual std::vector<NodeInput>& getInputs () {return inputs;}
00107 
00108 public:
00109 
00111    Node(std::string nodeName, const ParameterSet &params);
00112    
00113 
00115    virtual ~Node() {}
00116 
00119    virtual ObjectRef getOutput(int output_id, int count) = 0; 
00120 
00122    virtual ObjectRef getOutputNamed (const std::string &outputName, int count) {
00123       return this->getOutput (this->translateOutput(outputName),count);
00124    }
00125 
00127    virtual void connectToNode(std::string in, Node *inputNode, std::string out);
00128 
00130    virtual void initialize ();
00131 
00133    virtual bool hasOutput(int output_id) const;
00134 
00135    ObjectRef getInput(int inputID, int count)
00136    {
00137       NodeInput &input = inputs[inputID];
00138       return input.node->getOutput(input.outputID, count);
00139    }
00140 
00142    virtual void stop() {}
00143 
00145    virtual void cleanupNotify() {}
00146 
00148    virtual void reset();
00149 
00151    std::string getName() {return name;}
00152  
00154    virtual void request(int outputID, const ParameterSet &req)
00155    {
00156       for (unsigned int i=0;i<inputs.size();i++)
00157          inputs[i].node->request(inputs[i].outputID,req);      
00158    }
00159 
00161    virtual void verifyConnect();
00162 
00164    void printOn(std::ostream &out=std::cout) const;
00165 
00166    void setUINode(UINode *_uinode) {uinode = _uinode;}
00167    
00169    static int addFactory (const std::string &factoryName, _NodeFactory* const factory);
00170 
00172    static int addXPM (const std::string &nodeName, char **XPMData);
00173 
00175    static char**  getXPM (const std::string &nodeName);
00176    
00178    static _NodeFactory* getFactoryNamed (const std::string &name);
00179 
00180 protected:
00181 
00183    Node() {throw new GeneralException("Node Constructor should not be called",__FILE__,__LINE__);}
00184 
00186    virtual int translateInput(std::string inputName);
00187 
00189    virtual int translateOutput(std::string inputName);
00190 
00192    virtual void rt_assert(bool cond, std::string message="", char *_file="unknown", int _line=0);
00193 
00195    virtual void construct_assert(bool cond, std::string message="", char *_file="unknown", int _line=0);
00196 
00198    virtual void throw_error(bool send_ptr, std::string message, char *_file, int _line);
00199 
00200 public:
00202    static std::map<std::string,_NodeFactory*> &factoryDictionary();
00203 
00205    static std::vector<std::string> &nodeInfo();
00206 
00208    static std::map<std::string,char**> &XPMDictionary();
00209 
00211    static int addNodeInfo (const std::string &info);
00212 };
00213 
00214 
00215 
00216 
00217 
00218 /***************************************************************************/
00219 /*
00220   NotInitializedException
00221   Dominic Letourneau
00222  */
00223 /***************************************************************************/
00229 class NotInitializedException : public BaseException {
00230 
00231 public:
00233    NotInitializedException (std::map<std::string,Node * > aMap) {
00234       nodeMap = aMap;
00235    }
00237    virtual void print(std::ostream &out = std::cerr) {
00238       out<<"NotInitializedException occured"<<std::endl;
00239       
00240       std::map<std::string,Node*>::iterator iter;
00241       
00242       for (iter = nodeMap.begin(); iter != nodeMap.end(); iter++) {
00243          out<<"This node is not initialized: "<<(*iter).first<<std::endl;
00244       }
00245    }   
00246 
00248    std::map<std::string,Node*> nodeMap;
00249 };
00250 
00256 class NodeException : public BaseException {
00257 
00258 public:
00259 
00261    NodeException( Node *_node, std::string _message, char *_file, int _line) 
00262       : message(_message)
00263       , node(_node)
00264       , file(_file)
00265       , line(_line)
00266       , frozen(false)
00267    {}   
00269    virtual void print(std::ostream &out = std::cerr);
00270 
00271    virtual void freeze();
00272 
00273 protected:
00275    std::string message;
00276 
00278    Node *node;
00279 
00281    std::string file;
00282 
00284    int line;
00285 
00287    bool frozen;
00288 
00289 };
00290 
00291 
00292 
00293 #define DECLARE_NODE_XPM(NodeTypeName, XPMFilePtr) int dummy_initializer_for ## NodeTypeName = \
00294                Node::addFactory (# NodeTypeName, new NodeFactory<NodeTypeName>(# NodeTypeName)) + \
00295                Node::addXPM (# NodeTypeName, XPMFilePtr);
00296 
00297 
00298 #define DECLARE_NODE(NodeTypeName) DECLARE_NODE_XPM(NodeTypeName,NULL)
00299 
00300 
00301 }//namespace FD
00302 #endif

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