gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Add missing tags and indicators
0 4 0
default
4 files changed with 31 insertions and 1 deletions:
↑ Collapse diff ↑
Ignore white space 192 line context
... ...
@@ -125,150 +125,176 @@
125 125
  public:
126 126

	
127 127
    typedef _Graph Graph;
128 128

	
129 129
    typedef typename Graph::Edge Item;
130 130
    typedef typename Graph::EdgeIt ItemIt;
131 131

	
132 132
    typedef typename EdgeNotifierIndicator<Graph>::Type ItemNotifier;
133 133

	
134 134
    template <typename _Value>
135 135
    class Map : public Graph::template EdgeMap<_Value> {
136 136
    public:
137 137
      typedef typename Graph::template EdgeMap<_Value> Parent;
138 138
      typedef typename Graph::template EdgeMap<_Value> Type;
139 139
      typedef typename Parent::Value Value;
140 140

	
141 141
      Map(const Graph& _digraph) : Parent(_digraph) {}
142 142
      Map(const Graph& _digraph, const Value& _value)
143 143
        : Parent(_digraph, _value) {}
144 144
    };
145 145

	
146 146
  };
147 147

	
148 148
  template <typename Map, typename Enable = void>
149 149
  struct MapTraits {
150 150
    typedef False ReferenceMapTag;
151 151

	
152 152
    typedef typename Map::Key Key;
153 153
    typedef typename Map::Value Value;
154 154

	
155 155
    typedef Value ConstReturnValue;
156 156
    typedef Value ReturnValue;
157 157
  };
158 158

	
159 159
  template <typename Map>
160 160
  struct MapTraits<
161 161
    Map, typename enable_if<typename Map::ReferenceMapTag, void>::type >
162 162
  {
163 163
    typedef True ReferenceMapTag;
164 164

	
165 165
    typedef typename Map::Key Key;
166 166
    typedef typename Map::Value Value;
167 167

	
168 168
    typedef typename Map::ConstReference ConstReturnValue;
169 169
    typedef typename Map::Reference ReturnValue;
170 170

	
171 171
    typedef typename Map::ConstReference ConstReference;
172 172
    typedef typename Map::Reference Reference;
173 173
 };
174 174

	
175 175
  template <typename MatrixMap, typename Enable = void>
176 176
  struct MatrixMapTraits {
177 177
    typedef False ReferenceMapTag;
178 178

	
179 179
    typedef typename MatrixMap::FirstKey FirstKey;
180 180
    typedef typename MatrixMap::SecondKey SecondKey;
181 181
    typedef typename MatrixMap::Value Value;
182 182

	
183 183
    typedef Value ConstReturnValue;
184 184
    typedef Value ReturnValue;
185 185
  };
186 186

	
187 187
  template <typename MatrixMap>
188 188
  struct MatrixMapTraits<
189 189
    MatrixMap, typename enable_if<typename MatrixMap::ReferenceMapTag,
190 190
                                  void>::type >
191 191
  {
192 192
    typedef True ReferenceMapTag;
193 193

	
194 194
    typedef typename MatrixMap::FirstKey FirstKey;
195 195
    typedef typename MatrixMap::SecondKey SecondKey;
196 196
    typedef typename MatrixMap::Value Value;
197 197

	
198 198
    typedef typename MatrixMap::ConstReference ConstReturnValue;
199 199
    typedef typename MatrixMap::Reference ReturnValue;
200 200

	
201 201
    typedef typename MatrixMap::ConstReference ConstReference;
202 202
    typedef typename MatrixMap::Reference Reference;
203 203
 };
204 204

	
205 205
  // Indicators for the tags
206 206

	
207 207
  template <typename Graph, typename Enable = void>
208 208
  struct NodeNumTagIndicator {
209 209
    static const bool value = false;
210 210
  };
211 211

	
212 212
  template <typename Graph>
213 213
  struct NodeNumTagIndicator<
214 214
    Graph,
215 215
    typename enable_if<typename Graph::NodeNumTag, void>::type
216 216
  > {
217 217
    static const bool value = true;
218 218
  };
219 219

	
220 220
  template <typename Graph, typename Enable = void>
