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