lemon/bits/base_extender.h
changeset 2222 a24939ee343c
parent 2187 a54a2dd03f03
child 2231 06faf3f06d67
equal deleted inserted replaced
3:424572abd34a 4:48d58b3ecfde
    33 ///\brief Extenders for the graph types
    33 ///\brief Extenders for the graph types
    34 namespace lemon {
    34 namespace lemon {
    35 
    35 
    36   /// \ingroup graphbits
    36   /// \ingroup graphbits
    37   ///
    37   ///
    38   /// \brief BaseExtender for the UGraphs
    38   /// \brief BaseGraph to BaseUGraph extender
    39   template <typename Base>
    39   template <typename Base>
    40   class UndirGraphExtender : public Base {
    40   class UndirGraphExtender : public Base {
    41 
    41 
    42   public:
    42   public:
    43 
    43 
   236 
   236 
   237     int uEdgeNum() const {
   237     int uEdgeNum() const {
   238       return Parent::edgeNum();
   238       return Parent::edgeNum();
   239     }
   239     }
   240 
   240 
   241     Edge findEdge(Node source, Node target, Edge prev) const {
   241     Edge findEdge(Node source, Node target, Edge prev = INVALID) const {
   242       if (prev == INVALID) {
   242       if (prev == INVALID) {
   243 	UEdge edge = Parent::findEdge(source, target);
   243 	UEdge edge = Parent::findEdge(source, target);
   244 	if (edge != INVALID) return direct(edge, true);
   244 	if (edge != INVALID) return direct(edge, true);
   245 	edge = Parent::findEdge(target, source);
   245 	edge = Parent::findEdge(target, source);
   246 	if (edge != INVALID) return direct(edge, false);
   246 	if (edge != INVALID) return direct(edge, false);
   254 	if (edge != INVALID) return direct(edge, false);	      
   254 	if (edge != INVALID) return direct(edge, false);	      
   255       }
   255       }
   256       return INVALID;
   256       return INVALID;
   257     }
   257     }
   258 
   258 
   259     UEdge findUEdge(Node source, Node target, UEdge prev) const {
   259     UEdge findUEdge(Node source, Node target, UEdge prev = INVALID) const {
   260       if (prev == INVALID) {
   260       if (source != target) {
   261 	UEdge edge = Parent::findEdge(source, target);
   261         if (prev == INVALID) {
   262 	if (edge != INVALID) return edge;
   262           UEdge edge = Parent::findEdge(source, target);
   263 	edge = Parent::findEdge(target, source);
   263           if (edge != INVALID) return edge;
   264 	if (edge != INVALID) return edge;
   264           edge = Parent::findEdge(target, source);
   265       } else if (Parent::source(prev) == source) {
   265           if (edge != INVALID) return edge;
   266 	UEdge edge = Parent::findEdge(source, target, prev);
   266         } else if (Parent::source(prev) == source) {
   267 	if (edge != INVALID) return edge;
   267           UEdge edge = Parent::findEdge(source, target, prev);
   268 	edge = Parent::findEdge(target, source);
   268           if (edge != INVALID) return edge;
   269 	if (edge != INVALID) return edge;	
   269           edge = Parent::findEdge(target, source);
       
   270           if (edge != INVALID) return edge;	
       
   271         } else {
       
   272           UEdge edge = Parent::findEdge(target, source, prev);
       
   273           if (edge != INVALID) return edge;	      
       
   274         }
   270       } else {
   275       } else {
   271 	UEdge edge = Parent::findEdge(target, source, prev);
   276         return Parent::findEdge(source, target, prev);
   272 	if (edge != INVALID) return edge;	      
       
   273       }
   277       }
   274       return INVALID;
   278       return INVALID;
   275     }
   279     }
   276   };
   280   };
   277 
   281