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 <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

Generated on Sat Mar 19 10:58:39 2005 for LEMON by  doxygen 1.4.1