00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef LEMON_EXTENDABLE_GRAPH_EXTENDER_H
00020 #define LEMON_EXTENDABLE_GRAPH_EXTENDER_H
00021
00022 namespace lemon {
00023
00024 template <typename _Base>
00025 class ExtendableGraphExtender : public _Base {
00026 public:
00027
00028 typedef ExtendableGraphExtender Graph;
00029 typedef _Base Parent;
00030
00031 typedef typename Parent::Node Node;
00032 typedef typename Parent::Edge Edge;
00033
00034 Node addNode() {
00035 Node node = Parent::addNode();
00036 Parent::getNotifier(Node()).add(node);
00037 return node;
00038 }
00039
00040 Edge addEdge(const Node& from, const Node& to) {
00041 Edge edge = Parent::addEdge(from, to);
00042 Parent::getNotifier(Edge()).add(edge);
00043 return edge;
00044 }
00045
00046 };
00047
00048 template <typename _Base>
00049 class ExtendableEdgeSetExtender : public _Base {
00050 public:
00051
00052 typedef ExtendableEdgeSetExtender Graph;
00053 typedef _Base Parent;
00054
00055 typedef typename Parent::Edge Edge;
00056 typedef typename Parent::Node Node;
00057
00058 Edge addEdge(const Node& from, const Node& to) {
00059 Edge edge = Parent::addEdge(from, to);
00060 Parent::getNotifier(Edge()).add(edge);
00061 return edge;
00062 }
00063
00064 };
00065
00066 template <typename _Base>
00067 class ExtendableUGraphExtender : public _Base {
00068 public:
00069
00070 typedef ExtendableUGraphExtender Graph;
00071 typedef _Base Parent;
00072
00073 typedef typename Parent::Node Node;
00074 typedef typename Parent::Edge Edge;
00075 typedef typename Parent::UEdge UEdge;
00076
00077 Node addNode() {
00078 Node node = Parent::addNode();
00079 Parent::getNotifier(Node()).add(node);
00080 return node;
00081 }
00082
00083 UEdge addEdge(const Node& from, const Node& to) {
00084 UEdge uedge = Parent::addEdge(from, to);
00085 Parent::getNotifier(UEdge()).add(uedge);
00086
00087 std::vector<Edge> edges;
00088 edges.push_back(Parent::direct(uedge, true));
00089 edges.push_back(Parent::direct(uedge, false));
00090 Parent::getNotifier(Edge()).add(edges);
00091
00092 return uedge;
00093 }
00094
00095 };
00096
00097 template <typename _Base>
00098 class ExtendableUEdgeSetExtender : public _Base {
00099 public:
00100
00101 typedef ExtendableUEdgeSetExtender Graph;
00102 typedef _Base Parent;
00103
00104 typedef typename Parent::Node Node;
00105 typedef typename Parent::Edge Edge;
00106 typedef typename Parent::UEdge UEdge;
00107
00108 UEdge addEdge(const Node& from, const Node& to) {
00109 UEdge uedge = Parent::addEdge(from, to);
00110 Parent::getNotifier(UEdge()).add(uedge);
00111
00112 std::vector<Edge> edges;
00113 edges.push_back(Parent::direct(uedge, true));
00114 edges.push_back(Parent::direct(uedge, false));
00115 Parent::getNotifier(Edge()).add(edges);
00116
00117 return uedge;
00118 }
00119
00120 };
00121
00122
00123 template <typename _Base>
00124 class ExtendableBpUGraphExtender : public _Base {
00125 public:
00126
00127 typedef _Base Parent;
00128 typedef ExtendableBpUGraphExtender Graph;
00129
00130 typedef typename Parent::Node Node;
00131 typedef typename Parent::BNode BNode;
00132 typedef typename Parent::ANode ANode;
00133 typedef typename Parent::Edge Edge;
00134 typedef typename Parent::UEdge UEdge;
00135
00136 Node addANode() {
00137 Node node = Parent::addANode();
00138 Parent::getNotifier(ANode()).add(node);
00139 Parent::getNotifier(Node()).add(node);
00140 return node;
00141 }
00142
00143 Node addBNode() {
00144 Node node = Parent::addBNode();
00145 Parent::getNotifier(BNode()).add(node);
00146 Parent::getNotifier(Node()).add(node);
00147 return node;
00148 }
00149
00150 UEdge addEdge(const Node& source, const Node& target) {
00151 UEdge uedge = Parent::addEdge(source, target);
00152 Parent::getNotifier(UEdge()).add(uedge);
00153
00154 std::vector<Edge> edges;
00155 edges.push_back(Parent::direct(uedge, true));
00156 edges.push_back(Parent::direct(uedge, false));
00157 Parent::getNotifier(Edge()).add(edges);
00158
00159 return uedge;
00160 }
00161
00162 };
00163
00164 }
00165
00166 #endif