3 #ifndef LEMON_ERASABLE_GRAPH_EXTENDER_H
 
     4 #define LEMON_ERASABLE_GRAPH_EXTENDER_H
 
     8 #include <lemon/invalid.h>
 
    13   template <typename _Base> 
 
    14   class ErasableGraphExtender : public _Base {
 
    17     typedef ErasableGraphExtender Graph;
 
    20     typedef typename Parent::Node Node;
 
    21     typedef typename Parent::Edge Edge;
 
    23     void erase(const Node& node) {
 
    25       Parent::firstOut(edge, node);
 
    26       while (edge != INVALID ) {
 
    28 	Parent::firstOut(edge, node);
 
    31       Parent::firstIn(edge, node);
 
    32       while (edge != INVALID ) {
 
    34 	Parent::firstIn(edge, node);
 
    37       Parent::getNotifier(Node()).erase(node);
 
    41     void erase(const Edge& edge) {
 
    42       Parent::getNotifier(Edge()).erase(edge);
 
    48   template <typename _Base> 
 
    49   class ErasableUndirGraphExtender : public _Base {
 
    52     typedef ErasableUndirGraphExtender Graph;
 
    55     typedef typename Parent::Node Node;
 
    56     typedef typename Parent::UndirEdge UndirEdge;
 
    57     typedef typename Parent::Edge Edge;
 
    59     void erase(const Node& node) {
 
    61       Parent::firstOut(edge, node);
 
    62       while (edge != INVALID ) {
 
    64 	Parent::firstOut(edge, node);
 
    67       Parent::getNotifier(Node()).erase(node);
 
    71     void erase(const UndirEdge& uedge) {
 
    72       std::vector<Edge> edges;
 
    73       edges.push_back(Edge(uedge,true));
 
    74       edges.push_back(Edge(uedge,false));
 
    75       Parent::getNotifier(Edge()).erase(edges);
 
    76       Parent::getNotifier(UndirEdge()).erase(uedge);