00001
00002
00003 #ifndef LEMON_EXTENDABLE_GRAPH_EXTENDER_H
00004 #define LEMON_EXTENDABLE_GRAPH_EXTENDER_H
00005
00006 namespace lemon {
00007
00008 template <typename _Base>
00009 class ExtendableGraphExtender : public _Base {
00010 public:
00011
00012 typedef ExtendableGraphExtender Graph;
00013 typedef _Base Parent;
00014
00015 typedef typename Parent::Node Node;
00016 typedef typename Parent::Edge Edge;
00017
00018 Node addNode() {
00019 Node node = Parent::addNode();
00020 Parent::getNotifier(Node()).add(node);
00021 return node;
00022 }
00023
00024 Edge addEdge(const Node& from, const Node& to) {
00025 Edge edge = Parent::addEdge(from, to);
00026 Parent::getNotifier(Edge()).add(edge);
00027 return edge;
00028 }
00029
00030 };
00031
00032 template <typename _Base>
00033 class ExtendableUndirGraphExtender : public _Base {
00034 public:
00035
00036 typedef ExtendableUndirGraphExtender Graph;
00037 typedef _Base Parent;
00038
00039 typedef typename Parent::Node Node;
00040 typedef typename Parent::Edge Edge;
00041 typedef typename Parent::UndirEdge UndirEdge;
00042
00043 Node addNode() {
00044 Node node = Parent::addNode();
00045 Parent::getNotifier(Node()).add(node);
00046 return node;
00047 }
00048
00049 UndirEdge addEdge(const Node& from, const Node& to) {
00050 UndirEdge uedge = Parent::addEdge(from, to);
00051 Parent::getNotifier(UndirEdge()).add(uedge);
00052
00053 Edge edge_forward(uedge, true);
00054 Edge edge_backward(uedge, false);
00055 Parent::getNotifier(Edge()).add(edge_forward);
00056 Parent::getNotifier(Edge()).add(edge_backward);
00057
00058 return uedge;
00059 }
00060
00061 };
00062
00063 }
00064
00065 #endif