00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <vector>
00032 #include <algorithm>
00033
00038 class Subgraph {
00039 public:
00040 struct tmpEdge {
00041 GNode src;
00042 GNode dst;
00043 Edge data;
00044 tmpEdge(GNode s, GNode d, const Edge& _d)
00045 :src(s), dst(d), data(_d)
00046 {}
00047
00048 bool operator==(const tmpEdge& rhs) const {
00049 return src == rhs.src && dst == rhs.dst && data == data;
00050 }
00051 };
00052
00053 private:
00054
00055 typedef std::vector<GNode,Galois::PerIterAllocTy::rebind<GNode>::other> nodesTy;
00056
00057 nodesTy nodes;
00058
00059
00060
00061 typedef std::vector<tmpEdge,Galois::PerIterAllocTy::rebind<tmpEdge>::other> edgesTy;
00062
00063 edgesTy edges;
00064
00065 public:
00066 explicit Subgraph(Galois::PerIterAllocTy& cnx)
00067 : nodes(cnx),
00068 edges(cnx)
00069 {}
00070
00071 bool containsNode(GNode N) {
00072 return std::find(nodes.begin(), nodes.end(), N) != nodes.end();
00073 }
00074
00075 void addNode(GNode n) {
00076 return nodes.push_back(n);
00077 }
00078
00079 void addEdge(tmpEdge e) {
00080 return edges.push_back(e);
00081 }
00082 void addEdge(GNode src, GNode dst, const Edge& e) {
00083 return edges.push_back(tmpEdge(src,dst,e));
00084 }
00085
00086 void reset() {
00087 nodes.clear();
00088 edges.clear();
00089 }
00090
00091 typedef nodesTy::iterator iterator;
00092
00093 iterator begin() {
00094 return nodes.begin();
00095 }
00096
00097 iterator end() {
00098 return nodes.end();
00099 }
00100
00101 typedef edgesTy::iterator edge_iterator;
00102
00103 edge_iterator edge_begin() {
00104 return edges.begin();
00105 }
00106
00107 edge_iterator edge_end() {
00108 return edges.end();
00109 }
00110 };