3 #ifndef HUGO_SMART_GRAPH_H
4 #define HUGO_SMART_GRAPH_H
7 ///\brief ListGraph and SymListGraph classes.
18 ///A list graph class.
20 ///This is a simple and fast erasable graph implementation.
22 ///It conforms to the graph interface documented under
23 ///the description of \ref GraphSkeleton.
24 ///\sa \ref GraphSkeleton.
27 //Nodes are double linked.
28 //The free nodes are only single linked using the "next" field.
31 int first_in,first_out;
35 //Edges are double linked.
36 //The free edges are only single linked using the "next_in" field.
40 int prev_in, prev_out;
41 int next_in, next_out;
42 //FIXME: is this necessary?
43 // EdgeT() : next_in(-1), next_out(-1) prev_in(-1), prev_out(-1) {}
46 std::vector<NodeT> nodes;
51 std::vector<EdgeT> edges;
57 template <typename Key> class DynMapBase
62 virtual void add(const Key k) = NULL;
63 virtual void erase(const Key k) = NULL;
64 DynMapBase(const ListGraph &_G) : G(&_G) {}
65 virtual ~DynMapBase() {}
66 friend class ListGraph;
70 template <typename T> class EdgeMap;
71 template <typename T> class NodeMap;
79 ///\bug It must be public because of SymEdgeMap.
81 mutable std::vector<DynMapBase<Node> * > dyn_node_maps;
82 ///\bug It must be public because of SymEdgeMap.
84 mutable std::vector<DynMapBase<Edge> * > dyn_edge_maps;
93 template <typename T> class NodeMap;
94 template <typename T> class EdgeMap;
98 ListGraph() : nodes(), first_node(-1),
99 first_free_node(-1), edges(), first_free_edge(-1) {}
100 ListGraph(const ListGraph &_g) : nodes(_g.nodes), first_node(_g.first_node),
101 first_free_node(_g.first_free_node),
103 first_free_edge(_g.first_free_edge) {}
107 for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
108 i!=dyn_node_maps.end(); ++i) (**i).G=NULL;
109 for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
110 i!=dyn_edge_maps.end(); ++i) (**i).G=NULL;
113 int nodeNum() const { return nodes.size(); } //FIXME: What is this?
114 int edgeNum() const { return edges.size(); } //FIXME: What is this?
116 ///\bug This function does something different than
117 ///its name would suggests...
118 int maxNodeId() const { return nodes.size(); } //FIXME: What is this?
119 ///\bug This function does something different than
120 ///its name would suggests...
121 int maxEdgeId() const { return edges.size(); } //FIXME: What is this?
123 Node tail(Edge e) const { return edges[e.n].tail; }
124 Node head(Edge e) const { return edges[e.n].head; }
126 Node aNode(OutEdgeIt e) const { return edges[e.n].tail; }
127 Node aNode(InEdgeIt e) const { return edges[e.n].head; }
129 Node bNode(OutEdgeIt e) const { return edges[e.n].head; }
130 Node bNode(InEdgeIt e) const { return edges[e.n].tail; }
132 NodeIt& first(NodeIt& v) const {
133 v=NodeIt(*this); return v; }
134 EdgeIt& first(EdgeIt& e) const {
135 e=EdgeIt(*this); return e; }
136 OutEdgeIt& first(OutEdgeIt& e, const Node v) const {
137 e=OutEdgeIt(*this,v); return e; }
138 InEdgeIt& first(InEdgeIt& e, const Node v) const {
139 e=InEdgeIt(*this,v); return e; }
141 // template< typename It >
142 // It first() const { It e; first(e); return e; }
144 // template< typename It >
145 // It first(Node v) const { It e; first(e,v); return e; }
147 bool valid(Edge e) const { return e.n!=-1; }
148 bool valid(Node n) const { return n.n!=-1; }
150 void setInvalid(Edge &e) { e.n=-1; }
151 void setInvalid(Node &n) { n.n=-1; }
153 template <typename It> It getNext(It it) const
154 { It tmp(it); return next(tmp); }
156 NodeIt& next(NodeIt& it) const {
157 it.n=nodes[it.n].next;
160 OutEdgeIt& next(OutEdgeIt& it) const
161 { it.n=edges[it.n].next_out; return it; }
162 InEdgeIt& next(InEdgeIt& it) const
163 { it.n=edges[it.n].next_in; return it; }
164 EdgeIt& next(EdgeIt& it) const {
165 if(edges[it.n].next_in!=-1) {
166 it.n=edges[it.n].next_in;
170 for(n=nodes[edges[it.n].head].next;
171 n!=-1 && nodes[n].first_in == -1;
173 it.n = (n==-1)?-1:nodes[n].first_in;
178 int id(Node v) const { return v.n; }
179 int id(Edge e) const { return e.n; }
181 /// Adds a new node to the graph.
183 /// \todo It adds the nodes in a reversed order.
184 /// (i.e. the lastly added node becomes the first.)
188 if(first_free_node==-1)
191 nodes.push_back(NodeT());
195 first_free_node = nodes[n].next;
198 nodes[n].next = first_node;
199 if(first_node != -1) nodes[first_node].prev = n;
203 nodes[n].first_in = nodes[n].first_out = -1;
207 //Update dynamic maps
208 for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
209 i!=dyn_node_maps.end(); ++i) (**i).add(nn);
214 Edge addEdge(Node u, Node v) {
217 if(first_free_edge==-1)
220 edges.push_back(EdgeT());
224 first_free_edge = edges[n].next_in;
227 edges[n].tail = u.n; edges[n].head = v.n;
229 edges[n].next_out = nodes[u.n].first_out;
230 if(nodes[u.n].first_out != -1) edges[nodes[u.n].first_out].prev_out = n;
231 edges[n].next_in = nodes[v.n].first_in;
232 if(nodes[v.n].first_in != -1) edges[nodes[v.n].first_in].prev_in = n;
233 edges[n].prev_in = edges[n].prev_out = -1;
235 nodes[u.n].first_out = nodes[v.n].first_in = n;
239 //Update dynamic maps
240 for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
241 i!=dyn_edge_maps.end(); ++i) (**i).add(e);
247 void eraseEdge(int n) {
249 if(edges[n].next_in!=-1)
250 edges[edges[n].next_in].prev_in = edges[n].prev_in;
251 if(edges[n].prev_in!=-1)
252 edges[edges[n].prev_in].next_in = edges[n].next_in;
253 else nodes[edges[n].head].first_in = edges[n].next_in;
255 if(edges[n].next_out!=-1)
256 edges[edges[n].next_out].prev_out = edges[n].prev_out;
257 if(edges[n].prev_out!=-1)
258 edges[edges[n].prev_out].next_out = edges[n].next_out;
259 else nodes[edges[n].tail].first_out = edges[n].next_out;
261 edges[n].next_in = first_free_edge;
262 first_free_edge = -1;
264 //Update dynamic maps
266 for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
267 i!=dyn_edge_maps.end(); ++i) (**i).erase(e);
272 void erase(Node nn) {
276 while((m=nodes[n].first_in)!=-1) eraseEdge(m);
277 while((m=nodes[n].first_out)!=-1) eraseEdge(m);
279 if(nodes[n].next != -1) nodes[nodes[n].next].prev = nodes[n].prev;
280 if(nodes[n].prev != -1) nodes[nodes[n].prev].next = nodes[n].next;
281 else first_node = nodes[n].next;
283 nodes[n].next = first_free_node;
286 //Update dynamic maps
287 for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
288 i!=dyn_node_maps.end(); ++i) (**i).erase(nn);
291 void erase(Edge e) { eraseEdge(e.n); }
293 ///\bug Dynamic maps must be updated!
296 nodes.clear();edges.clear();
297 first_node=first_free_node=first_free_edge=-1;
301 friend class ListGraph;
302 template <typename T> friend class NodeMap;
305 friend class OutEdgeIt;
306 friend class InEdgeIt;
307 friend class SymEdge;
311 friend int ListGraph::id(Node v) const;
315 Node (Invalid i) { n=-1; }
316 bool operator==(const Node i) const {return n==i.n;}
317 bool operator!=(const Node i) const {return n!=i.n;}
318 bool operator<(const Node i) const {return n<i.n;}
321 class NodeIt : public Node {
322 friend class ListGraph;
324 NodeIt() : Node() { }
325 NodeIt(Invalid i) : Node(i) { }
326 NodeIt(const ListGraph& G) : Node(G.first_node) { }
330 friend class ListGraph;
331 template <typename T> friend class EdgeMap;
333 //template <typename T> friend class SymListGraph::SymEdgeMap;
334 //friend Edge SymListGraph::opposite(Edge) const;
340 friend int ListGraph::id(Edge e) const;
345 Edge (Invalid) { n=-1; }
346 bool operator==(const Edge i) const {return n==i.n;}
347 bool operator!=(const Edge i) const {return n!=i.n;}
348 bool operator<(const Edge i) const {return n<i.n;}
349 ///\bug This is a workaround until somebody tells me how to
350 ///make class \c SymListGraph::SymEdgeMap friend of Edge
351 int &idref() {return n;}
352 const int &idref() const {return n;}
355 class EdgeIt : public Edge {
356 friend class ListGraph;
358 EdgeIt(const ListGraph& G) : Edge() {
361 m!=-1 && G.nodes[m].first_in == -1; m = G.nodes[m].next);
362 n = (m==-1)?-1:G.nodes[m].first_in;
364 EdgeIt (Invalid i) : Edge(i) { }
365 EdgeIt() : Edge() { }
366 ///\bug This is a workaround until somebody tells me how to
367 ///make class \c SymListGraph::SymEdgeMap friend of Edge
368 int &idref() {return n;}
371 class OutEdgeIt : public Edge {
372 friend class ListGraph;
374 OutEdgeIt() : Edge() { }
375 OutEdgeIt (Invalid i) : Edge(i) { }
377 OutEdgeIt(const ListGraph& G,const Node v)
378 : Edge(G.nodes[v.n].first_out) {}
381 class InEdgeIt : public Edge {
382 friend class ListGraph;
384 InEdgeIt() : Edge() { }
385 InEdgeIt (Invalid i) : Edge(i) { }
386 InEdgeIt(const ListGraph& G,Node v) :Edge(G.nodes[v.n].first_in){}
389 template <typename T> class NodeMap : public DynMapBase<Node>
391 std::vector<T> container;
395 typedef Node KeyType;
397 NodeMap(const ListGraph &_G) :
398 DynMapBase<Node>(_G), container(_G.maxNodeId())
400 G->dyn_node_maps.push_back(this);
402 NodeMap(const ListGraph &_G,const T &t) :
403 DynMapBase<Node>(_G), container(_G.maxNodeId(),t)
405 G->dyn_node_maps.push_back(this);
408 NodeMap(const NodeMap<T> &m) :
409 DynMapBase<Node>(*m.G), container(m.container)
411 G->dyn_node_maps.push_back(this);
414 template<typename TT> friend class NodeMap;
416 ///\todo It can copy between different types.
418 template<typename TT> NodeMap(const NodeMap<TT> &m) :
419 DynMapBase<Node>(*m.G)
421 G->dyn_node_maps.push_back(this);
422 typename std::vector<TT>::const_iterator i;
423 for(typename std::vector<TT>::const_iterator i=m.container.begin();
424 i!=m.container.end();
426 container.push_back(*i);
431 std::vector<DynMapBase<Node>* >::iterator i;
432 for(i=G->dyn_node_maps.begin();
433 i!=G->dyn_node_maps.end() && *i!=this; ++i) ;
434 //if(*i==this) G->dyn_node_maps.erase(i); //FIXME: Way too slow...
435 //A better way to do that: (Is this really important?)
437 *i=G->dyn_node_maps.back();
438 G->dyn_node_maps.pop_back();
443 void add(const Node k)
445 if(k.n>=int(container.size())) container.resize(k.n+1);
448 void erase(const Node) { }
450 void set(Node n, T a) { container[n.n]=a; }
451 //'T& operator[](Node n)' would be wrong here
452 typename std::vector<T>::reference
453 operator[](Node n) { return container[n.n]; }
454 //'const T& operator[](Node n)' would be wrong here
455 typename std::vector<T>::const_reference
456 operator[](Node n) const { return container[n.n]; }
458 ///\warning There is no safety check at all!
459 ///Using operator = between maps attached to different graph may
460 ///cause serious problem.
461 ///\todo Is this really so?
462 ///\todo It can copy between different types.
463 const NodeMap<T>& operator=(const NodeMap<T> &m)
465 container = m.container;
468 template<typename TT>
469 const NodeMap<T>& operator=(const NodeMap<TT> &m)
471 copy(m.container.begin(), m.container.end(), container.begin());
475 void update() {} //Useless for Dynamic Maps
476 void update(T a) {} //Useless for Dynamic Maps
479 template <typename T> class EdgeMap : public DynMapBase<Edge>
481 std::vector<T> container;
485 typedef Edge KeyType;
487 EdgeMap(const ListGraph &_G) :
488 DynMapBase<Edge>(_G), container(_G.maxEdgeId())
490 //FIXME: What if there are empty Id's?
491 //FIXME: Can I use 'this' in a constructor?
492 G->dyn_edge_maps.push_back(this);
494 EdgeMap(const ListGraph &_G,const T &t) :
495 DynMapBase<Edge>(_G), container(_G.maxEdgeId(),t)
497 G->dyn_edge_maps.push_back(this);
499 EdgeMap(const EdgeMap<T> &m) :
500 DynMapBase<Edge>(*m.G), container(m.container)
502 G->dyn_node_maps.push_back(this);
505 template<typename TT> friend class EdgeMap;
507 ///\todo It can copy between different types.
509 template<typename TT> EdgeMap(const EdgeMap<TT> &m) :
510 DynMapBase<Edge>(*m.G)
512 G->dyn_node_maps.push_back(this);
513 typename std::vector<TT>::const_iterator i;
514 for(typename std::vector<TT>::const_iterator i=m.container.begin();
515 i!=m.container.end();
517 container.push_back(*i);
522 std::vector<DynMapBase<Edge>* >::iterator i;
523 for(i=G->dyn_edge_maps.begin();
524 i!=G->dyn_edge_maps.end() && *i!=this; ++i) ;
525 //if(*i==this) G->dyn_edge_maps.erase(i); //Way too slow...
526 //A better way to do that: (Is this really important?)
528 *i=G->dyn_edge_maps.back();
529 G->dyn_edge_maps.pop_back();
534 void add(const Edge k)
536 if(k.n>=int(container.size())) container.resize(k.n+1);
538 void erase(const Edge) { }
540 void set(Edge n, T a) { container[n.n]=a; }
541 //T get(Edge n) const { return container[n.n]; }
542 typename std::vector<T>::reference
543 operator[](Edge n) { return container[n.n]; }
544 typename std::vector<T>::const_reference
545 operator[](Edge n) const { return container[n.n]; }
547 ///\warning There is no safety check at all!
548 ///Using operator = between maps attached to different graph may
549 ///cause serious problem.
550 ///\todo Is this really so?
551 ///\todo It can copy between different types.
552 const EdgeMap<T>& operator=(const EdgeMap<T> &m)
554 container = m.container;
557 template<typename TT>
558 const EdgeMap<T>& operator=(const EdgeMap<TT> &m)
560 copy(m.container.begin(), m.container.end(), container.begin());
564 void update() {} //Useless for DynMaps
565 void update(T a) {} //Useless for DynMaps
570 ///Graph for bidirectional edges.
572 ///The purpose of this graph structure is to handle graphs
573 ///having bidirectional edges. Here the function \c addEdge(u,v) adds a pair
574 ///of oppositely directed edges.
575 ///There is a new edge map type called
576 ///\ref SymListGraph::SymEdgeMap "SymEdgeMap"
577 ///that complements this
579 ///storing shared values for the edge pairs. The usual
580 ///\ref GraphSkeleton::EdgeMap "EdgeMap"
584 ///The oppositely directed edge can also be obtained easily
585 ///using \ref opposite.
587 ///Here erase(Edge) deletes a pair of edges.
589 ///\todo this date structure need some reconsiderations. Maybe it
590 ///should be implemented independently from ListGraph.
592 class SymListGraph : public ListGraph
595 template<typename T> class SymEdgeMap;
596 template<typename T> friend class SymEdgeMap;
598 SymListGraph() : ListGraph() { }
599 SymListGraph(const ListGraph &_g) : ListGraph(_g) { }
600 ///Adds a pair of oppositely directed edges to the graph.
601 Edge addEdge(Node u, Node v)
603 Edge e = ListGraph::addEdge(u,v);
604 ListGraph::addEdge(v,u);
608 void erase(Node n) { ListGraph::erase(n); }
609 ///The oppositely directed edge.
611 ///Returns the oppositely directed
612 ///pair of the edge \c e.
613 Edge opposite(Edge e) const
616 f.idref() = e.idref() - 2*(e.idref()%2) + 1;
620 ///Removes a pair of oppositely directed edges to the graph.
622 ListGraph::erase(opposite(e));
626 ///Common data storage for the edge pairs.
628 ///This map makes it possible to store data shared by the oppositely
629 ///directed pairs of edges.
630 template <typename T> class SymEdgeMap : public DynMapBase<Edge>
632 std::vector<T> container;
636 typedef Edge KeyType;
638 SymEdgeMap(const SymListGraph &_G) :
639 DynMapBase<Edge>(_G), container(_G.maxEdgeId()/2)
641 static_cast<const SymListGraph*>(G)->dyn_edge_maps.push_back(this);
643 SymEdgeMap(const SymListGraph &_G,const T &t) :
644 DynMapBase<Edge>(_G), container(_G.maxEdgeId()/2,t)
646 G->dyn_edge_maps.push_back(this);
649 SymEdgeMap(const SymEdgeMap<T> &m) :
650 DynMapBase<SymEdge>(*m.G), container(m.container)
652 G->dyn_node_maps.push_back(this);
655 // template<typename TT> friend class SymEdgeMap;
657 ///\todo It can copy between different types.
660 template<typename TT> SymEdgeMap(const SymEdgeMap<TT> &m) :
661 DynMapBase<SymEdge>(*m.G)
663 G->dyn_node_maps.push_back(this);
664 typename std::vector<TT>::const_iterator i;
665 for(typename std::vector<TT>::const_iterator i=m.container.begin();
666 i!=m.container.end();
668 container.push_back(*i);
674 std::vector<DynMapBase<Edge>* >::iterator i;
675 for(i=static_cast<const SymListGraph*>(G)->dyn_edge_maps.begin();
676 i!=static_cast<const SymListGraph*>(G)->dyn_edge_maps.end()
678 //if(*i==this) G->dyn_edge_maps.erase(i); //Way too slow...
679 //A better way to do that: (Is this really important?)
681 *i=static_cast<const SymListGraph*>(G)->dyn_edge_maps.back();
682 static_cast<const SymListGraph*>(G)->dyn_edge_maps.pop_back();
687 void add(const Edge k)
689 if(!k.idref()%2&&k.idref()/2>=int(container.size()))
690 container.resize(k.idref()/2+1);
692 void erase(const Edge k) { }
694 void set(Edge n, T a) { container[n.idref()/2]=a; }
695 //T get(Edge n) const { return container[n.idref()/2]; }
696 typename std::vector<T>::reference
697 operator[](Edge n) { return container[n.idref()/2]; }
698 typename std::vector<T>::const_reference
699 operator[](Edge n) const { return container[n.idref()/2]; }
701 ///\warning There is no safety check at all!
702 ///Using operator = between maps attached to different graph may
703 ///cause serious problem.
704 ///\todo Is this really so?
705 ///\todo It can copy between different types.
706 const SymEdgeMap<T>& operator=(const SymEdgeMap<T> &m)
708 container = m.container;
711 template<typename TT>
712 const SymEdgeMap<T>& operator=(const SymEdgeMap<TT> &m)
714 copy(m.container.begin(), m.container.end(), container.begin());
718 void update() {} //Useless for DynMaps
719 void update(T a) {} //Useless for DynMaps
726 ///A graph class containing only nodes.
728 ///This class implements a graph structure without edges.
729 ///The most useful application of this class is to be the node set of an
730 ///\ref EdgeSet class.
732 ///It conforms to the graph interface documented under
733 ///the description of \ref GraphSkeleton with the exception that you cannot
734 ///add (or delete) edges. The usual edge iterators are exists, but they are
735 ///always \ref INVALID.
736 ///\sa \ref GraphSkeleton
740 //Nodes are double linked.
741 //The free nodes are only single linked using the "next" field.
744 int first_in,first_out;
749 std::vector<NodeT> nodes;
752 //The first free node
757 template <typename Key> class DynMapBase
762 virtual void add(const Key k) = NULL;
763 virtual void erase(const Key k) = NULL;
764 DynMapBase(const NodeSet &_G) : G(&_G) {}
765 virtual ~DynMapBase() {}
766 friend class NodeSet;
770 template <typename T> class EdgeMap;
771 template <typename T> class NodeMap;
779 ///\bug It must be public because of SymEdgeMap.
781 mutable std::vector<DynMapBase<Node> * > dyn_node_maps;
782 //mutable std::vector<DynMapBase<Edge> * > dyn_edge_maps;
791 template <typename T> class NodeMap;
792 template <typename T> class EdgeMap;
796 NodeSet() : nodes(), first_node(-1),
797 first_free_node(-1) {}
798 NodeSet(const NodeSet &_g) : nodes(_g.nodes), first_node(_g.first_node),
799 first_free_node(_g.first_free_node) {}
803 for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
804 i!=dyn_node_maps.end(); ++i) (**i).G=NULL;
805 //for(std::vector<DynMapBase<Edge> * >::iterator i=dyn_edge_maps.begin();
806 // i!=dyn_edge_maps.end(); ++i) (**i).G=NULL;
809 int nodeNum() const { return nodes.size(); } //FIXME: What is this?
810 int edgeNum() const { return 0; } //FIXME: What is this?
812 ///\bug This function does something different than
813 ///its name would suggests...
814 int maxNodeId() const { return nodes.size(); } //FIXME: What is this?
815 ///\bug This function does something different than
816 ///its name would suggests...
817 int maxEdgeId() const { return 0; } //FIXME: What is this?
819 Node tail(Edge e) const { return INVALID; }
820 Node head(Edge e) const { return INVALID; }
822 Node aNode(OutEdgeIt e) const { return INVALID; }
823 Node aNode(InEdgeIt e) const { return INVALID; }
825 Node bNode(OutEdgeIt e) const { return INVALID; }
826 Node bNode(InEdgeIt e) const { return INVALID; }
828 NodeIt& first(NodeIt& v) const {
829 v=NodeIt(*this); return v; }
830 EdgeIt& first(EdgeIt& e) const {
831 e=EdgeIt(*this); return e; }
832 OutEdgeIt& first(OutEdgeIt& e, const Node v) const {
833 e=OutEdgeIt(*this,v); return e; }
834 InEdgeIt& first(InEdgeIt& e, const Node v) const {
835 e=InEdgeIt(*this,v); return e; }
837 // template< typename It >
838 // It first() const { It e; first(e); return e; }
840 // template< typename It >
841 // It first(Node v) const { It e; first(e,v); return e; }
843 bool valid(Edge e) const { return false; }
844 bool valid(Node n) const { return n.n!=-1; }
846 void setInvalid(Edge &e) { }
847 void setInvalid(Node &n) { n.n=-1; }
849 template <typename It> It getNext(It it) const
850 { It tmp(it); return next(tmp); }
852 NodeIt& next(NodeIt& it) const {
853 it.n=nodes[it.n].next;
856 OutEdgeIt& next(OutEdgeIt& it) const { return it; }
857 InEdgeIt& next(InEdgeIt& it) const { return it; }
858 EdgeIt& next(EdgeIt& it) const { return it; }
860 int id(Node v) const { return v.n; }
861 int id(Edge e) const { return -1; }
863 /// Adds a new node to the graph.
865 /// \todo It adds the nodes in a reversed order.
866 /// (i.e. the lastly added node becomes the first.)
870 if(first_free_node==-1)
873 nodes.push_back(NodeT());
877 first_free_node = nodes[n].next;
880 nodes[n].next = first_node;
881 if(first_node != -1) nodes[first_node].prev = n;
885 nodes[n].first_in = nodes[n].first_out = -1;
889 //Update dynamic maps
890 for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
891 i!=dyn_node_maps.end(); ++i) (**i).add(nn);
896 void erase(Node nn) {
899 if(nodes[n].next != -1) nodes[nodes[n].next].prev = nodes[n].prev;
900 if(nodes[n].prev != -1) nodes[nodes[n].prev].next = nodes[n].next;
901 else first_node = nodes[n].next;
903 nodes[n].next = first_free_node;
906 //Update dynamic maps
907 for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
908 i!=dyn_node_maps.end(); ++i) (**i).erase(nn);
911 ///\bug Dynamic maps must be updated!
915 first_node = first_free_node = -1;
919 friend class NodeSet;
920 template <typename T> friend class NodeMap;
923 friend class OutEdgeIt;
924 friend class InEdgeIt;
928 friend int NodeSet::id(Node v) const;
932 Node (Invalid i) { n=-1; }
933 bool operator==(const Node i) const {return n==i.n;}
934 bool operator!=(const Node i) const {return n!=i.n;}
935 bool operator<(const Node i) const {return n<i.n;}
938 class NodeIt : public Node {
939 friend class NodeSet;
941 NodeIt(const NodeSet& G) : Node(G.first_node) { }
942 NodeIt() : Node() { }
946 //friend class NodeSet;
947 //template <typename T> friend class EdgeMap;
949 //template <typename T> friend class SymNodeSet::SymEdgeMap;
950 //friend Edge SymNodeSet::opposite(Edge) const;
952 // friend class Node;
953 // friend class NodeIt;
955 //friend int NodeSet::id(Edge e) const;
960 bool operator==(const Edge i) const {return true;}
961 bool operator!=(const Edge i) const {return false;}
962 bool operator<(const Edge i) const {return false;}
963 ///\bug This is a workaround until somebody tells me how to
964 ///make class \c SymNodeSet::SymEdgeMap friend of Edge
965 // int idref() {return -1;}
966 // int idref() const {return -1;}
969 class EdgeIt : public Edge {
970 //friend class NodeSet;
972 EdgeIt(const NodeSet& G) : Edge() { }
973 EdgeIt (Invalid i) : Edge(i) { }
974 EdgeIt() : Edge() { }
975 ///\bug This is a workaround until somebody tells me how to
976 ///make class \c SymNodeSet::SymEdgeMap friend of Edge
977 // int idref() {return -1;}
980 class OutEdgeIt : public Edge {
981 friend class NodeSet;
983 OutEdgeIt() : Edge() { }
984 OutEdgeIt (Invalid i) : Edge(i) { }
985 OutEdgeIt(const NodeSet& G,const Node v) : Edge() {}
988 class InEdgeIt : public Edge {
989 friend class NodeSet;
991 InEdgeIt() : Edge() { }
992 InEdgeIt (Invalid i) : Edge(i) { }
993 InEdgeIt(const NodeSet& G,Node v) :Edge() {}
996 template <typename T> class NodeMap : public DynMapBase<Node>
998 std::vector<T> container;
1001 typedef T ValueType;
1002 typedef Node KeyType;
1004 NodeMap(const NodeSet &_G) :
1005 DynMapBase<Node>(_G), container(_G.maxNodeId())
1007 G->dyn_node_maps.push_back(this);
1009 NodeMap(const NodeSet &_G,const T &t) :
1010 DynMapBase<Node>(_G), container(_G.maxNodeId(),t)
1012 G->dyn_node_maps.push_back(this);
1015 NodeMap(const NodeMap<T> &m) :
1016 DynMapBase<Node>(*m.G), container(m.container)
1018 G->dyn_node_maps.push_back(this);
1021 template<typename TT> friend class NodeMap;
1023 ///\todo It can copy between different types.
1025 template<typename TT> NodeMap(const NodeMap<TT> &m) :
1026 DynMapBase<Node>(*m.G)
1028 G->dyn_node_maps.push_back(this);
1029 typename std::vector<TT>::const_iterator i;
1030 for(typename std::vector<TT>::const_iterator i=m.container.begin();
1031 i!=m.container.end();
1033 container.push_back(*i);
1038 std::vector<DynMapBase<Node>* >::iterator i;
1039 for(i=G->dyn_node_maps.begin();
1040 i!=G->dyn_node_maps.end() && *i!=this; ++i) ;
1041 //if(*i==this) G->dyn_node_maps.erase(i); //FIXME: Way too slow...
1042 //A better way to do that: (Is this really important?)
1044 *i=G->dyn_node_maps.back();
1045 G->dyn_node_maps.pop_back();
1050 void add(const Node k)
1052 if(k.n>=int(container.size())) container.resize(k.n+1);
1055 void erase(const Node) { }
1057 void set(Node n, T a) { container[n.n]=a; }
1058 //'T& operator[](Node n)' would be wrong here
1059 typename std::vector<T>::reference
1060 operator[](Node n) { return container[n.n]; }
1061 //'const T& operator[](Node n)' would be wrong here
1062 typename std::vector<T>::const_reference
1063 operator[](Node n) const { return container[n.n]; }
1065 ///\warning There is no safety check at all!
1066 ///Using operator = between maps attached to different graph may
1067 ///cause serious problem.
1068 ///\todo Is this really so?
1069 ///\todo It can copy between different types.
1070 const NodeMap<T>& operator=(const NodeMap<T> &m)
1072 container = m.container;
1075 template<typename TT>
1076 const NodeMap<T>& operator=(const NodeMap<TT> &m)
1078 copy(m.container.begin(), m.container.end(), container.begin());
1082 void update() {} //Useless for Dynamic Maps
1083 void update(T a) {} //Useless for Dynamic Maps
1086 template <typename T> class EdgeMap
1089 typedef T ValueType;
1090 typedef Edge KeyType;
1092 EdgeMap(const NodeSet &) { }
1093 EdgeMap(const NodeSet &,const T &) { }
1094 EdgeMap(const EdgeMap<T> &) { }
1095 // template<typename TT> friend class EdgeMap;
1097 ///\todo It can copy between different types.
1099 template<typename TT> EdgeMap(const EdgeMap<TT> &) { }
1102 void add(const Edge ) { }
1103 void erase(const Edge) { }
1105 void set(Edge, T) { }
1106 //T get(Edge n) const { return container[n.n]; }
1107 ValueType &operator[](Edge) { return *((T*)(NULL)); }
1108 const ValueType &operator[](Edge) const { return *((T*)(NULL)); }
1110 const EdgeMap<T>& operator=(const EdgeMap<T> &) { return *this; }
1112 template<typename TT>
1113 const EdgeMap<T>& operator=(const EdgeMap<TT> &m) { return *this; }
1122 ///Graph structure using a node set of another graph.
1124 ///This structure can be used to establish another graph over a node set
1125 /// of an existing one. The node iterator will go through the nodes of the
1126 /// original graph, and the NodeMap's of both graphs will convert to
1129 ///\param GG The type of the graph which shares its node set with this class.
1130 ///Its interface must conform with \ref GraphSkeleton.
1132 ///It conforms to the graph interface documented under
1133 ///the description of \ref GraphSkeleton.
1134 ///\sa \ref GraphSkeleton.
1135 ///\sa \ref NodeSet.
1136 template<typename GG>
1139 typedef GG NodeGraphType;
1145 //Edges are double linked.
1146 //The free edges are only single linked using the "next_in" field.
1149 int first_in,first_out;
1150 NodeT() : first_in(-1), first_out(-1) { }
1156 int prev_in, prev_out;
1157 int next_in, next_out;
1161 typename NodeGraphType::NodeMap<NodeT> nodes;
1163 std::vector<EdgeT> edges;
1164 //The first free edge
1165 int first_free_edge;
1169 template <typename Key> class DynMapBase
1174 virtual void add(const Key k) = NULL;
1175 virtual void erase(const Key k) = NULL;
1176 DynMapBase(const EdgeSet &_G) : G(&_G) {}
1177 virtual ~DynMapBase() {}
1178 friend class EdgeSet;
1182 //template <typename T> class NodeMap;
1183 template <typename T> class EdgeMap;
1191 // mutable std::vector<DynMapBase<Node> * > dyn_node_maps;
1192 ///\bug It must be public because of SymEdgeMap.
1194 mutable std::vector<DynMapBase<Edge> * > dyn_edge_maps;
1203 template <typename T> class NodeMap;
1204 template <typename T> class EdgeMap;
1208 EdgeSet(NodeGraphType &_G) : G(_G),
1210 first_free_edge(-1) { }
1211 EdgeSet(const EdgeSet &_g) : G(_g.G), nodes(_g.G), edges(_g.edges),
1212 first_free_edge(_g.first_free_edge) { }
1216 // for(std::vector<DynMapBase<Node> * >::iterator i=dyn_node_maps.begin();
1217 // i!=dyn_node_maps.end(); ++i) (**i).G=NULL;
1218 for(typename std::vector<DynMapBase<Edge> * >::iterator
1219 i=dyn_edge_maps.begin();
1220 i!=dyn_edge_maps.end(); ++i) (**i).G=NULL;
1223 int nodeNum() const { return G.nodeNum(); } //FIXME: What is this?
1224 int edgeNum() const { return edges.size(); } //FIXME: What is this?
1226 ///\bug This function does something different than
1227 ///its name would suggests...
1228 int maxNodeId() const { return G.maxNodeId(); } //FIXME: What is this?
1229 ///\bug This function does something different than
1230 ///its name would suggests...
1231 int maxEdgeId() const { return edges.size(); } //FIXME: What is this?
1233 Node tail(Edge e) const { return edges[e.n].tail; }
1234 Node head(Edge e) const { return edges[e.n].head; }
1236 Node aNode(OutEdgeIt e) const { return edges[e.n].tail; }
1237 Node aNode(InEdgeIt e) const { return edges[e.n].head; }
1239 Node bNode(OutEdgeIt e) const { return edges[e.n].head; }
1240 Node bNode(InEdgeIt e) const { return edges[e.n].tail; }
1242 NodeIt& first(NodeIt& v) const {
1243 v=NodeIt(*this); return v; }
1244 EdgeIt& first(EdgeIt& e) const {
1245 e=EdgeIt(*this); return e; }
1246 OutEdgeIt& first(OutEdgeIt& e, const Node v) const {
1247 e=OutEdgeIt(*this,v); return e; }
1248 InEdgeIt& first(InEdgeIt& e, const Node v) const {
1249 e=InEdgeIt(*this,v); return e; }
1251 // template< typename It >
1252 // It first() const { It e; first(e); return e; }
1254 // template< typename It >
1255 // It first(Node v) const { It e; first(e,v); return e; }
1257 bool valid(Edge e) const { return e.n!=-1; }
1258 bool valid(Node n) const { return G.valid(n); }
1260 void setInvalid(Edge &e) { e.n=-1; }
1261 void setInvalid(Node &n) { G.setInvalid(n); }
1263 template <typename It> It getNext(It it) const
1264 { It tmp(it); return next(tmp); }
1266 NodeIt& next(NodeIt& it) const { G.next(it); return it; }
1267 OutEdgeIt& next(OutEdgeIt& it) const
1268 { it.n=edges[it.n].next_out; return it; }
1269 InEdgeIt& next(InEdgeIt& it) const
1270 { it.n=edges[it.n].next_in; return it; }
1271 EdgeIt& next(EdgeIt& it) const {
1272 if(edges[it.n].next_in!=-1) {
1273 it.n=edges[it.n].next_in;
1276 typename NodeGraphType::Node n;
1277 for(n=G.next(edges[it.n].head);
1278 G.valid(n) && nodes[n].first_in == -1;
1280 it.n = (G.valid(n))?-1:nodes[n].first_in;
1285 int id(Node v) const { return G.id(v); }
1286 int id(Edge e) const { return e.n; }
1288 /// Adds a new node to the graph.
1289 Node addNode() { return G.AddNode(); }
1291 Edge addEdge(Node u, Node v) {
1294 if(first_free_edge==-1)
1297 edges.push_back(EdgeT());
1300 n = first_free_edge;
1301 first_free_edge = edges[n].next_in;
1304 edges[n].tail = u; edges[n].head = v;
1306 edges[n].next_out = nodes[u].first_out;
1307 if(nodes[u].first_out != -1) edges[nodes[u].first_out].prev_out = n;
1308 edges[n].next_in = nodes[v].first_in;
1309 if(nodes[v].first_in != -1) edges[nodes[v].first_in].prev_in = n;
1310 edges[n].prev_in = edges[n].prev_out = -1;
1312 nodes[u].first_out = nodes[v].first_in = n;
1316 //Update dynamic maps
1317 for(typename std::vector<DynMapBase<Edge> * >::iterator
1318 i=dyn_edge_maps.begin();
1319 i!=dyn_edge_maps.end(); ++i) (**i).add(e);
1325 void eraseEdge(int n) {
1327 if(edges[n].next_in!=-1)
1328 edges[edges[n].next_in].prev_in = edges[n].prev_in;
1329 if(edges[n].prev_in!=-1)
1330 edges[edges[n].prev_in].next_in = edges[n].next_in;
1331 else nodes[edges[n].head].first_in = edges[n].next_in;
1333 if(edges[n].next_out!=-1)
1334 edges[edges[n].next_out].prev_out = edges[n].prev_out;
1335 if(edges[n].prev_out!=-1)
1336 edges[edges[n].prev_out].next_out = edges[n].next_out;
1337 else nodes[edges[n].tail].first_out = edges[n].next_out;
1339 edges[n].next_in = first_free_edge;
1340 first_free_edge = -1;
1342 //Update dynamic maps
1344 for(typename std::vector<DynMapBase<Edge> * >::iterator
1345 i=dyn_edge_maps.begin();
1346 i!=dyn_edge_maps.end(); ++i) (**i).erase(e);
1351 // void erase(Node nn) {
1354 // while((m=nodes[n].first_in)!=-1) eraseEdge(m);
1355 // while((m=nodes[n].first_out)!=-1) eraseEdge(m);
1358 void erase(Edge e) { eraseEdge(e.n); }
1360 // //\bug Dynamic maps must be updated!
1363 // nodes.clear();edges.clear();
1364 // first_node=first_free_node=first_free_edge=-1;
1367 class Node : public NodeGraphType::Node {
1368 friend class EdgeSet;
1369 // template <typename T> friend class NodeMap;
1372 friend class OutEdgeIt;
1373 friend class InEdgeIt;
1374 friend class SymEdge;
1377 friend int EdgeSet::id(Node v) const;
1378 // Node(int nn) {n=nn;}
1380 Node() : NodeGraphType::Node() {}
1381 Node (Invalid i) : NodeGraphType::Node(i) {}
1382 Node(const typename NodeGraphType::Node &n) : NodeGraphType::Node(n) {}
1385 class NodeIt : public NodeGraphType::NodeIt {
1386 friend class EdgeSet;
1388 NodeIt() : NodeGraphType::NodeIt() { }
1389 NodeIt (Invalid i) : NodeGraphType::NodeIt(i) {}
1390 NodeIt(const EdgeSet& _G) : NodeGraphType::NodeIt(_G.G) { }
1391 NodeIt(const typename NodeGraphType::NodeIt &n)
1392 : NodeGraphType::NodeIt(n) {}
1393 operator Node() { return Node(*this);}
1397 friend class EdgeSet;
1398 template <typename T> friend class EdgeMap;
1400 //template <typename T> friend class SymEdgeSet::SymEdgeMap;
1401 //friend Edge SymEdgeSet::opposite(Edge) const;
1404 friend class NodeIt;
1407 friend int EdgeSet::id(Edge e) const;
1409 Edge(int nn) {n=nn;}
1412 Edge (Invalid) { n=-1; }
1413 bool operator==(const Edge i) const {return n==i.n;}
1414 bool operator!=(const Edge i) const {return n!=i.n;}
1415 bool operator<(const Edge i) const {return n<i.n;}
1416 ///\bug This is a workaround until somebody tells me how to
1417 ///make class \c SymEdgeSet::SymEdgeMap friend of Edge
1418 int &idref() {return n;}
1419 const int &idref() const {return n;}
1422 class EdgeIt : public Edge {
1423 friend class EdgeSet;
1425 EdgeIt(const EdgeSet& G) : Edge() {
1426 typename NodeGraphType::Node m;
1428 G.valid(m) && nodes[m].first_in == -1; G.next[m]);
1429 n = G.valid(m)?-1:nodes[m].first_in;
1431 EdgeIt (Invalid i) : Edge(i) { }
1432 EdgeIt() : Edge() { }
1433 ///\bug This is a workaround until somebody tells me how to
1434 ///make class \c SymEdgeSet::SymEdgeMap friend of Edge
1435 int &idref() {return n;}
1438 class OutEdgeIt : public Edge {
1439 friend class EdgeSet;
1441 OutEdgeIt() : Edge() { }
1442 OutEdgeIt (Invalid i) : Edge(i) { }
1444 OutEdgeIt(const EdgeSet& G,const Node v) : Edge(nodes[v].first_out) { }
1447 class InEdgeIt : public Edge {
1448 friend class EdgeSet;
1450 InEdgeIt() : Edge() { }
1451 InEdgeIt (Invalid i) : Edge(i) { }
1452 InEdgeIt(const EdgeSet& G,Node v) :Edge(nodes[v].first_in) { }
1455 template <typename T> class NodeMap : public NodeGraphType::NodeMap<T>
1458 NodeMap(const EdgeSet &_G) :
1459 NodeGraphType::NodeMap<T>(_G.G) { }
1460 NodeMap(const EdgeSet &_G,const T &t) :
1461 NodeGraphType::NodeMap<T>(_G.G,t) { }
1463 NodeMap(const typename NodeGraphType::NodeMap<T> &m)
1464 : NodeGraphType::NodeMap<T>(m) { }
1466 ///\todo It can copy between different types.
1468 template<typename TT>
1469 NodeMap(const typename NodeGraphType::NodeMap<TT> &m)
1470 : NodeGraphType::NodeMap<T>(m) { }
1473 template <typename T> class EdgeMap : public DynMapBase<Edge>
1475 std::vector<T> container;
1478 typedef T ValueType;
1479 typedef Edge KeyType;
1481 EdgeMap(const EdgeSet &_G) :
1482 DynMapBase<Edge>(_G), container(_G.maxEdgeId())
1484 //FIXME: What if there are empty Id's?
1485 //FIXME: Can I use 'this' in a constructor?
1486 G->dyn_edge_maps.push_back(this);
1488 EdgeMap(const EdgeSet &_G,const T &t) :
1489 DynMapBase<Edge>(_G), container(_G.maxEdgeId(),t)
1491 G->dyn_edge_maps.push_back(this);
1493 EdgeMap(const EdgeMap<T> &m) :
1494 DynMapBase<Edge>(*m.G), container(m.container)
1496 G->dyn_node_maps.push_back(this);
1499 template<typename TT> friend class EdgeMap;
1501 ///\todo It can copy between different types.
1503 template<typename TT> EdgeMap(const EdgeMap<TT> &m) :
1504 DynMapBase<Edge>(*m.G)
1506 G->dyn_node_maps.push_back(this);
1507 typename std::vector<TT>::const_iterator i;
1508 for(typename std::vector<TT>::const_iterator i=m.container.begin();
1509 i!=m.container.end();
1511 container.push_back(*i);
1516 typename std::vector<DynMapBase<Edge>* >::iterator i;
1517 for(i=G->dyn_edge_maps.begin();
1518 i!=G->dyn_edge_maps.end() && *i!=this; ++i) ;
1519 //if(*i==this) G->dyn_edge_maps.erase(i); //Way too slow...
1520 //A better way to do that: (Is this really important?)
1522 *i=G->dyn_edge_maps.back();
1523 G->dyn_edge_maps.pop_back();
1528 void add(const Edge k)
1530 if(k.n>=int(container.size())) container.resize(k.n+1);
1532 void erase(const Edge) { }
1534 void set(Edge n, T a) { container[n.n]=a; }
1535 //T get(Edge n) const { return container[n.n]; }
1536 typename std::vector<T>::reference
1537 operator[](Edge n) { return container[n.n]; }
1538 typename std::vector<T>::const_reference
1539 operator[](Edge n) const { return container[n.n]; }
1541 ///\warning There is no safety check at all!
1542 ///Using operator = between maps attached to different graph may
1543 ///cause serious problem.
1544 ///\todo Is this really so?
1545 ///\todo It can copy between different types.
1546 const EdgeMap<T>& operator=(const EdgeMap<T> &m)
1548 container = m.container;
1551 template<typename TT>
1552 const EdgeMap<T>& operator=(const EdgeMap<TT> &m)
1554 copy(m.container.begin(), m.container.end(), container.begin());
1558 void update() {} //Useless for DynMaps
1559 void update(T a) {} //Useless for DynMaps
1576 #endif //SMART_GRAPH_H