221
  struct ArcNumTagIndicator {
222
    static const bool value = false;
223
  };
224

	
225
  template <typename Graph>
226
  struct ArcNumTagIndicator<
227
    Graph,
228
    typename enable_if<typename Graph::ArcNumTag, void>::type
229
  > {
230
    static const bool value = true;
231
  };
232

	
233
  template <typename Graph, typename Enable = void>
221 234
  struct EdgeNumTagIndicator {
222 235
    static const bool value = false;
223 236
  };
224 237

	
225 238
  template <typename Graph>
226 239
  struct EdgeNumTagIndicator<
227 240
    Graph,
228 241
    typename enable_if<typename Graph::EdgeNumTag, void>::type
229 242
  > {
230 243
    static const bool value = true;
231 244
  };
232 245

	
233 246
  template <typename Graph, typename Enable = void>
247
  struct FindArcTagIndicator {
248
    static const bool value = false;
249
  };
250

	
251
  template <typename Graph>
252
  struct FindArcTagIndicator<
253
    Graph,
254
    typename enable_if<typename Graph::FindArcTag, void>::type
255
  > {
256
    static const bool value = true;
257
  };
258

	
259
  template <typename Graph, typename Enable = void>
234 260
  struct FindEdgeTagIndicator {
235 261
    static const bool value = false;
236 262
  };
237 263

	
238 264
  template <typename Graph>
239 265
  struct FindEdgeTagIndicator<
240 266
    Graph,
241 267
    typename enable_if<typename Graph::FindEdgeTag, void>::type
242 268
  > {
243 269
    static const bool value = true;
244 270
  };
245 271

	
246 272
  template <typename Graph, typename Enable = void>
247 273
  struct UndirectedTagIndicator {
248 274
    static const bool value = false;
249 275
  };
250 276

	
251 277
  template <typename Graph>
252 278
  struct UndirectedTagIndicator<
253 279
    Graph,
254 280
    typename enable_if<typename Graph::UndirectedTag, void>::type
255 281
  > {
256 282
    static const bool value = true;
257 283
  };
258 284

	
259 285
  template <typename Graph, typename Enable = void>
260 286
  struct BuildTagIndicator {
261 287
    static const bool value = false;
262 288
  };
263 289

	
264 290
  template <typename Graph>
265 291
  struct BuildTagIndicator<
266 292
    Graph,
267 293
    typename enable_if<typename Graph::BuildTag, void>::type
268 294
  > {
269 295
    static const bool value = true;
270 296
  };
271 297

	
272 298
}
273 299

	
274 300
#endif
Ignore white space 192 line context
... ...
@@ -213,229 +213,231 @@
213 213
    int index(const Node& node) const { return Parent::index(node); }
214 214

	
215 215
    /// \brief Returns the arc connecting the given nodes.
216 216
    ///
217 217
    /// Returns the arc connecting the given nodes.
218 218
    Arc arc(const Node& u, const Node& v) const {
219 219
      return Parent::arc(u, v);
220 220
    }
221 221

	
222 222
    /// \brief Number of nodes.
223 223
    int nodeNum() const { return Parent::nodeNum(); }
224 224
    /// \brief Number of arcs.
225 225
    int arcNum() const { return Parent::arcNum(); }
226 226
  };
