# HG changeset patch # User Alpar Juttner # Date 1428993580 -7200 # Node ID 4add05447ca00f659a054e88a7e0842a66f8b041 # Parent 0759d974de816af3492dff5e02de2d361ad27841 Tests and bugfixes for the STL style iterators (#325) diff -r 0759d974de81 -r 4add05447ca0 CMakeLists.txt --- a/CMakeLists.txt Sun Jan 05 22:24:56 2014 +0100 +++ b/CMakeLists.txt Tue Apr 14 08:39:40 2015 +0200 @@ -264,8 +264,8 @@ INCLUDE(CheckCXXCompilerFlag) -CHECK_CXX_COMPILER_FLAG("-std=c++11" CXX11FLAG) -IF(CXX11FLAG) +CHECK_CXX_COMPILER_FLAG("-std=c++11" LEMON_CXX11) +IF(LEMON_CXX11) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") ENDIF() diff -r 0759d974de81 -r 4add05447ca0 lemon/bellman_ford.h --- a/lemon/bellman_ford.h Sun Jan 05 22:24:56 2014 +0100 +++ b/lemon/bellman_ford.h Tue Apr 14 08:39:40 2015 +0200 @@ -701,8 +701,8 @@ /// like an STL container (by having begin() and end()) /// which you can use in range-based for loops, STL algorithms, etc. LemonRangeWrapper1 - activeNodes(const BellmanFord& algorithm) const { - return LemonRangeWrapper1(algorithm); + activeNodes() const { + return LemonRangeWrapper1(*this); } diff -r 0759d974de81 -r 4add05447ca0 lemon/bits/edge_set_extender.h --- a/lemon/bits/edge_set_extender.h Sun Jan 05 22:24:56 2014 +0100 +++ b/lemon/bits/edge_set_extender.h Tue Apr 14 08:39:40 2015 +0200 @@ -113,6 +113,9 @@ }; + LemonRangeWrapper1 nodes() const { + return LemonRangeWrapper1(*this); + } class ArcIt : public Arc { const Digraph* digraph; @@ -136,6 +139,9 @@ }; + LemonRangeWrapper1 arcs() const { + return LemonRangeWrapper1(*this); + } class OutArcIt : public Arc { const Digraph* digraph; @@ -160,6 +166,9 @@ }; + LemonRangeWrapper2 outArcs(const Node& u) const { + return LemonRangeWrapper2(*this, u); + } class InArcIt : public Arc { const Digraph* digraph; @@ -184,6 +193,10 @@ }; + LemonRangeWrapper2 inArcs(const Node& u) const { + return LemonRangeWrapper2(*this, u); + } + // \brief Base node of the iterator // // Returns the base node (ie. the source in this case) of the iterator @@ -372,6 +385,9 @@ }; + LemonRangeWrapper1 nodes() const { + return LemonRangeWrapper1(*this); + } class ArcIt : public Arc { const Graph* graph; @@ -395,6 +411,9 @@ }; + LemonRangeWrapper1 arcs() const { + return LemonRangeWrapper1(*this); + } class OutArcIt : public Arc { const Graph* graph; @@ -419,6 +438,9 @@ }; + LemonRangeWrapper2 outArcs(const Node& u) const { + return LemonRangeWrapper2(*this, u); + } class InArcIt : public Arc { const Graph* graph; @@ -443,6 +465,9 @@ }; + LemonRangeWrapper2 inArcs(const Node& u) const { + return LemonRangeWrapper2(*this, u); + } class EdgeIt : public Parent::Edge { const Graph* graph; @@ -466,6 +491,10 @@ }; + LemonRangeWrapper1 edges() const { + return LemonRangeWrapper1(*this); + } + class IncEdgeIt : public Parent::Edge { friend class EdgeSetExtender; const Graph* graph; @@ -491,6 +520,10 @@ } }; + LemonRangeWrapper2 incEdges(const Node& u) const { + return LemonRangeWrapper2(*this, u); + } + // \brief Base node of the iterator // // Returns the base node (ie. the source in this case) of the iterator diff -r 0759d974de81 -r 4add05447ca0 lemon/bits/graph_adaptor_extender.h --- a/lemon/bits/graph_adaptor_extender.h Sun Jan 05 22:24:56 2014 +0100 +++ b/lemon/bits/graph_adaptor_extender.h Tue Apr 14 08:39:40 2015 +0200 @@ -85,7 +85,7 @@ }; - LemonRangeWrapper1 nodes() { + LemonRangeWrapper1 nodes() const { return LemonRangeWrapper1(*this); } @@ -111,7 +111,7 @@ }; - LemonRangeWrapper1 arcs() { + LemonRangeWrapper1 arcs() const { return LemonRangeWrapper1(*this); } @@ -269,7 +269,7 @@ }; - LemonRangeWrapper1 nodes() { + LemonRangeWrapper1 nodes() const { return LemonRangeWrapper1(*this); } @@ -296,7 +296,7 @@ }; - LemonRangeWrapper1 arcs() { + LemonRangeWrapper1 arcs() const { return LemonRangeWrapper1(*this); } @@ -378,7 +378,7 @@ }; - LemonRangeWrapper1 edges() { + LemonRangeWrapper1 edges() const { return LemonRangeWrapper1(*this); } diff -r 0759d974de81 -r 4add05447ca0 lemon/config.h.in --- a/lemon/config.h.in Sun Jan 05 22:24:56 2014 +0100 +++ b/lemon/config.h.in Tue Apr 14 08:39:40 2015 +0200 @@ -1,6 +1,8 @@ #define LEMON_VERSION "@PROJECT_VERSION@" #cmakedefine LEMON_HAVE_LONG_LONG 1 +#cmakedefine LEMON_CXX11 1 + #cmakedefine LEMON_HAVE_LP 1 #cmakedefine LEMON_HAVE_MIP 1 #cmakedefine LEMON_HAVE_GLPK 1 diff -r 0759d974de81 -r 4add05447ca0 lemon/list_graph.h --- a/lemon/list_graph.h Sun Jan 05 22:24:56 2014 +0100 +++ b/lemon/list_graph.h Tue Apr 14 08:39:40 2015 +0200 @@ -1209,7 +1209,7 @@ /// ListGraph() {} - typedef Parent::OutArcIt IncEdgeIt; + typedef Parent::IncEdgeIt IncEdgeIt; /// \brief Add a new node to the graph. /// @@ -2136,7 +2136,7 @@ /// ListBpGraph() {} - typedef Parent::OutArcIt IncEdgeIt; + typedef Parent::IncEdgeIt IncEdgeIt; /// \brief Add a new red node to the graph. /// diff -r 0759d974de81 -r 4add05447ca0 test/bellman_ford_test.cc --- a/test/bellman_ford_test.cc Sun Jan 05 22:24:56 2014 +0100 +++ b/test/bellman_ford_test.cc Tue Apr 14 08:39:40 2015 +0200 @@ -101,6 +101,10 @@ pp = const_bf_test.negativeCycle(); for (BF::ActiveIt it(const_bf_test); it != INVALID; ++it) {} + for (auto n: const_bf_test.activeNodes()) { ::lemon::ignore_unused_variable_warning(n); } + for (Digraph::Node n: const_bf_test.activeNodes()) { + ::lemon::ignore_unused_variable_warning(n); + } } { BF::SetPredMap > diff -r 0759d974de81 -r 4add05447ca0 test/graph_test.h --- a/test/graph_test.h Sun Jan 05 22:24:56 2014 +0100 +++ b/test/graph_test.h Tue Apr 14 08:39:40 2015 +0200 @@ -38,6 +38,27 @@ } check(n==INVALID,"Wrong Node list linking."); check(countNodes(G)==cnt,"Wrong Node number."); + +#ifdef LEMON_CXX11 + { + typename Graph::NodeIt n(G); + for(auto u: G.nodes()) + { + check(n==u,"Wrong STL Node iterator."); + ++n; + } + check(n==INVALID,"Wrong STL Node iterator."); + } + { + typename Graph::NodeIt n(G); + for(typename Graph::Node u: G.nodes()) + { + check(n==u,"Wrong STL Node iterator."); + ++n; + } + check(n==INVALID,"Wrong STL Node iterator."); + } +#endif } template @@ -56,6 +77,26 @@ } check(n==INVALID,"Wrong red Node list linking."); check(countRedNodes(G)==cnt,"Wrong red Node number."); +#ifdef LEMON_CXX11 + { + typename Graph::RedNodeIt n(G); + for(auto u: G.redNodes()) + { + check(n==u,"Wrong STL RedNode iterator."); + ++n; + } + check(n==INVALID,"Wrong STL RedNode iterator."); + } + { + typename Graph::RedNodeIt n(G); + for(typename Graph::RedNode u: G.redNodes()) + { + check(n==u,"Wrong STL RedNode iterator."); + ++n; + } + check(n==INVALID,"Wrong STL RedNode iterator."); + } +#endif } template @@ -74,6 +115,27 @@ } check(n==INVALID,"Wrong blue Node list linking."); check(countBlueNodes(G)==cnt,"Wrong blue Node number."); +#ifdef LEMON_CXX11 + { + typename Graph::BlueNodeIt n(G); + for(auto u: G.blueNodes()) + { + check(n==u,"Wrong STL BlueNode iterator."); + ++n; + } + check(n==INVALID,"Wrong STL BlueNode iterator."); + } + { + typename Graph::BlueNodeIt n(G); + for(typename Graph::BlueNode u: G.blueNodes()) + { + check(n==u,"Wrong STL BlueNode iterator."); + ++n; + } + check(n==INVALID,"Wrong STL BlueNode iterator."); + } +#endif + } template @@ -90,6 +152,27 @@ } check(e==INVALID,"Wrong Arc list linking."); check(countArcs(G)==cnt,"Wrong Arc number."); +#ifdef LEMON_CXX11 + { + typename Graph::ArcIt a(G); + for(auto e: G.arcs()) + { + check(a==e,"Wrong STL Arc iterator."); + ++a; + } + check(a==INVALID,"Wrong STL Arc iterator."); + } + { + typename Graph::ArcIt a(G); + for(typename Graph::Arc e: G.arcs()) + { + check(a==e,"Wrong STL Arc iterator."); + ++a; + } + check(a==INVALID,"Wrong STL Arc iterator."); + } +#endif + } template @@ -105,6 +188,27 @@ } check(e==INVALID,"Wrong OutArc list linking."); check(countOutArcs(G,n)==cnt,"Wrong OutArc number."); +#ifdef LEMON_CXX11 + { + typename Graph::OutArcIt a(G,n); + for(auto e: G.outArcs(n)) + { + check(a==e,"Wrong STL OutArc iterator."); + ++a; + } + check(a==INVALID,"Wrong STL OutArc iterator."); + } + { + typename Graph::OutArcIt a(G,n); + for(typename Graph::Arc e: G.outArcs(n)) + { + check(a==e,"Wrong STL OutArc iterator."); + ++a; + } + check(a==INVALID,"Wrong STL OutArc iterator."); + } +#endif + } template @@ -120,6 +224,26 @@ } check(e==INVALID,"Wrong InArc list linking."); check(countInArcs(G,n)==cnt,"Wrong InArc number."); +#ifdef LEMON_CXX11 + { + typename Graph::InArcIt a(G,n); + for(auto e: G.inArcs(n)) + { + check(a==e,"Wrong STL InArc iterator."); + ++a; + } + check(a==INVALID,"Wrong STL InArc iterator."); + } + { + typename Graph::InArcIt a(G,n); + for(typename Graph::Arc e: G.inArcs(n)) + { + check(a==e,"Wrong STL InArc iterator."); + ++a; + } + check(a==INVALID,"Wrong STL InArc iterator."); + } +#endif } template @@ -134,6 +258,27 @@ } check(e==INVALID,"Wrong Edge list linking."); check(countEdges(G)==cnt,"Wrong Edge number."); +#ifdef LEMON_CXX11 + { + typename Graph::EdgeIt a(G); + for(auto e: G.edges()) + { + check(a==e,"Wrong STL Edge iterator."); + ++a; + } + check(a==INVALID,"Wrong STL Edge iterator."); + } + { + typename Graph::EdgeIt a(G); + for(typename Graph::Edge e: G.edges()) + { + check(a==e,"Wrong STL Edge iterator."); + ++a; + } + check(a==INVALID,"Wrong STL Edge iterator."); + } +#endif + } template @@ -150,6 +295,27 @@ } check(e==INVALID,"Wrong IncEdge list linking."); check(countIncEdges(G,n)==cnt,"Wrong IncEdge number."); +#ifdef LEMON_CXX11 + { + typename Graph::IncEdgeIt a(G,n); + for(auto e: G.incEdges(n)) + { + check(a==e,"Wrong STL IncEdge iterator."); + ++a; + } + check(a==INVALID,"Wrong STL IncEdge iterator."); + } + { + typename Graph::IncEdgeIt a(G,n); + for(typename Graph::Edge e: G.incEdges(n)) + { + check(a==e,"Wrong STL IncEdge iterator."); + ++a; + } + check(a==INVALID,"Wrong STL IncEdge iterator."); + } +#endif + } template diff -r 0759d974de81 -r 4add05447ca0 test/lp_test.cc --- a/test/lp_test.cc Sun Jan 05 22:24:56 2014 +0100 +++ b/test/lp_test.cc Tue Apr 14 08:39:40 2015 +0200 @@ -20,7 +20,7 @@ #include #include "test_tools.h" #include - +#include #include #ifdef LEMON_HAVE_GLPK @@ -47,12 +47,22 @@ int countCols(LpBase & lp) { int count=0; for (LpBase::ColIt c(lp); c!=INVALID; ++c) ++count; +#ifdef LEMON_CXX11 + int cnt = 0; + for(auto c: lp.cols()) { cnt++; ::lemon::ignore_unused_variable_warning(c); } + check(count == cnt, "Wrong STL iterator"); +#endif return count; } int countRows(LpBase & lp) { int count=0; for (LpBase::RowIt r(lp); r!=INVALID; ++r) ++count; +#ifdef LEMON_CXX11 + int cnt = 0; + for(auto r: lp.rows()) { cnt++; ::lemon::ignore_unused_variable_warning(r); } + check(count == cnt, "Wrong STL iterator"); +#endif return count; } diff -r 0759d974de81 -r 4add05447ca0 test/maps_test.cc --- a/test/maps_test.cc Sun Jan 05 22:24:56 2014 +0100 +++ b/test/maps_test.cc Tue Apr 14 08:39:40 2015 +0200 @@ -730,6 +730,30 @@ } check(n == 3, "Wrong number"); check(map1.falseNum() == 3, "Wrong number"); + +#ifdef LEMON_CXX11 + { + int c = 0; + for(auto v: map1.items(false)) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == map1.falseNum(), "Wrong number"); + } + { + int c = 0; + for(auto v: map1.items(true)) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == map1.trueNum(), "Wrong number"); + } + { + int c = 0; + for(auto v: map1.falseKeys()) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == map1.falseNum(), "Wrong number"); + } + { + int c = 0; + for(auto v: map1.trueKeys()) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == map1.trueNum(), "Wrong number"); + } +#endif + } // Iterable int map @@ -780,6 +804,15 @@ ++n; } check(n == num, "Wrong number"); +#ifdef LEMON_CXX11 + { + int c = 0; + for(auto v: map1.items(0)) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == (num + 1) / 2, "Wrong number"); + for(auto v: map1.items(1)) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == num, "Wrong number"); + } +#endif } @@ -839,6 +872,16 @@ } check(n == num, "Wrong number"); +#ifdef LEMON_CXX11 + { + int c = 0; + for(auto v: map1.items(0.0)) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == (num + 1) / 2, "Wrong number"); + for(auto v: map1.items(1.0)) { c++; ::lemon::ignore_unused_variable_warning(v); } + check(c == num, "Wrong number"); + } +#endif + } // Graph map utilities: