deba@491: /* -*- C++ -*- deba@491: * deba@491: * This file is a part of LEMON, a generic C++ optimization library deba@491: * deba@491: * Copyright (C) 2003-2008 deba@491: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport deba@491: * (Egervary Research Group on Combinatorial Optimization, EGRES). deba@491: * deba@491: * Permission to use, modify and distribute this software is granted deba@491: * provided that this copyright notice appears in all copies. For deba@491: * precise terms see the accompanying LICENSE file. deba@491: * deba@491: * This software is provided "AS IS" with no warranty of any kind, deba@491: * express or implied, and with no claim as to its suitability for any deba@491: * purpose. deba@491: * deba@491: */ deba@491: deba@491: #ifndef LEMON_BITS_EDGE_SET_EXTENDER_H deba@491: #define LEMON_BITS_EDGE_SET_EXTENDER_H deba@491: deba@566: #include deba@491: #include deba@491: #include deba@566: #include deba@491: kpeter@606: //\ingroup digraphbits kpeter@606: //\file kpeter@606: //\brief Extenders for the arc set types deba@491: namespace lemon { deba@491: kpeter@606: // \ingroup digraphbits kpeter@606: // kpeter@606: // \brief Extender for the ArcSets deba@491: template deba@491: class ArcSetExtender : public Base { kpeter@664: typedef Base Parent; kpeter@664: deba@491: public: deba@491: deba@491: typedef ArcSetExtender Digraph; deba@491: deba@491: // Base extensions deba@491: deba@491: typedef typename Parent::Node Node; deba@491: typedef typename Parent::Arc Arc; deba@491: deba@491: int maxId(Node) const { deba@491: return Parent::maxNodeId(); deba@491: } deba@491: deba@491: int maxId(Arc) const { deba@491: return Parent::maxArcId(); deba@491: } deba@491: deba@491: Node fromId(int id, Node) const { deba@491: return Parent::nodeFromId(id); deba@491: } deba@491: deba@491: Arc fromId(int id, Arc) const { deba@491: return Parent::arcFromId(id); deba@491: } deba@491: deba@491: Node oppositeNode(const Node &n, const Arc &e) const { deba@491: if (n == Parent::source(e)) deba@491: return Parent::target(e); deba@491: else if(n==Parent::target(e)) deba@491: return Parent::source(e); deba@491: else deba@491: return INVALID; deba@491: } deba@491: deba@491: deba@491: // Alteration notifier extensions deba@491: kpeter@606: // The arc observer registry. deba@491: typedef AlterationNotifier ArcNotifier; deba@491: deba@491: protected: deba@491: deba@491: mutable ArcNotifier arc_notifier; deba@491: deba@491: public: deba@491: deba@491: using Parent::notifier; deba@491: kpeter@606: // Gives back the arc alteration notifier. deba@491: ArcNotifier& notifier(Arc) const { deba@491: return arc_notifier; deba@491: } deba@491: deba@491: // Iterable extensions deba@491: deba@491: class NodeIt : public Node { deba@491: const Digraph* digraph; deba@491: public: deba@491: deba@491: NodeIt() {} deba@491: deba@491: NodeIt(Invalid i) : Node(i) { } deba@491: deba@491: explicit NodeIt(const Digraph& _graph) : digraph(&_graph) { deba@491: _graph.first(static_cast(*this)); deba@491: } deba@491: deba@491: NodeIt(const Digraph& _graph, const Node& node) deba@491: : Node(node), digraph(&_graph) {} deba@491: deba@491: NodeIt& operator++() { deba@491: digraph->next(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: class ArcIt : public Arc { deba@491: const Digraph* digraph; deba@491: public: deba@491: deba@491: ArcIt() { } deba@491: deba@491: ArcIt(Invalid i) : Arc(i) { } deba@491: deba@491: explicit ArcIt(const Digraph& _graph) : digraph(&_graph) { deba@491: _graph.first(static_cast(*this)); deba@491: } deba@491: deba@491: ArcIt(const Digraph& _graph, const Arc& e) : deba@491: Arc(e), digraph(&_graph) { } deba@491: deba@491: ArcIt& operator++() { deba@491: digraph->next(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: class OutArcIt : public Arc { deba@491: const Digraph* digraph; deba@491: public: deba@491: deba@491: OutArcIt() { } deba@491: deba@491: OutArcIt(Invalid i) : Arc(i) { } deba@491: deba@491: OutArcIt(const Digraph& _graph, const Node& node) deba@491: : digraph(&_graph) { deba@491: _graph.firstOut(*this, node); deba@491: } deba@491: deba@491: OutArcIt(const Digraph& _graph, const Arc& arc) deba@491: : Arc(arc), digraph(&_graph) {} deba@491: deba@491: OutArcIt& operator++() { deba@491: digraph->nextOut(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: class InArcIt : public Arc { deba@491: const Digraph* digraph; deba@491: public: deba@491: deba@491: InArcIt() { } deba@491: deba@491: InArcIt(Invalid i) : Arc(i) { } deba@491: deba@491: InArcIt(const Digraph& _graph, const Node& node) deba@491: : digraph(&_graph) { deba@491: _graph.firstIn(*this, node); deba@491: } deba@491: deba@491: InArcIt(const Digraph& _graph, const Arc& arc) : deba@491: Arc(arc), digraph(&_graph) {} deba@491: deba@491: InArcIt& operator++() { deba@491: digraph->nextIn(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: kpeter@606: // \brief Base node of the iterator kpeter@606: // kpeter@606: // Returns the base node (ie. the source in this case) of the iterator deba@491: Node baseNode(const OutArcIt &e) const { deba@491: return Parent::source(static_cast(e)); deba@491: } kpeter@606: // \brief Running node of the iterator kpeter@606: // kpeter@606: // Returns the running node (ie. the target in this case) of the kpeter@606: // iterator deba@491: Node runningNode(const OutArcIt &e) const { deba@491: return Parent::target(static_cast(e)); deba@491: } deba@491: kpeter@606: // \brief Base node of the iterator kpeter@606: // kpeter@606: // Returns the base node (ie. the target in this case) of the iterator deba@491: Node baseNode(const InArcIt &e) const { deba@491: return Parent::target(static_cast(e)); deba@491: } kpeter@606: // \brief Running node of the iterator kpeter@606: // kpeter@606: // Returns the running node (ie. the source in this case) of the kpeter@606: // iterator deba@491: Node runningNode(const InArcIt &e) const { deba@491: return Parent::source(static_cast(e)); deba@491: } deba@491: deba@491: using Parent::first; deba@491: deba@491: // Mappable extension deba@491: deba@491: template deba@491: class ArcMap deba@491: : public MapExtender > { deba@491: typedef MapExtender > Parent; deba@491: kpeter@664: public: deba@491: explicit ArcMap(const Digraph& _g) deba@491: : Parent(_g) {} deba@491: ArcMap(const Digraph& _g, const _Value& _v) deba@491: : Parent(_g, _v) {} deba@491: deba@491: ArcMap& operator=(const ArcMap& cmap) { deba@491: return operator=(cmap); deba@491: } deba@491: deba@491: template deba@491: ArcMap& operator=(const CMap& cmap) { deba@491: Parent::operator=(cmap); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: // Alteration extension deba@491: deba@491: Arc addArc(const Node& from, const Node& to) { deba@491: Arc arc = Parent::addArc(from, to); deba@491: notifier(Arc()).add(arc); deba@491: return arc; deba@491: } deba@491: deba@491: void clear() { deba@491: notifier(Arc()).clear(); deba@491: Parent::clear(); deba@491: } deba@491: deba@491: void erase(const Arc& arc) { deba@491: notifier(Arc()).erase(arc); deba@491: Parent::erase(arc); deba@491: } deba@491: deba@491: ArcSetExtender() { deba@491: arc_notifier.setContainer(*this); deba@491: } deba@491: deba@491: ~ArcSetExtender() { deba@491: arc_notifier.clear(); deba@491: } deba@491: deba@491: }; deba@491: deba@491: kpeter@606: // \ingroup digraphbits kpeter@606: // kpeter@606: // \brief Extender for the EdgeSets deba@491: template deba@491: class EdgeSetExtender : public Base { kpeter@664: typedef Base Parent; deba@491: deba@491: public: deba@491: kpeter@664: typedef EdgeSetExtender Graph; deba@491: deba@491: typedef typename Parent::Node Node; deba@491: typedef typename Parent::Arc Arc; deba@491: typedef typename Parent::Edge Edge; deba@491: deba@491: int maxId(Node) const { deba@491: return Parent::maxNodeId(); deba@491: } deba@491: deba@491: int maxId(Arc) const { deba@491: return Parent::maxArcId(); deba@491: } deba@491: deba@491: int maxId(Edge) const { deba@491: return Parent::maxEdgeId(); deba@491: } deba@491: deba@491: Node fromId(int id, Node) const { deba@491: return Parent::nodeFromId(id); deba@491: } deba@491: deba@491: Arc fromId(int id, Arc) const { deba@491: return Parent::arcFromId(id); deba@491: } deba@491: deba@491: Edge fromId(int id, Edge) const { deba@491: return Parent::edgeFromId(id); deba@491: } deba@491: deba@491: Node oppositeNode(const Node &n, const Edge &e) const { deba@491: if( n == Parent::u(e)) deba@491: return Parent::v(e); deba@491: else if( n == Parent::v(e)) deba@491: return Parent::u(e); deba@491: else deba@491: return INVALID; deba@491: } deba@491: deba@491: Arc oppositeArc(const Arc &e) const { deba@491: return Parent::direct(e, !Parent::direction(e)); deba@491: } deba@491: deba@491: using Parent::direct; deba@491: Arc direct(const Edge &e, const Node &s) const { deba@491: return Parent::direct(e, Parent::u(e) == s); deba@491: } deba@491: deba@491: typedef AlterationNotifier ArcNotifier; deba@491: typedef AlterationNotifier EdgeNotifier; deba@491: deba@491: deba@491: protected: deba@491: deba@491: mutable ArcNotifier arc_notifier; deba@491: mutable EdgeNotifier edge_notifier; deba@491: deba@491: public: deba@491: deba@491: using Parent::notifier; deba@491: deba@491: ArcNotifier& notifier(Arc) const { deba@491: return arc_notifier; deba@491: } deba@491: deba@491: EdgeNotifier& notifier(Edge) const { deba@491: return edge_notifier; deba@491: } deba@491: deba@491: deba@491: class NodeIt : public Node { kpeter@664: const Graph* graph; deba@491: public: deba@491: deba@491: NodeIt() {} deba@491: deba@491: NodeIt(Invalid i) : Node(i) { } deba@491: kpeter@664: explicit NodeIt(const Graph& _graph) : graph(&_graph) { deba@491: _graph.first(static_cast(*this)); deba@491: } deba@491: kpeter@664: NodeIt(const Graph& _graph, const Node& node) kpeter@664: : Node(node), graph(&_graph) {} deba@491: deba@491: NodeIt& operator++() { kpeter@664: graph->next(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: class ArcIt : public Arc { kpeter@664: const Graph* graph; deba@491: public: deba@491: deba@491: ArcIt() { } deba@491: deba@491: ArcIt(Invalid i) : Arc(i) { } deba@491: kpeter@664: explicit ArcIt(const Graph& _graph) : graph(&_graph) { deba@491: _graph.first(static_cast(*this)); deba@491: } deba@491: kpeter@664: ArcIt(const Graph& _graph, const Arc& e) : kpeter@664: Arc(e), graph(&_graph) { } deba@491: deba@491: ArcIt& operator++() { kpeter@664: graph->next(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: class OutArcIt : public Arc { kpeter@664: const Graph* graph; deba@491: public: deba@491: deba@491: OutArcIt() { } deba@491: deba@491: OutArcIt(Invalid i) : Arc(i) { } deba@491: kpeter@664: OutArcIt(const Graph& _graph, const Node& node) kpeter@664: : graph(&_graph) { deba@491: _graph.firstOut(*this, node); deba@491: } deba@491: kpeter@664: OutArcIt(const Graph& _graph, const Arc& arc) kpeter@664: : Arc(arc), graph(&_graph) {} deba@491: deba@491: OutArcIt& operator++() { kpeter@664: graph->nextOut(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: class InArcIt : public Arc { kpeter@664: const Graph* graph; deba@491: public: deba@491: deba@491: InArcIt() { } deba@491: deba@491: InArcIt(Invalid i) : Arc(i) { } deba@491: kpeter@664: InArcIt(const Graph& _graph, const Node& node) kpeter@664: : graph(&_graph) { deba@491: _graph.firstIn(*this, node); deba@491: } deba@491: kpeter@664: InArcIt(const Graph& _graph, const Arc& arc) : kpeter@664: Arc(arc), graph(&_graph) {} deba@491: deba@491: InArcIt& operator++() { kpeter@664: graph->nextIn(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: class EdgeIt : public Parent::Edge { kpeter@664: const Graph* graph; deba@491: public: deba@491: deba@491: EdgeIt() { } deba@491: deba@491: EdgeIt(Invalid i) : Edge(i) { } deba@491: kpeter@664: explicit EdgeIt(const Graph& _graph) : graph(&_graph) { deba@491: _graph.first(static_cast(*this)); deba@491: } deba@491: kpeter@664: EdgeIt(const Graph& _graph, const Edge& e) : kpeter@664: Edge(e), graph(&_graph) { } deba@491: deba@491: EdgeIt& operator++() { kpeter@664: graph->next(*this); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: class IncEdgeIt : public Parent::Edge { deba@491: friend class EdgeSetExtender; kpeter@664: const Graph* graph; deba@491: bool direction; deba@491: public: deba@491: deba@491: IncEdgeIt() { } deba@491: deba@491: IncEdgeIt(Invalid i) : Edge(i), direction(false) { } deba@491: kpeter@664: IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) { deba@491: _graph.firstInc(*this, direction, n); deba@491: } deba@491: kpeter@664: IncEdgeIt(const Graph& _graph, const Edge &ue, const Node &n) kpeter@664: : graph(&_graph), Edge(ue) { deba@491: direction = (_graph.source(ue) == n); deba@491: } deba@491: deba@491: IncEdgeIt& operator++() { kpeter@664: graph->nextInc(*this, direction); deba@491: return *this; deba@491: } deba@491: }; deba@491: kpeter@606: // \brief Base node of the iterator kpeter@606: // kpeter@606: // Returns the base node (ie. the source in this case) of the iterator deba@491: Node baseNode(const OutArcIt &e) const { deba@491: return Parent::source(static_cast(e)); deba@491: } kpeter@606: // \brief Running node of the iterator kpeter@606: // kpeter@606: // Returns the running node (ie. the target in this case) of the kpeter@606: // iterator deba@491: Node runningNode(const OutArcIt &e) const { deba@491: return Parent::target(static_cast(e)); deba@491: } deba@491: kpeter@606: // \brief Base node of the iterator kpeter@606: // kpeter@606: // Returns the base node (ie. the target in this case) of the iterator deba@491: Node baseNode(const InArcIt &e) const { deba@491: return Parent::target(static_cast(e)); deba@491: } kpeter@606: // \brief Running node of the iterator kpeter@606: // kpeter@606: // Returns the running node (ie. the source in this case) of the kpeter@606: // iterator deba@491: Node runningNode(const InArcIt &e) const { deba@491: return Parent::source(static_cast(e)); deba@491: } deba@491: kpeter@606: // Base node of the iterator kpeter@606: // kpeter@606: // Returns the base node of the iterator deba@491: Node baseNode(const IncEdgeIt &e) const { deba@491: return e.direction ? u(e) : v(e); deba@491: } kpeter@606: // Running node of the iterator kpeter@606: // kpeter@606: // Returns the running node of the iterator deba@491: Node runningNode(const IncEdgeIt &e) const { deba@491: return e.direction ? v(e) : u(e); deba@491: } deba@491: deba@491: deba@491: template deba@491: class ArcMap kpeter@664: : public MapExtender > { kpeter@664: typedef MapExtender > Parent; kpeter@664: deba@491: public: kpeter@664: ArcMap(const Graph& _g) deba@491: : Parent(_g) {} kpeter@664: ArcMap(const Graph& _g, const _Value& _v) deba@491: : Parent(_g, _v) {} deba@491: deba@491: ArcMap& operator=(const ArcMap& cmap) { deba@491: return operator=(cmap); deba@491: } deba@491: deba@491: template deba@491: ArcMap& operator=(const CMap& cmap) { deba@491: Parent::operator=(cmap); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: template deba@491: class EdgeMap kpeter@664: : public MapExtender > { kpeter@664: typedef MapExtender > Parent; kpeter@664: deba@491: public: kpeter@664: EdgeMap(const Graph& _g) deba@491: : Parent(_g) {} deba@491: kpeter@664: EdgeMap(const Graph& _g, const _Value& _v) deba@491: : Parent(_g, _v) {} deba@491: deba@491: EdgeMap& operator=(const EdgeMap& cmap) { deba@491: return operator=(cmap); deba@491: } deba@491: deba@491: template deba@491: EdgeMap& operator=(const CMap& cmap) { deba@491: Parent::operator=(cmap); deba@491: return *this; deba@491: } deba@491: deba@491: }; deba@491: deba@491: deba@491: // Alteration extension deba@491: deba@491: Edge addEdge(const Node& from, const Node& to) { deba@491: Edge edge = Parent::addEdge(from, to); deba@491: notifier(Edge()).add(edge); deba@491: std::vector arcs; deba@491: arcs.push_back(Parent::direct(edge, true)); deba@491: arcs.push_back(Parent::direct(edge, false)); deba@491: notifier(Arc()).add(arcs); deba@491: return edge; deba@491: } deba@491: deba@491: void clear() { deba@491: notifier(Arc()).clear(); deba@491: notifier(Edge()).clear(); deba@491: Parent::clear(); deba@491: } deba@491: deba@491: void erase(const Edge& edge) { deba@491: std::vector arcs; deba@491: arcs.push_back(Parent::direct(edge, true)); deba@491: arcs.push_back(Parent::direct(edge, false)); deba@491: notifier(Arc()).erase(arcs); deba@491: notifier(Edge()).erase(edge); deba@491: Parent::erase(edge); deba@491: } deba@491: deba@491: deba@491: EdgeSetExtender() { deba@491: arc_notifier.setContainer(*this); deba@491: edge_notifier.setContainer(*this); deba@491: } deba@491: deba@491: ~EdgeSetExtender() { deba@491: edge_notifier.clear(); deba@491: arc_notifier.clear(); deba@491: } deba@491: deba@491: }; deba@491: deba@491: } deba@491: deba@491: #endif