00001
00002
00003
00004
00005
00006
00007 #ifndef INCLUDE__NODE_H__FILE
00008 #define INCLUDE__NODE_H__FILE
00009
00010 #include "defs.h"
00011 #include "EGTAbstractNode.h"
00012 #include "EGTVector.h"
00013 #include <string>
00014
00023 template<class T>
00024 class EGTNode : public EGTAbstractNode<T> {
00025 public:
00026 typedef EGTAbstractNode<T> Base;
00027 typedef EGTNode<T> Self;
00028 typedef T Term;
00029 typedef EGTVector<T*> Terms;
00030
00031 EGTNode(UInt uFuncID, UInt uNumInTerms, UInt uNumOutTerms, UInt uNO);
00032 EGTNode(const Self&);
00033 virtual ~EGTNode();
00034
00036 UInt GetFuncID() const { return m_uFuncID; }
00038 void SetNodeID(UInt n) { m_uNodeID = n; }
00040 UInt GetNodeID() const { return m_uNodeID; }
00042 void SetNO(UInt n) { m_uNO = n; }
00044 UInt GetNO() const { return m_uNO; }
00045
00046 void SetOrigin(UInt n) { m_uOrigin = n; }
00047 UInt GetOrigin() { return m_uOrigin; }
00048
00049 virtual bool IsCandidate() const {
00050 if (m_uNO == 0) {
00051 return true;
00052 }
00053 return false;
00054 }
00055
00056 virtual void SaveExtraData(std::ostream& out) const { ; }
00057 virtual bool LoadExtraData(std::istream& in) { return true; }
00058
00059 virtual void Display(std::ostream&) const;
00060 virtual const std::string GetName() const { return ""; }
00061 virtual const std::string GetInLabel(UInt) const { return ""; }
00062 virtual const std::string GetOutLabel(UInt) const { return ""; }
00063
00065 virtual Self* CreateNode() = 0;
00067 virtual Self* CreateNode(UInt uFuncID) = 0;
00069 virtual Self* CreateNodeDiff(Int iDiff) = 0;
00071 virtual Self* CreateInputNode(UInt n) = 0;
00073 virtual Self* CreateOutputNode(UInt n) = 0;
00074
00075 private:
00077 UInt m_uFuncID;
00079 UInt m_uNodeID;
00085 UInt m_uNO;
00087 Self& operator=(const Self&);
00088
00089 UInt m_uOrigin;
00090 };
00091
00092
00100 template<class T>
00101 EGTNode<T>:: EGTNode(UInt uFuncID, UInt uNumIn, UInt uNumOut, UInt uNO)
00102 : Base(uNumIn, uNumOut), m_uFuncID(uFuncID), m_uNodeID(0), m_uNO(uNO),
00103 m_uOrigin(ORI_UNDEF)
00104 {
00105 for (UInt i=0; i<uNumIn; ++i) {
00106 m_tInTerms[i] = new Term;
00107 GetInTerm(i)->SetTermNum(i);
00108 }
00109 for (UInt i=0; i<uNumOut; ++i) {
00110 m_tOutTerms[i] = new Term;
00111 GetOutTerm(i)->SetTermNum(i);
00112 }
00113 }
00114
00115
00120 template<class T>
00121 EGTNode<T>::EGTNode(const Self& rhs)
00122 : Base(rhs),
00123 m_uFuncID(rhs.m_uFuncID), m_uNodeID(rhs.m_uNodeID), m_uNO(rhs.m_uNO),
00124 m_uOrigin(ORI_UNDEF)
00125 {
00126 UInt uNumInTerms = GetNumInTerms();
00127 for (UInt i=0; i<uNumInTerms; ++i) {
00128 m_tInTerms[i] = new Term;
00129 GetInTerm(i)->SetTermNum(i);
00130 GetInTerm(i)->SetTerm(0);
00131 }
00132 UInt uNumOutTerms = GetNumOutTerms();
00133 for (UInt i=0; i<uNumOutTerms; ++i) {
00134 m_tOutTerms[i] = new Term;
00135 GetOutTerm(i)->SetTermNum(i);
00136 GetOutTerm(i)->SetTerm(0);
00137 }
00138 }
00139
00140
00144 template<class T>
00145 EGTNode<T>::~EGTNode()
00146 {
00147 UInt uNumIn = GetNumInTerms();
00148 for (UInt i=0; i<uNumIn; ++i) {
00149 delete m_tInTerms[i];
00150 }
00151 UInt uNumOut = GetNumOutTerms();
00152 for (UInt i=0; i<uNumOut; ++i) {
00153 delete m_tOutTerms[i];
00154 }
00155 }
00156
00157
00162 template<class T>
00163 void EGTNode<T>::Display(std::ostream& out) const
00164 {
00165 if (m_uNodeID > 9) {
00166 out << m_uNodeID << ": ";
00167 }
00168 else {
00169 out << " " << m_uNodeID << ": ";
00170 }
00171 if (m_uFuncID > 9) {
00172 out << "FuncID:" << m_uFuncID << ", ";
00173 }
00174 else {
00175 out << "FuncID: " << m_uFuncID << ", ";
00176 }
00177 out << "I/O: (" << GetNumInTerms() << "," << GetNumOutTerms() << "), ";
00178 out << "NO:" << m_uNO << " ";
00179
00180 Base::Display(out);
00181 }
00182
00183 #endif //INCLUDE__NODE_H__FILE