COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/hugo/list_graph.h @ 722:be8712e1fe07

Last change on this file since 722:be8712e1fe07 was 722:be8712e1fe07, checked in by Alpar Juttner, 20 years ago

For the sake of icc.

File size: 46.5 KB
RevLine 
[395]1// -*- mode:C++ -*-
2
[405]3#ifndef HUGO_LIST_GRAPH_H
4#define HUGO_LIST_GRAPH_H
[395]5
[491]6///\ingroup graphs
[395]7///\file
[405]8///\brief ListGraph, SymListGraph, NodeSet and EdgeSet classes.
[395]9
10#include <vector>
11#include <limits.h>
12
[542]13#include <hugo/invalid.h>
[395]14
15namespace hugo {
16
[406]17/// \addtogroup graphs
18/// @{
19
[397]20  class SymListGraph;
[395]21
[401]22  ///A list graph class.
[395]23
[397]24  ///This is a simple and fast erasable graph implementation.
25  ///
[395]26  ///It conforms to the graph interface documented under
27  ///the description of \ref GraphSkeleton.
28  ///\sa \ref GraphSkeleton.
[397]29  class ListGraph {
[395]30
[397]31    //Nodes are double linked.
32    //The free nodes are only single linked using the "next" field.
[395]33    struct NodeT
34    {
[397]35      int first_in,first_out;
36      int prev, next;
37      //      NodeT() {}
[395]38    };
[397]39    //Edges are double linked.
40    //The free edges are only single linked using the "next_in" field.
[395]41    struct EdgeT
42    {
[397]43      int head, tail;
44      int prev_in, prev_out;
45      int next_in, next_out;
[395]46      //FIXME: is this necessary?
[397]47      //      EdgeT() : next_in(-1), next_out(-1) prev_in(-1), prev_out(-1) {} 
[395]48    };
49
50    std::vector<NodeT> nodes;
[397]51    //The first node
52    int first_node;
53    //The first free node
54    int first_free_node;
[395]55    std::vector<EdgeT> edges;
[397]56    //The first free edge
57    int first_free_edge;
[395]58   
[397]59  protected:
[395]60   
61    template <typename Key> class DynMapBase
62    {
63    protected:
[397]64      const ListGraph* G;
[395]65    public:
[515]66      virtual void add(const Key k) = 0;
67      virtual void erase(const Key k) = 0;
[397]68      DynMapBase(const ListGraph &_G) : G(&_G) {}
[395]69      virtual ~DynMapBase() {}
[397]70      friend class ListGraph;
[395]71    };
72   
73  public:
74    template <typename T> class EdgeMap;
[400]75    template <typename T> class NodeMap;
[397]76   
[395]77    class Node;
78    class Edge;
79
80    //  protected:
81    // HELPME:
82  protected:
83    ///\bug It must be public because of SymEdgeMap.
84    ///
85    mutable std::vector<DynMapBase<Node> * > dyn_node_maps;
86    ///\bug It must be public because of SymEdgeMap.
87    ///
88    mutable std::vector<DynMapBase<Edge> * > dyn_edge_maps;
89   
90  public:
91
92    class NodeIt;
93    class EdgeIt;
94    class OutEdgeIt;
95    class InEdgeIt;
96   
97  public:
98
[397]99    ListGraph() : nodes(), first_node(-1),
100                  first_free_node(-1), edges(), first_free_edge(-1) {}
101    ListGraph(const ListGraph &_g) : nodes(_g.nodes), first_node(_g.first_node),
102                                     first_free_node(_g.first_free_node),
103                                     edges(_g.edges),
104                                     first_free_edge(_g.first_free_edge) {}
[395]105   
[397]106    ~ListGraph()
[395]107    {
108      for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
109          i!=dyn_node_maps.end(); ++i) (**i).G=NULL;
110      for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
111          i!=dyn_edge_maps.end(); ++i) (**i).G=NULL;
112    }
113
114    int nodeNum() const { return nodes.size(); }  //FIXME: What is this?
115    int edgeNum() const { return edges.size(); }  //FIXME: What is this?
116
[695]117    ///Set the expected number of edges
118
119    ///With this function, it is possible to set the expected number of edges.
120    ///The use of this fasten the building of the graph and makes
121    ///it possible to avoid the superfluous memory allocation.
122    void reserveEdge(int n) { edges.reserve(n); };
123   
[395]124    ///\bug This function does something different than
125    ///its name would suggests...
126    int maxNodeId() const { return nodes.size(); }  //FIXME: What is this?
127    ///\bug This function does something different than
128    ///its name would suggests...
129    int maxEdgeId() const { return edges.size(); }  //FIXME: What is this?
130
131    Node tail(Edge e) const { return edges[e.n].tail; }
132    Node head(Edge e) const { return edges[e.n].head; }
133
134    Node aNode(OutEdgeIt e) const { return edges[e.n].tail; }
135    Node aNode(InEdgeIt e) const { return edges[e.n].head; }
136
137    Node bNode(OutEdgeIt e) const { return edges[e.n].head; }
138    Node bNode(InEdgeIt e) const { return edges[e.n].tail; }
139
[713]140    NodeIt& first(NodeIt& v) const {
[395]141      v=NodeIt(*this); return v; }
[713]142    EdgeIt& first(EdgeIt& e) const {
[395]143      e=EdgeIt(*this); return e; }
[713]144    OutEdgeIt& first(OutEdgeIt& e, const Node v) const {
[395]145      e=OutEdgeIt(*this,v); return e; }
[713]146    InEdgeIt& first(InEdgeIt& e, const Node v) const {
[395]147      e=InEdgeIt(*this,v); return e; }
148
149//     template< typename It >
150//     It first() const { It e; first(e); return e; }
151
152//     template< typename It >
153//     It first(Node v) const { It e; first(e,v); return e; }
154
[713]155    static bool valid(Edge e) { return e.n!=-1; }
156    static bool valid(Node n) { return n.n!=-1; }
[395]157   
[710]158    static void setInvalid(Edge &e) { e.n=-1; }
159    static void setInvalid(Node &n) { n.n=-1; }
[395]160   
[713]161    template <typename It> static It getNext(It it)
[395]162    { It tmp(it); return next(tmp); }
163
164    NodeIt& next(NodeIt& it) const {
[397]165      it.n=nodes[it.n].next;
[395]166      return it;
167    }
168    OutEdgeIt& next(OutEdgeIt& it) const
169    { it.n=edges[it.n].next_out; return it; }
170    InEdgeIt& next(InEdgeIt& it) const
171    { it.n=edges[it.n].next_in; return it; }
[397]172    EdgeIt& next(EdgeIt& it) const {
173      if(edges[it.n].next_in!=-1) {
174        it.n=edges[it.n].next_in;
175      }
176      else {
177        int n;
178        for(n=nodes[edges[it.n].head].next;
179            n!=-1 && nodes[n].first_in == -1;
180            n = nodes[n].next) ;
181        it.n = (n==-1)?-1:nodes[n].first_in;
182      }
183      return it;
184    }
[395]185
[713]186    static int id(Node v) { return v.n; }
187    static int id(Edge e) { return e.n; }
[395]188
[397]189    /// Adds a new node to the graph.
190
191    /// \todo It adds the nodes in a reversed order.
192    /// (i.e. the lastly added node becomes the first.)
[395]193    Node addNode() {
[397]194      int n;
195     
196      if(first_free_node==-1)
197        {
198          n = nodes.size();
199          nodes.push_back(NodeT());
200        }
201      else {
202        n = first_free_node;
203        first_free_node = nodes[n].next;
204      }
205     
206      nodes[n].next = first_node;
207      if(first_node != -1) nodes[first_node].prev = n;
208      first_node = n;
209      nodes[n].prev = -1;
210     
211      nodes[n].first_in = nodes[n].first_out = -1;
212     
213      Node nn; nn.n=n;
[395]214
[397]215      //Update dynamic maps
[395]216      for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
[397]217          i!=dyn_node_maps.end(); ++i) (**i).add(nn);
[395]218
[397]219      return nn;
[395]220    }
221   
222    Edge addEdge(Node u, Node v) {
[397]223      int n;
224     
225      if(first_free_edge==-1)
226        {
227          n = edges.size();
228          edges.push_back(EdgeT());
229        }
230      else {
231        n = first_free_edge;
232        first_free_edge = edges[n].next_in;
233      }
234     
235      edges[n].tail = u.n; edges[n].head = v.n;
[395]236
[397]237      edges[n].next_out = nodes[u.n].first_out;
238      if(nodes[u.n].first_out != -1) edges[nodes[u.n].first_out].prev_out = n;
239      edges[n].next_in = nodes[v.n].first_in;
240      if(nodes[v.n].first_in != -1) edges[nodes[v.n].first_in].prev_in = n;
241      edges[n].prev_in = edges[n].prev_out = -1;
242       
243      nodes[u.n].first_out = nodes[v.n].first_in = n;
244
245      Edge e; e.n=n;
246
247      //Update dynamic maps
[395]248      for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
249          i!=dyn_edge_maps.end(); ++i) (**i).add(e);
250
251      return e;
252    }
253
[397]254  private:
255    void eraseEdge(int n) {
256     
257      if(edges[n].next_in!=-1)
258        edges[edges[n].next_in].prev_in = edges[n].prev_in;
259      if(edges[n].prev_in!=-1)
260        edges[edges[n].prev_in].next_in = edges[n].next_in;
261      else nodes[edges[n].head].first_in = edges[n].next_in;
262     
263      if(edges[n].next_out!=-1)
264        edges[edges[n].next_out].prev_out = edges[n].prev_out;
265      if(edges[n].prev_out!=-1)
266        edges[edges[n].prev_out].next_out = edges[n].next_out;
267      else nodes[edges[n].tail].first_out = edges[n].next_out;
268     
269      edges[n].next_in = first_free_edge;
[695]270      first_free_edge = n;     
[397]271
272      //Update dynamic maps
273      Edge e; e.n=n;
274      for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
275          i!=dyn_edge_maps.end(); ++i) (**i).erase(e);
276    }
277     
278  public:
279
280    void erase(Node nn) {
281      int n=nn.n;
282     
283      int m;
284      while((m=nodes[n].first_in)!=-1) eraseEdge(m);
285      while((m=nodes[n].first_out)!=-1) eraseEdge(m);
286
287      if(nodes[n].next != -1) nodes[nodes[n].next].prev = nodes[n].prev;
288      if(nodes[n].prev != -1) nodes[nodes[n].prev].next = nodes[n].next;
289      else first_node = nodes[n].next;
290     
291      nodes[n].next = first_free_node;
292      first_free_node = n;
293
294      //Update dynamic maps
295      for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
296          i!=dyn_node_maps.end(); ++i) (**i).erase(nn);
297    }
298   
299    void erase(Edge e) { eraseEdge(e.n); }
300
301    ///\bug Dynamic maps must be updated!
302    ///
303    void clear() {
304      nodes.clear();edges.clear();
305      first_node=first_free_node=first_free_edge=-1;
306    }
[395]307
308    class Node {
[397]309      friend class ListGraph;
[395]310      template <typename T> friend class NodeMap;
[400]311       
[395]312      friend class Edge;
313      friend class OutEdgeIt;
314      friend class InEdgeIt;
315      friend class SymEdge;
316
317    protected:
318      int n;
[722]319      friend int ListGraph::id(Node v);
[395]320      Node(int nn) {n=nn;}
321    public:
322      Node() {}
[503]323      Node (Invalid) { n=-1; }
[395]324      bool operator==(const Node i) const {return n==i.n;}
325      bool operator!=(const Node i) const {return n!=i.n;}
326      bool operator<(const Node i) const {return n<i.n;}
327    };
328   
329    class NodeIt : public Node {
[397]330      friend class ListGraph;
[395]331    public:
[400]332      NodeIt() : Node() { }
333      NodeIt(Invalid i) : Node(i) { }
[397]334      NodeIt(const ListGraph& G) : Node(G.first_node) { }
[579]335      ///\todo Undocumented conversion Node -\> NodeIt.
336      NodeIt(const ListGraph& G, const Node &n) : Node(n) { }
[395]337    };
338
339    class Edge {
[397]340      friend class ListGraph;
[395]341      template <typename T> friend class EdgeMap;
342
[397]343      //template <typename T> friend class SymListGraph::SymEdgeMap;     
344      //friend Edge SymListGraph::opposite(Edge) const;
[395]345     
346      friend class Node;
347      friend class NodeIt;
348    protected:
349      int n;
[722]350      friend int ListGraph::id(Edge e);
[395]351
[706]352    public:
353      /// An Edge with id \c n.
354
355      /// \bug It should be
356      /// obtained by a member function of the Graph.
[395]357      Edge(int nn) {n=nn;}
[706]358
[395]359      Edge() { }
360      Edge (Invalid) { n=-1; }
361      bool operator==(const Edge i) const {return n==i.n;}
362      bool operator!=(const Edge i) const {return n!=i.n;}
363      bool operator<(const Edge i) const {return n<i.n;}
364      ///\bug This is a workaround until somebody tells me how to
[397]365      ///make class \c SymListGraph::SymEdgeMap friend of Edge
[395]366      int &idref() {return n;}
367      const int &idref() const {return n;}
368    };
369   
370    class EdgeIt : public Edge {
[397]371      friend class ListGraph;
[395]372    public:
[397]373      EdgeIt(const ListGraph& G) : Edge() {
374        int m;
375        for(m=G.first_node;
376            m!=-1 && G.nodes[m].first_in == -1; m = G.nodes[m].next);
377        n = (m==-1)?-1:G.nodes[m].first_in;
378      }
[395]379      EdgeIt (Invalid i) : Edge(i) { }
380      EdgeIt() : Edge() { }
381      ///\bug This is a workaround until somebody tells me how to
[397]382      ///make class \c SymListGraph::SymEdgeMap friend of Edge
[395]383      int &idref() {return n;}
384    };
385   
386    class OutEdgeIt : public Edge {
[397]387      friend class ListGraph;
[395]388    public:
389      OutEdgeIt() : Edge() { }
390      OutEdgeIt (Invalid i) : Edge(i) { }
391
[397]392      OutEdgeIt(const ListGraph& G,const Node v)
[395]393        : Edge(G.nodes[v.n].first_out) {}
394    };
395   
396    class InEdgeIt : public Edge {
[397]397      friend class ListGraph;
[395]398    public:
399      InEdgeIt() : Edge() { }
400      InEdgeIt (Invalid i) : Edge(i) { }
[681]401      InEdgeIt(const ListGraph& G,Node v) :Edge(G.nodes[v.n].first_in) {}
[395]402    };
403
404    template <typename T> class NodeMap : public DynMapBase<Node>
405    {
406      std::vector<T> container;
407
408    public:
409      typedef T ValueType;
410      typedef Node KeyType;
411
[397]412      NodeMap(const ListGraph &_G) :
[395]413        DynMapBase<Node>(_G), container(_G.maxNodeId())
414      {
415        G->dyn_node_maps.push_back(this);
416      }
[397]417      NodeMap(const ListGraph &_G,const T &t) :
[395]418        DynMapBase<Node>(_G), container(_G.maxNodeId(),t)
419      {
420        G->dyn_node_maps.push_back(this);
421      }
422     
423      NodeMap(const NodeMap<T> &m) :
424        DynMapBase<Node>(*m.G), container(m.container)
425      {
426        G->dyn_node_maps.push_back(this);
427      }
428
429      template<typename TT> friend class NodeMap;
430 
431      ///\todo It can copy between different types.
432      ///
433      template<typename TT> NodeMap(const NodeMap<TT> &m) :
[590]434        DynMapBase<Node>(*m.G), container(m.container.size())
435
[395]436      {
437        G->dyn_node_maps.push_back(this);
438        typename std::vector<TT>::const_iterator i;
439        for(typename std::vector<TT>::const_iterator i=m.container.begin();
440            i!=m.container.end();
441            i++)
442          container.push_back(*i);
443      }
444      ~NodeMap()
445      {
446        if(G) {
447          std::vector<DynMapBase<Node>* >::iterator i;
448          for(i=G->dyn_node_maps.begin();
449              i!=G->dyn_node_maps.end() && *i!=this; ++i) ;
450          //if(*i==this) G->dyn_node_maps.erase(i); //FIXME: Way too slow...
451          //A better way to do that: (Is this really important?)
452          if(*i==this) {
453            *i=G->dyn_node_maps.back();
454            G->dyn_node_maps.pop_back();
455          }
456        }
457      }
458
459      void add(const Node k)
460      {
461        if(k.n>=int(container.size())) container.resize(k.n+1);
462      }
463
464      void erase(const Node) { }
465     
466      void set(Node n, T a) { container[n.n]=a; }
467      //'T& operator[](Node n)' would be wrong here
468      typename std::vector<T>::reference
469      operator[](Node n) { return container[n.n]; }
470      //'const T& operator[](Node n)' would be wrong here
471      typename std::vector<T>::const_reference
472      operator[](Node n) const { return container[n.n]; }
473
474      ///\warning There is no safety check at all!
475      ///Using operator = between maps attached to different graph may
476      ///cause serious problem.
477      ///\todo Is this really so?
478      ///\todo It can copy between different types.
479      const NodeMap<T>& operator=(const NodeMap<T> &m)
480      {
481        container = m.container;
482        return *this;
483      }
484      template<typename TT>
485      const NodeMap<T>& operator=(const NodeMap<TT> &m)
486      {
[531]487        std::copy(m.container.begin(), m.container.end(), container.begin());
[395]488        return *this;
489      }
490     
491      void update() {}    //Useless for Dynamic Maps
492      void update(T a) {}  //Useless for Dynamic Maps
493    };
494   
495    template <typename T> class EdgeMap : public DynMapBase<Edge>
496    {
[579]497    protected:
[395]498      std::vector<T> container;
499
500    public:
501      typedef T ValueType;
502      typedef Edge KeyType;
503
[397]504      EdgeMap(const ListGraph &_G) :
[395]505        DynMapBase<Edge>(_G), container(_G.maxEdgeId())
506      {
507        //FIXME: What if there are empty Id's?
508        //FIXME: Can I use 'this' in a constructor?
509        G->dyn_edge_maps.push_back(this);
510      }
[397]511      EdgeMap(const ListGraph &_G,const T &t) :
[395]512        DynMapBase<Edge>(_G), container(_G.maxEdgeId(),t)
513      {
514        G->dyn_edge_maps.push_back(this);
515      }
516      EdgeMap(const EdgeMap<T> &m) :
517        DynMapBase<Edge>(*m.G), container(m.container)
518      {
[503]519        G->dyn_edge_maps.push_back(this);
[395]520      }
521
522      template<typename TT> friend class EdgeMap;
523
524      ///\todo It can copy between different types.
525      ///
526      template<typename TT> EdgeMap(const EdgeMap<TT> &m) :
[590]527        DynMapBase<Edge>(*m.G), container(m.container.size())
[395]528      {
[503]529        G->dyn_edge_maps.push_back(this);
[395]530        typename std::vector<TT>::const_iterator i;
531        for(typename std::vector<TT>::const_iterator i=m.container.begin();
532            i!=m.container.end();
533            i++)
534          container.push_back(*i);
535      }
536      ~EdgeMap()
537      {
538        if(G) {
539          std::vector<DynMapBase<Edge>* >::iterator i;
540          for(i=G->dyn_edge_maps.begin();
541              i!=G->dyn_edge_maps.end() && *i!=this; ++i) ;
542          //if(*i==this) G->dyn_edge_maps.erase(i); //Way too slow...
543          //A better way to do that: (Is this really important?)
544          if(*i==this) {
545            *i=G->dyn_edge_maps.back();
546            G->dyn_edge_maps.pop_back();
547          }
548        }
549      }
550     
551      void add(const Edge k)
552      {
553        if(k.n>=int(container.size())) container.resize(k.n+1);
554      }
555      void erase(const Edge) { }
556     
557      void set(Edge n, T a) { container[n.n]=a; }
558      //T get(Edge n) const { return container[n.n]; }
559      typename std::vector<T>::reference
560      operator[](Edge n) { return container[n.n]; }
561      typename std::vector<T>::const_reference
562      operator[](Edge n) const { return container[n.n]; }
563
564      ///\warning There is no safety check at all!
565      ///Using operator = between maps attached to different graph may
566      ///cause serious problem.
567      ///\todo Is this really so?
568      ///\todo It can copy between different types.
569      const EdgeMap<T>& operator=(const EdgeMap<T> &m)
570      {
571        container = m.container;
572        return *this;
573      }
574      template<typename TT>
575      const EdgeMap<T>& operator=(const EdgeMap<TT> &m)
576      {
[531]577        std::copy(m.container.begin(), m.container.end(), container.begin());
[395]578        return *this;
579      }
580     
581      void update() {}    //Useless for DynMaps
582      void update(T a) {}  //Useless for DynMaps
583    };
584
585  };
586
587  ///Graph for bidirectional edges.
588
589  ///The purpose of this graph structure is to handle graphs
590  ///having bidirectional edges. Here the function \c addEdge(u,v) adds a pair
591  ///of oppositely directed edges.
592  ///There is a new edge map type called
[397]593  ///\ref SymListGraph::SymEdgeMap "SymEdgeMap"
[395]594  ///that complements this
595  ///feature by
596  ///storing shared values for the edge pairs. The usual
597  ///\ref GraphSkeleton::EdgeMap "EdgeMap"
598  ///can be used
599  ///as well.
600  ///
601  ///The oppositely directed edge can also be obtained easily
602  ///using \ref opposite.
[397]603  ///
604  ///Here erase(Edge) deletes a pair of edges.
605  ///
606  ///\todo this date structure need some reconsiderations. Maybe it
607  ///should be implemented independently from ListGraph.
[395]608
[397]609  class SymListGraph : public ListGraph
[395]610  {
611  public:
612    template<typename T> class SymEdgeMap;
613    template<typename T> friend class SymEdgeMap;
614
[397]615    SymListGraph() : ListGraph() { }
616    SymListGraph(const ListGraph &_g) : ListGraph(_g) { }
617    ///Adds a pair of oppositely directed edges to the graph.
[395]618    Edge addEdge(Node u, Node v)
619    {
[397]620      Edge e = ListGraph::addEdge(u,v);
621      ListGraph::addEdge(v,u);
[395]622      return e;
623    }
624
[397]625    void erase(Node n) { ListGraph::erase(n); }
[395]626    ///The oppositely directed edge.
627
628    ///Returns the oppositely directed
629    ///pair of the edge \c e.
[713]630    static Edge opposite(Edge e)
[395]631    {
632      Edge f;
633      f.idref() = e.idref() - 2*(e.idref()%2) + 1;
634      return f;
635    }
636   
[397]637    ///Removes a pair of oppositely directed edges to the graph.
638    void erase(Edge e) {
639      ListGraph::erase(opposite(e));
640      ListGraph::erase(e);
641    }
642   
[395]643    ///Common data storage for the edge pairs.
644
645    ///This map makes it possible to store data shared by the oppositely
646    ///directed pairs of edges.
647    template <typename T> class SymEdgeMap : public DynMapBase<Edge>
648    {
649      std::vector<T> container;
650     
651    public:
652      typedef T ValueType;
653      typedef Edge KeyType;
654
[397]655      SymEdgeMap(const SymListGraph &_G) :
[395]656        DynMapBase<Edge>(_G), container(_G.maxEdgeId()/2)
657      {
[397]658        static_cast<const SymListGraph*>(G)->dyn_edge_maps.push_back(this);
[395]659      }
[397]660      SymEdgeMap(const SymListGraph &_G,const T &t) :
[395]661        DynMapBase<Edge>(_G), container(_G.maxEdgeId()/2,t)
662      {
663        G->dyn_edge_maps.push_back(this);
664      }
665
666      SymEdgeMap(const SymEdgeMap<T> &m) :
667        DynMapBase<SymEdge>(*m.G), container(m.container)
668      {
669        G->dyn_node_maps.push_back(this);
670      }
671
672      //      template<typename TT> friend class SymEdgeMap;
673
674      ///\todo It can copy between different types.
675      ///
676
677      template<typename TT> SymEdgeMap(const SymEdgeMap<TT> &m) :
[590]678        DynMapBase<SymEdge>(*m.G), container(m.container.size())
[395]679      {
680        G->dyn_node_maps.push_back(this);
681        typename std::vector<TT>::const_iterator i;
682        for(typename std::vector<TT>::const_iterator i=m.container.begin();
683            i!=m.container.end();
684            i++)
685          container.push_back(*i);
686      }
687 
688      ~SymEdgeMap()
689      {
690        if(G) {
691          std::vector<DynMapBase<Edge>* >::iterator i;
[397]692          for(i=static_cast<const SymListGraph*>(G)->dyn_edge_maps.begin();
693              i!=static_cast<const SymListGraph*>(G)->dyn_edge_maps.end()
[395]694                && *i!=this; ++i) ;
695          //if(*i==this) G->dyn_edge_maps.erase(i); //Way too slow...
696          //A better way to do that: (Is this really important?)
697          if(*i==this) {
[397]698            *i=static_cast<const SymListGraph*>(G)->dyn_edge_maps.back();
699            static_cast<const SymListGraph*>(G)->dyn_edge_maps.pop_back();
[395]700          }
701        }
702      }
703     
704      void add(const Edge k)
705      {
706        if(!k.idref()%2&&k.idref()/2>=int(container.size()))
707          container.resize(k.idref()/2+1);
708      }
709      void erase(const Edge k) { }
710     
711      void set(Edge n, T a) { container[n.idref()/2]=a; }
712      //T get(Edge n) const { return container[n.idref()/2]; }
713      typename std::vector<T>::reference
714      operator[](Edge n) { return container[n.idref()/2]; }
715      typename std::vector<T>::const_reference
716      operator[](Edge n) const { return container[n.idref()/2]; }
717
718      ///\warning There is no safety check at all!
719      ///Using operator = between maps attached to different graph may
720      ///cause serious problem.
721      ///\todo Is this really so?
722      ///\todo It can copy between different types.
723      const SymEdgeMap<T>& operator=(const SymEdgeMap<T> &m)
724      {
725        container = m.container;
726        return *this;
727      }
728      template<typename TT>
729      const SymEdgeMap<T>& operator=(const SymEdgeMap<TT> &m)
730      {
[531]731        std::copy(m.container.begin(), m.container.end(), container.begin());
[395]732        return *this;
733      }
734     
735      void update() {}    //Useless for DynMaps
736      void update(T a) {}  //Useless for DynMaps
737
738    };
739
740  };
741 
[400]742
[401]743  ///A graph class containing only nodes.
[400]744
[401]745  ///This class implements a graph structure without edges.
746  ///The most useful application of this class is to be the node set of an
747  ///\ref EdgeSet class.
[400]748  ///
749  ///It conforms to the graph interface documented under
[401]750  ///the description of \ref GraphSkeleton with the exception that you cannot
751  ///add (or delete) edges. The usual edge iterators are exists, but they are
752  ///always \ref INVALID.
753  ///\sa \ref GraphSkeleton
[508]754  ///\sa \ref EdgeSet
[400]755  class NodeSet {
756
757    //Nodes are double linked.
758    //The free nodes are only single linked using the "next" field.
759    struct NodeT
760    {
761      int first_in,first_out;
762      int prev, next;
763      //      NodeT() {}
764    };
765
766    std::vector<NodeT> nodes;
767    //The first node
768    int first_node;
769    //The first free node
770    int first_free_node;
771   
772  protected:
773   
774    template <typename Key> class DynMapBase
775    {
776    protected:
777      const NodeSet* G;
778    public:
[515]779      virtual void add(const Key k) = 0;
780      virtual void erase(const Key k) = 0;
[400]781      DynMapBase(const NodeSet &_G) : G(&_G) {}
782      virtual ~DynMapBase() {}
783      friend class NodeSet;
784    };
785   
786  public:
787    template <typename T> class EdgeMap;
788    template <typename T> class NodeMap;
789   
790    class Node;
791    class Edge;
792
793    //  protected:
794    // HELPME:
795  protected:
796    ///\bug It must be public because of SymEdgeMap.
797    ///
798    mutable std::vector<DynMapBase<Node> * > dyn_node_maps;
799    //mutable std::vector<DynMapBase<Edge> * > dyn_edge_maps;
800   
801  public:
802
803    class NodeIt;
804    class EdgeIt;
805    class OutEdgeIt;
806    class InEdgeIt;
807   
808    template <typename T> class NodeMap;
809    template <typename T> class EdgeMap;
810   
811  public:
812
[408]813    ///Default constructor
[400]814    NodeSet() : nodes(), first_node(-1),
815                  first_free_node(-1) {}
[408]816    ///Copy constructor
[400]817    NodeSet(const NodeSet &_g) : nodes(_g.nodes), first_node(_g.first_node),
818                                     first_free_node(_g.first_free_node) {}
819   
820    ~NodeSet()
821    {
822      for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
823          i!=dyn_node_maps.end(); ++i) (**i).G=NULL;
824      //for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
825      //          i!=dyn_edge_maps.end(); ++i) (**i).G=NULL;
826    }
827
828    int nodeNum() const { return nodes.size(); }  //FIXME: What is this?
829    int edgeNum() const { return 0; }  //FIXME: What is this?
830
831    ///\bug This function does something different than
832    ///its name would suggests...
833    int maxNodeId() const { return nodes.size(); }  //FIXME: What is this?
834    ///\bug This function does something different than
835    ///its name would suggests...
836    int maxEdgeId() const { return 0; }  //FIXME: What is this?
837
838    Node tail(Edge e) const { return INVALID; }
839    Node head(Edge e) const { return INVALID; }
840
841    Node aNode(OutEdgeIt e) const { return INVALID; }
842    Node aNode(InEdgeIt e) const { return INVALID; }
843
844    Node bNode(OutEdgeIt e) const { return INVALID; }
845    Node bNode(InEdgeIt e) const { return INVALID; }
846
847    NodeIt& first(NodeIt& v) const {
848      v=NodeIt(*this); return v; }
849    EdgeIt& first(EdgeIt& e) const {
850      e=EdgeIt(*this); return e; }
851    OutEdgeIt& first(OutEdgeIt& e, const Node v) const {
852      e=OutEdgeIt(*this,v); return e; }
853    InEdgeIt& first(InEdgeIt& e, const Node v) const {
854      e=InEdgeIt(*this,v); return e; }
855
856//     template< typename It >
857//     It first() const { It e; first(e); return e; }
858
859//     template< typename It >
860//     It first(Node v) const { It e; first(e,v); return e; }
861
862    bool valid(Edge e) const { return false; }
863    bool valid(Node n) const { return n.n!=-1; }
864   
865    void setInvalid(Edge &e) { }
866    void setInvalid(Node &n) { n.n=-1; }
867   
868    template <typename It> It getNext(It it) const
869    { It tmp(it); return next(tmp); }
870
871    NodeIt& next(NodeIt& it) const {
872      it.n=nodes[it.n].next;
873      return it;
874    }
875    OutEdgeIt& next(OutEdgeIt& it) const { return it; }
876    InEdgeIt& next(InEdgeIt& it) const { return it; }
877    EdgeIt& next(EdgeIt& it) const { return it; }
878
879    int id(Node v) const { return v.n; }
880    int id(Edge e) const { return -1; }
881
882    /// Adds a new node to the graph.
883
884    /// \todo It adds the nodes in a reversed order.
885    /// (i.e. the lastly added node becomes the first.)
886    Node addNode() {
887      int n;
888     
889      if(first_free_node==-1)
890        {
891          n = nodes.size();
892          nodes.push_back(NodeT());
893        }
894      else {
895        n = first_free_node;
896        first_free_node = nodes[n].next;
897      }
898     
899      nodes[n].next = first_node;
900      if(first_node != -1) nodes[first_node].prev = n;
901      first_node = n;
902      nodes[n].prev = -1;
903     
904      nodes[n].first_in = nodes[n].first_out = -1;
905     
906      Node nn; nn.n=n;
907
908      //Update dynamic maps
909      for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
910          i!=dyn_node_maps.end(); ++i) (**i).add(nn);
911
912      return nn;
913    }
914   
915    void erase(Node nn) {
916      int n=nn.n;
917     
918      if(nodes[n].next != -1) nodes[nodes[n].next].prev = nodes[n].prev;
919      if(nodes[n].prev != -1) nodes[nodes[n].prev].next = nodes[n].next;
920      else first_node = nodes[n].next;
921     
922      nodes[n].next = first_free_node;
923      first_free_node = n;
924
925      //Update dynamic maps
926      for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
927          i!=dyn_node_maps.end(); ++i) (**i).erase(nn);
928    }
929   
930    ///\bug Dynamic maps must be updated!
931    ///
932    void clear() {
933      nodes.clear();
934      first_node = first_free_node = -1;
935    }
936
937    class Node {
938      friend class NodeSet;
939      template <typename T> friend class NodeMap;
940     
941      friend class Edge;
942      friend class OutEdgeIt;
943      friend class InEdgeIt;
944
945    protected:
946      int n;
947      friend int NodeSet::id(Node v) const;
948      Node(int nn) {n=nn;}
949    public:
950      Node() {}
951      Node (Invalid i) { n=-1; }
952      bool operator==(const Node i) const {return n==i.n;}
953      bool operator!=(const Node i) const {return n!=i.n;}
954      bool operator<(const Node i) const {return n<i.n;}
955    };
956   
957    class NodeIt : public Node {
958      friend class NodeSet;
959    public:
[579]960      NodeIt() : Node() { }
961      NodeIt(Invalid i) : Node(i) { }
[400]962      NodeIt(const NodeSet& G) : Node(G.first_node) { }
[579]963      ///\todo Undocumented conversion Node -\> NodeIt.
964      NodeIt(const NodeSet& G, const Node &n) : Node(n) { }
965
[400]966    };
967
968    class Edge {
969      //friend class NodeSet;
970      //template <typename T> friend class EdgeMap;
971
972      //template <typename T> friend class SymNodeSet::SymEdgeMap;     
973      //friend Edge SymNodeSet::opposite(Edge) const;
974     
975      //      friend class Node;
976      //      friend class NodeIt;
977    protected:
978      //friend int NodeSet::id(Edge e) const;
979      //      Edge(int nn) {}
980    public:
981      Edge() { }
982      Edge (Invalid) { }
983      bool operator==(const Edge i) const {return true;}
984      bool operator!=(const Edge i) const {return false;}
985      bool operator<(const Edge i) const {return false;}
986      ///\bug This is a workaround until somebody tells me how to
987      ///make class \c SymNodeSet::SymEdgeMap friend of Edge
988      //      int idref() {return -1;}
989      //      int idref() const {return -1;}
990    };
991   
992    class EdgeIt : public Edge {
993      //friend class NodeSet;
994    public:
995      EdgeIt(const NodeSet& G) : Edge() { }
996      EdgeIt (Invalid i) : Edge(i) { }
997      EdgeIt() : Edge() { }
998      ///\bug This is a workaround until somebody tells me how to
999      ///make class \c SymNodeSet::SymEdgeMap friend of Edge
1000      //      int idref() {return -1;}
1001    };
1002   
1003    class OutEdgeIt : public Edge {
1004      friend class NodeSet;
1005    public:
1006      OutEdgeIt() : Edge() { }
1007      OutEdgeIt (Invalid i) : Edge(i) { }
1008      OutEdgeIt(const NodeSet& G,const Node v)  : Edge() {}
1009    };
1010   
1011    class InEdgeIt : public Edge {
1012      friend class NodeSet;
1013    public:
1014      InEdgeIt() : Edge() { }
1015      InEdgeIt (Invalid i) : Edge(i) { }
1016      InEdgeIt(const NodeSet& G,Node v) :Edge() {}
1017    };
1018
1019    template <typename T> class NodeMap : public DynMapBase<Node>
1020    {
1021      std::vector<T> container;
1022
1023    public:
1024      typedef T ValueType;
1025      typedef Node KeyType;
1026
1027      NodeMap(const NodeSet &_G) :
1028        DynMapBase<Node>(_G), container(_G.maxNodeId())
1029      {
1030        G->dyn_node_maps.push_back(this);
1031      }
1032      NodeMap(const NodeSet &_G,const T &t) :
1033        DynMapBase<Node>(_G), container(_G.maxNodeId(),t)
1034      {
1035        G->dyn_node_maps.push_back(this);
1036      }
1037     
1038      NodeMap(const NodeMap<T> &m) :
1039        DynMapBase<Node>(*m.G), container(m.container)
1040      {
1041        G->dyn_node_maps.push_back(this);
1042      }
1043
1044      template<typename TT> friend class NodeMap;
1045 
1046      ///\todo It can copy between different types.
1047      ///
1048      template<typename TT> NodeMap(const NodeMap<TT> &m) :
[590]1049        DynMapBase<Node>(*m.G), container(m.container.size())
[400]1050      {
1051        G->dyn_node_maps.push_back(this);
1052        typename std::vector<TT>::const_iterator i;
1053        for(typename std::vector<TT>::const_iterator i=m.container.begin();
1054            i!=m.container.end();
1055            i++)
1056          container.push_back(*i);
1057      }
1058      ~NodeMap()
1059      {
1060        if(G) {
1061          std::vector<DynMapBase<Node>* >::iterator i;
1062          for(i=G->dyn_node_maps.begin();
1063              i!=G->dyn_node_maps.end() && *i!=this; ++i) ;
1064          //if(*i==this) G->dyn_node_maps.erase(i); //FIXME: Way too slow...
1065          //A better way to do that: (Is this really important?)
1066          if(*i==this) {
1067            *i=G->dyn_node_maps.back();
1068            G->dyn_node_maps.pop_back();
1069          }
1070        }
1071      }
1072
1073      void add(const Node k)
1074      {
1075        if(k.n>=int(container.size())) container.resize(k.n+1);
1076      }
1077
1078      void erase(const Node) { }
1079     
1080      void set(Node n, T a) { container[n.n]=a; }
1081      //'T& operator[](Node n)' would be wrong here
1082      typename std::vector<T>::reference
1083      operator[](Node n) { return container[n.n]; }
1084      //'const T& operator[](Node n)' would be wrong here
1085      typename std::vector<T>::const_reference
1086      operator[](Node n) const { return container[n.n]; }
1087
1088      ///\warning There is no safety check at all!
1089      ///Using operator = between maps attached to different graph may
1090      ///cause serious problem.
1091      ///\todo Is this really so?
1092      ///\todo It can copy between different types.
1093      const NodeMap<T>& operator=(const NodeMap<T> &m)
1094      {
1095        container = m.container;
1096        return *this;
1097      }
1098      template<typename TT>
1099      const NodeMap<T>& operator=(const NodeMap<TT> &m)
1100      {
[531]1101        std::copy(m.container.begin(), m.container.end(), container.begin());
[400]1102        return *this;
1103      }
1104     
1105      void update() {}    //Useless for Dynamic Maps
1106      void update(T a) {}  //Useless for Dynamic Maps
1107    };
1108   
1109    template <typename T> class EdgeMap
1110    {
1111    public:
1112      typedef T ValueType;
1113      typedef Edge KeyType;
1114
1115      EdgeMap(const NodeSet &) { }
1116      EdgeMap(const NodeSet &,const T &) { }
1117      EdgeMap(const EdgeMap<T> &) { }
1118      //      template<typename TT> friend class EdgeMap;
1119
1120      ///\todo It can copy between different types.
1121      ///
1122      template<typename TT> EdgeMap(const EdgeMap<TT> &) { }
1123      ~EdgeMap() { }
1124
1125      void add(const Edge  ) { }
1126      void erase(const Edge) { }
1127     
1128      void set(Edge, T) { }
1129      //T get(Edge n) const { return container[n.n]; }
1130      ValueType &operator[](Edge) { return *((T*)(NULL)); }
1131      const ValueType &operator[](Edge) const { return *((T*)(NULL)); }
1132
1133      const EdgeMap<T>& operator=(const EdgeMap<T> &) { return *this; }
1134   
1135      template<typename TT>
1136      const EdgeMap<T>& operator=(const EdgeMap<TT> &m) { return *this; }
1137     
1138      void update() {}
1139      void update(T a) {}
1140    };
1141  };
1142
1143
1144
[401]1145  ///Graph structure using a node set of another graph.
1146
1147  ///This structure can be used to establish another graph over a node set
1148  /// of an existing one. The node iterator will go through the nodes of the
1149  /// original graph, and the NodeMap's of both graphs will convert to
1150  /// each other.
1151  ///
[404]1152  ///\warning Adding or deleting nodes from the graph is not safe if an
1153  ///\ref EdgeSet is currently attached to it!
1154  ///
1155  ///\todo Make it possible to add/delete edges from the base graph
1156  ///(and from \ref EdgeSet, as well)
1157  ///
[401]1158  ///\param GG The type of the graph which shares its node set with this class.
1159  ///Its interface must conform with \ref GraphSkeleton.
[400]1160  ///
1161  ///It conforms to the graph interface documented under
1162  ///the description of \ref GraphSkeleton.
1163  ///\sa \ref GraphSkeleton.
[401]1164  ///\sa \ref NodeSet.
[400]1165  template<typename GG>
1166  class EdgeSet {
1167
1168    typedef GG NodeGraphType;
1169
1170    NodeGraphType &G;
1171
[515]1172  public:
[400]1173    class Node;
[705]1174    class Edge;
1175    class OutEdgeIt;
1176    class InEdgeIt;
1177    class SymEdge;
[531]1178    int id(Node v) const;
1179
1180    class Node : public NodeGraphType::Node {
1181      friend class EdgeSet;
1182      //      template <typename T> friend class NodeMap;
1183     
1184      friend class Edge;
1185      friend class OutEdgeIt;
1186      friend class InEdgeIt;
1187      friend class SymEdge;
1188
1189    public:
1190      friend int EdgeSet::id(Node v) const;
1191      //      Node(int nn) {n=nn;}
1192    public:
1193      Node() : NodeGraphType::Node() {}
1194      Node (Invalid i) : NodeGraphType::Node(i) {}
1195      Node(const typename NodeGraphType::Node &n) : NodeGraphType::Node(n) {}
1196    };
1197   
1198    class NodeIt : public NodeGraphType::NodeIt {
1199      friend class EdgeSet;
1200    public:
1201      NodeIt() : NodeGraphType::NodeIt() { }
1202      NodeIt (Invalid i) : NodeGraphType::NodeIt(i) {}
1203      NodeIt(const EdgeSet& _G) : NodeGraphType::NodeIt(_G.G) { }
1204      NodeIt(const typename NodeGraphType::NodeIt &n)
1205        : NodeGraphType::NodeIt(n) {}
[579]1206      ///\todo Undocumented conversion Node -\> NodeIt.
1207      NodeIt(const EdgeSet& _G, const Node &n)
1208        : NodeGraphType::NodeIt(_G.G,n) { }
1209
[531]1210      operator Node() { return Node(*this);}
1211    };
[515]1212
1213  private:
[400]1214    //Edges are double linked.
1215    //The free edges are only single linked using the "next_in" field.
1216    struct NodeT
1217    {
1218      int first_in,first_out;
1219      NodeT() : first_in(-1), first_out(-1) { }
1220    };
1221
1222    struct EdgeT
1223    {
1224      Node head, tail;
1225      int prev_in, prev_out;
1226      int next_in, next_out;
1227    };
1228
1229   
[515]1230    typename NodeGraphType::template NodeMap<NodeT> nodes;
[400]1231   
1232    std::vector<EdgeT> edges;
1233    //The first free edge
1234    int first_free_edge;
1235   
1236  protected:
1237   
1238    template <typename Key> class DynMapBase
1239    {
1240    protected:
1241      const EdgeSet* G;
1242    public:
[515]1243      virtual void add(const Key k) = 0;
1244      virtual void erase(const Key k) = 0;
[400]1245      DynMapBase(const EdgeSet &_G) : G(&_G) {}
1246      virtual ~DynMapBase() {}
1247      friend class EdgeSet;
1248    };
1249   
1250  public:
1251    //template <typename T> class NodeMap;
1252    template <typename T> class EdgeMap;
1253   
1254    class Node;
1255    class Edge;
1256
1257    //  protected:
1258    // HELPME:
1259  protected:
1260    // mutable std::vector<DynMapBase<Node> * > dyn_node_maps;
1261    ///\bug It must be public because of SymEdgeMap.
1262    ///
1263    mutable std::vector<DynMapBase<Edge> * > dyn_edge_maps;
1264   
1265  public:
1266
1267    class NodeIt;
1268    class EdgeIt;
1269    class OutEdgeIt;
1270    class InEdgeIt;
1271   
1272    template <typename T> class NodeMap;
1273    template <typename T> class EdgeMap;
1274   
1275  public:
1276
[408]1277    ///Constructor
1278   
1279    ///Construates a new graph based on the nodeset of an existing one.
1280    ///\param _G the base graph.
1281    ///\todo It looks like a copy constructor, but it isn't.
[401]1282    EdgeSet(NodeGraphType &_G) : G(_G),
1283                                 nodes(_G), edges(),
1284                                 first_free_edge(-1) { }
[408]1285    ///Copy constructor
1286
1287    ///Makes a copy of an EdgeSet.
1288    ///It will be based on the same graph.
[400]1289    EdgeSet(const EdgeSet &_g) : G(_g.G), nodes(_g.G), edges(_g.edges),
[401]1290                                 first_free_edge(_g.first_free_edge) { }
[400]1291   
1292    ~EdgeSet()
1293    {
1294      // for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
1295      //  i!=dyn_node_maps.end(); ++i) (**i).G=NULL;
1296      for(typename std::vector<DynMapBase<Edge> * >::iterator
1297            i=dyn_edge_maps.begin();
1298          i!=dyn_edge_maps.end(); ++i) (**i).G=NULL;
1299    }
1300
1301    int nodeNum() const { return G.nodeNum(); }  //FIXME: What is this?
1302    int edgeNum() const { return edges.size(); }  //FIXME: What is this?
1303
1304    ///\bug This function does something different than
1305    ///its name would suggests...
1306    int maxNodeId() const { return G.maxNodeId(); }  //FIXME: What is this?
1307    ///\bug This function does something different than
1308    ///its name would suggests...
1309    int maxEdgeId() const { return edges.size(); }  //FIXME: What is this?
1310
1311    Node tail(Edge e) const { return edges[e.n].tail; }
1312    Node head(Edge e) const { return edges[e.n].head; }
1313
1314    Node aNode(OutEdgeIt e) const { return edges[e.n].tail; }
1315    Node aNode(InEdgeIt e) const { return edges[e.n].head; }
1316
1317    Node bNode(OutEdgeIt e) const { return edges[e.n].head; }
1318    Node bNode(InEdgeIt e) const { return edges[e.n].tail; }
1319
1320    NodeIt& first(NodeIt& v) const {
1321      v=NodeIt(*this); return v; }
1322    EdgeIt& first(EdgeIt& e) const {
1323      e=EdgeIt(*this); return e; }
1324    OutEdgeIt& first(OutEdgeIt& e, const Node v) const {
1325      e=OutEdgeIt(*this,v); return e; }
1326    InEdgeIt& first(InEdgeIt& e, const Node v) const {
1327      e=InEdgeIt(*this,v); return e; }
1328
1329//     template< typename It >
1330//     It first() const { It e; first(e); return e; }
1331
1332//     template< typename It >
1333//     It first(Node v) const { It e; first(e,v); return e; }
1334
1335    bool valid(Edge e) const { return e.n!=-1; }
1336    bool valid(Node n) const { return G.valid(n); }
1337   
1338    void setInvalid(Edge &e) { e.n=-1; }
1339    void setInvalid(Node &n) { G.setInvalid(n); }
1340   
1341    template <typename It> It getNext(It it) const
1342    { It tmp(it); return next(tmp); }
1343
1344    NodeIt& next(NodeIt& it) const { G.next(it); return it; }
1345    OutEdgeIt& next(OutEdgeIt& it) const
1346    { it.n=edges[it.n].next_out; return it; }
1347    InEdgeIt& next(InEdgeIt& it) const
1348    { it.n=edges[it.n].next_in; return it; }
1349    EdgeIt& next(EdgeIt& it) const {
1350      if(edges[it.n].next_in!=-1) {
1351        it.n=edges[it.n].next_in;
1352      }
1353      else {
[579]1354        NodeIt n(*this,edges[it.n].head);
1355        for(n=next(n);
[503]1356            valid(n) && nodes[n].first_in == -1;
1357            next(n)) ;
1358        it.n = (valid(n))?-1:nodes[n].first_in;
[400]1359      }
1360      return it;
1361    }
1362
1363    int id(Edge e) const { return e.n; }
1364
1365    /// Adds a new node to the graph.
[579]1366    Node addNode() { return G.addNode(); }
[400]1367   
1368    Edge addEdge(Node u, Node v) {
1369      int n;
1370     
1371      if(first_free_edge==-1)
1372        {
1373          n = edges.size();
1374          edges.push_back(EdgeT());
1375        }
1376      else {
1377        n = first_free_edge;
1378        first_free_edge = edges[n].next_in;
1379      }
1380     
[401]1381      edges[n].tail = u; edges[n].head = v;
[400]1382
[401]1383      edges[n].next_out = nodes[u].first_out;
1384      if(nodes[u].first_out != -1) edges[nodes[u].first_out].prev_out = n;
1385      edges[n].next_in = nodes[v].first_in;
1386      if(nodes[v].first_in != -1) edges[nodes[v].first_in].prev_in = n;
[400]1387      edges[n].prev_in = edges[n].prev_out = -1;
1388       
[401]1389      nodes[u].first_out = nodes[v].first_in = n;
[400]1390
1391      Edge e; e.n=n;
1392
1393      //Update dynamic maps
1394      for(typename std::vector<DynMapBase<Edge> * >::iterator
1395            i=dyn_edge_maps.begin();
1396          i!=dyn_edge_maps.end(); ++i) (**i).add(e);
1397
1398      return e;
1399    }
1400
1401  private:
1402    void eraseEdge(int n) {
1403     
1404      if(edges[n].next_in!=-1)
1405        edges[edges[n].next_in].prev_in = edges[n].prev_in;
1406      if(edges[n].prev_in!=-1)
1407        edges[edges[n].prev_in].next_in = edges[n].next_in;
1408      else nodes[edges[n].head].first_in = edges[n].next_in;
1409     
1410      if(edges[n].next_out!=-1)
1411        edges[edges[n].next_out].prev_out = edges[n].prev_out;
1412      if(edges[n].prev_out!=-1)
1413        edges[edges[n].prev_out].next_out = edges[n].next_out;
1414      else nodes[edges[n].tail].first_out = edges[n].next_out;
1415     
1416      edges[n].next_in = first_free_edge;
1417      first_free_edge = -1;     
1418
1419      //Update dynamic maps
1420      Edge e; e.n=n;
1421      for(typename std::vector<DynMapBase<Edge> * >::iterator
1422            i=dyn_edge_maps.begin();
1423          i!=dyn_edge_maps.end(); ++i) (**i).erase(e);
1424    }
1425     
1426  public:
1427
1428//     void erase(Node nn) {
1429//       int n=nn.n;
1430//       int m;
1431//       while((m=nodes[n].first_in)!=-1) eraseEdge(m);
1432//       while((m=nodes[n].first_out)!=-1) eraseEdge(m);
1433//     }
1434   
1435    void erase(Edge e) { eraseEdge(e.n); }
1436
[579]1437    ///Clear all edges. (Doesn't clear the nodes!)
1438    void clear() {
1439      edges.clear();
1440      first_free_edge=-1;
1441    }
1442
1443
[400]1444//     //\bug Dynamic maps must be updated!
1445//     //
1446//     void clear() {
1447//       nodes.clear();edges.clear();
1448//       first_node=first_free_node=first_free_edge=-1;
1449//     }
1450
[579]1451  public:
1452    template <typename T> class EdgeMap;
1453   
1454    ///
[400]1455    class Edge {
[579]1456    public:
[400]1457      friend class EdgeSet;
1458      template <typename T> friend class EdgeMap;
1459
1460      friend class Node;
1461      friend class NodeIt;
[579]1462    public:
1463      ///\bug It shoud be at least protected
1464      ///
1465      int n;
[400]1466    protected:
1467      friend int EdgeSet::id(Edge e) const;
1468
1469      Edge(int nn) {n=nn;}
1470    public:
1471      Edge() { }
1472      Edge (Invalid) { n=-1; }
1473      bool operator==(const Edge i) const {return n==i.n;}
1474      bool operator!=(const Edge i) const {return n!=i.n;}
1475      bool operator<(const Edge i) const {return n<i.n;}
1476      ///\bug This is a workaround until somebody tells me how to
1477      ///make class \c SymEdgeSet::SymEdgeMap friend of Edge
1478      int &idref() {return n;}
1479      const int &idref() const {return n;}
1480    };
1481   
1482    class EdgeIt : public Edge {
1483      friend class EdgeSet;
[579]1484      template <typename T> friend class EdgeMap;
1485   
1486     
[400]1487    public:
1488      EdgeIt(const EdgeSet& G) : Edge() {
[503]1489        //              typename NodeGraphType::Node m;
1490        NodeIt m;
[400]1491        for(G.first(m);
[503]1492            G.valid(m) && G.nodes[m].first_in == -1;  G.next(m));
[515]1493        //AJJAJ! This is a non sense!!!!!!!
1494        this->n = G.valid(m)?-1:G.nodes[m].first_in;
[400]1495      }
1496      EdgeIt (Invalid i) : Edge(i) { }
1497      EdgeIt() : Edge() { }
1498      ///\bug This is a workaround until somebody tells me how to
1499      ///make class \c SymEdgeSet::SymEdgeMap friend of Edge
[515]1500      int &idref() {return this->n;}
[400]1501    };
1502   
1503    class OutEdgeIt : public Edge {
1504      friend class EdgeSet;
1505    public:
1506      OutEdgeIt() : Edge() { }
1507      OutEdgeIt (Invalid i) : Edge(i) { }
1508
[579]1509      OutEdgeIt(const EdgeSet& G,const Node v) : Edge(G.nodes[v].first_out) { }
[400]1510    };
1511   
1512    class InEdgeIt : public Edge {
1513      friend class EdgeSet;
1514    public:
1515      InEdgeIt() : Edge() { }
1516      InEdgeIt (Invalid i) : Edge(i) { }
[579]1517      InEdgeIt(const EdgeSet& G,Node v) :Edge(G.nodes[v].first_in) { }
[400]1518    };
1519
[515]1520    template <typename T> class NodeMap :
1521      public NodeGraphType::template NodeMap<T>
[400]1522    {
[579]1523      //This is a must, the constructors need it.
1524      typedef typename NodeGraphType::template NodeMap<T> ParentNodeMap;
[400]1525    public:
[579]1526      NodeMap(const EdgeSet &_G) : ParentNodeMap(_G.G) { }
1527      NodeMap(const EdgeSet &_G,const T &t) : ParentNodeMap(_G.G,t) { }
[400]1528      //It is unnecessary
[515]1529      NodeMap(const typename NodeGraphType::template NodeMap<T> &m) :
[579]1530        ParentNodeMap(m) { }
[400]1531
1532      ///\todo It can copy between different types.
1533      ///
[401]1534      template<typename TT>
[515]1535      NodeMap(const typename NodeGraphType::template NodeMap<TT> &m)
[579]1536        : ParentNodeMap(m) { }
[400]1537    };
1538   
[579]1539    ///
[400]1540    template <typename T> class EdgeMap : public DynMapBase<Edge>
1541    {
[579]1542    protected:
1543    public:
1544      ///\bug It should be at least protected
1545      ///
[400]1546      std::vector<T> container;
1547
1548    public:
1549      typedef T ValueType;
1550      typedef Edge KeyType;
1551
1552      EdgeMap(const EdgeSet &_G) :
1553        DynMapBase<Edge>(_G), container(_G.maxEdgeId())
1554      {
1555        //FIXME: What if there are empty Id's?
1556        //FIXME: Can I use 'this' in a constructor?
1557        G->dyn_edge_maps.push_back(this);
1558      }
1559      EdgeMap(const EdgeSet &_G,const T &t) :
1560        DynMapBase<Edge>(_G), container(_G.maxEdgeId(),t)
1561      {
1562        G->dyn_edge_maps.push_back(this);
1563      }
1564      EdgeMap(const EdgeMap<T> &m) :
1565        DynMapBase<Edge>(*m.G), container(m.container)
1566      {
[503]1567        G->dyn_edge_maps.push_back(this);
[400]1568      }
1569
1570      ///\todo It can copy between different types.
1571      ///
1572      template<typename TT> EdgeMap(const EdgeMap<TT> &m) :
[590]1573        DynMapBase<Edge>(*m.G), container(m.container.size())
[400]1574      {
[503]1575        G->dyn_edge_maps.push_back(this);
[400]1576        typename std::vector<TT>::const_iterator i;
1577        for(typename std::vector<TT>::const_iterator i=m.container.begin();
1578            i!=m.container.end();
1579            i++)
1580          container.push_back(*i);
1581      }
1582      ~EdgeMap()
1583      {
1584        if(G) {
1585          typename std::vector<DynMapBase<Edge>* >::iterator i;
1586          for(i=G->dyn_edge_maps.begin();
1587              i!=G->dyn_edge_maps.end() && *i!=this; ++i) ;
1588          //if(*i==this) G->dyn_edge_maps.erase(i); //Way too slow...
1589          //A better way to do that: (Is this really important?)
1590          if(*i==this) {
1591            *i=G->dyn_edge_maps.back();
1592            G->dyn_edge_maps.pop_back();
1593          }
1594        }
1595      }
1596     
1597      void add(const Edge k)
1598      {
1599        if(k.n>=int(container.size())) container.resize(k.n+1);
1600      }
1601      void erase(const Edge) { }
1602     
[579]1603      ///\bug This doesn't work. Why?
1604      ///      void set(Edge n, T a) { container[n.n]=a; }
1605      void set(Edge n, T a) { container[G->id(n)]=a; }
[400]1606      //T get(Edge n) const { return container[n.n]; }
1607      typename std::vector<T>::reference
[579]1608      ///\bug This doesn't work. Why?
1609      ///      operator[](Edge n) { return container[n.n]; }
1610      operator[](Edge n) { return container[G->id(n)]; }
[400]1611      typename std::vector<T>::const_reference
[579]1612      ///\bug This doesn't work. Why?
1613      ///      operator[](Edge n) const { return container[n.n]; }
1614      operator[](Edge n) const { return container[G->id(n)]; }
[400]1615
1616      ///\warning There is no safety check at all!
1617      ///Using operator = between maps attached to different graph may
1618      ///cause serious problem.
1619      ///\todo Is this really so?
1620      ///\todo It can copy between different types.
1621      const EdgeMap<T>& operator=(const EdgeMap<T> &m)
1622      {
1623        container = m.container;
1624        return *this;
1625      }
[579]1626     
1627      template<typename TT> friend class EdgeMap;
1628
[400]1629      template<typename TT>
1630      const EdgeMap<T>& operator=(const EdgeMap<TT> &m)
1631      {
[531]1632        std::copy(m.container.begin(), m.container.end(), container.begin());
[400]1633        return *this;
1634      }
1635     
1636      void update() {}    //Useless for DynMaps
1637      void update(T a) {}  //Useless for DynMaps
1638    };
1639
1640  };
[406]1641
[579]1642  template<typename GG>
1643  inline int EdgeSet<GG>::id(Node v) const { return G.id(v); }
[531]1644
[406]1645/// @} 
1646
[395]1647} //namespace hugo
1648
[405]1649#endif //HUGO_LIST_GRAPH_H
Note: See TracBrowser for help on using the repository browser.