[Lemon-commits] Balazs Dezso: Port graph adaptors from svn -r349...
Lemon HG
hg at lemon.cs.elte.hu
Tue Dec 2 16:35:20 CET 2008
details: http://lemon.cs.elte.hu/hg/lemon/rev/05357da973ce
changeset: 430:05357da973ce
user: Balazs Dezso <deba [at] inf.elte.hu>
date: Sun Nov 30 18:57:18 2008 +0100
description:
Port graph adaptors from svn -r3498 (#67)
diffstat:
7 files changed, 5680 insertions(+)
lemon/Makefile.am | 2
lemon/bits/graph_adaptor_extender.h | 444 ++++++
lemon/bits/variant.h | 494 ++++++
lemon/digraph_adaptor.h | 2530 +++++++++++++++++++++++++++++++++++
lemon/graph_adaptor.h | 1136 +++++++++++++++
test/Makefile.am | 2
test/graph_adaptor_test.cc | 1072 ++++++++++++++
diffs (truncated from 5731 to 300 lines):
diff -r 0c5dd7ceda03 -r 05357da973ce lemon/Makefile.am
--- a/lemon/Makefile.am Sun Nov 30 09:39:34 2008 +0000
+++ b/lemon/Makefile.am Sun Nov 30 18:57:18 2008 +0100
@@ -58,10 +58,12 @@
lemon/bits/bezier.h \
lemon/bits/default_map.h \
lemon/bits/enable_if.h \
+ lemon/bits/graph_adaptor_extender.h \
lemon/bits/graph_extender.h \
lemon/bits/map_extender.h \
lemon/bits/path_dump.h \
lemon/bits/traits.h \
+ lemon/bits/variant.h \
lemon/bits/vector_map.h
concept_HEADERS += \
diff -r 0c5dd7ceda03 -r 05357da973ce lemon/bits/graph_adaptor_extender.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lemon/bits/graph_adaptor_extender.h Sun Nov 30 18:57:18 2008 +0100
@@ -0,0 +1,444 @@
+/* -*- C++ -*-
+ *
+ * This file is a part of LEMON, a generic C++ optimization library
+ *
+ * Copyright (C) 2003-2008
+ * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
+ * (Egervary Research Group on Combinatorial Optimization, EGRES).
+ *
+ * Permission to use, modify and distribute this software is granted
+ * provided that this copyright notice appears in all copies. For
+ * precise terms see the accompanying LICENSE file.
+ *
+ * This software is provided "AS IS" with no warranty of any kind,
+ * express or implied, and with no claim as to its suitability for any
+ * purpose.
+ *
+ */
+
+#ifndef LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
+#define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
+
+#include <lemon/core.h>
+#include <lemon/error.h>
+
+#include <lemon/bits/default_map.h>
+
+
+///\ingroup digraphbits
+///\file
+///\brief Extenders for the digraph adaptor types
+namespace lemon {
+
+ /// \ingroup digraphbits
+ ///
+ /// \brief Extender for the DigraphAdaptors
+ template <typename _Digraph>
+ class DigraphAdaptorExtender : public _Digraph {
+ public:
+
+ typedef _Digraph Parent;
+ typedef _Digraph Digraph;
+ typedef DigraphAdaptorExtender Adaptor;
+
+ // Base extensions
+
+ typedef typename Parent::Node Node;
+ typedef typename Parent::Arc Arc;
+
+ int maxId(Node) const {
+ return Parent::maxNodeId();
+ }
+
+ int maxId(Arc) const {
+ return Parent::maxArcId();
+ }
+
+ Node fromId(int id, Node) const {
+ return Parent::nodeFromId(id);
+ }
+
+ Arc fromId(int id, Arc) const {
+ return Parent::arcFromId(id);
+ }
+
+ Node oppositeNode(const Node &n, const Arc &e) const {
+ if (n == Parent::source(e))
+ return Parent::target(e);
+ else if(n==Parent::target(e))
+ return Parent::source(e);
+ else
+ return INVALID;
+ }
+
+ class NodeIt : public Node {
+ const Adaptor* _adaptor;
+ public:
+
+ NodeIt() {}
+
+ NodeIt(Invalid i) : Node(i) { }
+
+ explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
+ _adaptor->first(static_cast<Node&>(*this));
+ }
+
+ NodeIt(const Adaptor& adaptor, const Node& node)
+ : Node(node), _adaptor(&adaptor) {}
+
+ NodeIt& operator++() {
+ _adaptor->next(*this);
+ return *this;
+ }
+
+ };
+
+
+ class ArcIt : public Arc {
+ const Adaptor* _adaptor;
+ public:
+
+ ArcIt() { }
+
+ ArcIt(Invalid i) : Arc(i) { }
+
+ explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
+ _adaptor->first(static_cast<Arc&>(*this));
+ }
+
+ ArcIt(const Adaptor& adaptor, const Arc& e) :
+ Arc(e), _adaptor(&adaptor) { }
+
+ ArcIt& operator++() {
+ _adaptor->next(*this);
+ return *this;
+ }
+
+ };
+
+
+ class OutArcIt : public Arc {
+ const Adaptor* _adaptor;
+ public:
+
+ OutArcIt() { }
+
+ OutArcIt(Invalid i) : Arc(i) { }
+
+ OutArcIt(const Adaptor& adaptor, const Node& node)
+ : _adaptor(&adaptor) {
+ _adaptor->firstOut(*this, node);
+ }
+
+ OutArcIt(const Adaptor& adaptor, const Arc& arc)
+ : Arc(arc), _adaptor(&adaptor) {}
+
+ OutArcIt& operator++() {
+ _adaptor->nextOut(*this);
+ return *this;
+ }
+
+ };
+
+
+ class InArcIt : public Arc {
+ const Adaptor* _adaptor;
+ public:
+
+ InArcIt() { }
+
+ InArcIt(Invalid i) : Arc(i) { }
+
+ InArcIt(const Adaptor& adaptor, const Node& node)
+ : _adaptor(&adaptor) {
+ _adaptor->firstIn(*this, node);
+ }
+
+ InArcIt(const Adaptor& adaptor, const Arc& arc) :
+ Arc(arc), _adaptor(&adaptor) {}
+
+ InArcIt& operator++() {
+ _adaptor->nextIn(*this);
+ return *this;
+ }
+
+ };
+
+ /// \brief Base node of the iterator
+ ///
+ /// Returns the base node (ie. the source in this case) of the iterator
+ Node baseNode(const OutArcIt &e) const {
+ return Parent::source(e);
+ }
+ /// \brief Running node of the iterator
+ ///
+ /// Returns the running node (ie. the target in this case) of the
+ /// iterator
+ Node runningNode(const OutArcIt &e) const {
+ return Parent::target(e);
+ }
+
+ /// \brief Base node of the iterator
+ ///
+ /// Returns the base node (ie. the target in this case) of the iterator
+ Node baseNode(const InArcIt &e) const {
+ return Parent::target(e);
+ }
+ /// \brief Running node of the iterator
+ ///
+ /// Returns the running node (ie. the source in this case) of the
+ /// iterator
+ Node runningNode(const InArcIt &e) const {
+ return Parent::source(e);
+ }
+
+ };
+
+
+ /// \ingroup digraphbits
+ ///
+ /// \brief Extender for the GraphAdaptors
+ template <typename _Graph>
+ class GraphAdaptorExtender : public _Graph {
+ public:
+
+ typedef _Graph Parent;
+ typedef _Graph Graph;
+ typedef GraphAdaptorExtender Adaptor;
+
+ typedef typename Parent::Node Node;
+ typedef typename Parent::Arc Arc;
+ typedef typename Parent::Edge Edge;
+
+ // Graph extension
+
+ int maxId(Node) const {
+ return Parent::maxNodeId();
+ }
+
+ int maxId(Arc) const {
+ return Parent::maxArcId();
+ }
+
+ int maxId(Edge) const {
+ return Parent::maxEdgeId();
+ }
+
+ Node fromId(int id, Node) const {
+ return Parent::nodeFromId(id);
+ }
+
+ Arc fromId(int id, Arc) const {
+ return Parent::arcFromId(id);
+ }
+
+ Edge fromId(int id, Edge) const {
+ return Parent::edgeFromId(id);
+ }
+
+ Node oppositeNode(const Node &n, const Edge &e) const {
+ if( n == Parent::u(e))
+ return Parent::v(e);
+ else if( n == Parent::v(e))
+ return Parent::u(e);
+ else
+ return INVALID;
+ }
+
+ Arc oppositeArc(const Arc &a) const {
+ return Parent::direct(a, !Parent::direction(a));
+ }
+
+ using Parent::direct;
+ Arc direct(const Edge &e, const Node &s) const {
+ return Parent::direct(e, Parent::u(e) == s);
+ }
+
+
+ class NodeIt : public Node {
+ const Adaptor* _adaptor;
+ public:
+
+ NodeIt() {}
+
+ NodeIt(Invalid i) : Node(i) { }
+
+ explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
+ _adaptor->first(static_cast<Node&>(*this));
+ }
+
+ NodeIt(const Adaptor& adaptor, const Node& node)
+ : Node(node), _adaptor(&adaptor) {}
+
+ NodeIt& operator++() {
+ _adaptor->next(*this);
+ return *this;
+ }
+
+ };
+
+
More information about the Lemon-commits
mailing list