|         |      1 @node The Full Feature Graph Class | 
|         |      2 @section The Full Feature Graph Class | 
|         |      3 @cindex Full Feature Graph Class | 
|         |      4  | 
|         |      5 This section describes what an imaginary full feature graph class knows. | 
|         |      6 The set of features provided by a real graph implementation is typically | 
|         |      7 a subset of the features below. | 
|         |      8  | 
|         |      9 On the other hand, each graph algorithm requires the underlying graph | 
|         |     10 structure to provide a certain (typically small) set of features in order | 
|         |     11 to be able to run. | 
|         |     12  | 
|         |     13 @subsection Declaration | 
|         |     14  | 
|         |     15 @deftp {Class} {class Graph} | 
|         |     16 @code{Graph} is the imaginary @emph{full feature graph class}. | 
|         |     17 @code{G} denotes the instance of this class in the exaples below. | 
|         |     18 @c Each node and edge has a user defined data sturcure | 
|         |     19 @c @var{N} and @var{E} statically attached to it. | 
|         |     20 @end deftp | 
|         |     21  | 
|         |     22 @subsection Types | 
|         |     23  | 
|         |     24 @c @deftp {Type} Graph::NodeType | 
|         |     25 @c @deftpx {Type} Graph::EdgeType | 
|         |     26 @c The type of the data stored statically for each node and edge. | 
|         |     27 @c @end deftp | 
|         |     28  | 
|         |     29 @anchor{Graph-NodeIterator} | 
|         |     30 @deftp {Type} Graph::NodeIt | 
|         |     31 @c @deftpx {Type} Graph::NodeIterator | 
|         |     32 These types points a node uniquely. The difference between the | 
|         |     33 @code{NodeIt} and the @code{NodeIterator} is that @code{NodeIt} | 
|         |     34 requires the graph structure itself for most of the operations. | 
|         |     35 For examples using iterators you can go through all nodes as follows. | 
|         |     36 @quotation | 
|         |     37 @verbatim | 
|         |     38 Graph G; | 
|         |     39 int nodenum=0; | 
|         |     40 for(Graph::NodeIterator n(G);n.valid();++n) ++nodenum; | 
|         |     41 @end verbatim | 
|         |     42 @end quotation | 
|         |     43 Using @code{NodeIt} the last line looks like this. | 
|         |     44 @quotation | 
|         |     45 @verbatim | 
|         |     46 for(Graph::NodeIt n(G);n.valid();n=G.next(n)) ++nodenum; | 
|         |     47 @end verbatim | 
|         |     48 @end quotation | 
|         |     49 or | 
|         |     50 @quotation | 
|         |     51 @verbatim | 
|         |     52 MyGraph::NodeIt n; | 
|         |     53 for(G.getFirst(n);G.valid(n);G.goNext(n)) ++nodenum; | 
|         |     54 @end verbatim | 
|         |     55 @end quotation | 
|         |     56 @end deftp | 
|         |     57  | 
|         |     58 @deftp {Type} Graph::EdgeIt | 
|         |     59 @deftpx {Type} Graph::InEdgeIt | 
|         |     60 @deftpx {Type} Graph::OutEdgeIt | 
|         |     61 @deftpx {Type} Graph::EachEdgeIt | 
|         |     62 @c @deftpx {Type} Graph::BiEdgeIt | 
|         |     63 @c @deftpx {Type} Graph::SymEdgeIt | 
|         |     64 Each of these types points an edge uniquely. The difference between the | 
|         |     65 @code{EdgeIt} and the | 
|         |     66 @c @mref{Graph-NodeIterator,@code{EdgeIterator}} | 
|         |     67 @mref{Graph-NodeIterator , EdgeIterator} | 
|         |     68 series is that | 
|         |     69 @code{EdgeIt} requires the graph structure itself for most of the | 
|         |     70 operations. | 
|         |     71 @end deftp | 
|         |     72  | 
|         |     73 @anchor{Graph-EdgeIterator} | 
|         |     74 @c @deftp {Type} Graph::EdgeIterator | 
|         |     75 @c @deftpx {Type} Graph::InEdgeIterator | 
|         |     76 @c @deftpx {Type} Graph::OutEdgeIterator | 
|         |     77 @c @deftpx {Type} Graph::BiEdgeIterator | 
|         |     78 @c @deftpx {Type} Graph::SymEdgeIterator | 
|         |     79 @c @deftpx {Type} Graph::EachEdgeIterator | 
|         |     80 @c Each of these types points an edge uniquely. The difference between the | 
|         |     81 @c @code{EdgeIt} and the @code{EdgeIterator} series is that | 
|         |     82 @c @code{EdgeIt} requires the graph structure itself for most of the | 
|         |     83 @c operations.  | 
|         |     84  | 
|         |     85 @c For the @code{EdgeIterator} types you can use operator @code{++} | 
|         |     86 @c (both the prefix and the posfix one) to obtain the next edge. | 
|         |     87 @c @end deftp | 
|         |     88  | 
|         |     89 @deftp {Type} Graph::NodeMap<typename T> | 
|         |     90 @deftpx {Type} Graph::EdgeMap<typename T> | 
|         |     91 There are the default property maps for the edges and the nodes. | 
|         |     92 @end deftp | 
|         |     93  | 
|         |     94 @deftp {Type} Graph::DynNodeMap<typename T> | 
|         |     95 @deftpx {Type} Graph::DynEdgeMap<typename T> | 
|         |     96 There are the default @emph{dynamic} property maps for the edges and the nodes. | 
|         |     97 @end deftp | 
|         |     98  | 
|         |     99 @subsection Member Functions | 
|         |    100  | 
|         |    101 @subsubsection Constructors | 
|         |    102  | 
|         |    103 @deftypefun { } Graph::Graph () | 
|         |    104 The default constructor. | 
|         |    105 @end deftypefun | 
|         |    106  | 
|         |    107 @c @deftypefun { } Graph::Graph (Graph@tie{}&) | 
|         |    108 @deftypefun { } Graph::Graph (Graph &) | 
|         |    109 The copy constructor. | 
|         |    110 @end deftypefun | 
|         |    111  | 
|         |    112 @subsubsection Graph Maintenence Operations | 
|         |    113  | 
|         |    114 @deftypefun NodeIt Graph::addNode () | 
|         |    115 Adds a new node to the graph and returns a @code{NodeIt} pointing to it. | 
|         |    116 @end deftypefun | 
|         |    117  | 
|         |    118 @deftypefun EdgeIt Graph::addEdge (@w{const @mref{Graph-NodeIterator,NodeIt} @var{from}}, @w{const @mref{Graph-NodeIterator,NodeIt} @var{to}}) | 
|         |    119 Adds a new edge with tail @var{from} and head @var{to} to the graph | 
|         |    120 and returns an @code{EdgeIt} pointing to it. | 
|         |    121 @end deftypefun | 
|         |    122  | 
|         |    123 @deftypefun void Graph::delete (@w{const @mref{Graph-NodeIterator,NodeIt} @var{n}}) | 
|         |    124 Deletes the node @var{n}. It also deletes the adjacent edges. | 
|         |    125 @end deftypefun | 
|         |    126  | 
|         |    127 @deftypefun void Graph::delete (@w{const @mref{Graph-EdgeIterator,EdgeIt} @var{e}}) | 
|         |    128 Deletes the edge @var{n}. | 
|         |    129 @end deftypefun | 
|         |    130  | 
|         |    131 @deftypefun void Graph::clear () | 
|         |    132 Deletes all edges and nodes from the graph. | 
|         |    133 @end deftypefun | 
|         |    134  | 
|         |    135 @deftypefun int Graph::nodeNum () | 
|         |    136 Returns the number of the nodes in the graph. | 
|         |    137 ??? Is it necessary??? | 
|         |    138 @end deftypefun | 
|         |    139  | 
|         |    140 @subsubsection NodeIt Operations | 
|         |    141  | 
|         |    142 @deftypefun NodeIt Graph::getFirst (NodeIt &@var{n}) const | 
|         |    143 @deftypefunx NodeIt Graph::getNext (NodeIt @var{n}) const | 
|         |    144 @deftypefunx {NodeIt &} Graph::next (NodeIt &@var{n}) | 
|         |    145 The nodes in the graph forms a list. @code{getFirst(n)} sets @var{n} to | 
|         |    146 be the first node. @code{getNext(n)} gives back the subsequent | 
|         |    147 node. @code{next(n)} is equivalent to @code{n=getNext(n)}, though it | 
|         |    148 might be faster.  ??? What should be the return value ??? | 
|         |    149 @end deftypefun | 
|         |    150  | 
|         |    151 @deftypefun bool Graph::valid (NodeIt &@var{e}) | 
|         |    152 @c @deftypefunx bool NodeIt::valid () | 
|         |    153 These functions check if and NodeIt is valid or not. | 
|         |    154 @c ??? Which one should be implemented ??? | 
|         |    155 @end deftypefun | 
|         |    156  | 
|         |    157 @subsubsection EdgeIt Operations | 
|         |    158  | 
|         |    159 @deftypefun EachEdgeIt Graph::getFirst (const EachEdgeIt & @var{e}) const | 
|         |    160 @deftypefunx EachEdgeIt Graph::getNext (EachEdgeIt @var{n}) const | 
|         |    161 @deftypefunx {EachEdgeIt &} Graph::next (EachEdgeIt &@var{n}) | 
|         |    162 With these functions you can go though all the edges of the graph. | 
|         |    163 @c ??? What should be the return value ??? | 
|         |    164 @end deftypefun | 
|         |    165  | 
|         |    166 @deftypefun InEdgeIt &Graph::getFirst (InEdgeIt & @var{e}, const NodeIt @var{n}) | 
|         |    167 @deftypefunx OutEdgeIt &Graph::getFirst (OutEdgeIt & @var{e}, const NodeIt @var{n}) | 
|         |    168 @c @deftypefunx SymEdgeIt &Graph::getFirst (SymEdgeIt & @var{e}, const NodeIt @var{n}) | 
|         |    169 The edges leaving from | 
|         |    170 or | 
|         |    171 arriving at | 
|         |    172 @c or adjacent with | 
|         |    173 a node forms a | 
|         |    174 list.  These functions give back the first elements of these | 
|         |    175 lists. The exact behavior depends on the type of @var{e}. | 
|         |    176  | 
|         |    177 If @var{e} is an @code{InEdgeIt} or an @code{OutEdgeIt} then | 
|         |    178 @code{getFirst} sets @var{e} to be the first incoming or outgoing edge | 
|         |    179 of the node @var{n}, respectively. | 
|         |    180  | 
|         |    181 @c If @var{e} is a @code{SymEdgeIt} then | 
|         |    182 @c @code{getFirst} sets @var{e} to be the first incoming if there exists one | 
|         |    183 @c otherwise the first outgoing edge. | 
|         |    184  | 
|         |    185 If there are no such edges, @var{e} will be invalid. | 
|         |    186  | 
|         |    187 @end deftypefun | 
|         |    188  | 
|         |    189 @deftypefun InEdgeIt Graph::next (const InEdgeIt @var{e}) | 
|         |    190 @deftypefunx OutEdgeIt Graph::next (const OutEdgeIt @var{e}) | 
|         |    191 @deftypefunx SymEdgeIt Graph::next (const SymEdgeIt @var{e}) | 
|         |    192 These functions give back the edge that follows @var{e} | 
|         |    193 @end deftypefun | 
|         |    194  | 
|         |    195 @deftypefun {InEdgeIt &} Graph::goNext (InEdgeIt &@var{e}) | 
|         |    196 @deftypefunx {OutEdgeIt &} Graph::goNext (OutEdgeIt &@var{e}) | 
|         |    197 @deftypefunx {SymEdgeIt &} Graph::goNext (SymEdgeIt &@var{e}) | 
|         |    198 @code{G.goNext(e)} is equivalent to @code{e=G.next(e)}, though it | 
|         |    199 might be faster. | 
|         |    200 ??? What should be the return value ??? | 
|         |    201 @end deftypefun | 
|         |    202  | 
|         |    203 @deftypefun bool Graph::valid (EdgeIt &@var{e}) | 
|         |    204 @deftypefunx bool EdgeIt::valid () | 
|         |    205 These functions check if and EdgeIt is valid or not. | 
|         |    206 ??? Which one should be implemented ??? | 
|         |    207 @end deftypefun | 
|         |    208  | 
|         |    209 @deftypefun NodeIt Graph::tail (const EdgeIt @var{e}) | 
|         |    210 @deftypefunx NodeIt Graph::head (const EdgeIt @var{e}) | 
|         |    211 @deftypefunx NodeIt Graph::aNode (const InEdgeIt @var{e}) | 
|         |    212 @deftypefunx NodeIt Graph::aNode (const OutEdgeIt @var{e}) | 
|         |    213 @deftypefunx NodeIt Graph::aNode (const SymEdgeIt @var{e}) | 
|         |    214 @deftypefunx NodeIt Graph::bNode (const InEdgeIt @var{e}) | 
|         |    215 @deftypefunx NodeIt Graph::bNode (const OutEdgeIt @var{e}) | 
|         |    216 @deftypefunx NodeIt Graph::bNode (const SymEdgeIt @var{e}) | 
|         |    217 There queries give back the two endpoints of the edge @var{e}.  For a | 
|         |    218 directed edge @var{e}, @code{tail(e)} and @code{head(e)} is its tail and | 
|         |    219 its head, respectively. For an undirected @var{e}, they are two | 
|         |    220 endpoints, but you should not rely on which end is which. | 
|         |    221  | 
|         |    222 @code{aNode(e)} is the node which @var{e} is bounded to, i.e. it is | 
|         |    223 equal to @code{tail(e)} if @var{e} is an @code{OutEdgeIt} and | 
|         |    224 @code{head(e)} if @var{e} is an @code{InEdgeIt}. If @var{e} is a | 
|         |    225 @code{SymEdgeIt} and it or its first preceding edge was created by | 
|         |    226 @code{getFirst(e,n)}, then @code{aNode(e)} is equal to @var{n}. | 
|         |    227  | 
|         |    228 @code{bNode(e)} is the other end of the edge. | 
|         |    229  | 
|         |    230 @deftypefun void Graph::setInvalid (EdgeIt &@var{e}) | 
|         |    231 @deftypefunx void Graph::setInvalid (EdgeIt &@var{e}) | 
|         |    232 These functions set the corresponding iterator to be invalid. | 
|         |    233 @end deftypefun | 
|         |    234  | 
|         |    235 @c ???It is implemented in an other way now. (Member function <-> Graph global)??? | 
|         |    236 @end deftypefun | 
|         |    237  | 
|         |    238  | 
|         |    239  | 
|         |    240 @c @deftypevar int from | 
|         |    241 @c  the tail of the created edge. | 
|         |    242 @c @end deftypevar |