Index: iteration_macros.hpp =================================================================== --- iteration_macros.hpp (revision 53774) +++ iteration_macros.hpp (working copy) @@ -10,9 +10,10 @@ #ifndef BOOST_GRAPH_ITERATION_MACROS_HPP #define BOOST_GRAPH_ITERATION_MACROS_HPP +#include + #define BGL_CAT(x,y) x ## y -#define BGL_FIRST(linenum) BGL_CAT(bgl_first_,linenum) -#define BGL_LAST(linenum) BGL_CAT(bgl_last_,linenum) +#define BGL_RANGE(linenum) BGL_CAT(bgl_range_,linenum) /* BGL_FORALL_VERTICES_T(v, g, graph_t) // This is on line 9 @@ -22,7 +23,7 @@ bgl_first_9 = vertices(g).first, bgl_last_9 = vertices(g).second; bgl_first_9 != bgl_last_9; bgl_first_9 = bgl_last_9) for (typename boost::graph_traits::vertex_descriptor v; - bgl_first_9 != bgl_last ? (v = *bgl_first_9, true) : false; + bgl_first_9 != bgl_last_9 ? (v = *bgl_first_9, true) : false; ++bgl_first_9) The purpose of having two for-loops is just to provide a place to @@ -37,93 +38,112 @@ Use the _T versions when the graph type is a template parameter or dependent on a template parameter. Otherwise use the non _T versions. + ----------------------- + 6/9/09 THK + + The above contains two calls to the vertices function. I modified these + macros to expand to + + for (std::pair::vertex_iterator, + typename boost::graph_traits::vertex_iterator> bgl_range_9 = vertices(g); + bgl_range_9.first != bgl_range_9.second; + bgl_range_9.first = bgl_range_9.second) + for (typename boost::graph_traits::vertex_descriptor v; + bgl_range_9.first != bgl_range_9.second ? (v = *bgl_range_9.first, true) : false; + ++bgl_range_9.first) + + */ #define BGL_FORALL_VERTICES_T(VNAME, GNAME, GraphType) \ -for (typename boost::graph_traits::vertex_iterator \ - BGL_FIRST(__LINE__) = vertices(GNAME).first, BGL_LAST(__LINE__) = vertices(GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::vertex_iterator, \ + typename boost::graph_traits::vertex_iterator> BGL_RANGE(__LINE__) = vertices(GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (typename boost::graph_traits::vertex_descriptor VNAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true):false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (VNAME = *BGL_RANGE(__LINE__).first, true):false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_VERTICES(VNAME, GNAME, GraphType) \ -for (boost::graph_traits::vertex_iterator \ - BGL_FIRST(__LINE__) = vertices(GNAME).first, BGL_LAST(__LINE__) = vertices(GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::vertex_iterator, \ + boost::graph_traits::vertex_iterator> BGL_RANGE(__LINE__) = vertices(GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (boost::graph_traits::vertex_descriptor VNAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true):false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (VNAME = *BGL_RANGE(__LINE__).first, true):false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_EDGES_T(ENAME, GNAME, GraphType) \ -for (typename boost::graph_traits::edge_iterator \ - BGL_FIRST(__LINE__) = edges(GNAME).first, BGL_LAST(__LINE__) = edges(GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::edge_iterator, \ + typename boost::graph_traits::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (typename boost::graph_traits::edge_descriptor ENAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (ENAME = *BGL_RANGE(__LINE__).first, true):false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_EDGES(ENAME, GNAME, GraphType) \ -for (boost::graph_traits::edge_iterator \ - BGL_FIRST(__LINE__) = edges(GNAME).first, BGL_LAST(__LINE__) = edges(GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::edge_iterator, \ + boost::graph_traits::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (boost::graph_traits::edge_descriptor ENAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (ENAME = *BGL_RANGE(__LINE__).first, true):false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_ADJ_T(UNAME, VNAME, GNAME, GraphType) \ -for (typename boost::graph_traits::adjacency_iterator \ - BGL_FIRST(__LINE__) = adjacent_vertices(UNAME, GNAME).first,\ - BGL_LAST(__LINE__) = adjacent_vertices(UNAME, GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::adjacency_iterator, \ + typename boost::graph_traits::adjacency_iterator> BGL_RANGE(__LINE__) = adjacent_vertices(UNAME, GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (typename boost::graph_traits::vertex_descriptor VNAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true) : false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (VNAME = *BGL_RANGE(__LINE__).first, true) : false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_ADJ(UNAME, VNAME, GNAME, GraphType) \ -for (boost::graph_traits::adjacency_iterator \ - BGL_FIRST(__LINE__) = adjacent_vertices(UNAME, GNAME).first,\ - BGL_LAST(__LINE__) = adjacent_vertices(UNAME, GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::adjacency_iterator, \ + boost::graph_traits::adjacency_iterator> BGL_RANGE(__LINE__) = adjacent_vertices(UNAME, GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (boost::graph_traits::vertex_descriptor VNAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (VNAME = *BGL_FIRST(__LINE__), true) : false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (VNAME = *BGL_RANGE(__LINE__).first, true) : false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_OUTEDGES_T(UNAME, ENAME, GNAME, GraphType) \ -for (typename boost::graph_traits::out_edge_iterator \ - BGL_FIRST(__LINE__) = out_edges(UNAME, GNAME).first,\ - BGL_LAST(__LINE__) = out_edges(UNAME, GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::out_edge_iterator, \ + typename boost::graph_traits::out_edge_iterator> BGL_RANGE(__LINE__) = out_edges(UNAME, GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (typename boost::graph_traits::edge_descriptor ENAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (ENAME = *BGL_RANGE(__LINE__).first, true) : false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_OUTEDGES(UNAME, ENAME, GNAME, GraphType) \ -for (boost::graph_traits::out_edge_iterator \ - BGL_FIRST(__LINE__) = out_edges(UNAME, GNAME).first,\ - BGL_LAST(__LINE__) = out_edges(UNAME, GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::out_edge_iterator, \ + boost::graph_traits::out_edge_iterator> BGL_RANGE(__LINE__) = out_edges(UNAME, GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (boost::graph_traits::edge_descriptor ENAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (ENAME = *BGL_RANGE(__LINE__).first, true) : false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_INEDGES_T(UNAME, ENAME, GNAME, GraphType) \ -for (typename boost::graph_traits::in_edge_iterator \ - BGL_FIRST(__LINE__) = in_edges(UNAME, GNAME).first,\ - BGL_LAST(__LINE__) = in_edges(UNAME, GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::in_edge_iterator, \ + typename boost::graph_traits::in_edge_iterator> BGL_RANGE(__LINE__) = in_edges(UNAME, GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (typename boost::graph_traits::edge_descriptor ENAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (ENAME = *BGL_RANGE(__LINE__).first, true) : false; \ + ++BGL_RANGE(__LINE__).first) #define BGL_FORALL_INEDGES(UNAME, ENAME, GNAME, GraphType) \ -for (boost::graph_traits::in_edge_iterator \ - BGL_FIRST(__LINE__) = in_edges(UNAME, GNAME).first,\ - BGL_LAST(__LINE__) = in_edges(UNAME, GNAME).second; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \ +for (std::pair::in_edge_iterator, \ + boost::graph_traits::in_edge_iterator> BGL_RANGE(__LINE__) = in_edges(UNAME, GNAME); \ + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second; \ + BGL_RANGE(__LINE__).first = BGL_RANGE(__LINE__).second) \ for (boost::graph_traits::edge_descriptor ENAME; \ - BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true) : false; \ - ++BGL_FIRST(__LINE__)) + BGL_RANGE(__LINE__).first != BGL_RANGE(__LINE__).second ? (ENAME = *BGL_RANGE(__LINE__).first, true) : false; \ + ++BGL_RANGE(__LINE__).first) #endif // BOOST_GRAPH_ITERATION_MACROS_HPP