src/work/marci/for_each_macros.h
changeset 1365 c280de819a73
parent 725 9fa4045571cd
equal deleted inserted replaced
5:8af25367a3e0 -1:000000000000
     1 // -*- c++ -*-
       
     2 #ifndef LEMON_FOR_EACH_MACROS_H
       
     3 #define LEMON_FOR_EACH_MACROS_H
       
     4 
       
     5 // /// \ingroup gwrappers
       
     6 /// \file
       
     7 /// \brief Iteration macros.
       
     8 ///
       
     9 /// This file contains several macros which make easier writting 
       
    10 /// for cycles in LEMON using LEMON iterators.
       
    11 ///
       
    12 /// \author Marton Makai
       
    13 
       
    14 namespace lemon {
       
    15 
       
    16   /// This macro provides a comfortable interface for iterating with LEMON 
       
    17   /// iterators.
       
    18   /// \code
       
    19   /// Graph g;
       
    20   /// ...
       
    21   /// Graph::NodeIt n;
       
    22   /// h_for_glob(n, g) {
       
    23   /// ...
       
    24   /// }
       
    25   /// Graph::EdgeIt e;
       
    26   /// h_for_glob(e, g) {
       
    27   /// ...
       
    28   /// }
       
    29   /// \endcode
       
    30   /// Note that the iterated variables \c n and \c e are global ones. 
       
    31 #define h_for_glob(e, g) for((g).first((e)); (g).valid((e)); (g).next((e)))
       
    32 
       
    33 /// \deprecated
       
    34 #define FOR_EACH_GLOB(e, g) for((g).first((e)); (g).valid((e)); (g).next((e)))
       
    35 
       
    36   /// This macro provides a comfortable interface for iterating with LEMON 
       
    37   /// iterators.
       
    38   /// \code
       
    39   /// Graph g;
       
    40   /// ...
       
    41   /// Graph::Node v;
       
    42   /// Graph::OutEdgeIt e;
       
    43   /// h_for_inc_glob(e, g, v) {
       
    44   /// ...
       
    45   /// }
       
    46   /// typedef BipartiteGraph<Graph> BGraph;
       
    47   /// BGraph h;
       
    48   /// ...
       
    49   /// BGraph::ClassNodeIt n;
       
    50   /// h_for_inc_glob(BGraph::ClassNodeIt, n, h, h.S_CLASS) {
       
    51   /// ...
       
    52   /// }
       
    53   /// \endcode
       
    54   /// Note that iterated variables \c e and \c n are global ones. 
       
    55 #define h_for_inc_glob(e, g, v) for((g).first((e), (v)); (g).valid((e)); (g).next((e)))
       
    56 
       
    57 /// \deprecated
       
    58 #define FOR_EACH_INC_GLOB(e, g, v) for((g).first((e), (v)); (g).valid((e)); (g).next((e)))
       
    59   
       
    60 /// \deprecated
       
    61 //#define FOR_EACH_EDGE_GLOB(e, g) for((g).first((e)); (g).valid((e)); (g).next((e)))
       
    62 /// \deprecated
       
    63 //#define FOR_EACH_NODE_GLOB(e, g) for((g).first((e)); (g).valid((e)); (g).next((e)))
       
    64 /// \deprecated
       
    65 //#define FOR_EACH_INEDGE_GLOB(e, g, v) for((g).first((e), (v)); (g).valid((e)); (g).next((e)))
       
    66 /// \deprecated
       
    67 //#define FOR_EACH_OUTEDGE_GLOB(e, g, v) for((g).first((e), (v)); (g).valid((e)); (g).next((e)))
       
    68 
       
    69 //   template<typename It, typename Graph> 
       
    70 //   It loopFirst(const Graph& g) const {
       
    71 //     It e; g.first(e); return e; 
       
    72 //   }
       
    73 
       
    74 //   template<typename It, typename Graph> 
       
    75 //   It loopFirst(const Graph& g, const Node& v) const {
       
    76 //     It e; g.first(e, v); return e; 
       
    77 //   }
       
    78 
       
    79 //   template<typename Graph> 
       
    80 //   typename Graph::NodeIt loopFirstNode(const Graph& g) const {
       
    81 //     typename Graph::NodeIt e; g.first(e); return e; 
       
    82 //   }
       
    83 //   template<typename Graph> 
       
    84 //   typename Graph::EdgeIt loopFirstEdge(const Graph& g) const {
       
    85 //     typename Graph::EdgeIt e; g.first(e); return e; 
       
    86 //   }
       
    87 //   template<typename Graph> 
       
    88 //   typename Graph::OutEdgeIt 
       
    89 //   loopFirstOutEdge(const Graph& g, const Node& n) const {
       
    90 //     typename Graph::OutEdgeIt e; g.first(e, n); return e; 
       
    91 //   }
       
    92 //   template<typename Graph> 
       
    93 //   typename Graph::InEdgeIt 
       
    94 //   loopFirstIn Edge(const Graph& g, const Node& n) const {
       
    95 //     typename Graph::InEdgeIt e; g.first(e, n); return e; 
       
    96 //   }
       
    97 
       
    98 //FIXME ezt hogy a gorcsbe birja levezetni. Csak ugy leveszi a const-ot??
       
    99   template<typename It, typename Graph> 
       
   100   It loopFirst(const It&, const Graph& g) {
       
   101     It e; g.first(e); return e; 
       
   102   }
       
   103 
       
   104   template<typename It, typename Graph, typename Node> 
       
   105   It loopFirst(const It&, const Graph& g, const Node& v) {
       
   106     It e; g.first(e, v); return e; 
       
   107   }
       
   108 
       
   109 //   template<typename Graph> 
       
   110 //   typename Graph::NodeIt loopFirstNode(const Graph& g) const {
       
   111 //     typename Graph::NodeIt e; g.first(e); return e; 
       
   112 //   }
       
   113 //   template<typename Graph> 
       
   114 //   typename Graph::EdgeIt loopFirstEdge(const Graph& g) const {
       
   115 //     typename Graph::EdgeIt e; g.first(e); return e; 
       
   116 //   }
       
   117 //   template<typename Graph> 
       
   118 //   typename Graph::OutEdgeIt 
       
   119 //   loopFirstOutEdge(const Graph& g, const Node& n) const {
       
   120 //     typename Graph::OutEdgeIt e; g.first(e, n); return e; 
       
   121 //   }
       
   122 //   template<typename Graph> 
       
   123 //   typename Graph::InEdgeIt 
       
   124 //   loopFirstIn Edge(const Graph& g, const Node& n) const {
       
   125 //     typename Graph::InEdgeIt e; g.first(e, n); return e; 
       
   126 //   }
       
   127 
       
   128   /// This macro provides a comfortable interface for iterating with LEMON 
       
   129   /// iterators.
       
   130   /// \code
       
   131   /// Graph g;
       
   132   /// ...
       
   133   /// h_for(Graph::NodeIt, n, g) {
       
   134   /// ...
       
   135   /// }
       
   136   /// h_for(Graph::EdgeIt, e, g) {
       
   137   /// ...
       
   138   /// }
       
   139   /// \endcode
       
   140   /// Note that the iterated variables \c n and \c e are local ones. 
       
   141 #define h_for(Ittype, e, g) for(Ittype e=loopFirst(Ittype(), (g)); (g).valid(e); (g).next(e))
       
   142   
       
   143 /// \deprecated
       
   144 #define FOR_EACH_LOC(Ittype, e, g) for(Ittype e=loopFirst(Ittype(), (g)); (g).valid(e); (g).next(e))
       
   145 
       
   146   /// This macro provides a comfortable interface for iterating with LEMON 
       
   147   /// iterators.
       
   148   /// \code
       
   149   /// Graph g;
       
   150   /// ...
       
   151   /// Graph::Node v;
       
   152   /// h_for_inc(Graph::OutEdgeIt, e, g, v) {
       
   153   /// ...
       
   154   /// }
       
   155   /// typedef BipartiteGraph<Graph> BGraph;
       
   156   /// BGraph h;
       
   157   /// ...
       
   158   /// h_for_inc(BGraph::ClassNodeIt, n, h, h.S_CLASS) {
       
   159   /// ...
       
   160   /// }
       
   161   /// \endcode
       
   162   /// Note that the iterated variables \c e and \c n are local ones. 
       
   163 #define h_for_inc(Ittype, e, g, v) for(Ittype e=loopFirst(Ittype(), (g), (v)); (g).valid(e); (g).next(e))
       
   164   
       
   165 /// \deprecated
       
   166 #define FOR_EACH_INC_LOC(Ittype, e, g, v) for(Ittype e=loopFirst(Ittype(), (g), (v)); (g).valid(e); (g).next(e))
       
   167   
       
   168 // #define FOR_EACH_EDGE_LOC(e, g) ezt nem tom hogy kell for((g).first((e)); (g).valid((e)); (g).next((e)))
       
   169 // #define FOR_EACH_NODE_LOC(e, g) for((g).first((e)); (g).valid((e)); (g).next((e)))
       
   170 // #define FOR_EACH_INEDGE_LOC(e, g, v) for((g).first((e), (v)); (g).valid((e)); (g).next((e)))
       
   171 // #define FOR_EACH_OUTEDGE_LOC(e, g, v) for((g).first((e), (v)); (g).valid((e)); (g).next((e)))
       
   172 
       
   173 } //namespace lemon
       
   174 
       
   175 #endif //LEMON_FOR_EACH_MACROS_H