227 227

	
228 228

	
229 229
  class FullGraphBase {
230 230
    int _node_num;
231 231
    int _edge_num;
232 232
  public:
233 233

	
234 234
    typedef FullGraphBase Graph;
235 235

	
236 236
    class Node;
237 237
    class Arc;
238 238
    class Edge;
239 239

	
240 240
  protected:
241 241

	
242 242
    FullGraphBase() {}
243 243

	
244 244
    void construct(int n) { _node_num = n; _edge_num = n * (n - 1) / 2; }
245 245

	
246 246
    int _uid(int e) const {
247 247
      int u = e / _node_num;
248 248
      int v = e % _node_num;
249 249
      return u < v ? u : _node_num - 2 - u;
250 250
    }
251 251

	
252 252
    int _vid(int e) const {
253 253
      int u = e / _node_num;
254 254
      int v = e % _node_num;
255 255
      return u < v ? v : _node_num - 1 - v;
256 256
    }
257 257

	
258 258
    void _uvid(int e, int& u, int& v) const {
259 259
      u = e / _node_num;
260 260
      v = e % _node_num;
261 261
      if  (u >= v) {
262 262
        u = _node_num - 2 - u;
263 263
        v = _node_num - 1 - v;
264 264
      }
265 265
    }
266 266

	
267 267
    void _stid(int a, int& s, int& t) const {
268 268
      if ((a & 1) == 1) {
269 269
        _uvid(a >> 1, s, t);
270 270
      } else {
271 271
        _uvid(a >> 1, t, s);
272 272
      }
273 273
    }
274 274

	
275 275
    int _eid(int u, int v) const {
276 276
      if (u < (_node_num - 1) / 2) {
277 277
        return u * _node_num + v;
278 278
      } else {
279 279
        return (_node_num - 1 - u) * _node_num - v - 1;
280 280
      }
281 281
    }
282 282

	
283 283
  public:
284 284

	
285 285
    Node operator()(int ix) const { return Node(ix); }
286 286
    int index(const Node& node) const { return node._id; }
287 287

	
288 288
    Edge edge(const Node& u, const Node& v) const {
289 289
      if (u._id < v._id) {
290 290
        return Edge(_eid(u._id, v._id));
291 291
      } else if (u._id != v._id) {
292 292
        return Edge(_eid(v._id, u._id));
293 293
      } else {
294 294
        return INVALID;
295 295
      }
296 296
    }
297 297

	
298 298
    Arc arc(const Node& s, const Node& t) const {
299 299
      if (s._id < t._id) {
300 300
        return Arc((_eid(s._id, t._id) << 1) | 1);
301 301
      } else if (s._id != t._id) {
302 302
        return Arc(_eid(t._id, s._id) << 1);
303 303
      } else {
304 304
        return INVALID;
305 305
      }
306 306
    }
307 307

	
308 308
    typedef True NodeNumTag;
309
    typedef True ArcNumTag;
309 310
    typedef True EdgeNumTag;
310 311

	
311 312
    int nodeNum() const { return _node_num; }
312 313
    int arcNum() const { return 2 * _edge_num; }
313 314
    int edgeNum() const { return _edge_num; }
314 315

	
315 316
    static int id(Node node) { return node._id; }
316 317
    static int id(Arc arc) { return arc._id; }
317 318
    static int id(Edge edge) { return edge._id; }
318 319

	
319 320
    int maxNodeId() const { return _node_num-1; }
320 321
    int maxArcId() const { return 2 * _edge_num-1; }
321 322
    int maxEdgeId() const { return _edge_num-1; }
322 323

	
323 324
    static Node nodeFromId(int id) { return Node(id);}
324 325
    static Arc arcFromId(int id) { return Arc(id);}
325 326
    static Edge edgeFromId(int id) { return Edge(id);}
326 327

	
327 328
    Node u(Edge edge) const {
328 329
      return Node(_uid(edge._id));
329 330
    }
330 331

	
331 332
    Node v(Edge edge) const {
332 333
      return Node(_vid(edge._id));
333 334
    }
334 335

	
335 336
    Node source(Arc arc) const {
336 337
      return Node((arc._id & 1) == 1 ?
337 338
                  _uid(arc._id >> 1) : _vid(arc._id >> 1));
338 339
    }
339 340

	
340 341
    Node target(Arc arc) const {
341 342
      return Node((arc._id & 1) == 1 ?
342 343
                  _vid(arc._id >> 1) : _uid(arc._id >> 1));
343 344
    }
344 345

	
345 346
    typedef True FindEdgeTag;
347
    typedef True FindArcTag;
346 348

	
347 349
    Edge findEdge(Node u, Node v, Edge prev = INVALID) const {
348 350
      return prev != INVALID ? INVALID : edge(u, v);
349 351
    }
350 352

	
351 353
    Arc findArc(Node s, Node t, Arc prev = INVALID) const {
352 354
      return prev != INVALID ? INVALID : arc(s, t);
353 355
    }
354 356

	
355 357
    class Node {
356 358
      friend class FullGraphBase;
357 359

	
358 360
    protected:
359 361
      int _id;
360 362
      Node(int id) : _id(id) {}
361 363
    public:
362 364
      Node() {}
363 365
      Node (Invalid) { _id = -1; }
364 366
      bool operator==(const Node node) const {return _id == node._id;}
365 367
      bool operator!=(const Node node) const {return _id != node._id;}
366 368
      bool operator<(const Node node) const {return _id < node._id;}
367 369
    };
368 370

	
369 371
    class Edge {
370 372
      friend class FullGraphBase;
371 373
      friend class Arc;
372 374

	
373 375
    protected:
374 376
      int _id;
375 377

	
376 378
      Edge(int id) : _id(id) {}
377 379

	
378 380
    public:
379 381
      Edge() { }
380 382
      Edge (Invalid) { _id = -1; }
381 383

	
382 384
      bool operator==(const Edge edge) const {return _id == edge._id;}
383 385
      bool operator!=(const Edge edge) const {return _id != edge._id;}
384 386
      bool operator<(const Edge edge) const {return _id < edge._id;}
385 387
    };
386 388

	
387 389
    class Arc {
388 390
      friend class FullGraphBase;
389 391

	
390 392
    protected:
391 393
      int _id;
392 394

	
393 395
      Arc(int id) : _id(id) {}
394 396

	
395 397
    public:
396 398
      Arc() { }
397 399
      Arc (Invalid) { _id = -1; }
398 400

	
399 401
      operator Edge() const { return Edge(_id != -1 ? (_id >> 1) : -1); }
400 402

	
401 403
      bool operator==(const Arc arc) const {return _id == arc._id;}
402 404
      bool operator!=(const Arc arc) const {return _id != arc._id;}
403 405
      bool operator<(const Arc arc) const {return _id < arc._id;}
404 406
    };
405 407

	
406 408
    static bool direction(Arc arc) {
407 409
      return (arc._id & 1) == 1;
408 410
    }
409 411

	
410 412
    static Arc direct(Edge edge, bool dir) {
411 413
      return Arc((edge._id << 1) | (dir ? 1 : 0));
412 414
    }
413 415

	
414 416
    void first(Node& node) const {
415 417
      node._id = _node_num - 1;
416 418
    }
417 419

	
418 420
    static void next(Node& node) {
419 421
      --node._id;
420 422
    }
421 423

	
422 424
    void first(Arc& arc) const {
423 425
      arc._id = (_edge_num << 1) - 1;
424 426
    }
425 427

	
426 428
    static void next(Arc& arc) {
427 429
      --arc._id;
428 430
    }
429 431

	
430 432
    void first(Edge& edge) const {
431 433
      edge._id = _edge_num - 1;
432 434
    }
433 435

	
434 436
    static void next(Edge& edge) {
435 437
      --edge._id;
436 438
    }
437 439

	
438 440
    void firstOut(Arc& arc, const Node& node) const {
439 441
      int s = node._id, t = _node_num - 1;
440 442
      if (s < t) {
441 443
        arc._id = (_eid(s, t) << 1) | 1;
Ignore white space 192 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 GRID_GRAPH_H
20 20
#define GRID_GRAPH_H
21 21

	
22 22
#include <lemon/core.h>
23 23
#include <lemon/bits/graph_extender.h>
24 24
#include <lemon/dim2.h>
25 25
#include <lemon/assert.h>
26 26

	
27 27
///\ingroup graphs
28 28
///\file
29 29
///\brief GridGraph class.
30 30

	
31 31
namespace lemon {
32 32

	
33 33
  class GridGraphBase {
34 34

	
35 35
  public:
36 36

	
37 37
    typedef GridGraphBase Graph;
38 38

	
39 39
    class Node;
40 40
    class Edge;
41 41
    class Arc;
42 42

	
43 43
  public:
44 44

	
45 45
    GridGraphBase() {}
46 46

	
47 47
  protected:
48 48

	
49 49
    void construct(int width, int height) {
50 50
       _width = width; _height = height;
51 51
      _node_num = width * height;
52 52
      _edge_num = 2 * _node_num - width - height;
53 53
      _edge_limit = _node_num - _width;
54 54
    }
55 55

	
56 56
  public:
57 57

	
58 58
    Node operator()(int i, int j) const {
59 59
      LEMON_DEBUG(0 <= i && i < _width &&
60 60
                  0 <= j  && j < _height, "Index out of range");
61 61
      return Node(i + j * _width);
62 62
    }
63 63

	
64 64
    int col(Node n) const {
65 65
      return n._id % _width;
66 66
    }
67 67

	
68 68
    int row(Node n) const {
69 69
      return n._id / _width;
70 70
    }
71 71

	
72 72
    dim2::Point<int> pos(Node n) const {
73 73
      return dim2::Point<int>(col(n), row(n));
74 74
    }
75 75

	
76 76
    int width() const {
77 77
      return _width;
78 78
    }
79 79

	
80 80
    int height() const {
81 81
      return _height;
82 82
    }
83 83

	
84 84
    typedef True NodeNumTag;
85
    typedef True EdgeNumTag;
85 86
    typedef True ArcNumTag;
86 87

	
87 88
    int nodeNum() const { return _node_num; }
88 89
    int edgeNum() const { return _edge_num; }
89 90
    int arcNum() const { return 2 * _edge_num; }
90 91

	
91 92
    Node u(Edge edge) const {
92 93
      if (edge._id < _edge_limit) {
93 94
        return edge._id;
94 95
      } else {
95 96
        return (edge._id - _edge_limit) % (_width - 1) +
96 97
          (edge._id - _edge_limit) / (_width - 1) * _width;
97 98
      }
98 99
    }
99 100

	
100 101
    Node v(Edge edge) const {
101 102
      if (edge._id < _edge_limit) {
102 103
        return edge._id + _width;
103 104
      } else {
104 105
        return (edge._id - _edge_limit) % (_width - 1) +
105 106
          (edge._id - _edge_limit) / (_width - 1) * _width + 1;
106 107
      }
107 108
    }
108 109

	
109 110
    Node source(Arc arc) const {
110 111
      return (arc._id & 1) == 1 ? u(arc) : v(arc);
111 112
    }
112 113

	
113 114
    Node target(Arc arc) const {
114 115
      return (arc._id & 1) == 1 ? v(arc) : u(arc);
115 116
    }
116 117

	
117 118
    static int id(Node node) { return node._id; }
118 119
    static int id(Edge edge) { return edge._id; }
119 120
    static int id(Arc arc) { return arc._id; }
120 121

	
121 122
    int maxNodeId() const { return _node_num - 1; }
122 123
    int maxEdgeId() const { return _edge_num - 1; }
123 124
    int maxArcId() const { return 2 * _edge_num - 1; }
124 125

	
125 126
    static Node nodeFromId(int id) { return Node(id);}
126 127
    static Edge edgeFromId(int id) { return Edge(id);}
127 128
    static Arc arcFromId(int id) { return Arc(id);}
128 129

	
129 130
    typedef True FindEdgeTag;
131
    typedef True FindArcTag;
130 132

	
131 133
    Edge findEdge(Node u, Node v, Edge prev = INVALID) const {
132 134
      if (prev != INVALID) return INVALID;
133 135
      if (v._id > u._id) {
134 136
        if (v._id - u._id == _width)
135 137
          return Edge(u._id);
136 138
        if (v._id - u._id == 1 && u._id % _width < _width - 1) {
137 139
          return Edge(u._id / _width * (_width - 1) +
138 140
                      u._id % _width + _edge_limit);
139 141
        }
140 142
      } else {
141 143
        if (u._id - v._id == _width)
142 144
          return Edge(v._id);
143 145
        if (u._id - v._id == 1 && v._id % _width < _width - 1) {
144 146
          return Edge(v._id / _width * (_width - 1) +
145 147
                      v._id % _width + _edge_limit);
146 148
        }
147 149
      }
148 150
      return INVALID;
149 151
    }
150 152

	
151 153
    Arc findArc(Node u, Node v, Arc prev = INVALID) const {
152 154
      if (prev != INVALID) return INVALID;
153 155
      if (v._id > u._id) {
154 156
        if (v._id - u._id == _width)
155 157
          return Arc((u._id << 1) | 1);
156 158
        if (v._id - u._id == 1 && u._id % _width < _width - 1) {
157 159
          return Arc(((u._id / _width * (_width - 1) +
158 160
                       u._id % _width + _edge_limit) << 1) | 1);
159 161
        }
160 162
      } else {
161 163
        if (u._id - v._id == _width)
162 164
          return Arc(v._id << 1);
163 165
        if (u._id - v._id == 1 && v._id % _width < _width - 1) {
164 166
          return Arc((v._id / _width * (_width - 1) +
165 167
                       v._id % _width + _edge_limit) << 1);
166 168
        }
167 169
      }
168 170
      return INVALID;
169 171
    }
170 172

	
171 173
    class Node {
172 174
      friend class GridGraphBase;
173 175

	
174 176
    protected:
175 177
      int _id;
176 178
      Node(int id) : _id(id) {}
177 179
    public:
178 180
      Node() {}
179 181
      Node (Invalid) : _id(-1) {}
180 182
      bool operator==(const Node node) const {return _id == node._id;}
181 183
      bool operator!=(const Node node) const {return _id != node._id;}
182 184
      bool operator<(const Node node) const {return _id < node._id;}
183 185
    };
184 186

	
185 187
    class Edge {
186 188
      friend class GridGraphBase;
187 189
      friend class Arc;
188 190

	
189 191
    protected:
190 192
      int _id;
191 193

	
192 194
      Edge(int id) : _id(id) {}
193 195

	
194 196
    public:
195 197
      Edge() {}
196 198
      Edge (Invalid) : _id(-1) {}
197 199
      bool operator==(const Edge edge) const {return _id == edge._id;}
198 200
      bool operator!=(const Edge edge) const {return _id != edge._id;}
199 201
      bool operator<(const Edge edge) const {return _id < edge._id;}
200 202
    };
201 203

	
202 204
    class Arc {
203 205
      friend class GridGraphBase;
204 206

	
205 207
    protected:
206 208
      int _id;
207 209

	
208 210
      Arc(int id) : _id(id) {}
209 211

	
210 212
    public:
211 213
      Arc() {}
212 214
      Arc (Invalid) : _id(-1) {}
213 215
      operator Edge() const { return _id != -1 ? Edge(_id >> 1) : INVALID; }
214 216
      bool operator==(const Arc arc) const {return _id == arc._id;}
215 217
      bool operator!=(const Arc arc) const {return _id != arc._id;}
216 218
      bool operator<(const Arc arc) const {return _id < arc._id;}
217 219
    };
218 220

	
219 221
    static bool direction(Arc arc) {
220 222
      return (arc._id & 1) == 1;
221 223
    }
222 224

	
223 225
    static Arc direct(Edge edge, bool dir) {
224 226
      return Arc((edge._id << 1) | (dir ? 1 : 0));
225 227
    }
Ignore white space 192 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_SMART_GRAPH_H
20 20
#define LEMON_SMART_GRAPH_H
21 21

	
22 22
///\ingroup graphs
23 23
///\file
24 24
///\brief SmartDigraph and SmartGraph classes.
25 25

	
26 26
#include <vector>
27 27

	
28 28
#include <lemon/core.h>
29 29
#include <lemon/error.h>
30 30
#include <lemon/bits/graph_extender.h>
31 31

	
32 32
namespace lemon {
33 33

	
34 34
  class SmartDigraph;
35 35
  ///Base of SmartDigraph
36 36

	
37 37
  ///Base of SmartDigraph
38 38
  ///
39 39
  class SmartDigraphBase {
40 40
  protected:
41 41

	
42 42
    struct NodeT
43 43
    {
44 44
      int first_in, first_out;
45 45
      NodeT() {}
46 46
    };
47 47
    struct ArcT
48 48
    {
49 49
      int target, source, next_in, next_out;
50 50
      ArcT() {}
51 51
    };
52 52

	
53 53
    std::vector<NodeT> nodes;
54 54
    std::vector<ArcT> arcs;
55 55

	
56 56
  public:
57 57

	
58 58
    typedef SmartDigraphBase Graph;
59 59

	
60 60
    class Node;
61 61
    class Arc;
62 62

	
63 63
  public:
64 64

	
65 65
    SmartDigraphBase() : nodes(), arcs() { }
66 66
    SmartDigraphBase(const SmartDigraphBase &_g)
67 67
      : nodes(_g.nodes), arcs(_g.arcs) { }
68 68

	
69 69
    typedef True NodeNumTag;
70
    typedef True EdgeNumTag;
70
    typedef True ArcNumTag;
71 71

	
72 72
    int nodeNum() const { return nodes.size(); }
73 73
    int arcNum() const { return arcs.size(); }
74 74

	
75 75
    int maxNodeId() const { return nodes.size()-1; }
76 76
    int maxArcId() const { return arcs.size()-1; }
77 77

	
78 78
    Node addNode() {
79 79
      int n = nodes.size();
80 80
      nodes.push_back(NodeT());
81 81
      nodes[n].first_in = -1;
82 82
      nodes[n].first_out = -1;
83 83
      return Node(n);
84 84
    }
85 85

	
86 86
    Arc addArc(Node u, Node v) {
87 87
      int n = arcs.size();
88 88
      arcs.push_back(ArcT());
89 89
      arcs[n].source = u._id;
90 90
      arcs[n].target = v._id;
91 91
      arcs[n].next_out = nodes[u._id].first_out;
92 92
      arcs[n].next_in = nodes[v._id].first_in;
93 93
      nodes[u._id].first_out = nodes[v._id].first_in = n;
94 94

	
95 95
      return Arc(n);
96 96
    }
97 97

	
98 98
    void clear() {
99 99
      arcs.clear();
100 100
      nodes.clear();
101 101
    }
102 102

	
103 103
    Node source(Arc a) const { return Node(arcs[a._id].source); }
104 104
    Node target(Arc a) const { return Node(arcs[a._id].target); }
105 105

	
106 106
    static int id(Node v) { return v._id; }
107 107
    static int id(Arc a) { return a._id; }
108 108

	
109 109
    static Node nodeFromId(int id) { return Node(id);}
110 110
    static Arc arcFromId(int id) { return Arc(id);}
111 111

	
112 112
    bool valid(Node n) const {
113 113
      return n._id >= 0 && n._id < static_cast<int>(nodes.size());
114 114
    }
115 115
    bool valid(Arc a) const {
116 116
      return a._id >= 0 && a._id < static_cast<int>(arcs.size());
117 117
    }
118 118

	
119 119
    class Node {
120 120
      friend class SmartDigraphBase;
121 121
      friend class SmartDigraph;
122 122

	
123 123
    protected:
124 124
      int _id;
125 125
      explicit Node(int id) : _id(id) {}
126 126
    public:
127 127
      Node() {}
128 128
      Node (Invalid) : _id(-1) {}
129 129
      bool operator==(const Node i) const {return _id == i._id;}
130 130
      bool operator!=(const Node i) const {return _id != i._id;}
131 131
      bool operator<(const Node i) const {return _id < i._id;}
132 132
    };
133 133

	
134 134

	
135 135
    class Arc {
136 136
      friend class SmartDigraphBase;
137 137
      friend class SmartDigraph;
138 138

	
139 139
    protected:
140 140
      int _id;
141 141
      explicit Arc(int id) : _id(id) {}
142 142
    public:
143 143
      Arc() { }
144 144
      Arc (Invalid) : _id(-1) {}
145 145
      bool operator==(const Arc i) const {return _id == i._id;}
146 146
      bool operator!=(const Arc i) const {return _id != i._id;}
147 147
      bool operator<(const Arc i) const {return _id < i._id;}
148 148
    };
149 149

	
150 150
    void first(Node& node) const {
151 151
      node._id = nodes.size() - 1;
152 152
    }
153 153

	
154 154
    static void next(Node& node) {
155 155
      --node._id;
156 156
    }
157 157

	
158 158
    void first(Arc& arc) const {
159 159
      arc._id = arcs.size() - 1;
160 160
    }
161 161

	
162 162
    static void next(Arc& arc) {
163 163
      --arc._id;
164 164
    }
165 165

	
166 166
    void firstOut(Arc& arc, const Node& node) const {
0 comments (0 inline)