00001
00002
00003
00004
00005
00006
00007 #ifndef INCLUDE__ABSTRACTNODE_H__FILE
00008 #define INCLUDE__ABSTRACTNODE_H__FILE
00009
00010 #include "defs.h"
00011 #include "EGException.h"
00012 #include "EGTVector.h"
00013
00019 template<class T>
00020 class EGTAbstractNode {
00021 public:
00022 typedef T Term;
00023 typedef EGTVector<T*> Terms;
00024 typedef EGTAbstractNode<T> Self;
00025
00027 EGTAbstractNode(UInt uNumIn, UInt uNumOut)
00028 : m_tInTerms(uNumIn), m_tOutTerms(uNumOut) { }
00030 EGTAbstractNode(const Self& rhs)
00031 : m_tInTerms(rhs.m_tInTerms), m_tOutTerms(rhs.m_tOutTerms) { }
00033 virtual ~EGTAbstractNode() { }
00034
00036 UInt GetNumInTerms() const { return m_tInTerms.Size(); }
00037
00039 UInt GetNumOutTerms() const { return m_tOutTerms.Size(); }
00040
00042 Term* GetInTerm(UInt uTermNum) {
00043 CheckNumInTerms(uTermNum, __FILE__, __LINE__);
00044 return m_tInTerms[uTermNum];
00045 }
00047 Term* GetOutTerm(UInt uTermNum) {
00048 CheckNumOutTerms(uTermNum, __FILE__, __LINE__);
00049 return m_tOutTerms[uTermNum];
00050 }
00052 const Term* GetInTerm(UInt uTermNum) const {
00053 CheckNumInTerms(uTermNum, __FILE__, __LINE__);
00054 return m_tInTerms[uTermNum];
00055 }
00057 const Term* GetOutTerm(UInt uTermNum) const {
00058 CheckNumOutTerms(uTermNum, __FILE__, __LINE__);
00059 return m_tOutTerms[uTermNum];
00060 }
00061 void ConnectSrc(UInt uTermNum, Term* src);
00062 void ConnectDest(UInt uTermNum, Term* dest);
00063 virtual void Display(std::ostream& out) const;
00064
00065 protected:
00067 Terms m_tInTerms;
00069 Terms m_tOutTerms;
00070
00071 void CheckNumInTerms(UInt uNum, char* filename, UInt uLine) const;
00072 void CheckNumOutTerms(UInt uNum, char* filename, UInt uLine) const;
00073 };
00074
00075
00081 template<class T>
00082 void EGTAbstractNode<T>::ConnectSrc(UInt uTermNum, Term* src)
00083 {
00084 CheckNumInTerms(uTermNum, __FILE__, __LINE__);
00085 Term* pt = GetInTerm(uTermNum);
00086 pt->SetTerm(src);
00087 src->SetTerm(pt);
00088 }
00089
00090
00096 template<class T>
00097 void EGTAbstractNode<T>::ConnectDest(UInt uTermNum, Term* dest)
00098 {
00099 CheckNumOutTerms(uTermNum, __FILE__, __LINE__);
00100 Term* pt = GetOutTerm(uTermNum);
00101 pt->SetTerm(dest);
00102 dest->SetTerm(pt);
00103 }
00104
00105
00110 template<class T>
00111 void EGTAbstractNode<T>::Display(std::ostream& out) const {
00112
00113 if (GetNumInTerms()) {
00114 out << "Src[";
00115 if (GetInTerm(0)->GetTerm()) {
00116 out << GetInTerm(0)->GetDestNodeID();
00117 out << "(" << GetInTerm(0)->GetDestTermNum() << ")";
00118 }
00119 else {
00120 out << "***";
00121 }
00122 for (UInt i=1; i<GetNumInTerms(); ++i) {
00123 if (GetInTerm(i)->GetTerm()) {
00124 out << ", ";
00125 out << GetInTerm(i)->GetDestNodeID();
00126 out << "(" << GetInTerm(i)->GetDestTermNum() << ")";
00127 }
00128 else {
00129 out << ", ***";
00130 }
00131 }
00132 out << "]";
00133 }
00134 if (GetNumInTerms() && GetNumOutTerms()) {
00135 out << ", ";
00136 }
00137
00138 if (GetNumOutTerms()) {
00139 out << "Dest[";
00140 if (GetOutTerm(0)->GetTerm()) {
00141 out << GetOutTerm(0)->GetDestNodeID();
00142 out << "(" << GetOutTerm(0)->GetDestTermNum() << ")";
00143 }
00144 else {
00145 out << "***";
00146 }
00147 for (UInt i=1; i<GetNumOutTerms(); ++i) {
00148 if (GetOutTerm(i)->GetTerm()) {
00149 out << ", ";
00150 out << GetOutTerm(i)->GetDestNodeID();
00151 out << "(" << GetOutTerm(i)->GetDestTermNum() << ")";
00152 }
00153 else {
00154 out << ", ***";
00155 }
00156 }
00157 out << "]";
00158 }
00159 out << std::endl;
00160 }
00161
00162
00170 template<class T>
00171 void EGTAbstractNode<T>::CheckNumInTerms(UInt uNum,
00172 char* filename, UInt uLine) const
00173 {
00174 #ifdef DEBUG
00175 if (uNum >= GetNumInTerms()) {
00176 throw EGException("EGAbstractNode, "
00177 "The input Terminal with the specified ID number "
00178 "does not exist.",
00179 filename, uLine);
00180 }
00181 #endif
00182 }
00183
00184
00192 template<class T>
00193 void EGTAbstractNode<T>::CheckNumOutTerms(UInt uNum,
00194 char* filename, UInt uLine) const
00195 {
00196 #ifdef DEBUG
00197 if (uNum >= GetNumOutTerms()) {
00198 throw EGException("EGAbstractNode, "
00199 "The output Terminal with the specified ID number "
00200 "does not exist.",
00201 filename, uLine);
00202 }
00203 #endif
00204 }
00205
00206 #endif //INCLUDE__ABSTRACTNODE_H__FILE