Changeset 2076:10681ee9d8ae in lemon-0.x for lemon/bits/base_extender.h
- Timestamp:
- 05/12/06 11:51:45 (18 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2739
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/bits/base_extender.h
r2031 r2076 38 38 /// \brief BaseExtender for the UGraphs 39 39 template <typename Base> 40 class U GraphBaseExtender : public Base {40 class UndirGraphExtender : public Base { 41 41 42 42 public: … … 49 49 50 50 class Edge : public UEdge { 51 friend class U GraphBaseExtender;51 friend class UndirGraphExtender; 52 52 53 53 protected: … … 276 276 }; 277 277 278 279 /// \ingroup graphbits280 ///281 /// \brief BaseExtender for the BpUGraphs282 template <typename Base>283 class BpUGraphBaseExtender : public Base {284 public:285 typedef Base Parent;286 typedef BpUGraphBaseExtender Graph;287 288 typedef typename Parent::Node Node;289 typedef typename Parent::Edge UEdge;290 291 292 using Parent::first;293 using Parent::next;294 295 using Parent::id;296 297 class ANode : public Node {298 friend class BpUGraphBaseExtender;299 public:300 ANode() {}301 ANode(const Node& node) : Node(node) {302 LEMON_ASSERT(Parent::aNode(node) || node == INVALID,303 typename Parent::NodeSetError());304 }305 ANode(Invalid) : Node(INVALID) {}306 };307 308 void first(ANode& node) const {309 Parent::firstANode(static_cast<Node&>(node));310 }311 void next(ANode& node) const {312 Parent::nextANode(static_cast<Node&>(node));313 }314 315 int id(const ANode& node) const {316 return Parent::aNodeId(node);317 }318 319 class BNode : public Node {320 friend class BpUGraphBaseExtender;321 public:322 BNode() {}323 BNode(const Node& node) : Node(node) {324 LEMON_ASSERT(Parent::bNode(node) || node == INVALID,325 typename Parent::NodeSetError());326 }327 BNode(Invalid) : Node(INVALID) {}328 };329 330 void first(BNode& node) const {331 Parent::firstBNode(static_cast<Node&>(node));332 }333 void next(BNode& node) const {334 Parent::nextBNode(static_cast<Node&>(node));335 }336 337 int id(const BNode& node) const {338 return Parent::aNodeId(node);339 }340 341 Node source(const UEdge& edge) const {342 return aNode(edge);343 }344 Node target(const UEdge& edge) const {345 return bNode(edge);346 }347 348 void firstInc(UEdge& edge, bool& direction, const Node& node) const {349 if (Parent::aNode(node)) {350 Parent::firstOut(edge, node);351 direction = true;352 } else {353 Parent::firstIn(edge, node);354 direction = static_cast<UEdge&>(edge) == INVALID;355 }356 }357 void nextInc(UEdge& edge, bool& direction) const {358 if (direction) {359 Parent::nextOut(edge);360 } else {361 Parent::nextIn(edge);362 if (edge == INVALID) direction = true;363 }364 }365 366 int maxUEdgeId() const {367 return Parent::maxEdgeId();368 }369 370 UEdge uEdgeFromId(int id) const {371 return Parent::edgeFromId(id);372 }373 374 class Edge : public UEdge {375 friend class BpUGraphBaseExtender;376 protected:377 bool forward;378 379 Edge(const UEdge& edge, bool _forward)380 : UEdge(edge), forward(_forward) {}381 382 public:383 Edge() {}384 Edge (Invalid) : UEdge(INVALID), forward(true) {}385 bool operator==(const Edge& i) const {386 return UEdge::operator==(i) && forward == i.forward;387 }388 bool operator!=(const Edge& i) const {389 return UEdge::operator!=(i) || forward != i.forward;390 }391 bool operator<(const Edge& i) const {392 return UEdge::operator<(i) ||393 (!(i.forward<forward) && UEdge(*this)<UEdge(i));394 }395 };396 397 void first(Edge& edge) const {398 Parent::first(static_cast<UEdge&>(edge));399 edge.forward = true;400 }401 402 void next(Edge& edge) const {403 if (!edge.forward) {404 Parent::next(static_cast<UEdge&>(edge));405 }406 edge.forward = !edge.forward;407 }408 409 void firstOut(Edge& edge, const Node& node) const {410 if (Parent::aNode(node)) {411 Parent::firstOut(edge, node);412 edge.forward = true;413 } else {414 Parent::firstIn(edge, node);415 edge.forward = static_cast<UEdge&>(edge) == INVALID;416 }417 }418 void nextOut(Edge& edge) const {419 if (edge.forward) {420 Parent::nextOut(edge);421 } else {422 Parent::nextIn(edge);423 edge.forward = static_cast<UEdge&>(edge) == INVALID;424 }425 }426 427 void firstIn(Edge& edge, const Node& node) const {428 if (Parent::bNode(node)) {429 Parent::firstIn(edge, node);430 edge.forward = true;431 } else {432 Parent::firstOut(edge, node);433 edge.forward = static_cast<UEdge&>(edge) == INVALID;434 }435 }436 void nextIn(Edge& edge) const {437 if (edge.forward) {438 Parent::nextIn(edge);439 } else {440 Parent::nextOut(edge);441 edge.forward = static_cast<UEdge&>(edge) == INVALID;442 }443 }444 445 Node source(const Edge& edge) const {446 return edge.forward ? Parent::aNode(edge) : Parent::bNode(edge);447 }448 Node target(const Edge& edge) const {449 return edge.forward ? Parent::bNode(edge) : Parent::aNode(edge);450 }451 452 int id(const Edge& edge) const {453 return (Parent::id(edge) << 1) + (edge.forward ? 0 : 1);454 }455 Edge edgeFromId(int id) const {456 return Edge(Parent::fromId(id >> 1, UEdge()), (id & 1) == 0);457 }458 int maxEdgeId() const {459 return (Parent::maxId(UEdge()) << 1) + 1;460 }461 462 bool direction(const Edge& edge) const {463 return edge.forward;464 }465 466 Edge direct(const UEdge& edge, bool direction) const {467 return Edge(edge, direction);468 }469 470 int edgeNum() const {471 return 2 * Parent::edgeNum();472 }473 474 int uEdgeNum() const {475 return Parent::edgeNum();476 }477 478 };479 480 278 } 481 279
Note: See TracChangeset
for help on using the changeset viewer.