gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge bugfix #364 to branch 1.2
0 2 0
merge 1.2
1 file changed with 4 insertions and 0 deletions:
↑ Collapse diff ↑
Ignore white space 192 line context
... ...
@@ -187,192 +187,194 @@
187 187
    // \brief Base node of the iterator
188 188
    //
189 189
    // Returns the base node (ie. the source in this case) of the iterator
190 190
    Node baseNode(const OutArcIt &e) const {
191 191
      return Parent::source(static_cast<const Arc&>(e));
192 192
    }
193 193
    // \brief Running node of the iterator
194 194
    //
195 195
    // Returns the running node (ie. the target in this case) of the
196 196
    // iterator
197 197
    Node runningNode(const OutArcIt &e) const {
198 198
      return Parent::target(static_cast<const Arc&>(e));
199 199
    }
200 200

	
201 201
    // \brief Base node of the iterator
202 202
    //
203 203
    // Returns the base node (ie. the target in this case) of the iterator
204 204
    Node baseNode(const InArcIt &e) const {
205 205
      return Parent::target(static_cast<const Arc&>(e));
206 206
    }
207 207
    // \brief Running node of the iterator
208 208
    //
209 209
    // Returns the running node (ie. the source in this case) of the
210 210
    // iterator
211 211
    Node runningNode(const InArcIt &e) const {
212 212
      return Parent::source(static_cast<const Arc&>(e));
213 213
    }
214 214

	
215 215
    using Parent::first;
216 216

	
217 217
    // Mappable extension
218 218

	
219 219
    template <typename _Value>
220 220
    class ArcMap
221 221
      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
222 222
      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
223 223

	
224 224
    public:
225 225
      explicit ArcMap(const Digraph& _g)
226 226
        : Parent(_g) {}
227 227
      ArcMap(const Digraph& _g, const _Value& _v)
228 228
        : Parent(_g, _v) {}
229 229

	
230 230
      ArcMap& operator=(const ArcMap& cmap) {
231 231
        return operator=<ArcMap>(cmap);
232 232
      }
233 233

	
234 234
      template <typename CMap>
235 235
      ArcMap& operator=(const CMap& cmap) {
236 236
        Parent::operator=(cmap);
237 237
        return *this;
238 238
      }
239 239

	
240 240
    };
241 241

	
242 242

	
243 243
    // Alteration extension
244 244

	
245 245
    Arc addArc(const Node& from, const Node& to) {
246 246
      Arc arc = Parent::addArc(from, to);
247 247
      notifier(Arc()).add(arc);
248 248
      return arc;
249 249
    }
250 250

	
251 251
    void clear() {
252 252
      notifier(Arc()).clear();
253 253
      Parent::clear();
254 254
    }
255 255

	
256 256
    void erase(const Arc& arc) {
257 257
      notifier(Arc()).erase(arc);
258 258
      Parent::erase(arc);
259 259
    }
260 260

	
261 261
    ArcSetExtender() {
262 262
      arc_notifier.setContainer(*this);
263 263
    }
264 264

	
265 265
    ~ArcSetExtender() {
266 266
      arc_notifier.clear();
267 267
    }
268 268

	
269 269
  };
270 270

	
271 271

	
272 272
  // \ingroup digraphbits
273 273
  //
274 274
  // \brief Extender for the EdgeSets
275 275
  template <typename Base>
