src/work/peter/hierarchygraph.h
author deba
Wed, 08 Sep 2004 12:06:45 +0000 (2004-09-08)
changeset 822 88226d9fe821
parent 690 a0f95e1b17fc
child 826 056fbb112b30
permissions -rw-r--r--
The MapFactories have been removed from the code because
if we use macros then they increases only the complexity.

The pair iterators of the maps are separeted from the maps.

Some macros and comments has been changed.
hegyi@677
     1
// -*- c++ -*-
hegyi@677
     2
#ifndef HUGO_NET_GRAPH_H
hegyi@677
     3
#define HUGO_NET_GRAPH_H
hegyi@677
     4
hegyi@677
     5
///\file
hegyi@677
     6
///\brief Declaration of HierarchyGraph.
hegyi@677
     7
hegyi@677
     8
#include <hugo/invalid.h>
hegyi@677
     9
#include <hugo/maps.h>
hegyi@677
    10
hegyi@677
    11
/// The namespace of HugoLib
hegyi@691
    12
namespace hugo
hegyi@691
    13
{
hegyi@677
    14
hegyi@677
    15
  // @defgroup empty_graph The HierarchyGraph class
hegyi@677
    16
  // @{
hegyi@677
    17
hegyi@677
    18
  /// A graph class in that a simple edge can represent a path.
hegyi@690
    19
hegyi@677
    20
  /// This class provides common features of a graph structure
hegyi@677
    21
  /// that represents a network. You can handle with it layers. This
hegyi@677
    22
  /// means that a node in one layer can be a complete network in a nother
hegyi@677
    23
  /// layer.
hegyi@677
    24
hegyi@691
    25
  template < class Gact, class Gsub > class HierarchyGraph
hegyi@677
    26
  {
hegyi@677
    27
hegyi@677
    28
  public:
hegyi@677
    29
hegyi@677
    30
    /// The actual layer
hegyi@677
    31
    Gact actuallayer;
hegyi@677
    32
hegyi@677
    33
hegyi@690
    34
    /// Map of the subnetworks in the sublayer
hegyi@690
    35
    /// The appropriate edge nodes are also stored here
hegyi@677
    36
hegyi@690
    37
    class SubNetwork
hegyi@690
    38
    {
hegyi@690
    39
hegyi@690
    40
      struct actedgesubnodestruct
hegyi@690
    41
      {
hegyi@691
    42
	typename Gact::Edge actedge;
hegyi@691
    43
	typename Gsub::Node subnode;
hegyi@690
    44
      };
hegyi@690
    45
hegyi@690
    46
      int edgenumber;
hegyi@690
    47
      bool connectable;
hegyi@691
    48
      Gact *actuallayer;
hegyi@690
    49
      typename Gact::Node * actuallayernode;
hegyi@691
    50
      Gsub *subnetwork;
hegyi@691
    51
      actedgesubnodestruct *assignments;
hegyi@690
    52
hegyi@690
    53
    public:
hegyi@690
    54
hegyi@691
    55
      int addAssignment (typename Gact::Edge actedge,
hegyi@691
    56
			 typename Gsub::Node subnode)
hegyi@690
    57
      {
hegyi@691
    58
	if (!(actuallayer->valid (actedge)))
hegyi@691
    59
	  {
hegyi@691
    60
	    cerr << "The given edge is not in the given network!" << endl;
hegyi@691
    61
	    return -1;
hegyi@691
    62
	  }
hegyi@691
    63
	else if ((actuallayer->id (actuallayer->tail (actedge)) !=
hegyi@691
    64
		  actuallayer->id (*actuallayernode))
hegyi@691
    65
		 && (actuallayer->id (actuallayer->head (actedge)) !=
hegyi@691
    66
		     actuallayer->id (*actuallayernode)))
hegyi@691
    67
	  {
hegyi@691
    68
	    cerr << "The given edge does not connect to the given node!" <<
hegyi@691
    69
	      endl;
hegyi@691
    70
	    return -1;
hegyi@691
    71
	  }
hegyi@690
    72
hegyi@691
    73
	if (!(subnetwork->valid (subnode)))
hegyi@691
    74
	  {
hegyi@691
    75
	    cerr << "The given node is not in the given network!" << endl;
hegyi@691
    76
	    return -1;
hegyi@691
    77
	  }
hegyi@690
    78
hegyi@691
    79
	int i = 0;
hegyi@690
    80
	//while in the array there is valid note that is not equvivalent with the one that would be noted increase i
hegyi@691
    81
	while ((i < edgenumber)
hegyi@691
    82
	       && (actuallayer->valid (assignments[i].actedge))
hegyi@691
    83
	       && (assignments[i].actedge != actedge))
hegyi@691
    84
	  i++;
hegyi@691
    85
	if (assignments[i].actedge == actedge)
hegyi@691
    86
	  {
hegyi@691
    87
	    cout << "Warning: Redefinement of assigment!!!" << endl;
hegyi@691
    88
	  }
hegyi@691
    89
	if (i == edgenumber)
hegyi@691
    90
	  {
hegyi@691
    91
	    cout <<
hegyi@691
    92
	      "This case can't be!!! (because there should be the guven edge in the array already and the cycle had to stop)"
hegyi@691
    93
	      << endl;
hegyi@691
    94
	  }
hegyi@690
    95
	//if(!(actuallayer->valid(assignments[i].actedge)))   //this condition is necessary if we do not obey redefinition
hegyi@690
    96
	{
hegyi@691
    97
	  assignments[i].actedge = actedge;
hegyi@691
    98
	  assignments[i].subnode = subnode;
hegyi@690
    99
	}
hegyi@690
   100
hegyi@690
   101
	/// If to all of the edges a subnode is assigned then the subnetwork is connectable (attachable?)
hegyi@690
   102
	/// We do not need to check for further attributes, because to notice an assignment we need
hegyi@690
   103
	/// all of them to be correctly initialised before.
hegyi@691
   104
	if (i == edgenumber - 1)
hegyi@691
   105
	  connectable = 1;
hegyi@690
   106
hegyi@690
   107
	return 0;
hegyi@690
   108
      }
hegyi@690
   109
hegyi@691
   110
      int setSubNetwork (Gsub * sn)
hegyi@690
   111
      {
hegyi@691
   112
	subnetwork = sn;
hegyi@690
   113
	return 0;
hegyi@690
   114
      }
hegyi@690
   115
hegyi@691
   116
      int setActualLayer (Gact * al)
hegyi@690
   117
      {
hegyi@691
   118
	actuallayer = al;
hegyi@690
   119
	return 0;
hegyi@690
   120
      }
hegyi@690
   121
hegyi@691
   122
      int setActualLayerNode (typename Gact::Node * aln)
hegyi@690
   123
      {
hegyi@690
   124
	typename Gact::InEdgeIt iei;
hegyi@690
   125
	typename Gact::OutEdgeIt oei;
hegyi@690
   126
hegyi@691
   127
	actuallayernode = aln;
hegyi@690
   128
hegyi@691
   129
	edgenumber = 0;
hegyi@690
   130
hegyi@691
   131
	if (actuallayer)
hegyi@690
   132
	  {
hegyi@691
   133
	    for (iei = actuallayer->first (iei, (*actuallayernode));
hegyi@691
   134
		 ((actuallayer->valid (iei))
hegyi@691
   135
		  && (actuallayer->head (iei) == (*actuallayernode)));
hegyi@691
   136
		 actuallayer->next (iei))
hegyi@691
   137
	      {
hegyi@691
   138
		cout << actuallayer->id (actuallayer->
hegyi@691
   139
					 tail (iei)) << " " << actuallayer->
hegyi@691
   140
		  id (actuallayer->head (iei)) << endl;
hegyi@691
   141
		edgenumber++;
hegyi@691
   142
	      }
hegyi@691
   143
	    //cout << "Number of in-edges: " << edgenumber << endl;
hegyi@691
   144
	    for (oei = actuallayer->first (oei, (*actuallayernode));
hegyi@691
   145
		 ((actuallayer->valid (oei))
hegyi@691
   146
		  && (actuallayer->tail (oei) == (*actuallayernode)));
hegyi@691
   147
		 actuallayer->next (oei))
hegyi@691
   148
	      {
hegyi@691
   149
		cout << actuallayer->id (actuallayer->
hegyi@691
   150
					 tail (oei)) << " " << actuallayer->
hegyi@691
   151
		  id (actuallayer->head (oei)) << endl;
hegyi@691
   152
		edgenumber++;
hegyi@691
   153
	      }
hegyi@691
   154
	    //cout << "Number of in+out-edges: " << edgenumber << endl;
hegyi@691
   155
	    assignments = new actedgesubnodestruct[edgenumber];
hegyi@691
   156
	    for (int i = 0; i < edgenumber; i++)
hegyi@691
   157
	      {
hegyi@691
   158
		assignments[i].actedge = INVALID;
hegyi@691
   159
		assignments[i].subnode = INVALID;
hegyi@691
   160
	      }
hegyi@690
   161
	  }
hegyi@691
   162
	else
hegyi@690
   163
	  {
hegyi@691
   164
	    cerr << "There is no actual layer defined yet!" << endl;
hegyi@691
   165
	    return -1;
hegyi@690
   166
	  }
hegyi@690
   167
hegyi@690
   168
	return 0;
hegyi@690
   169
      }
hegyi@690
   170
hegyi@691
   171
    SubNetwork ():edgenumber (0), connectable (false), actuallayer (NULL),
hegyi@691
   172
	actuallayernode (NULL), subnetwork (NULL),
hegyi@691
   173
	assignments (NULL)
hegyi@690
   174
      {
hegyi@690
   175
      }
hegyi@690
   176
hegyi@690
   177
    };
hegyi@690
   178
hegyi@691
   179
    typename Gact::template NodeMap < SubNetwork > subnetworks;
hegyi@677
   180
hegyi@677
   181
hegyi@677
   182
    /// Defalult constructor.
hegyi@677
   183
    /// We don't need any extra lines, because the actuallayer
hegyi@677
   184
    /// variable has run its constructor, when we have created this class
hegyi@677
   185
    /// So only the two maps has to be initialised here.
hegyi@691
   186
  HierarchyGraph ():subnetworks (actuallayer)
hegyi@677
   187
    {
hegyi@677
   188
    }
hegyi@677
   189
hegyi@677
   190
hegyi@677
   191
    ///Copy consructor.
hegyi@691
   192
  HierarchyGraph (const HierarchyGraph < Gact, Gsub > &HG):actuallayer (HG.actuallayer),
hegyi@691
   193
      subnetworks
hegyi@691
   194
      (actuallayer)
hegyi@677
   195
    {
hegyi@677
   196
    }
hegyi@677
   197
hegyi@690
   198
hegyi@677
   199
    /// The base type of the node iterators.
hegyi@677
   200
hegyi@677
   201
    /// This is the base type of each node iterators,
hegyi@677
   202
    /// thus each kind of node iterator will convert to this.
hegyi@677
   203
    /// The Node type of the HierarchyGraph is the Node type of the actual layer.
hegyi@677
   204
    typedef typename Gact::Node Node;
hegyi@677
   205
hegyi@690
   206
hegyi@677
   207
    /// This iterator goes through each node.
hegyi@677
   208
hegyi@677
   209
    /// Its usage is quite simple, for example you can count the number
hegyi@677
   210
    /// of nodes in graph \c G of type \c Graph like this:
hegyi@677
   211
    /// \code
hegyi@677
   212
    ///int count=0;
hegyi@677
   213
    ///for(Graph::NodeIt n(G);G.valid(n);G.next(n)) count++;
hegyi@677
   214
    /// \endcode
hegyi@677
   215
    /// The NodeIt type of the HierarchyGraph is the NodeIt type of the actual layer.
hegyi@677
   216
    typedef typename Gact::NodeIt NodeIt;
hegyi@690
   217
hegyi@690
   218
hegyi@677
   219
    /// The base type of the edge iterators.
hegyi@677
   220
    /// The Edge type of the HierarchyGraph is the Edge type of the actual layer.
hegyi@691
   221
    typedef typename Gact::Edge Edge;
hegyi@677
   222
hegyi@690
   223
hegyi@677
   224
    /// This iterator goes trough the outgoing edges of a node.
hegyi@677
   225
hegyi@677
   226
    /// This iterator goes trough the \e outgoing edges of a certain node
hegyi@677
   227
    /// of a graph.
hegyi@677
   228
    /// Its usage is quite simple, for example you can count the number
hegyi@677
   229
    /// of outgoing edges of a node \c n
hegyi@677
   230
    /// in graph \c G of type \c Graph as follows.
hegyi@677
   231
    /// \code
hegyi@677
   232
    ///int count=0;
hegyi@677
   233
    ///for(Graph::OutEdgeIt e(G,n);G.valid(e);G.next(e)) count++;
hegyi@677
   234
    /// \endcode
hegyi@677
   235
    /// The OutEdgeIt type of the HierarchyGraph is the OutEdgeIt type of the actual layer.
hegyi@677
   236
    typedef typename Gact::OutEdgeIt OutEdgeIt;
hegyi@677
   237
hegyi@677
   238
hegyi@677
   239
    /// This iterator goes trough the incoming edges of a node.
hegyi@677
   240
hegyi@677
   241
    /// This iterator goes trough the \e incoming edges of a certain node
hegyi@677
   242
    /// of a graph.
hegyi@677
   243
    /// Its usage is quite simple, for example you can count the number
hegyi@677
   244
    /// of outgoing edges of a node \c n
hegyi@677
   245
    /// in graph \c G of type \c Graph as follows.
hegyi@677
   246
    /// \code
hegyi@677
   247
    ///int count=0;
hegyi@677
   248
    ///for(Graph::InEdgeIt e(G,n);G.valid(e);G.next(e)) count++;
hegyi@677
   249
    /// \endcode
hegyi@677
   250
    /// The InEdgeIt type of the HierarchyGraph is the InEdgeIt type of the actual layer.
hegyi@677
   251
    typedef typename Gact::InEdgeIt InEdgeIt;
hegyi@677
   252
hegyi@677
   253
hegyi@677
   254
    /// This iterator goes through each edge.
hegyi@677
   255
hegyi@677
   256
    /// This iterator goes through each edge of a graph.
hegyi@677
   257
    /// Its usage is quite simple, for example you can count the number
hegyi@677
   258
    /// of edges in a graph \c G of type \c Graph as follows:
hegyi@677
   259
    /// \code
hegyi@677
   260
    ///int count=0;
hegyi@677
   261
    ///for(Graph::EdgeIt e(G);G.valid(e);G.next(e)) count++;
hegyi@677
   262
    /// \endcode
hegyi@677
   263
    /// The EdgeIt type of the HierarchyGraph is the EdgeIt type of the actual layer.
hegyi@677
   264
    typedef typename Gact::EdgeIt EdgeIt;
hegyi@677
   265
hegyi@677
   266
hegyi@677
   267
    /// First node of the graph.
hegyi@677
   268
hegyi@677
   269
    /// \retval i the first node.
hegyi@677
   270
    /// \return the first node.
hegyi@691
   271
    typename Gact::NodeIt & first (typename Gact::NodeIt & i) const
hegyi@691
   272
    {
hegyi@691
   273
      return actuallayer.first (i);
hegyi@691
   274
    }
hegyi@677
   275
hegyi@677
   276
hegyi@677
   277
    /// The first incoming edge.
hegyi@691
   278
    typename Gact::InEdgeIt & first (typename Gact::InEdgeIt & i,
hegyi@691
   279
				     typename Gact::Node) const
hegyi@691
   280
    {
hegyi@691
   281
      return actuallayer.first (i);
hegyi@691
   282
    }
hegyi@677
   283
hegyi@677
   284
hegyi@677
   285
    /// The first outgoing edge.
hegyi@691
   286
    typename Gact::OutEdgeIt & first (typename Gact::OutEdgeIt & i,
hegyi@691
   287
				      typename Gact::Node) const
hegyi@691
   288
    {
hegyi@691
   289
      return actuallayer.first (i);
hegyi@691
   290
    }
hegyi@677
   291
hegyi@677
   292
hegyi@677
   293
    //  SymEdgeIt &first(SymEdgeIt &, Node) const { return i;}
hegyi@677
   294
    /// The first edge of the Graph.
hegyi@691
   295
    typename Gact::EdgeIt & first (typename Gact::EdgeIt & i) const
hegyi@691
   296
    {
hegyi@691
   297
      return actuallayer.first (i);
hegyi@691
   298
    }
hegyi@677
   299
hegyi@677
   300
hegyi@677
   301
//     Node getNext(Node) const {}
hegyi@677
   302
//     InEdgeIt getNext(InEdgeIt) const {}
hegyi@677
   303
//     OutEdgeIt getNext(OutEdgeIt) const {}
hegyi@677
   304
//     //SymEdgeIt getNext(SymEdgeIt) const {}
hegyi@677
   305
//     EdgeIt getNext(EdgeIt) const {}
hegyi@677
   306
hegyi@677
   307
hegyi@677
   308
    /// Go to the next node.
hegyi@691
   309
    typename Gact::NodeIt & next (typename Gact::NodeIt & i) const
hegyi@691
   310
    {
hegyi@691
   311
      return actuallayer.next (i);
hegyi@691
   312
    }
hegyi@677
   313
    /// Go to the next incoming edge.
hegyi@691
   314
    typename Gact::InEdgeIt & next (typename Gact::InEdgeIt & i) const
hegyi@691
   315
    {
hegyi@691
   316
      return actuallayer.next (i);
hegyi@691
   317
    }
hegyi@677
   318
    /// Go to the next outgoing edge.
hegyi@691
   319
    typename Gact::OutEdgeIt & next (typename Gact::OutEdgeIt & i) const
hegyi@691
   320
    {
hegyi@691
   321
      return actuallayer.next (i);
hegyi@691
   322
    }
hegyi@677
   323
    //SymEdgeIt &next(SymEdgeIt &) const {}
hegyi@677
   324
    /// Go to the next edge.
hegyi@691
   325
    typename Gact::EdgeIt & next (typename Gact::EdgeIt & i) const
hegyi@691
   326
    {
hegyi@691
   327
      return actuallayer.next (i);
hegyi@691
   328
    }
hegyi@677
   329
hegyi@677
   330
    ///Gives back the head node of an edge.
hegyi@691
   331
    typename Gact::Node head (typename Gact::Edge edge) const
hegyi@691
   332
    {
hegyi@691
   333
      return actuallayer.head (edge);
hegyi@691
   334
    }
hegyi@677
   335
    ///Gives back the tail node of an edge.
hegyi@691
   336
    typename Gact::Node tail (typename Gact::Edge edge) const
hegyi@691
   337
    {
hegyi@691
   338
      return actuallayer.tail (edge);
hegyi@691
   339
    }
hegyi@690
   340
hegyi@677
   341
    //   Node aNode(InEdgeIt) const {}
hegyi@677
   342
    //   Node aNode(OutEdgeIt) const {}
hegyi@677
   343
    //   Node aNode(SymEdgeIt) const {}
hegyi@677
   344
hegyi@677
   345
    //   Node bNode(InEdgeIt) const {}
hegyi@677
   346
    //   Node bNode(OutEdgeIt) const {}
hegyi@677
   347
    //   Node bNode(SymEdgeIt) const {}
hegyi@677
   348
hegyi@677
   349
    /// Checks if a node iterator is valid
hegyi@677
   350
hegyi@677
   351
    ///\todo Maybe, it would be better if iterator converted to
hegyi@677
   352
    ///bool directly, as Jacint prefers.
hegyi@691
   353
    bool valid (const typename Gact::Node & node) const
hegyi@691
   354
    {
hegyi@691
   355
      return actuallayer.valid (node);
hegyi@691
   356
    }
hegyi@677
   357
    /// Checks if an edge iterator is valid
hegyi@677
   358
hegyi@677
   359
    ///\todo Maybe, it would be better if iterator converted to
hegyi@677
   360
    ///bool directly, as Jacint prefers.
hegyi@691
   361
    bool valid (const typename Gact::Edge & edge) const
hegyi@691
   362
    {
hegyi@691
   363
      return actuallayer.valid (edge);
hegyi@691
   364
    }
hegyi@677
   365
hegyi@677
   366
    ///Gives back the \e id of a node.
hegyi@677
   367
hegyi@677
   368
    ///\warning Not all graph structures provide this feature.
hegyi@677
   369
    ///
hegyi@691
   370
    int id (const typename Gact::Node & node) const
hegyi@691
   371
    {
hegyi@691
   372
      return actuallayer.id (node);
hegyi@691
   373
    }
hegyi@677
   374
    ///Gives back the \e id of an edge.
hegyi@677
   375
hegyi@677
   376
    ///\warning Not all graph structures provide this feature.
hegyi@677
   377
    ///
hegyi@691
   378
    int id (const typename Gact::Edge & edge) const
hegyi@691
   379
    {
hegyi@691
   380
      return actuallayer.id (edge);
hegyi@691
   381
    }
hegyi@677
   382
hegyi@677
   383
    //void setInvalid(Node &) const {};
hegyi@677
   384
    //void setInvalid(Edge &) const {};
hegyi@690
   385
hegyi@677
   386
    ///Add a new node to the graph.
hegyi@677
   387
hegyi@677
   388
    /// \return the new node.
hegyi@677
   389
    ///
hegyi@691
   390
    typename Gact::Node addNode ()
hegyi@691
   391
    {
hegyi@691
   392
      return actuallayer.addNode ();
hegyi@691
   393
    }
hegyi@677
   394
    ///Add a new edge to the graph.
hegyi@677
   395
hegyi@677
   396
    ///Add a new edge to the graph with tail node \c tail
hegyi@677
   397
    ///and head node \c head.
hegyi@677
   398
    ///\return the new edge.
hegyi@691
   399
    typename Gact::Edge addEdge (typename Gact::Node node1,
hegyi@691
   400
				 typename Gact::Node node2)
hegyi@691
   401
    {
hegyi@691
   402
      return actuallayer.addEdge (node1, node2);
hegyi@691
   403
    }
hegyi@690
   404
hegyi@677
   405
    /// Resets the graph.
hegyi@677
   406
hegyi@677
   407
    /// This function deletes all edges and nodes of the graph.
hegyi@677
   408
    /// It also frees the memory allocated to store them.
hegyi@691
   409
    void clear ()
hegyi@691
   410
    {
hegyi@691
   411
      actuallayer.clear ();
hegyi@691
   412
    }
hegyi@677
   413
hegyi@691
   414
    int nodeNum () const
hegyi@691
   415
    {
hegyi@691
   416
      return actuallayer.nodeNum ();
hegyi@691
   417
    }
hegyi@691
   418
    int edgeNum () const
hegyi@691
   419
    {
hegyi@691
   420
      return actuallayer.edgeNum ();
hegyi@691
   421
    }
hegyi@677
   422
hegyi@677
   423
    ///Read/write/reference map of the nodes to type \c T.
hegyi@677
   424
hegyi@677
   425
    ///Read/write/reference map of the nodes to type \c T.
hegyi@677
   426
    /// \sa MemoryMapSkeleton
hegyi@677
   427
    /// \todo We may need copy constructor
hegyi@677
   428
    /// \todo We may need conversion from other nodetype
hegyi@677
   429
    /// \todo We may need operator=
hegyi@677
   430
    /// \warning Making maps that can handle bool type (NodeMap<bool>)
hegyi@677
   431
    /// needs extra attention!
hegyi@677
   432
hegyi@691
   433
    template < class T > class NodeMap
hegyi@677
   434
    {
hegyi@677
   435
    public:
hegyi@677
   436
      typedef T ValueType;
hegyi@677
   437
      typedef Node KeyType;
hegyi@677
   438
hegyi@691
   439
      NodeMap (const HierarchyGraph &)
hegyi@691
   440
      {
hegyi@691
   441
      }
hegyi@691
   442
      NodeMap (const HierarchyGraph &, T)
hegyi@691
   443
      {
hegyi@691
   444
      }
hegyi@677
   445
hegyi@691
   446
      template < typename TT > NodeMap (const NodeMap < TT > &)
hegyi@691
   447
      {
hegyi@691
   448
      }
hegyi@677
   449
hegyi@677
   450
      /// Sets the value of a node.
hegyi@677
   451
hegyi@677
   452
      /// Sets the value associated with node \c i to the value \c t.
hegyi@677
   453
      ///
hegyi@691
   454
      void set (Node, T)
hegyi@691
   455
      {
hegyi@691
   456
      }
hegyi@677
   457
      // Gets the value of a node.
hegyi@677
   458
      //T get(Node i) const {return *(T*)0;}  //FIXME: Is it necessary?
hegyi@691
   459
      T & operator[](Node)
hegyi@691
   460
      {
hegyi@691
   461
	return *(T *) 0;
hegyi@691
   462
      }
hegyi@691
   463
      const T & operator[] (Node) const
hegyi@691
   464
      {
hegyi@691
   465
	return *(T *) 0;
hegyi@691
   466
      }
hegyi@677
   467
hegyi@677
   468
      /// Updates the map if the graph has been changed
hegyi@677
   469
hegyi@677
   470
      /// \todo Do we need this?
hegyi@677
   471
      ///
hegyi@691
   472
      void update ()
hegyi@691
   473
      {
hegyi@691
   474
      }
hegyi@691
   475
      void update (T a)
hegyi@691
   476
      {
hegyi@691
   477
      }				//FIXME: Is it necessary
hegyi@677
   478
    };
hegyi@677
   479
hegyi@677
   480
    ///Read/write/reference map of the edges to type \c T.
hegyi@677
   481
hegyi@677
   482
    ///Read/write/reference map of the edges to type \c T.
hegyi@677
   483
    ///It behaves exactly in the same way as \ref NodeMap.
hegyi@677
   484
    /// \sa NodeMap
hegyi@677
   485
    /// \sa MemoryMapSkeleton
hegyi@677
   486
    /// \todo We may need copy constructor
hegyi@677
   487
    /// \todo We may need conversion from other edgetype
hegyi@677
   488
    /// \todo We may need operator=
hegyi@691
   489
    template < class T > class EdgeMap
hegyi@677
   490
    {
hegyi@677
   491
    public:
hegyi@677
   492
      typedef T ValueType;
hegyi@677
   493
      typedef Edge KeyType;
hegyi@677
   494
hegyi@691
   495
      EdgeMap (const HierarchyGraph &)
hegyi@691
   496
      {
hegyi@691
   497
      }
hegyi@691
   498
      EdgeMap (const HierarchyGraph &, T)
hegyi@691
   499
      {
hegyi@691
   500
      }
hegyi@690
   501
hegyi@677
   502
      ///\todo It can copy between different types.
hegyi@677
   503
      ///
hegyi@691
   504
      template < typename TT > EdgeMap (const EdgeMap < TT > &)
hegyi@691
   505
      {
hegyi@691
   506
      }
hegyi@677
   507
hegyi@691
   508
      void set (Edge, T)
hegyi@691
   509
      {
hegyi@691
   510
      }
hegyi@677
   511
      //T get(Edge) const {return *(T*)0;}
hegyi@691
   512
      T & operator[](Edge)
hegyi@691
   513
      {
hegyi@691
   514
	return *(T *) 0;
hegyi@691
   515
      }
hegyi@691
   516
      const T & operator[] (Edge) const
hegyi@691
   517
      {
hegyi@691
   518
	return *(T *) 0;
hegyi@691
   519
      }
hegyi@690
   520
hegyi@691
   521
      void update ()
hegyi@691
   522
      {
hegyi@691
   523
      }
hegyi@691
   524
      void update (T a)
hegyi@691
   525
      {
hegyi@691
   526
      }				//FIXME: Is it necessary
hegyi@677
   527
    };
hegyi@677
   528
  };
hegyi@677
   529
hegyi@677
   530
  /// An empty eraseable graph class.
hegyi@690
   531
hegyi@677
   532
  /// This class provides all the common features of an \e eraseable graph
hegyi@677
   533
  /// structure,
hegyi@677
   534
  /// however completely without implementations and real data structures
hegyi@677
   535
  /// behind the interface.
hegyi@677
   536
  /// All graph algorithms should compile with this class, but it will not
hegyi@677
   537
  /// run properly, of course.
hegyi@677
   538
  ///
hegyi@677
   539
  /// \todo This blabla could be replaced by a sepatate description about
hegyi@677
   540
  /// Skeletons.
hegyi@677
   541
  ///
hegyi@677
   542
  /// It can be used for checking the interface compatibility,
hegyi@677
   543
  /// or it can serve as a skeleton of a new graph structure.
hegyi@690
   544
  ///
hegyi@677
   545
  /// Also, you will find here the full documentation of a certain graph
hegyi@677
   546
  /// feature, the documentation of a real graph imlementation
hegyi@677
   547
  /// like @ref ListGraph or
hegyi@677
   548
  /// @ref SmartGraph will just refer to this structure.
hegyi@691
   549
template < typename Gact, typename Gsub > class EraseableHierarchyGraph:public HierarchyGraph < Gact,
hegyi@691
   550
    Gsub
hegyi@691
   551
    >
hegyi@677
   552
  {
hegyi@677
   553
  public:
hegyi@677
   554
    /// Deletes a node.
hegyi@691
   555
    void erase (typename Gact::Node n)
hegyi@691
   556
    {
hegyi@691
   557
      actuallayer.erase (n);
hegyi@691
   558
    }
hegyi@677
   559
    /// Deletes an edge.
hegyi@691
   560
    void erase (typename Gact::Edge e)
hegyi@691
   561
    {
hegyi@691
   562
      actuallayer.erase (e);
hegyi@691
   563
    }
hegyi@677
   564
hegyi@677
   565
    /// Defalult constructor.
hegyi@691
   566
    EraseableHierarchyGraph ()
hegyi@691
   567
    {
hegyi@691
   568
    }
hegyi@677
   569
    ///Copy consructor.
hegyi@691
   570
    EraseableHierarchyGraph (const HierarchyGraph < Gact, Gsub > &EPG)
hegyi@691
   571
    {
hegyi@691
   572
    }
hegyi@677
   573
  };
hegyi@677
   574
hegyi@690
   575
hegyi@677
   576
  // @}
hegyi@677
   577
hegyi@691
   578
}				//namespace hugo
hegyi@677
   579
hegyi@677
   580
hegyi@677
   581
#endif // HUGO_SKELETON_GRAPH_H