extendable_graph_extender.h

00001 /* -*- C++ -*-
00002  *
00003  * This file is a part of LEMON, a generic C++ optimization library
00004  *
00005  * Copyright (C) 2003-2006
00006  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
00007  * (Egervary Research Group on Combinatorial Optimization, EGRES).
00008  *
00009  * Permission to use, modify and distribute this software is granted
00010  * provided that this copyright notice appears in all copies. For
00011  * precise terms see the accompanying LICENSE file.
00012  *
00013  * This software is provided "AS IS" with no warranty of any kind,
00014  * express or implied, and with no claim as to its suitability for any
00015  * purpose.
00016  *
00017  */
00018 
00019 #ifndef LEMON_EXTENDABLE_GRAPH_EXTENDER_H
00020 #define LEMON_EXTENDABLE_GRAPH_EXTENDER_H
00021 
00022 namespace lemon {
00023 
00024   template <typename _Base> 
00025   class ExtendableGraphExtender : public _Base {
00026   public:
00027 
00028     typedef ExtendableGraphExtender Graph;
00029     typedef _Base Parent;
00030 
00031     typedef typename Parent::Node Node;
00032     typedef typename Parent::Edge Edge;
00033 
00034     Node addNode() {
00035       Node node = Parent::addNode();
00036       Parent::getNotifier(Node()).add(node);
00037       return node;
00038     }
00039     
00040     Edge addEdge(const Node& from, const Node& to) {
00041       Edge edge = Parent::addEdge(from, to);
00042       Parent::getNotifier(Edge()).add(edge);
00043       return edge;
00044     }
00045 
00046   };
00047 
00048   template <typename _Base> 
00049   class ExtendableEdgeSetExtender : public _Base {
00050   public:
00051 
00052     typedef ExtendableEdgeSetExtender Graph;
00053     typedef _Base Parent;
00054 
00055     typedef typename Parent::Edge Edge;
00056     typedef typename Parent::Node Node;
00057 
00058     Edge addEdge(const Node& from, const Node& to) {
00059       Edge edge = Parent::addEdge(from, to);
00060       Parent::getNotifier(Edge()).add(edge);
00061       return edge;
00062     }
00063 
00064   };
00065 
00066   template <typename _Base> 
00067   class ExtendableUGraphExtender : public _Base {
00068   public:
00069 
00070     typedef ExtendableUGraphExtender Graph;
00071     typedef _Base Parent;
00072 
00073     typedef typename Parent::Node Node;
00074     typedef typename Parent::Edge Edge;
00075     typedef typename Parent::UEdge UEdge;
00076 
00077     Node addNode() {
00078       Node node = Parent::addNode();
00079       Parent::getNotifier(Node()).add(node);
00080       return node;
00081     }
00082 
00083     UEdge addEdge(const Node& from, const Node& to) {
00084       UEdge uedge = Parent::addEdge(from, to);
00085       Parent::getNotifier(UEdge()).add(uedge);
00086 
00087       std::vector<Edge> edges;
00088       edges.push_back(Parent::direct(uedge, true));
00089       edges.push_back(Parent::direct(uedge, false));
00090       Parent::getNotifier(Edge()).add(edges);
00091 
00092       return uedge;
00093     }
00094 
00095   };
00096 
00097   template <typename _Base> 
00098   class ExtendableUEdgeSetExtender : public _Base {
00099   public:
00100 
00101     typedef ExtendableUEdgeSetExtender Graph;
00102     typedef _Base Parent;
00103 
00104     typedef typename Parent::Node Node;
00105     typedef typename Parent::Edge Edge;
00106     typedef typename Parent::UEdge UEdge;
00107 
00108     UEdge addEdge(const Node& from, const Node& to) {
00109       UEdge uedge = Parent::addEdge(from, to);
00110       Parent::getNotifier(UEdge()).add(uedge);
00111 
00112       std::vector<Edge> edges;
00113       edges.push_back(Parent::direct(uedge, true));
00114       edges.push_back(Parent::direct(uedge, false));
00115       Parent::getNotifier(Edge()).add(edges);
00116 
00117       return uedge;
00118     }
00119 
00120   };
00121 
00122 
00123   template <typename _Base>
00124   class ExtendableBpUGraphExtender : public _Base {
00125   public:
00126 
00127     typedef _Base Parent;
00128     typedef ExtendableBpUGraphExtender Graph;
00129   
00130     typedef typename Parent::Node Node;
00131     typedef typename Parent::BNode BNode;
00132     typedef typename Parent::ANode ANode;
00133     typedef typename Parent::Edge Edge;
00134     typedef typename Parent::UEdge UEdge;
00135   
00136     Node addANode() {
00137       Node node = Parent::addANode();
00138       Parent::getNotifier(ANode()).add(node);
00139       Parent::getNotifier(Node()).add(node);
00140       return node;
00141     }
00142 
00143     Node addBNode() {
00144       Node node = Parent::addBNode();
00145       Parent::getNotifier(BNode()).add(node);
00146       Parent::getNotifier(Node()).add(node);
00147       return node;
00148     }
00149   
00150     UEdge addEdge(const Node& source, const Node& target) {
00151       UEdge uedge = Parent::addEdge(source, target);
00152       Parent::getNotifier(UEdge()).add(uedge);
00153     
00154       std::vector<Edge> edges;
00155       edges.push_back(Parent::direct(uedge, true));
00156       edges.push_back(Parent::direct(uedge, false));
00157       Parent::getNotifier(Edge()).add(edges);
00158     
00159       return uedge;
00160     }
00161 
00162   };
00163 
00164 }
00165 
00166 #endif

Generated on Fri Feb 3 18:35:46 2006 for LEMON by  doxygen 1.4.6