00001
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
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) {}
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 ¶ms);
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
00221
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 }
00302 #endif