klao@946: // -*- c++ -*-
klao@946: 
klao@946: #ifndef LEMON_ERASABLE_GRAPH_EXTENDER_H
klao@946: #define LEMON_ERASABLE_GRAPH_EXTENDER_H
klao@946: 
deba@1414: #include <vector>
deba@1414: 
klao@946: #include <lemon/invalid.h>
klao@946: 
klao@946: 
klao@946: namespace lemon {
klao@946: 
klao@946:   template <typename _Base> 
klao@946:   class ErasableGraphExtender : public _Base {
klao@946:   public:
klao@946: 
klao@946:     typedef ErasableGraphExtender Graph;
klao@946:     typedef _Base Parent;
klao@946: 
klao@946:     typedef typename Parent::Node Node;
klao@946:     typedef typename Parent::Edge Edge;
klao@946: 
klao@946:     void erase(const Node& node) {
klao@946:       Edge edge;
klao@946:       Parent::firstOut(edge, node);
klao@946:       while (edge != INVALID ) {
klao@946: 	erase(edge);
klao@946: 	Parent::firstOut(edge, node);
klao@946:       } 
klao@946: 
klao@946:       Parent::firstIn(edge, node);
klao@946:       while (edge != INVALID ) {
klao@946: 	erase(edge);
klao@946: 	Parent::firstIn(edge, node);
klao@946:       }
klao@946: 
deba@1039:       Parent::getNotifier(Node()).erase(node);
klao@946:       Parent::erase(node);
klao@946:     }
klao@946:     
klao@946:     void erase(const Edge& edge) {
deba@1039:       Parent::getNotifier(Edge()).erase(edge);
klao@946:       Parent::erase(edge);
klao@946:     }
klao@946: 
klao@946:   };
klao@946: 
klao@1022:   template <typename _Base> 
klao@1022:   class ErasableUndirGraphExtender : public _Base {
klao@1022:   public:
klao@1022: 
klao@1022:     typedef ErasableUndirGraphExtender Graph;
klao@1022:     typedef _Base Parent;
klao@1022: 
klao@1022:     typedef typename Parent::Node Node;
klao@1022:     typedef typename Parent::UndirEdge UndirEdge;
klao@1022:     typedef typename Parent::Edge Edge;
klao@1022: 
klao@1022:     void erase(const Node& node) {
klao@1022:       Edge edge;
klao@1022:       Parent::firstOut(edge, node);
klao@1022:       while (edge != INVALID ) {
klao@1022: 	erase(edge);
klao@1022: 	Parent::firstOut(edge, node);
klao@1022:       } 
klao@1022: 
deba@1039:       Parent::getNotifier(Node()).erase(node);
klao@1022:       Parent::erase(node);
klao@1022:     }
klao@1022:     
klao@1022:     void erase(const UndirEdge& uedge) {
deba@1414:       std::vector<Edge> edges;
deba@1414:       edges.push_back(Edge(uedge,true));
deba@1414:       edges.push_back(Edge(uedge,false));
deba@1414:       Parent::getNotifier(Edge()).erase(edges);
deba@1039:       Parent::getNotifier(UndirEdge()).erase(uedge);
klao@1022:       Parent::erase(uedge);
klao@1022:     }
klao@1022: 
klao@1022:   };
klao@1022: 
klao@946: }
klao@946: 
klao@946: #endif