00001
00002
00003 #ifndef LEMON_ERASABLE_GRAPH_EXTENDER_H
00004 #define LEMON_ERASABLE_GRAPH_EXTENDER_H
00005
00006 #include <vector>
00007
00008 #include <lemon/invalid.h>
00009
00010
00011 namespace lemon {
00012
00013 template <typename _Base>
00014 class ErasableGraphExtender : public _Base {
00015 public:
00016
00017 typedef ErasableGraphExtender Graph;
00018 typedef _Base Parent;
00019
00020 typedef typename Parent::Node Node;
00021 typedef typename Parent::Edge Edge;
00022
00023 void erase(const Node& node) {
00024 Edge edge;
00025 Parent::firstOut(edge, node);
00026 while (edge != INVALID ) {
00027 erase(edge);
00028 Parent::firstOut(edge, node);
00029 }
00030
00031 Parent::firstIn(edge, node);
00032 while (edge != INVALID ) {
00033 erase(edge);
00034 Parent::firstIn(edge, node);
00035 }
00036
00037 Parent::getNotifier(Node()).erase(node);
00038 Parent::erase(node);
00039 }
00040
00041 void erase(const Edge& edge) {
00042 Parent::getNotifier(Edge()).erase(edge);
00043 Parent::erase(edge);
00044 }
00045
00046 };
00047
00048 template <typename _Base>
00049 class ErasableUndirGraphExtender : public _Base {
00050 public:
00051
00052 typedef ErasableUndirGraphExtender Graph;
00053 typedef _Base Parent;
00054
00055 typedef typename Parent::Node Node;
00056 typedef typename Parent::UndirEdge UndirEdge;
00057 typedef typename Parent::Edge Edge;
00058
00059 void erase(const Node& node) {
00060 Edge edge;
00061 Parent::firstOut(edge, node);
00062 while (edge != INVALID ) {
00063 erase(edge);
00064 Parent::firstOut(edge, node);
00065 }
00066
00067 Parent::getNotifier(Node()).erase(node);
00068 Parent::erase(node);
00069 }
00070
00071 void erase(const UndirEdge& uedge) {
00072 std::vector<Edge> edges;
00073 edges.push_back(Parent::direct(uedge,true));
00074 edges.push_back(Parent::direct(uedge,false));
00075 Parent::getNotifier(Edge()).erase(edges);
00076 Parent::getNotifier(UndirEdge()).erase(uedge);
00077 Parent::erase(uedge);
00078 }
00079
00080 };
00081
00082 }
00083
00084 #endif