gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Revert faulty changes of [dc9e8d2c0df9]
0 1 0
default
1 file changed with 8 insertions and 8 deletions:
↑ Collapse diff ↑
Ignore white space 384 line context
1 1
/* -*- mode: C++; indent-tabs-mode: nil; -*-
2 2
 *
3 3
 * This file is a part of LEMON, a generic C++ optimization library.
4 4
 *
5 5
 * Copyright (C) 2003-2008
6 6
 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 7
 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 8
 *
9 9
 * Permission to use, modify and distribute this software is granted
10 10
 * provided that this copyright notice appears in all copies. For
11 11
 * precise terms see the accompanying LICENSE file.
12 12
 *
13 13
 * This software is provided "AS IS" with no warranty of any kind,
14 14
 * express or implied, and with no claim as to its suitability for any
15 15
 * purpose.
16 16
 *
17 17
 */
18 18

	
19 19
#ifndef LEMON_CORE_H
20 20
#define LEMON_CORE_H
21 21

	
22 22
#include <vector>
23 23
#include <algorithm>
24 24

	
25 25
#include <lemon/bits/enable_if.h>
26 26
#include <lemon/bits/traits.h>
27 27

	
28 28
///\file
29 29
///\brief LEMON core utilities.
30 30
///
31 31
///This header file contains core utilities for LEMON.
32 32
///It is automatically included by all graph types, therefore it usually
33 33
///do not have to be included directly.
34 34

	
35 35
namespace lemon {
36 36

	
37 37
  /// \brief Dummy type to make it easier to create invalid iterators.
38 38
  ///
39 39
  /// Dummy type to make it easier to create invalid iterators.
40 40
  /// See \ref INVALID for the usage.
41 41
  struct Invalid {
42 42
  public:
43 43
    bool operator==(Invalid) { return true;  }
44 44
    bool operator!=(Invalid) { return false; }
45 45
    bool operator< (Invalid) { return false; }
46 46
  };
47 47

	
48 48
  /// \brief Invalid iterators.
49 49
  ///
50 50
  /// \ref Invalid is a global type that converts to each iterator
51 51
  /// in such a way that the value of the target iterator will be invalid.
52 52
#ifdef LEMON_ONLY_TEMPLATES
53 53
  const Invalid INVALID = Invalid();
54 54
#else
55 55
  extern const Invalid INVALID;
56 56
#endif
57 57

	
58 58
  /// \addtogroup gutils
59 59
  /// @{
60 60

	
61
  ///Create convenient typedefs for the digraph types and iterators
61
  ///Create convenience typedefs for the digraph types and iterators
62 62

	
63 63
  ///This \c \#define creates convenient type definitions for the following
64 64
  ///types of \c Digraph: \c Node,  \c NodeIt, \c Arc, \c ArcIt, \c InArcIt,
65 65
  ///\c OutArcIt, \c BoolNodeMap, \c IntNodeMap, \c DoubleNodeMap,
66 66
  ///\c BoolArcMap, \c IntArcMap, \c DoubleArcMap.
67 67
  ///
68 68
  ///\note If the graph type is a dependent type, ie. the graph type depend
69 69
  ///on a template parameter, then use \c TEMPLATE_DIGRAPH_TYPEDEFS()
70 70
  ///macro.
71 71
#define DIGRAPH_TYPEDEFS(Digraph)                                       \
72 72
  typedef Digraph::Node Node;                                           \
73 73
  typedef Digraph::NodeIt NodeIt;                                       \
74 74
  typedef Digraph::Arc Arc;                                             \
75 75
  typedef Digraph::ArcIt ArcIt;                                         \
76 76
  typedef Digraph::InArcIt InArcIt;                                     \
77 77
  typedef Digraph::OutArcIt OutArcIt;                                   \
78 78
  typedef Digraph::NodeMap<bool> BoolNodeMap;                           \
79 79
  typedef Digraph::NodeMap<int> IntNodeMap;                             \
80 80
  typedef Digraph::NodeMap<double> DoubleNodeMap;                       \
81 81
  typedef Digraph::ArcMap<bool> BoolArcMap;                             \
82 82
  typedef Digraph::ArcMap<int> IntArcMap;                               \
83
  typedef Digraph::ArcMap<double> DoubleArcMap;
83
  typedef Digraph::ArcMap<double> DoubleArcMap
84 84

	
85
  ///Create convenient typedefs for the digraph types and iterators
85
  ///Create convenience typedefs for the digraph types and iterators
86 86

	
87 87
  ///\see DIGRAPH_TYPEDEFS
88 88
  ///
89 89
  ///\note Use this macro, if the graph type is a dependent type,
90 90
  ///ie. the graph type depend on a template parameter.
91 91
#define TEMPLATE_DIGRAPH_TYPEDEFS(Digraph)                              \
92 92
  typedef typename Digraph::Node Node;                                  \
93 93
  typedef typename Digraph::NodeIt NodeIt;                              \
94 94
  typedef typename Digraph::Arc Arc;                                    \
95 95
  typedef typename Digraph::ArcIt ArcIt;                                \
96 96
  typedef typename Digraph::InArcIt InArcIt;                            \
97 97
  typedef typename Digraph::OutArcIt OutArcIt;                          \
98 98
  typedef typename Digraph::template NodeMap<bool> BoolNodeMap;         \
99 99
  typedef typename Digraph::template NodeMap<int> IntNodeMap;           \
100 100
  typedef typename Digraph::template NodeMap<double> DoubleNodeMap;     \
101 101
  typedef typename Digraph::template ArcMap<bool> BoolArcMap;           \
102 102
  typedef typename Digraph::template ArcMap<int> IntArcMap;             \
103
  typedef typename Digraph::template ArcMap<double> DoubleArcMap;
103
  typedef typename Digraph::template ArcMap<double> DoubleArcMap
104 104

	
105
  ///Create convenient typedefs for the graph types and iterators
105
  ///Create convenience typedefs for the graph types and iterators
106 106

	
107 107
  ///This \c \#define creates the same convenient type definitions as defined
108 108
  ///by \ref DIGRAPH_TYPEDEFS(Graph) and six more, namely it creates
109 109
  ///\c Edge, \c EdgeIt, \c IncEdgeIt, \c BoolEdgeMap, \c IntEdgeMap,
110 110
  ///\c DoubleEdgeMap.
111 111
  ///
112 112
  ///\note If the graph type is a dependent type, ie. the graph type depend
113 113
  ///on a template parameter, then use \c TEMPLATE_GRAPH_TYPEDEFS()
114 114
  ///macro.
115 115
#define GRAPH_TYPEDEFS(Graph)                                           \
116 116
  DIGRAPH_TYPEDEFS(Graph);                                              \
117 117
  typedef Graph::Edge Edge;                                             \
118 118
  typedef Graph::EdgeIt EdgeIt;                                         \
119 119
  typedef Graph::IncEdgeIt IncEdgeIt;                                   \
120 120
  typedef Graph::EdgeMap<bool> BoolEdgeMap;                             \
121 121
  typedef Graph::EdgeMap<int> IntEdgeMap;                               \
122
  typedef Graph::EdgeMap<double> DoubleEdgeMap;
122
  typedef Graph::EdgeMap<double> DoubleEdgeMap
123 123

	
124
  ///Create convenient typedefs for the graph types and iterators
124
  ///Create convenience typedefs for the graph types and iterators
125 125

	
126 126
  ///\see GRAPH_TYPEDEFS
127 127
  ///
128 128
  ///\note Use this macro, if the graph type is a dependent type,
129 129
  ///ie. the graph type depend on a template parameter.
130 130
#define TEMPLATE_GRAPH_TYPEDEFS(Graph)                                  \
131 131
  TEMPLATE_DIGRAPH_TYPEDEFS(Graph);                                     \
132 132
  typedef typename Graph::Edge Edge;                                    \
133 133
  typedef typename Graph::EdgeIt EdgeIt;                                \
134 134
  typedef typename Graph::IncEdgeIt IncEdgeIt;                          \
135 135
  typedef typename Graph::template EdgeMap<bool> BoolEdgeMap;           \
136 136
  typedef typename Graph::template EdgeMap<int> IntEdgeMap;             \
137
  typedef typename Graph::template EdgeMap<double> DoubleEdgeMap;
137
  typedef typename Graph::template EdgeMap<double> DoubleEdgeMap
138 138

	
139 139
  /// \brief Function to count the items in a graph.
140 140
  ///
141 141
  /// This function counts the items (nodes, arcs etc.) in a graph.
142 142
  /// The complexity of the function is linear because
143 143
  /// it iterates on all of the items.
144 144
  template <typename Graph, typename Item>
145 145
  inline int countItems(const Graph& g) {
146 146
    typedef typename ItemSetTraits<Graph, Item>::ItemIt ItemIt;
147 147
    int num = 0;
148 148
    for (ItemIt it(g); it != INVALID; ++it) {
149 149
      ++num;
150 150
    }
151 151
    return num;
152 152
  }
153 153

	
154 154
  // Node counting:
155 155

	
156 156
  namespace _core_bits {
157 157

	
158 158
    template <typename Graph, typename Enable = void>
159 159
    struct CountNodesSelector {
160 160
      static int count(const Graph &g) {
161 161
        return countItems<Graph, typename Graph::Node>(g);
162 162
      }
163 163
    };
164 164

	
165 165
    template <typename Graph>
166 166
    struct CountNodesSelector<
167 167
      Graph, typename
168 168
      enable_if<typename Graph::NodeNumTag, void>::type>
169 169
    {
170 170
      static int count(const Graph &g) {
171 171
        return g.nodeNum();
172 172
      }
173 173
    };
174 174
  }
175 175

	
176 176
  /// \brief Function to count the nodes in the graph.
177 177
  ///
178 178
  /// This function counts the nodes in the graph.
179 179
  /// The complexity of the function is <em>O</em>(<em>n</em>), but for some
180 180
  /// graph structures it is specialized to run in <em>O</em>(1).
181 181
  ///
182 182
  /// \note If the graph contains a \c nodeNum() member function and a
183 183
  /// \c NodeNumTag tag then this function calls directly the member
184 184
  /// function to query the cardinality of the node set.
185 185
  template <typename Graph>
186 186
  inline int countNodes(const Graph& g) {
187 187
    return _core_bits::CountNodesSelector<Graph>::count(g);
188 188
  }
189 189

	
190 190
  // Arc counting:
191 191

	
192 192
  namespace _core_bits {
193 193

	
194 194
    template <typename Graph, typename Enable = void>
195 195
    struct CountArcsSelector {
196 196
      static int count(const Graph &g) {
197 197
        return countItems<Graph, typename Graph::Arc>(g);
198 198
      }
199 199
    };
200 200

	
201 201
    template <typename Graph>
202 202
    struct CountArcsSelector<
203 203
      Graph,
204 204
      typename enable_if<typename Graph::ArcNumTag, void>::type>
205 205
    {
206 206
      static int count(const Graph &g) {
207 207
        return g.arcNum();
208 208
      }
209 209
    };
210 210
  }
211 211

	
212 212
  /// \brief Function to count the arcs in the graph.
213 213
  ///
214 214
  /// This function counts the arcs in the graph.
215 215
  /// The complexity of the function is <em>O</em>(<em>m</em>), but for some
216 216
  /// graph structures it is specialized to run in <em>O</em>(1).
217 217
  ///
218 218
  /// \note If the graph contains a \c arcNum() member function and a
219 219
  /// \c ArcNumTag tag then this function calls directly the member
220 220
  /// function to query the cardinality of the arc set.
221 221
  template <typename Graph>
222 222
  inline int countArcs(const Graph& g) {
223 223
    return _core_bits::CountArcsSelector<Graph>::count(g);
224 224
  }
225 225

	
226 226
  // Edge counting:
227 227

	
228 228
  namespace _core_bits {
229 229

	
230 230
    template <typename Graph, typename Enable = void>
231 231
    struct CountEdgesSelector {
232 232
      static int count(const Graph &g) {
233 233
        return countItems<Graph, typename Graph::Edge>(g);
234 234
      }
235 235
    };
236 236

	
237 237
    template <typename Graph>
238 238
    struct CountEdgesSelector<
239 239
      Graph,
240 240
      typename enable_if<typename Graph::EdgeNumTag, void>::type>
241 241
    {
242 242
      static int count(const Graph &g) {
243 243
        return g.edgeNum();
244 244
      }
245 245
    };
246 246
  }
247 247

	
248 248
  /// \brief Function to count the edges in the graph.
249 249
  ///
250 250
  /// This function counts the edges in the graph.
251 251
  /// The complexity of the function is <em>O</em>(<em>m</em>), but for some
252 252
  /// graph structures it is specialized to run in <em>O</em>(1).
253 253
  ///
254 254
  /// \note If the graph contains a \c edgeNum() member function and a
255 255
  /// \c EdgeNumTag tag then this function calls directly the member
256 256
  /// function to query the cardinality of the edge set.
257 257
  template <typename Graph>
258 258
  inline int countEdges(const Graph& g) {
259 259
    return _core_bits::CountEdgesSelector<Graph>::count(g);
260 260

	
261 261
  }
262 262

	
263 263

	
264 264
  template <typename Graph, typename DegIt>
265 265
  inline int countNodeDegree(const Graph& _g, const typename Graph::Node& _n) {
266 266
    int num = 0;
267 267
    for (DegIt it(_g, _n); it != INVALID; ++it) {
268 268
      ++num;
269 269
    }
270 270
    return num;
271 271
  }
272 272

	
273 273
  /// \brief Function to count the number of the out-arcs from node \c n.
274 274
  ///
275 275
  /// This function counts the number of the out-arcs from node \c n
276 276
  /// in the graph \c g.
277 277
  template <typename Graph>
278 278
  inline int countOutArcs(const Graph& g,  const typename Graph::Node& n) {
279 279
    return countNodeDegree<Graph, typename Graph::OutArcIt>(g, n);
280 280
  }
281 281

	
282 282
  /// \brief Function to count the number of the in-arcs to node \c n.
283 283
  ///
284 284
  /// This function counts the number of the in-arcs to node \c n
285 285
  /// in the graph \c g.
286 286
  template <typename Graph>
287 287
  inline int countInArcs(const Graph& g,  const typename Graph::Node& n) {
288 288
    return countNodeDegree<Graph, typename Graph::InArcIt>(g, n);
289 289
  }
290 290

	
291 291
  /// \brief Function to count the number of the inc-edges to node \c n.
292 292
  ///
293 293
  /// This function counts the number of the inc-edges to node \c n
294 294
  /// in the undirected graph \c g.
295 295
  template <typename Graph>
296 296
  inline int countIncEdges(const Graph& g,  const typename Graph::Node& n) {
297 297
    return countNodeDegree<Graph, typename Graph::IncEdgeIt>(g, n);
298 298
  }
299 299

	
300 300
  namespace _core_bits {
301 301

	
302 302
    template <typename Digraph, typename Item, typename RefMap>
303 303
    class MapCopyBase {
304 304
    public:
305 305
      virtual void copy(const Digraph& from, const RefMap& refMap) = 0;
306 306

	
307 307
      virtual ~MapCopyBase() {}
308 308
    };
309 309

	
310 310
    template <typename Digraph, typename Item, typename RefMap,
311 311
              typename FromMap, typename ToMap>
312 312
    class MapCopy : public MapCopyBase<Digraph, Item, RefMap> {
313 313
    public:
314 314

	
315 315
      MapCopy(const FromMap& map, ToMap& tmap)
316 316
        : _map(map), _tmap(tmap) {}
317 317

	
318 318
      virtual void copy(const Digraph& digraph, const RefMap& refMap) {
319 319
        typedef typename ItemSetTraits<Digraph, Item>::ItemIt ItemIt;
320 320
        for (ItemIt it(digraph); it != INVALID; ++it) {
321 321
          _tmap.set(refMap[it], _map[it]);
322 322
        }
323 323
      }
324 324

	
325 325
    private:
326 326
      const FromMap& _map;
327 327
      ToMap& _tmap;
328 328
    };
329 329

	
0 comments (0 inline)