gravatar
kpeter (Peter Kovacs)
kpeter@inf.elte.hu
Extend the interface of StaticDigraph (#68) with index(), arc() and node() functions similarly to other static graph structures.
0 2 0
default
2 files changed with 56 insertions and 5 deletions:
↑ Collapse diff ↑
Show white space 24 line context
... ...
@@ -230,42 +230,82 @@
230 230
  ///
231 231
  /// \brief A static directed graph class.
232 232
  ///
233 233
  /// \ref StaticDigraph is a highly efficient digraph implementation,
234 234
  /// but it is fully static.
235 235
  /// It stores only two \c int values for each node and only four \c int
236 236
  /// values for each arc. Moreover it provides faster item iteration than
237 237
  /// \ref ListDigraph and \ref SmartDigraph, especially using \c OutArcIt
238 238
  /// iterators, since its arcs are stored in an appropriate order.
239 239
  /// However it only provides build() and clear() functions and does not
240 240
  /// support any other modification of the digraph.
241 241
  ///
242
  /// Since this digraph structure is completely static, its nodes and arcs
243
  /// can be indexed with integers from the ranges <tt>[0..nodeNum()-1]</tt>
244
  /// and <tt>[0..arcNum()-1]</tt>, respectively. 
245
  /// The index of an item is the same as its ID, it can be obtained
246
  /// using the corresponding \ref index() or \ref concepts::Digraph::id()
247
  /// "id()" function. A node or arc with a certain index can be obtained
248
  /// using node() or arc().
249
  ///
242 250
  /// This type fully conforms to the \ref concepts::Digraph "Digraph concept".
243 251
  /// Most of its member functions and nested classes are documented
244 252
  /// only in the concept class.
245 253
  ///
246 254
  /// \sa concepts::Digraph
247 255
  class StaticDigraph : public ExtendedStaticDigraphBase {
248 256
  public:
249 257

	
250 258
    typedef ExtendedStaticDigraphBase Parent;
251 259
  
252 260
  public:
253 261
  
254
    /// \brief Clear the digraph.
262
    /// \brief Constructor
255 263
    ///
256
    /// This function erases all nodes and arcs from the digraph.
257
    void clear() {
258
      Parent::clear();
259
    }
264
    /// Default constructor.
265
    StaticDigraph() : Parent() {}
266

	
267
    /// \brief The node with the given index.
268
    ///
269
    /// This function returns the node with the given index.
270
    /// \sa index()
271
    Node node(int ix) const { return Parent::nodeFromId(ix); }
272

	
273
    /// \brief The arc with the given index.
274
    ///
275
    /// This function returns the arc with the given index.
276
    /// \sa index()
277
    Arc arc(int ix) const { return Parent::arcFromId(ix); }
278

	
279
    /// \brief The index of the given node.
280
    ///
281
    /// This function returns the index of the the given node.
282
    /// \sa node()
283
    int index(Node node) const { return Parent::id(node); }
284

	
285
    /// \brief The index of the given arc.
286
    ///
287
    /// This function returns the index of the the given arc.
288
    /// \sa arc()
289
    int index(Arc arc) const { return Parent::id(arc); }
290

	
291
    /// \brief Number of nodes.
292
    ///
293
    /// This function returns the number of nodes.
294
    int nodeNum() const { return node_num; }
295

	
296
    /// \brief Number of arcs.
297
    ///
298
    /// This function returns the number of arcs.
299
    int arcNum() const { return arc_num; }
260 300
    
261 301
    /// \brief Build the digraph copying another digraph.
262 302
    ///
263 303
    /// This function builds the digraph copying another digraph of any
264 304
    /// kind. It can be called more than once, but in such case, the whole
265 305
    /// structure and all maps will be cleared and rebuilt.
266 306
    ///
267 307
    /// This method also makes possible to copy a digraph to a StaticDigraph
268 308
    /// structure using \ref DigraphCopy.
269 309
    /// 
270 310
    /// \param digraph An existing digraph to be copied.
271 311
    /// \param nodeRef The node references will be copied into this map.
... ...
@@ -279,24 +319,30 @@
279 319
    /// It must conform to the \ref concepts::WriteMap "WriteMap" concept.
280 320
    ///
281 321
    /// \note If you do not need the arc references, then you could use
282 322
    /// \ref NullMap for the last parameter. However the node references
283 323
    /// are required by the function itself, thus they must be readable
284 324
    /// from the map.
285 325
    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
286 326
    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
287 327
      if (built) Parent::clear();
288 328
      Parent::build(digraph, nodeRef, arcRef);
289 329
    }
290 330
  
331
    /// \brief Clear the digraph.
332
    ///
333
    /// This function erases all nodes and arcs from the digraph.
334
    void clear() {
335
      Parent::clear();
336
    }
291 337

	
292 338
  protected:
293 339

	
294 340
    using Parent::fastFirstOut;
295 341
    using Parent::fastNextOut;
296 342
    using Parent::fastLastOut;
297 343
    
298 344
  public:
299 345

	
300 346
    class OutArcIt : public Arc {
301 347
    public:
302 348

	
Show white space 24 line context
... ...
@@ -436,24 +436,29 @@
436 436
  checkGraphOutArcList(G, nref[n3], 0);
437 437

	
438 438
  checkGraphInArcList(G, nref[n1], 1);
439 439
  checkGraphInArcList(G, nref[n2], 1);
440 440
  checkGraphInArcList(G, nref[n3], 2);
441 441

	
442 442
  checkGraphConArcList(G, 4);
443 443

	
444 444
  checkNodeIds(G);
445 445
  checkArcIds(G);
446 446
  checkGraphNodeMap(G);
447 447
  checkGraphArcMap(G);
448
  
449
  int n = G.nodeNum();
450
  int m = G.arcNum();
451
  check(G.index(G.node(n-1)) == n-1, "Wrong index.");
452
  check(G.index(G.arc(m-1)) == m-1, "Wrong index.");
448 453
}
449 454

	
450 455
void checkFullDigraph(int num) {
451 456
  typedef FullDigraph Digraph;
452 457
  DIGRAPH_TYPEDEFS(Digraph);
453 458
  Digraph G(num);
454 459

	
455 460
  checkGraphNodeList(G, num);
456 461
  checkGraphArcList(G, num * num);
457 462

	
458 463
  for (NodeIt n(G); n != INVALID; ++n) {
459 464
    checkGraphOutArcList(G, n, num);
0 comments (0 inline)