deba@414: /* -*- C++ -*- deba@414: * deba@414: * This file is a part of LEMON, a generic C++ optimization library deba@414: * deba@414: * Copyright (C) 2003-2008 deba@414: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport deba@414: * (Egervary Research Group on Combinatorial Optimization, EGRES). deba@414: * deba@414: * Permission to use, modify and distribute this software is granted deba@414: * provided that this copyright notice appears in all copies. For deba@414: * precise terms see the accompanying LICENSE file. deba@414: * deba@414: * This software is provided "AS IS" with no warranty of any kind, deba@414: * express or implied, and with no claim as to its suitability for any deba@414: * purpose. deba@414: * deba@414: */ deba@414: deba@414: #ifndef LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H deba@414: #define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H deba@414: deba@414: #include deba@414: #include deba@414: deba@414: #include deba@414: deba@414: deba@414: ///\ingroup digraphbits deba@414: ///\file deba@414: ///\brief Extenders for the digraph adaptor types deba@414: namespace lemon { deba@414: deba@414: /// \ingroup digraphbits deba@414: /// deba@414: /// \brief Extender for the DigraphAdaptors deba@414: template deba@414: class DigraphAdaptorExtender : public _Digraph { deba@414: public: deba@414: deba@414: typedef _Digraph Parent; deba@414: typedef _Digraph Digraph; deba@414: typedef DigraphAdaptorExtender Adaptor; deba@414: deba@414: // Base extensions deba@414: deba@414: typedef typename Parent::Node Node; deba@414: typedef typename Parent::Arc Arc; deba@414: deba@414: int maxId(Node) const { deba@414: return Parent::maxNodeId(); deba@414: } deba@414: deba@414: int maxId(Arc) const { deba@414: return Parent::maxArcId(); deba@414: } deba@414: deba@414: Node fromId(int id, Node) const { deba@414: return Parent::nodeFromId(id); deba@414: } deba@414: deba@414: Arc fromId(int id, Arc) const { deba@414: return Parent::arcFromId(id); deba@414: } deba@414: deba@414: Node oppositeNode(const Node &n, const Arc &e) const { deba@414: if (n == Parent::source(e)) deba@414: return Parent::target(e); deba@414: else if(n==Parent::target(e)) deba@414: return Parent::source(e); deba@414: else deba@414: return INVALID; deba@414: } deba@414: deba@414: class NodeIt : public Node { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: NodeIt() {} deba@414: deba@414: NodeIt(Invalid i) : Node(i) { } deba@414: deba@414: explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@414: _adaptor->first(static_cast(*this)); deba@414: } deba@414: deba@414: NodeIt(const Adaptor& adaptor, const Node& node) deba@414: : Node(node), _adaptor(&adaptor) {} deba@414: deba@414: NodeIt& operator++() { deba@414: _adaptor->next(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: deba@414: class ArcIt : public Arc { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: ArcIt() { } deba@414: deba@414: ArcIt(Invalid i) : Arc(i) { } deba@414: deba@414: explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@414: _adaptor->first(static_cast(*this)); deba@414: } deba@414: deba@414: ArcIt(const Adaptor& adaptor, const Arc& e) : deba@414: Arc(e), _adaptor(&adaptor) { } deba@414: deba@414: ArcIt& operator++() { deba@414: _adaptor->next(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: deba@414: class OutArcIt : public Arc { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: OutArcIt() { } deba@414: deba@414: OutArcIt(Invalid i) : Arc(i) { } deba@414: deba@414: OutArcIt(const Adaptor& adaptor, const Node& node) deba@414: : _adaptor(&adaptor) { deba@414: _adaptor->firstOut(*this, node); deba@414: } deba@414: deba@414: OutArcIt(const Adaptor& adaptor, const Arc& arc) deba@414: : Arc(arc), _adaptor(&adaptor) {} deba@414: deba@414: OutArcIt& operator++() { deba@414: _adaptor->nextOut(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: deba@414: class InArcIt : public Arc { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: InArcIt() { } deba@414: deba@414: InArcIt(Invalid i) : Arc(i) { } deba@414: deba@414: InArcIt(const Adaptor& adaptor, const Node& node) deba@414: : _adaptor(&adaptor) { deba@414: _adaptor->firstIn(*this, node); deba@414: } deba@414: deba@414: InArcIt(const Adaptor& adaptor, const Arc& arc) : deba@414: Arc(arc), _adaptor(&adaptor) {} deba@414: deba@414: InArcIt& operator++() { deba@414: _adaptor->nextIn(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: /// \brief Base node of the iterator deba@414: /// deba@414: /// Returns the base node (ie. the source in this case) of the iterator deba@414: Node baseNode(const OutArcIt &e) const { deba@414: return Parent::source(e); deba@414: } deba@414: /// \brief Running node of the iterator deba@414: /// deba@414: /// Returns the running node (ie. the target in this case) of the deba@414: /// iterator deba@414: Node runningNode(const OutArcIt &e) const { deba@414: return Parent::target(e); deba@414: } deba@414: deba@414: /// \brief Base node of the iterator deba@414: /// deba@414: /// Returns the base node (ie. the target in this case) of the iterator deba@414: Node baseNode(const InArcIt &e) const { deba@414: return Parent::target(e); deba@414: } deba@414: /// \brief Running node of the iterator deba@414: /// deba@414: /// Returns the running node (ie. the source in this case) of the deba@414: /// iterator deba@414: Node runningNode(const InArcIt &e) const { deba@414: return Parent::source(e); deba@414: } deba@414: deba@414: }; deba@414: deba@414: deba@414: /// \ingroup digraphbits deba@414: /// deba@414: /// \brief Extender for the GraphAdaptors deba@414: template deba@414: class GraphAdaptorExtender : public _Graph { deba@414: public: deba@414: deba@414: typedef _Graph Parent; deba@414: typedef _Graph Graph; deba@414: typedef GraphAdaptorExtender Adaptor; deba@414: deba@414: typedef typename Parent::Node Node; deba@414: typedef typename Parent::Arc Arc; deba@414: typedef typename Parent::Edge Edge; deba@414: deba@414: // Graph extension deba@414: deba@414: int maxId(Node) const { deba@414: return Parent::maxNodeId(); deba@414: } deba@414: deba@414: int maxId(Arc) const { deba@414: return Parent::maxArcId(); deba@414: } deba@414: deba@414: int maxId(Edge) const { deba@414: return Parent::maxEdgeId(); deba@414: } deba@414: deba@414: Node fromId(int id, Node) const { deba@414: return Parent::nodeFromId(id); deba@414: } deba@414: deba@414: Arc fromId(int id, Arc) const { deba@414: return Parent::arcFromId(id); deba@414: } deba@414: deba@414: Edge fromId(int id, Edge) const { deba@414: return Parent::edgeFromId(id); deba@414: } deba@414: deba@414: Node oppositeNode(const Node &n, const Edge &e) const { deba@414: if( n == Parent::u(e)) deba@414: return Parent::v(e); deba@414: else if( n == Parent::v(e)) deba@414: return Parent::u(e); deba@414: else deba@414: return INVALID; deba@414: } deba@414: deba@414: Arc oppositeArc(const Arc &a) const { deba@414: return Parent::direct(a, !Parent::direction(a)); deba@414: } deba@414: deba@414: using Parent::direct; deba@414: Arc direct(const Edge &e, const Node &s) const { deba@414: return Parent::direct(e, Parent::u(e) == s); deba@414: } deba@414: deba@414: deba@414: class NodeIt : public Node { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: NodeIt() {} deba@414: deba@414: NodeIt(Invalid i) : Node(i) { } deba@414: deba@414: explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@414: _adaptor->first(static_cast(*this)); deba@414: } deba@414: deba@414: NodeIt(const Adaptor& adaptor, const Node& node) deba@414: : Node(node), _adaptor(&adaptor) {} deba@414: deba@414: NodeIt& operator++() { deba@414: _adaptor->next(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: deba@414: class ArcIt : public Arc { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: ArcIt() { } deba@414: deba@414: ArcIt(Invalid i) : Arc(i) { } deba@414: deba@414: explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@414: _adaptor->first(static_cast(*this)); deba@414: } deba@414: deba@414: ArcIt(const Adaptor& adaptor, const Arc& e) : deba@414: Arc(e), _adaptor(&adaptor) { } deba@414: deba@414: ArcIt& operator++() { deba@414: _adaptor->next(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: deba@414: class OutArcIt : public Arc { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: OutArcIt() { } deba@414: deba@414: OutArcIt(Invalid i) : Arc(i) { } deba@414: deba@414: OutArcIt(const Adaptor& adaptor, const Node& node) deba@414: : _adaptor(&adaptor) { deba@414: _adaptor->firstOut(*this, node); deba@414: } deba@414: deba@414: OutArcIt(const Adaptor& adaptor, const Arc& arc) deba@414: : Arc(arc), _adaptor(&adaptor) {} deba@414: deba@414: OutArcIt& operator++() { deba@414: _adaptor->nextOut(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: deba@414: class InArcIt : public Arc { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: InArcIt() { } deba@414: deba@414: InArcIt(Invalid i) : Arc(i) { } deba@414: deba@414: InArcIt(const Adaptor& adaptor, const Node& node) deba@414: : _adaptor(&adaptor) { deba@414: _adaptor->firstIn(*this, node); deba@414: } deba@414: deba@414: InArcIt(const Adaptor& adaptor, const Arc& arc) : deba@414: Arc(arc), _adaptor(&adaptor) {} deba@414: deba@414: InArcIt& operator++() { deba@414: _adaptor->nextIn(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: class EdgeIt : public Parent::Edge { deba@414: const Adaptor* _adaptor; deba@414: public: deba@414: deba@414: EdgeIt() { } deba@414: deba@414: EdgeIt(Invalid i) : Edge(i) { } deba@414: deba@414: explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@414: _adaptor->first(static_cast(*this)); deba@414: } deba@414: deba@414: EdgeIt(const Adaptor& adaptor, const Edge& e) : deba@414: Edge(e), _adaptor(&adaptor) { } deba@414: deba@414: EdgeIt& operator++() { deba@414: _adaptor->next(*this); deba@414: return *this; deba@414: } deba@414: deba@414: }; deba@414: deba@414: class IncEdgeIt : public Edge { deba@414: friend class GraphAdaptorExtender; deba@414: const Adaptor* _adaptor; deba@414: bool direction; deba@414: public: deba@414: deba@414: IncEdgeIt() { } deba@414: deba@414: IncEdgeIt(Invalid i) : Edge(i), direction(false) { } deba@414: deba@414: IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) { deba@414: _adaptor->firstInc(static_cast(*this), direction, n); deba@414: } deba@414: deba@414: IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n) deba@414: : _adaptor(&adaptor), Edge(e) { deba@414: direction = (_adaptor->u(e) == n); deba@414: } deba@414: deba@414: IncEdgeIt& operator++() { deba@414: _adaptor->nextInc(*this, direction); deba@414: return *this; deba@414: } deba@414: }; deba@414: deba@414: /// \brief Base node of the iterator deba@414: /// deba@414: /// Returns the base node (ie. the source in this case) of the iterator deba@414: Node baseNode(const OutArcIt &a) const { deba@414: return Parent::source(a); deba@414: } deba@414: /// \brief Running node of the iterator deba@414: /// deba@414: /// Returns the running node (ie. the target in this case) of the deba@414: /// iterator deba@414: Node runningNode(const OutArcIt &a) const { deba@414: return Parent::target(a); deba@414: } deba@414: deba@414: /// \brief Base node of the iterator deba@414: /// deba@414: /// Returns the base node (ie. the target in this case) of the iterator deba@414: Node baseNode(const InArcIt &a) const { deba@414: return Parent::target(a); deba@414: } deba@414: /// \brief Running node of the iterator deba@414: /// deba@414: /// Returns the running node (ie. the source in this case) of the deba@414: /// iterator deba@414: Node runningNode(const InArcIt &a) const { deba@414: return Parent::source(a); deba@414: } deba@414: deba@414: /// Base node of the iterator deba@414: /// deba@414: /// Returns the base node of the iterator deba@414: Node baseNode(const IncEdgeIt &e) const { deba@414: return e.direction ? Parent::u(e) : Parent::v(e); deba@414: } deba@414: /// Running node of the iterator deba@414: /// deba@414: /// Returns the running node of the iterator deba@414: Node runningNode(const IncEdgeIt &e) const { deba@414: return e.direction ? Parent::v(e) : Parent::u(e); deba@414: } deba@414: deba@414: }; deba@414: deba@414: } deba@414: deba@414: deba@414: #endif