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 |