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