276 276
  class EdgeSetExtender : public Base {
277 277
    typedef Base Parent;
278 278

	
279 279
  public:
280 280

	
281 281
    typedef EdgeSetExtender Graph;
282 282

	
283
    typedef True UndirectedTag;
284

	
283 285
    typedef typename Parent::Node Node;
284 286
    typedef typename Parent::Arc Arc;
285 287
    typedef typename Parent::Edge Edge;
286 288

	
287 289
    int maxId(Node) const {
288 290
      return Parent::maxNodeId();
289 291
    }
290 292

	
291 293
    int maxId(Arc) const {
292 294
      return Parent::maxArcId();
293 295
    }
294 296

	
295 297
    int maxId(Edge) const {
296 298
      return Parent::maxEdgeId();
297 299
    }
298 300

	
299 301
    Node fromId(int id, Node) const {
300 302
      return Parent::nodeFromId(id);
301 303
    }
302 304

	
303 305
    Arc fromId(int id, Arc) const {
304 306
      return Parent::arcFromId(id);
305 307
    }
306 308

	
307 309
    Edge fromId(int id, Edge) const {
308 310
      return Parent::edgeFromId(id);
309 311
    }
310 312

	
311 313
    Node oppositeNode(const Node &n, const Edge &e) const {
312 314
      if( n == Parent::u(e))
313 315
        return Parent::v(e);
314 316
      else if( n == Parent::v(e))
315 317
        return Parent::u(e);
316 318
      else
317 319
        return INVALID;
318 320
    }
319 321

	
320 322
    Arc oppositeArc(const Arc &e) const {
321 323
      return Parent::direct(e, !Parent::direction(e));
322 324
    }
323 325

	
324 326
    using Parent::direct;
325 327
    Arc direct(const Edge &e, const Node &s) const {
326 328
      return Parent::direct(e, Parent::u(e) == s);
327 329
    }
328 330

	
329 331
    typedef AlterationNotifier<EdgeSetExtender, Arc> ArcNotifier;
330 332
    typedef AlterationNotifier<EdgeSetExtender, Edge> EdgeNotifier;
331 333

	
332 334

	
333 335
  protected:
334 336

	
335 337
    mutable ArcNotifier arc_notifier;
336 338
    mutable EdgeNotifier edge_notifier;
337 339

	
338 340
  public:
339 341

	
340 342
    using Parent::notifier;
341 343

	
342 344
    ArcNotifier& notifier(Arc) const {
343 345
      return arc_notifier;
344 346
    }
345 347

	
346 348
    EdgeNotifier& notifier(Edge) const {
347 349
      return edge_notifier;
348 350
    }
349 351

	
350 352

	
351 353
    class NodeIt : public Node {
352 354
      const Graph* graph;
353 355
    public:
354 356

	
355 357
      NodeIt() {}
356 358

	
357 359
      NodeIt(Invalid i) : Node(i) { }
358 360

	
359 361
      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
360 362
        _graph.first(static_cast<Node&>(*this));
361 363
      }
362 364

	
363 365
      NodeIt(const Graph& _graph, const Node& node)
364 366
        : Node(node), graph(&_graph) {}
365 367

	
366 368
      NodeIt& operator++() {
367 369
        graph->next(*this);
368 370
        return *this;
369 371
      }
370 372

	
371 373
    };
372 374

	
373 375

	
374 376
    class ArcIt : public Arc {
375 377
      const Graph* graph;
376 378
    public:
377 379

	
378 380
      ArcIt() { }
... ...
@@ -88,192 +88,194 @@
88 88

	
89 89
    class ArcIt : public Arc {
90 90
      const Adaptor* _adaptor;
91 91
    public:
92 92

	
93 93
      ArcIt() { }
94 94

	
95 95
      ArcIt(Invalid i) : Arc(i) { }
96 96

	
97 97
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
98 98
        _adaptor->first(static_cast<Arc&>(*this));
99 99
      }
100 100

	
101 101
      ArcIt(const Adaptor& adaptor, const Arc& e) :
102 102
        Arc(e), _adaptor(&adaptor) { }
103 103

	
104 104
      ArcIt& operator++() {
105 105
        _adaptor->next(*this);
106 106
        return *this;
107 107
      }
108 108

	
109 109
    };
110 110

	
111 111

	
112 112
    class OutArcIt : public Arc {
113 113
      const Adaptor* _adaptor;
114 114
    public:
115 115

	
116 116
      OutArcIt() { }
117 117

	
118 118
      OutArcIt(Invalid i) : Arc(i) { }
119 119

	
120 120
      OutArcIt(const Adaptor& adaptor, const Node& node)
121 121
        : _adaptor(&adaptor) {
122 122
        _adaptor->firstOut(*this, node);
123 123
      }
124 124

	
125 125
      OutArcIt(const Adaptor& adaptor, const Arc& arc)
126 126
        : Arc(arc), _adaptor(&adaptor) {}
127 127

	
128 128
      OutArcIt& operator++() {
129 129
        _adaptor->nextOut(*this);
130 130
        return *this;
131 131
      }
132 132

	
133 133
    };
134 134

	
135 135

	
136 136
    class InArcIt : public Arc {
137 137
      const Adaptor* _adaptor;
138 138
    public:
139 139

	
140 140
      InArcIt() { }
141 141

	
142 142
      InArcIt(Invalid i) : Arc(i) { }
143 143

	
144 144
      InArcIt(const Adaptor& adaptor, const Node& node)
145 145
        : _adaptor(&adaptor) {
146 146
        _adaptor->firstIn(*this, node);
147 147
      }
148 148

	
149 149
      InArcIt(const Adaptor& adaptor, const Arc& arc) :
150 150
        Arc(arc), _adaptor(&adaptor) {}
151 151

	
152 152
      InArcIt& operator++() {
153 153
        _adaptor->nextIn(*this);
154 154
        return *this;
155 155
      }
156 156

	
157 157
    };
