gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge bugfix #364 to branch 1.1
0 2 0
merge 1.1
1 file changed with 4 insertions and 0 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -219,128 +219,130 @@
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 {
... ...
@@ -120,128 +120,130 @@
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

	
0 comments (0 inline)