Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

erasable_graph_extender.h

00001 // -*- c++ -*-
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

Generated on Sat Aug 27 14:14:50 2005 for LEMON by  doxygen 1.4.4