klao@946: // -*- c++ -*- klao@946: klao@946: #ifndef LEMON_ERASABLE_GRAPH_EXTENDER_H klao@946: #define LEMON_ERASABLE_GRAPH_EXTENDER_H klao@946: klao@946: #include klao@946: klao@946: klao@946: namespace lemon { klao@946: klao@946: template 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@980: Parent::getObserverRegistry(Node()).erase(node); klao@946: Parent::erase(node); klao@946: } klao@946: klao@946: void erase(const Edge& edge) { deba@980: Parent::getObserverRegistry(Edge()).erase(edge); klao@946: Parent::erase(edge); klao@946: } klao@946: klao@946: }; klao@946: klao@1022: template 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: klao@1022: Parent::getObserverRegistry(Node()).erase(node); klao@1022: Parent::erase(node); klao@1022: } klao@1022: klao@1022: void erase(const UndirEdge& uedge) { klao@1022: Parent::getObserverRegistry(Edge()).erase(Edge(uedge,true)); klao@1022: Parent::getObserverRegistry(Edge()).erase(Edge(uedge,false)); klao@1022: Parent::getObserverRegistry(UndirEdge()).erase(uedge); klao@1022: Parent::erase(uedge); klao@1022: } klao@1022: klao@1022: }; klao@1022: klao@946: } klao@946: klao@946: #endif