158 158

	
159 159
    Node baseNode(const OutArcIt &e) const {
160 160
      return Parent::source(e);
161 161
    }
162 162
    Node runningNode(const OutArcIt &e) const {
163 163
      return Parent::target(e);
164 164
    }
165 165

	
166 166
    Node baseNode(const InArcIt &e) const {
167 167
      return Parent::target(e);
168 168
    }
169 169
    Node runningNode(const InArcIt &e) const {
170 170
      return Parent::source(e);
171 171
    }
172 172

	
173 173
  };
174 174

	
175 175
  template <typename _Graph>
176 176
  class GraphAdaptorExtender : public _Graph {
177 177
    typedef _Graph Parent;
178 178

	
179 179
  public:
180 180

	
181 181
    typedef _Graph Graph;
182 182
    typedef GraphAdaptorExtender Adaptor;
183 183

	
184
    typedef True UndirectedTag;
185

	
184 186
    typedef typename Parent::Node Node;
185 187
    typedef typename Parent::Arc Arc;
186 188
    typedef typename Parent::Edge Edge;
187 189

	
188 190
    // Graph extension
189 191

	
190 192
    int maxId(Node) const {
191 193
      return Parent::maxNodeId();
192 194
    }
193 195

	
194 196
    int maxId(Arc) const {
195 197
      return Parent::maxArcId();
196 198
    }
197 199

	
198 200
    int maxId(Edge) const {
199 201
      return Parent::maxEdgeId();
200 202
    }
201 203

	
202 204
    Node fromId(int id, Node) const {
203 205
      return Parent::nodeFromId(id);
204 206
    }
205 207

	
206 208
    Arc fromId(int id, Arc) const {
207 209
      return Parent::arcFromId(id);
208 210
    }
209 211

	
210 212
    Edge fromId(int id, Edge) const {
211 213
      return Parent::edgeFromId(id);
212 214
    }
213 215

	
214 216
    Node oppositeNode(const Node &n, const Edge &e) const {
215 217
      if( n == Parent::u(e))
216 218
        return Parent::v(e);
217 219
      else if( n == Parent::v(e))
218 220
        return Parent::u(e);
219 221
      else
220 222
        return INVALID;
221 223
    }
222 224

	
223 225
    Arc oppositeArc(const Arc &a) const {
224 226
      return Parent::direct(a, !Parent::direction(a));
225 227
    }
226 228

	
227 229
    using Parent::direct;
228 230
    Arc direct(const Edge &e, const Node &s) const {
229 231
      return Parent::direct(e, Parent::u(e) == s);
230 232
    }
231 233

	
232 234

	
233 235
    class NodeIt : public Node {
234 236
      const Adaptor* _adaptor;
235 237
    public:
236 238

	
237 239
      NodeIt() {}
238 240

	
239 241
      NodeIt(Invalid i) : Node(i) { }
240 242

	
241 243
      explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
242 244
        _adaptor->first(static_cast<Node&>(*this));
243 245
      }
244 246

	
245 247
      NodeIt(const Adaptor& adaptor, const Node& node)
246 248
        : Node(node), _adaptor(&adaptor) {}
247 249

	
248 250
      NodeIt& operator++() {
249 251
        _adaptor->next(*this);
250 252
        return *this;
251 253
      }
252 254

	
253 255
    };
254 256

	
255 257

	
256 258
    class ArcIt : public Arc {
257 259
      const Adaptor* _adaptor;
258 260
    public:
259 261

	
260 262
      ArcIt() { }
261 263

	
262 264
      ArcIt(Invalid i) : Arc(i) { }
263 265

	
264 266
      explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
265 267
        _adaptor->first(static_cast<Arc&>(*this));
266 268
      }
267 269

	
268 270
      ArcIt(const Adaptor& adaptor, const Arc& e) :
269 271
        Arc(e), _adaptor(&adaptor) { }
270 272

	
271 273
      ArcIt& operator++() {
272 274
        _adaptor->next(*this);
273 275
        return *this;
274 276
      }
275 277

	
276 278
    };
277 279

	
278 280

	
279 281
    class OutArcIt : public Arc {
0 comments (0 inline)