|
core/CommunicationStructure.hppGo to the documentation of this file.00001 //============================================================================ 00002 // Author : Alessandro Pinto <apinto@eecs.berkeley.edu> 00003 // University of California, Berkeley 00004 // 545 Cory Hall, Berkeley, CA 94720 00005 // Copyright : See COPYING file that comes with this distribution 00006 //============================================================================ 00007 00008 #ifndef COMMUNICATIONSTRUCTURE_HPP_ 00009 #define COMMUNICATIONSTRUCTURE_HPP_ 00010 00011 #include <string> 00012 #include "IdGraph.h" 00013 #include "IdUndirectedGraph.h" 00014 #include "../label/LabelMap.hpp" 00015 00016 namespace cosi { 00017 00018 #define PRJ(x) x:: 00019 00020 template<class L> class CommunicationStructure : public IdGraph, 00021 public LabelMap<L> { 00022 public: 00023 00024 CommunicationStructure() : 00025 IdGraph("Unknown") { 00026 } 00027 ; 00028 00029 CommunicationStructure(std::string pName) : 00030 IdGraph(pName) { 00031 } 00032 ; 00033 00034 int AddVertex() { 00035 int Id = IdGraph::AddVertex(); 00036 LabelMap<L>::Set(Id, L()) ; 00037 return Id ; 00038 } 00039 ; 00040 00042 void AddVertex(int Id) { 00043 IdGraph::AddVertex(Id); 00044 LabelMap<L>::Set(Id, L()) ; 00045 } 00046 ; 00047 00049 void DeleteVertex(int Id) { 00050 IdGraph::DeleteVertex(Id); 00051 LabelMap<L>::Erase(Id); 00052 } 00053 ; 00054 00056 void AddEdge(int i, int j) { 00057 IdGraph::AddEdge(i, j); 00058 LabelMap<L>::Set(Edge(i, j), L()); 00059 } 00060 ; 00061 00063 void AddEdge(Edge pE) { 00064 IdGraph::AddEdge(pE); 00065 LabelMap<L>::Set(pE, L()); 00066 } 00067 ; 00068 00070 void DeleteEdge(int i, int j) { 00071 IdGraph::DeleteEdge(i, j); 00072 LabelMap<L>::Erase(Edge(i, j)); 00073 } 00074 ; 00075 00076 void DeleteEdge(Edge pE) { 00077 IdGraph::DeleteEdge(pE); 00078 LabelMap<L>::Erase(pE); 00079 } 00080 ; 00081 00082 L& operator[](Vertex V) { 00083 return LabelMap<L>::Get(V) ; 00084 } 00085 ; 00086 00087 L& operator[](Edge E) { 00088 return LabelMap<L>::Get(E) ; 00089 } 00090 ; 00091 00092 std::string PrintNode(int V) { 00093 std::string s; 00094 s += IdGraph::PrintNode(V) ; 00095 s += (*this)[V].Print() ; 00096 return s ; 00097 } 00098 00099 std::string PrintEdge(int U, int V) { 00100 std::string s; 00101 s+= IdGraph::PrintEdge(U, V) ; 00102 s+= (*this)[Edge(U,V)].Print() ; 00103 return s ; 00104 } 00105 00106 std::string PrintEdge(Edge pE) { 00107 std::string s; 00108 s+= IdGraph::PrintEdge(pE) ; 00109 s+= (*this)[pE].Print() ; 00110 return s ; 00111 } 00112 00113 }; 00114 00115 template<class L> class U_CommunicationStructure : public IdUndirectedGraph, 00116 public LabelMap<L> { 00117 public: 00118 00119 U_CommunicationStructure() : 00120 IdUndirectedGraph("Unknown") { 00121 } 00122 ; 00123 00124 U_CommunicationStructure(std::string pName) : 00125 IdUndirectedGraph(pName) { 00126 } 00127 ; 00128 00130 void AddVertex(int Id) { 00131 IdUndirectedGraph::AddVertex(Id); 00132 LabelMap<L>::Set(Id, L()) ; 00133 } 00134 ; 00135 00137 void DeleteVertex(int Id) { 00138 IdUndirectedGraph::DeleteVertex(Id); 00139 LabelMap<L>::Erase(Id); 00140 } 00141 ; 00142 00144 void AddEdge(int i, int j) { 00145 IdUndirectedGraph::AddEdge(i, j); 00146 LabelMap<L>::Set(Edge(i, j), L()); 00147 LabelMap<L>::Set(Edge(j, i), L()); 00148 } 00149 ; 00150 00152 void AddEdge(Edge pE) { 00153 IdUndirectedGraph::AddEdge(pE); 00154 LabelMap<L>::Set(pE, L()); 00155 Edge E(pE.V() , pE.U()); 00156 LabelMap<L>::Set(E, L()); 00157 } 00158 ; 00159 00161 void DeleteEdge(int i, int j) { 00162 IdUndirectedGraph::DeleteEdge(i, j); 00163 LabelMap<L>::Erase(Edge(i, j)); 00164 LabelMap<L>::Erase(Edge(j, i)); 00165 } 00166 ; 00167 00168 void DeleteEdge(Edge pE) { 00169 IdUndirectedGraph::DeleteEdge(pE); 00170 LabelMap<L>::Erase(pE); 00171 Edge E(pE.V() , pE.U()); 00172 LabelMap<L>::Erase(E); 00173 } 00174 ; 00175 00176 L& operator[](Vertex V) { 00177 return LabelMap<L>::Get(V) ; 00178 } 00179 ; 00180 00181 L& operator[](Edge E) { 00182 if ( !(LabelMap<L>::Get(E)).IsBot() ) 00183 return LabelMap<L>::Get(E) ; 00184 Edge Re ; 00185 Re.U(E.V()) ; 00186 Re.V(E.U()) ; 00187 if ( !(LabelMap<L>::Get(Re)).IsBot() ) 00188 return LabelMap<L>::Get(Re) ; 00189 return LabelMap<L>::Get(E); 00190 } 00191 ; 00192 00193 std::string PrintNode(int V) { 00194 std::string s; 00195 s += IdUndirectedGraph::PrintNode(V) ; 00196 s += (*this)[V].Print() ; 00197 return s ; 00198 } 00199 00200 std::string PrintEdge(int U, int V) { 00201 std::string s; 00202 s+= IdUndirectedGraph::PrintEdge(U, V) ; 00203 s+= (*this)[Edge(U,V)].Print() ; 00204 return s ; 00205 } 00206 00207 std::string PrintEdge(Edge pE) { 00208 std::string s; 00209 s+= IdUndirectedGraph::PrintEdge(pE) ; 00210 s+= (*this)[pE].Print() ; 00211 return s ; 00212 } 00213 00214 }; 00215 00216 } 00217 00218 #endif /*COMMUNICATIONSTRUCTURE_HPP_*/ Generated on Sun Sep 7 18:37:42 2008 for COSI by 1.5.4 |