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