src/hugo/smart_graph.h
changeset 916 c0734a8c282c
parent 909 6a22e0dfd453
child 919 6153d9cf78c6
equal deleted inserted replaced
19:d79cb3bb1458 20:cd9fe36e2355
   392       Parent::OutEdgeIt out;
   392       Parent::OutEdgeIt out;
   393       Parent::InEdgeIt in;      
   393       Parent::InEdgeIt in;      
   394     public: 
   394     public: 
   395       OutEdgeIt() {}
   395       OutEdgeIt() {}
   396       OutEdgeIt(const SymSmartGraph& g, Edge e) { 
   396       OutEdgeIt(const SymSmartGraph& g, Edge e) { 
   397 	if (e.id & 1 == 0) {	
   397 	if ((e.id & 1) == 0) {	
   398 	  out = Parent::OutEdgeIt(g, SymEdge(e));
   398 	  out = Parent::OutEdgeIt(g, SymEdge(e));
   399 	  in = Parent::InEdgeIt(g, g.tail(e));
   399 	  in = Parent::InEdgeIt(g, g.tail(e));
   400 	} else {
   400 	} else {
   401 	  out = Parent::OutEdgeIt(INVALID);
   401 	  out = Parent::OutEdgeIt(INVALID);
   402 	  in = Parent::InEdgeIt(g, SymEdge(e));
   402 	  in = Parent::InEdgeIt(g, SymEdge(e));
   429       Parent::OutEdgeIt out;
   429       Parent::OutEdgeIt out;
   430       Parent::InEdgeIt in;      
   430       Parent::InEdgeIt in;      
   431     public: 
   431     public: 
   432       InEdgeIt() {}
   432       InEdgeIt() {}
   433       InEdgeIt(const SymSmartGraph& g, Edge e) { 
   433       InEdgeIt(const SymSmartGraph& g, Edge e) { 
   434 	if (e.id & 1 == 0) {	
   434 	if ((e.id & 1) == 0) {	
   435 	  out = Parent::OutEdgeIt(g, SymEdge(e));
   435 	  out = Parent::OutEdgeIt(g, SymEdge(e));
   436 	  in = Parent::InEdgeIt(g, g.tail(e));
   436 	  in = Parent::InEdgeIt(g, g.tail(e));
   437 	} else {
   437 	} else {
   438 	  out = Parent::OutEdgeIt(INVALID);
   438 	  out = Parent::OutEdgeIt(INVALID);
   439 	  in = Parent::InEdgeIt(g, SymEdge(e));
   439 	  in = Parent::InEdgeIt(g, SymEdge(e));
   538     ///\sa id(SymEdge)
   538     ///\sa id(SymEdge)
   539     int maxSymEdgeId() const { return Parent::maxEdgeId(); }
   539     int maxSymEdgeId() const { return Parent::maxEdgeId(); }
   540 
   540 
   541 
   541 
   542     Node tail(Edge e) const { 
   542     Node tail(Edge e) const { 
   543       return e.id & 1 == 0 ? 
   543       return (e.id & 1) == 0 ? 
   544 	Parent::tail(SymEdge(e)) : Parent::head(SymEdge(e)); 
   544 	Parent::tail(SymEdge(e)) : Parent::head(SymEdge(e)); 
   545     }
   545     }
   546 
   546 
   547     Node head(Edge e) const { 
   547     Node head(Edge e) const { 
   548       return e.id & 1 == 0 ? 
   548       return (e.id & 1) == 0 ? 
   549 	Parent::head(SymEdge(e)) : Parent::tail(SymEdge(e)); 
   549 	Parent::head(SymEdge(e)) : Parent::tail(SymEdge(e)); 
   550     }
   550     }
   551 
   551 
   552     Node tail(SymEdge e) const { 
   552     Node tail(SymEdge e) const { 
   553       return Parent::tail(e); 
   553       return Parent::tail(e); 
   628 	if (se != INVALID) return backward(se);	
   628 	if (se != INVALID) return backward(se);	
   629       }
   629       }
   630       return INVALID;
   630       return INVALID;
   631     }
   631     }
   632 
   632 
   633     /// Finds an symmetric edge between two nodes.
   633 //     /// Finds an symmetric edge between two nodes.
   634 
   634 
   635     /// Finds an symmetric edge from node \c u to node \c v.
   635 //     /// Finds an symmetric edge from node \c u to node \c v.
   636     ///
   636 //     ///
   637     /// If \c prev is \ref INVALID (this is the default value), then
   637 //     /// If \c prev is \ref INVALID (this is the default value), then
   638     /// It finds the first edge from \c u to \c v. Otherwise it looks for
   638 //     /// It finds the first edge from \c u to \c v. Otherwise it looks for
   639     /// the next edge from \c u to \c v after \c prev.
   639 //     /// the next edge from \c u to \c v after \c prev.
   640     /// \return The found edge or INVALID if there is no such an edge.
   640 //     /// \return The found edge or INVALID if there is no such an edge.
   641 
   641 
   642 //     SymEdge findEdge(Node u, Node v, SymEdge prev = INVALID) 
   642 //     SymEdge findEdge(Node u, Node v, SymEdge prev = INVALID) 
   643 //     {     
   643 //     {     
   644 //       if (prev == INVALID || id(prev) & 1 == 0) {
   644 //       if (prev == INVALID || id(prev) & 1 == 0) {
   645 // 	SymEdge se = Parent::findEdge(u, v, SymEdge(prev));
   645 // 	SymEdge se = Parent::findEdge(u, v, SymEdge(prev));
   665     static Edge forward(SymEdge e) {
   665     static Edge forward(SymEdge e) {
   666       return Edge(id(e) << 1);
   666       return Edge(id(e) << 1);
   667     }
   667     }
   668 
   668 
   669     static Edge backward(SymEdge e) {
   669     static Edge backward(SymEdge e) {
   670       return Edge((id(e) << 1) & 1);
   670       return Edge((id(e) << 1) | 1);
   671     }
   671     }
   672 
   672 
   673   };
   673   };
   674   ///Graph for bidirectional edges.
   674   ///Graph for bidirectional edges.
   675 
   675