src/include/graph.h
author alpar
Sat, 13 Dec 2003 15:44:50 +0000
changeset 3 272a5677bd6d
parent 2 37117ebbabe2
child 6 b63d1bc367f7
permissions -rw-r--r--
- Marci type iterator constructors
- src/demo/bfsdemo.cc: demo for bfs.h
- cosmetical changes
alpar@1
     1
// -*-mode: c++; -*-
alpar@1
     2
#ifndef __GRAPH_H_
alpar@1
     3
#define __GRAPH_H_
alpar@1
     4
alpar@1
     5
//inline void *operator new(size_t s, void *p) { return p; }
alpar@1
     6
#include <new>
alpar@1
     7
alpar@1
     8
namespace NEGRO 
alpar@1
     9
{
alpar@1
    10
  using namespace std;
alpar@1
    11
  
alpar@1
    12
#include "oldgraph.h"
alpar@1
    13
  
alpar@1
    14
  template <class N, class E> class Graph : protected OldGraph<N,E>
alpar@1
    15
  {
alpar@1
    16
  public:
alpar@1
    17
    typedef E EdgeType;
alpar@1
    18
    typedef N NodeType;
alpar@1
    19
    
alpar@1
    20
    class EdgePoint
alpar@1
    21
    {
alpar@1
    22
    public:
alpar@1
    23
      NEGRO::EdgePoint e;
alpar@1
    24
      bool isValid() { return e; }
alpar@1
    25
    };
alpar@1
    26
    
alpar@1
    27
    class InEdgePoint : public EdgePoint {};
alpar@1
    28
    class OutEdgePoint : public EdgePoint {};
alpar@1
    29
    class BiEdgePoint : public EdgePoint {};
alpar@1
    30
    class SymEdgePoint : public EdgePoint {};
alpar@1
    31
    
alpar@1
    32
    typedef int NodePoint;
alpar@1
    33
    
alpar@1
    34
    class NodeIterator;
alpar@1
    35
    
alpar@1
    36
    class EdgeIterator;
alpar@1
    37
    class InEdgeIterator;
alpar@1
    38
    class OutEdgeIterator;
alpar@1
    39
    class BiEdgeIterator;
alpar@1
    40
    class SymEdgeIterator;
alpar@1
    41
    class AllEdgeIterator;
alpar@1
    42
    
alpar@1
    43
    class FirstAnythingTypeNode;
alpar@1
    44
alpar@1
    45
    friend class NodeIterator;
alpar@1
    46
    friend class EdgeIterator;
alpar@1
    47
    friend class InEdgeIterator;
alpar@1
    48
    friend class OutEdgeIterator;
alpar@1
    49
    friend class BiEdgeIterator;
alpar@1
    50
    friend class SymEdgeIterator;
alpar@1
    51
    friend class AllEdgeIterator;
alpar@1
    52
    
alpar@1
    53
    class NodeIterator
alpar@1
    54
    {
alpar@1
    55
      Graph<N,E> *G;  //operator*() miatt kell!!!
alpar@1
    56
      int n;     //nem kellene, ha itt mutato lenne!!
alpar@1
    57
    public:    
alpar@1
    58
      
alpar@1
    59
      NodeIterator() {;} 
alpar@3
    60
      NodeIterator(Graph<N,E> &Gr)//'const Graph<N,E> &G' would be wrong.
alpar@3
    61
      {G=&Gr;n=Gr.OldGraph<N,E>::FirstNode();} 
alpar@1
    62
      NodeIterator(const NodeIterator &i) {G=i.G;n=i.n;}
alpar@1
    63
      
alpar@1
    64
      NodeIterator &GoNext() { n=G->NextNode(n); return *this;}
alpar@1
    65
      NodeIterator Next() const { return NodeIterator(*this).GoNext();}
alpar@1
    66
      NodeIterator &operator++() { return GoNext();} 
alpar@1
    67
      NodeIterator operator++(int)
alpar@1
    68
      {NodeIterator tmp(*this); GoNext(); return tmp;}
alpar@1
    69
      bool isValid() { return n!=INVALID; }
alpar@1
    70
      
alpar@1
    71
      N &operator*() const { return G->Data(n); }
alpar@1
    72
      N *operator->() const { return &G->Data(n); }
alpar@1
    73
      
alpar@1
    74
      bool operator==(const NodeIterator &i) const {return n==i.n;}
alpar@1
    75
      bool operator!=(const NodeIterator &i) const {return n!=i.n;}
alpar@1
    76
      
alpar@2
    77
      int Index() { return n; } //If the nodes are indexable 
alpar@1
    78
      friend class Graph;
alpar@1
    79
      friend class EdgeIterator;
alpar@1
    80
      friend class InEdgeIterator;
alpar@1
    81
      friend class OutEdgeIterator;
alpar@1
    82
      friend class BiEdgeIterator;
alpar@1
    83
      friend class SymEdgeIterator;
alpar@1
    84
      friend class AllEdgeIterator;
alpar@1
    85
      friend class FirstAnythingTypeNode;
alpar@1
    86
alpar@1
    87
      //Nem kellene egy:
alpar@1
    88
      //      static NodeIterator &GetInvalid();  ?
alpar@1
    89
    };
alpar@1
    90
    
alpar@1
    91
    class EdgeIterator
alpar@1
    92
    {
alpar@1
    93
      
alpar@1
    94
      Graph<N,E> *G; //Itt baj van!!!!! operator*() miatt kell!
alpar@1
    95
      //Ez csak kicsit baj, de:
alpar@1
    96
      // Meg a From() es To() miatt!!!!!!!!!!
alpar@1
    97
      
alpar@1
    98
      NEGRO::EdgePoint e;
alpar@1
    99
      
alpar@1
   100
    public:
alpar@1
   101
      EdgeIterator() {;} //Kell inicializalni? (Nem)
alpar@1
   102
      EdgeIterator(const EdgeIterator &i) {G=i.G;e=i.e;}
alpar@1
   103
      
alpar@1
   104
      // Lehet, hogy ez a ketto nem kell!!!
alpar@1
   105
      
alpar@1
   106
      NodeIterator From() const {NodeIterator i;i.G=G;i.n=e->From();return i;}
alpar@1
   107
      NodeIterator To() const {NodeIterator i;i.G=G;i.n=e->To();return i;}
alpar@1
   108
      
alpar@1
   109
      bool isValid() {return e;}
alpar@1
   110
      E &operator*() const { return G->Data(e); }
alpar@1
   111
      E *operator->() const { return &G->Data(e); }
alpar@1
   112
      
alpar@1
   113
      //operator const OutEdgeIterator ();
alpar@1
   114
      //operator const InEdgeIterator ();
alpar@1
   115
      //operator const BiEdgeIterator ();
alpar@1
   116
      //operator const SymEdgeIterator(); //Ez kerdeses, mit csinal
alpar@1
   117
      
alpar@1
   118
      bool operator==(const EdgeIterator &i) const {return e==i.e;}
alpar@1
   119
      bool operator!=(const EdgeIterator &i) const {return e!=i.e;}
alpar@2
   120
       
alpar@2
   121
      int Index() { return e.index.block*EDGE_BLOCK_SIZE+e.index.index; }
alpar@2
   122
      //If the edges are indexable 
alpar@2
   123
alpar@1
   124
      friend class Graph;
alpar@1
   125
      friend class InEdgeIterator;
alpar@1
   126
      friend class OutEdgeIterator;
alpar@1
   127
      friend class BiEdgeIterator;
alpar@1
   128
      friend class SymEdgeIterator;
alpar@1
   129
      friend class AllEdgeIterator;
alpar@1
   130
    };
alpar@1
   131
    
alpar@1
   132
    class BiEdgeIterator : public EdgeIterator
alpar@1
   133
    {
alpar@1
   134
    public:
alpar@1
   135
      BiEdgeIterator &GoNextIn()  { e=e->NextIn(); return *this;}
alpar@1
   136
      BiEdgeIterator &GoNextOut() { e=e->NextOut(); return *this;}
alpar@1
   137
      BiEdgeIterator NextIn() const  {return BiEdgeIterator(*this).GoNextIn();}
alpar@1
   138
      BiEdgeIterator NextOut() const {return BiEdgeIterator(*this).GoNextOut();}
alpar@1
   139
      
alpar@1
   140
      operator InEdgeIterator ()
alpar@1
   141
      {InEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   142
      operator OutEdgeIterator ()
alpar@1
   143
      {OutEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   144
      //operator const SymEdgeIterator ()
alpar@1
   145
      
alpar@1
   146
      friend class Graph;
alpar@1
   147
    };
alpar@1
   148
    
alpar@1
   149
    class InEdgeIterator : public EdgeIterator
alpar@1
   150
    //Ne a BiEdgeIterator-bol szarmazzon?
alpar@1
   151
    {
alpar@1
   152
    public:
alpar@3
   153
      InEdgeIterator() {}
alpar@3
   154
      InEdgeIterator(const Graph<N,E> &Gr,const NodeIterator &n)
alpar@3
   155
      { G=&Gr; e=Gr.OldGraph<N,E>::FirstIn(n.n);}
alpar@3
   156
alpar@1
   157
      InEdgeIterator &GoNext() { e=e->NextIn(); return *this;}
alpar@1
   158
      InEdgeIterator Next() const {return InEdgeIterator(*this).GoNext();}
alpar@1
   159
      InEdgeIterator &operator++() { return GoNext();}
alpar@1
   160
      InEdgeIterator operator++(int)
alpar@1
   161
      {InEdgeIterator tmp(*this); GoNext(); return tmp;}
alpar@1
   162
      
alpar@1
   163
      operator const OutEdgeIterator ()
alpar@1
   164
      {OutEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   165
      operator const BiEdgeIterator ()
alpar@1
   166
      {EdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   167
      //      operator const SymEdgeIterator ();
alpar@1
   168
      
alpar@1
   169
      NodeIterator Anode() const {return To();}
alpar@1
   170
      NodeIterator Bnode() const {return From();}
alpar@1
   171
      
alpar@1
   172
      friend class Graph;
alpar@1
   173
    };
alpar@1
   174
    
alpar@1
   175
    class OutEdgeIterator : public EdgeIterator
alpar@1
   176
    {
alpar@1
   177
    public:
alpar@3
   178
      OutEdgeIterator() {}
alpar@3
   179
      OutEdgeIterator(Graph<N,E> &Gr,const NodeIterator &n)
alpar@3
   180
      { G=&Gr; e=Gr.OldGraph<N,E>::FirstOut(n.n);}
alpar@3
   181
alpar@1
   182
      OutEdgeIterator &GoNext() { e=e->NextOut(); return *this;}
alpar@1
   183
      OutEdgeIterator Next() const {return OutEdgeIterator(*this).GoNext();}
alpar@1
   184
      OutEdgeIterator &operator++() { return GoNext();}
alpar@1
   185
      OutEdgeIterator operator++(int)
alpar@1
   186
      {OutEdgeIterator tmp(*this); GoNext(); return tmp;}
alpar@1
   187
      
alpar@1
   188
      NodeIterator Anode() const {return From();}
alpar@1
   189
      NodeIterator Bnode() const {return To();}
alpar@1
   190
      
alpar@1
   191
      operator const InEdgeIterator ()
alpar@1
   192
      {InEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   193
      operator const BiEdgeIterator ()
alpar@1
   194
      {BiEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   195
      //operator const SymEdgeIterator(); 
alpar@1
   196
      
alpar@1
   197
      friend class Graph;
alpar@1
   198
    };
alpar@1
   199
    
alpar@1
   200
    class SymEdgeIterator : public EdgeIterator
alpar@1
   201
    {
alpar@1
   202
      NodeIterator n;  // Itt ketszer van a G
alpar@1
   203
      
alpar@1
   204
    public:
alpar@3
   205
      SymEdgeIterator() {}
alpar@3
   206
      SymEdgeIterator(const Graph<N,E> &Gr,const NodeIterator &nn)
alpar@3
   207
      { G=&Gr; n=nn; e=Gr.FirstSym(nn.n); }
alpar@3
   208
alpar@1
   209
      SymEdgeIterator &GoNext() { e=e->NextEdge(n.n); return *this;}
alpar@1
   210
      SymEdgeIterator Next() const {return SymEdgeIterator(*this).GoNext();}
alpar@1
   211
      SymEdgeIterator &operator++() { return GoNext();}
alpar@1
   212
      SymEdgeIterator operator++(int)
alpar@1
   213
      {SymEdgeIterator tmp(*this); GoNext(); return tmp;}
alpar@1
   214
      
alpar@1
   215
      NodeIterator Anode() const {return n;}
alpar@1
   216
      NodeIterator Bnode() const {return n.n==From().n?To():From();}
alpar@1
   217
      
alpar@1
   218
      operator const InEdgeIterator ()
alpar@1
   219
      {InEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   220
      operator const OutEdgeIterator ()
alpar@1
   221
      {OutEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   222
      operator const BiEdgeIterator ()
alpar@1
   223
      {BiEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   224
      
alpar@1
   225
      friend class Graph;
alpar@1
   226
    };
alpar@1
   227
    
alpar@1
   228
    class AllEdgeIterator : public EdgeIterator
alpar@1
   229
    {
alpar@1
   230
      NodeIterator n;  // Itt ketszer van a G
alpar@1
   231
      
alpar@1
   232
    public:
alpar@3
   233
      AllEdgeIterator() {}
alpar@3
   234
      AllEdgeIterator(Graph<N,E> &Gr) : n(Gr)
alpar@3
   235
      {
alpar@3
   236
	e=n.isValid()?Gr.OldGraph<N,E>::FirstOut(n.n):NULL;
alpar@3
   237
      }  
alpar@3
   238
alpar@1
   239
      AllEdgeIterator &GoNext()
alpar@1
   240
      {
alpar@1
   241
	e=e->NextOut();
alpar@1
   242
	if(!e && (++n).isValid()) e=G->OldGraph<N,E>::FirstOut(n.n);
alpar@1
   243
	return *this;
alpar@1
   244
      }
alpar@1
   245
      AllEdgeIterator Next() const {return AllEdgeIterator(*this).GoNext();}
alpar@1
   246
      AllEdgeIterator &operator++() { return GoNext();}
alpar@1
   247
      AllEdgeIterator operator++(int)
alpar@1
   248
	{AllEdgeIterator tmp(*this); GoNext(); return tmp;}
alpar@1
   249
      
alpar@1
   250
      
alpar@1
   251
      NodeIterator Anode() const {return n;}
alpar@1
   252
      NodeIterator Bnode() const {return n.n==From().n?To():From();}
alpar@1
   253
      
alpar@1
   254
      operator const InEdgeIterator ()
alpar@1
   255
      {InEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   256
      operator const OutEdgeIterator ()
alpar@1
   257
      {OutEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   258
      operator const BiEdgeIterator ()
alpar@1
   259
      {BiEdgeIterator i; i.G=G;i.e=e;return i;}
alpar@1
   260
      
alpar@1
   261
      friend class Graph;
alpar@1
   262
    };
alpar@1
   263
    
alpar@1
   264
    typedef NodeIterator DeletingNodeIterator;
alpar@1
   265
    typedef EdgeIterator DeletingEdgeIterator;
alpar@1
   266
    typedef BiEdgeIterator DeletingBiEdgeIterator;
alpar@1
   267
    typedef OutEdgeIterator DeletingOutEdgeIterator;
alpar@1
   268
    typedef InEdgeIterator DeletingInEdgeIterator;
alpar@1
   269
    typedef SymEdgeIterator DeletingSymEdgeIterator;
alpar@1
   270
    
alpar@3
   271
    const NodeIterator FirstNode()
alpar@1
   272
    {
alpar@1
   273
      NodeIterator i;
alpar@1
   274
      i.G=this;i.n=OldGraph<N,E>::FirstNode();
alpar@1
   275
      return i;
alpar@1
   276
    }
alpar@1
   277
    
alpar@1
   278
    void GetFirst(NodePoint &p)   { p=OldGraph<N,E>::FirstNode(); }
alpar@1
   279
    
alpar@1
   280
    void GetFirst(InEdgePoint &p,const NodePoint &n)
alpar@1
   281
    { p=OldGraph<N,E>::FirstIn(n); }
alpar@1
   282
    void GetFirst(OutEdgePoint &p,const NodePoint &n)
alpar@1
   283
    { p=OldGraph<N,E>::FirstOut(n); }
alpar@1
   284
    void GetFirst(SymEdgePoint &p,const NodePoint &n)
alpar@1
   285
    { p=OldGraph<N,E>::FirstEdge(n); }
alpar@1
   286
    void GetFirst(EdgePoint &p) //Vegigmegy mindenen
alpar@1
   287
    { p.e=NodeNum()?OldGraph<N,E>::FirstOut(OldGraph<N,E>::FirstNode()):NULL;}
alpar@1
   288
alpar@1
   289
    void GetFirst(NodeIterator &i) { i.G=this;i.n=OldGraph<N,E>::FirstNode();}
alpar@1
   290
    
alpar@1
   291
    void GetFirst(InEdgeIterator &i,const NodeIterator &n)
alpar@1
   292
    { i.G=this;i.e=OldGraph<N,E>::FirstIn(n.n); }
alpar@1
   293
    void GetFirst(OutEdgeIterator &i,const NodeIterator &n)
alpar@1
   294
    { i.G=this;i.e=OldGraph<N,E>::FirstOut(n.n); }
alpar@1
   295
    void GetFirst(SymEdgeIterator &i,const NodeIterator &n)
alpar@1
   296
    { i.G=this;i.e=OldGraph<N,E>::FirstSym(n.n); }
alpar@1
   297
    void GetFirst(AllEdgeIterator &i) //Vegigmegy mindenen
alpar@1
   298
    {
alpar@1
   299
      i.G=this;
alpar@1
   300
      GetFirst(i.n);
alpar@1
   301
      i.e=OldGraph<N,E>::NodeNum()?OldGraph<N,E>::FirstOut(i.n.n):NULL;
alpar@1
   302
    }  
alpar@1
   303
    
alpar@1
   304
    
alpar@1
   305
    
alpar@1
   306
    //Vagy beginnode()?
alpar@3
   307
    const DeletingEdgeIterator FirstOut(const NodeIterator &n)
alpar@1
   308
    {
alpar@1
   309
      EdgeIterator i;
alpar@1
   310
      i.G=n.G;i.edge=n.G->OldGraph<N,E>::FirstOut(n.n);
alpar@1
   311
      return i;
alpar@1
   312
    }
alpar@3
   313
    const DeletingEdgeIterator FirstIn(const NodeIterator &n)
alpar@1
   314
    {
alpar@1
   315
      EdgeIterator i;
alpar@1
   316
      i.G=n.G;i.edge=n.G->OldGraph<N,E>::FirstIn(n.n);
alpar@1
   317
      return i;
alpar@1
   318
    }
alpar@3
   319
    const DeletingSymEdgeIterator FirstSym(const NodeIterator &n)
alpar@1
   320
    {
alpar@1
   321
      EdgeIterator i;
alpar@1
   322
      i.G=n.G;i.n=n.n;
alpar@1
   323
      i.edge=n.G->OldGraph<N,E>::FirstEdge(n.n);
alpar@1
   324
      return i;
alpar@1
   325
    }
alpar@1
   326
    
alpar@1
   327
    //    class FirstAnythingType;
alpar@1
   328
    //    friend class FirstAnythingType;
alpar@1
   329
alpar@1
   330
    class FirstAnythingTypeNode
alpar@1
   331
    {
alpar@1
   332
      NodeIterator n;
alpar@1
   333
    public:
alpar@1
   334
      FirstAnythingTypeNode(NodeIterator i) : n(i) {}
alpar@1
   335
alpar@1
   336
      operator const InEdgeIterator () const
alpar@1
   337
      {InEdgeIterator i; n.G->GetFirst(i,n);return i;}
alpar@1
   338
      operator const OutEdgeIterator () const
alpar@1
   339
      {OutEdgeIterator i; n.G->GetFirst(i,n);return i;}
alpar@1
   340
      operator const SymEdgeIterator () const
alpar@1
   341
      {SymEdgeIterator i; n.G->GetFirst(i,n);return i;}
alpar@1
   342
  
alpar@1
   343
      operator const InEdgePoint () const
alpar@1
   344
      {InEdgePoint i; n.G->GetFirst(i,n);return i;}
alpar@1
   345
      operator const OutEdgePoint () const
alpar@1
   346
      {OutEdgePoint i; n.G->GetFirst(i,n);return i;}
alpar@1
   347
      operator const SymEdgePoint () const
alpar@1
   348
      {SymEdgePoint i; n.G->GetFirst(i,n);return i;}
alpar@1
   349
    };
alpar@1
   350
    
alpar@1
   351
    class FirstAnythingType
alpar@1
   352
    {
alpar@1
   353
      Graph<N,E> *G;
alpar@1
   354
    public:
alpar@1
   355
      FirstAnythingType(Graph<N,E> *gg) : G(gg) {}
alpar@1
   356
alpar@1
   357
      operator const AllEdgeIterator () const
alpar@1
   358
      {AllEdgeIterator i; G->GetFirst(i);return i;}  
alpar@1
   359
      operator const EdgePoint () const
alpar@1
   360
      {EdgePoint i; G->GetFirst(i);return i;}
alpar@1
   361
      operator const NodeIterator () const
alpar@1
   362
      {NodeIterator i; G->GetFirst(i);return i;}  
alpar@1
   363
      operator const NodePoint () const
alpar@1
   364
      {NodePoint i; G->GetFirst(i);return i;}
alpar@1
   365
    } _FST;
alpar@1
   366
    
alpar@1
   367
    //    const NodeIterator First() {NodeIterator i;GetFirst(i); return i;}
alpar@1
   368
    FirstAnythingTypeNode First(NodeIterator &i)
alpar@1
   369
    {FirstAnythingTypeNode t(i); return t;}
alpar@1
   370
    const FirstAnythingType &First() {return _FST;}
alpar@1
   371
    
alpar@1
   372
    // LastNode() vagy endnode() stb. Nem kell?
alpar@1
   373
    
alpar@1
   374
    DeletingNodeIterator AddNode()
alpar@1
   375
    {
alpar@1
   376
      DeletingNodeIterator i;
alpar@1
   377
      i.G=this; i.n=OldGraph<N,E>::AddNode();
alpar@1
   378
      return i;
alpar@1
   379
    }
alpar@1
   380
    DeletingEdgeIterator
alpar@1
   381
    AddEdge(const NodeIterator from,const NodeIterator to)
alpar@1
   382
    {
alpar@1
   383
      DeletingEdgeIterator i;
alpar@1
   384
      i.G=this;i.e=OldGraph<N,E>::AddEdge(from.n,to.n);return i;
alpar@1
   385
    }
alpar@1
   386
    
alpar@1
   387
    void Delete(DeletingNodeIterator n) {n.G->OldGraph<N,E>::Delete(n.n);}
alpar@1
   388
    void Delete(DeletingEdgeIterator e) {e.G->OldGraph<N,E>::Delete(e.e);}
alpar@1
   389
    
alpar@1
   390
    int NodeNum() { OldGraph<N,E>::NodeNum(); }
alpar@3
   391
    void Clean() { OldGraph<N,E>::Clean(); }
alpar@1
   392
alpar@1
   393
    Graph() : _FST(this) {}
alpar@1
   394
  };
alpar@1
   395
  
alpar@1
   396
  /*   Ez itt a fiam kommentje:
alpar@1
   397
       <v n  nnnnnnnnnnnnnncncccccccccccccccccvvvvvv
alpar@1
   398
       vvnvnvnvnvnvvnnvnvnvnnvnbbbvfffffvvffffffffffffffffffffz
alpar@1
   399
       <<  < < <  < <  <   .cx..x.c.cc.c          
alpar@1
   400
       mcmn   
alpar@1
   401
  */
alpar@1
   402
  
alpar@1
   403
}
alpar@1
   404
alpar@1
   405
#endif