src/work/alpar/smart_graph.h
author alpar
Fri, 20 Feb 2004 21:57:39 +0000
changeset 106 0508d63fcc96
parent 104 7a2d991e9852
child 108 0351b00fd283
permissions -rw-r--r--
.
alpar@105
     1
// -*- mode:C++ -*-
alpar@105
     2
alpar@104
     3
#ifndef SMART_GRAPH_H
alpar@104
     4
#define SMART_GRAPH_H
alpar@104
     5
alpar@104
     6
#include <iostream>
alpar@104
     7
#include <vector>
alpar@104
     8
alpar@105
     9
namespace hugo {
alpar@104
    10
alpar@104
    11
  class SmartGraph {
alpar@104
    12
alpar@104
    13
    static const int INVALID=-1;
alpar@104
    14
alpar@104
    15
    struct NodeT 
alpar@104
    16
    {
alpar@104
    17
      int first_in,first_out;      
alpar@104
    18
      NodeT() : first_in(INVALID), first_out(INVALID) {}
alpar@104
    19
    };
alpar@104
    20
    struct EdgeT 
alpar@104
    21
    {
alpar@104
    22
      int head, tail, next_in, next_out;      
alpar@104
    23
      //FIXME: is this necessary?
alpar@104
    24
      EdgeT() : next_in(INVALID), next_out(INVALID) {}  
alpar@104
    25
    };
alpar@104
    26
alpar@104
    27
    std::vector<NodeT> nodes;
alpar@104
    28
    std::vector<EdgeT> edges;
alpar@104
    29
    
alpar@104
    30
alpar@104
    31
  public:
alpar@104
    32
alpar@104
    33
    class NodeIt;
alpar@104
    34
    class EachNodeIt;
alpar@104
    35
    class EdgeIt;
alpar@104
    36
    class EachEdgeIt;
alpar@104
    37
    class OutEdgeIt;
alpar@104
    38
    class InEdgeIt;
alpar@104
    39
    
alpar@105
    40
    //      class NodeIt { int n; };
alpar@105
    41
    //     class EachNodeIt : public NodeIt { };
alpar@105
    42
    //     class EdgeIt { int n; };
alpar@105
    43
    //     class EachEdgeIt : public EdgeIt {};
alpar@105
    44
    //     class OutEdgeIt : public EdgeIt {};
alpar@105
    45
    //     class InEdgeIt : public EdgeIt {};
alpar@104
    46
    //    class SymEdgeIt;
alpar@105
    47
    
alpar@105
    48
    template <typename T> class NodeMap;
alpar@104
    49
    template <typename T> class EdgeMap;
alpar@104
    50
    
alpar@104
    51
  public:
alpar@104
    52
alpar@104
    53
    /* default constructor */
alpar@104
    54
alpar@104
    55
    SmartGraph() : nodes(), edges() { }
alpar@104
    56
    
alpar@104
    57
    ~SmartGraph() {}
alpar@104
    58
alpar@104
    59
    int nodeNum() const { return nodes.size(); }  //FIXME: What is this?
alpar@104
    60
    int edgeNum() const { return edges.size(); }  //FIXME: What is this?
alpar@104
    61
alpar@104
    62
    NodeIt tail(EdgeIt e) const { return edges[e.n].tail; }
alpar@104
    63
    NodeIt head(EdgeIt e) const { return edges[e.n].head; }
alpar@104
    64
alpar@104
    65
    NodeIt aNode(const OutEdgeIt& e) const { return tail(e); }
alpar@104
    66
    NodeIt aNode(const InEdgeIt& e) const { return head(e); }
alpar@104
    67
    //NodeIt aNode(const SymEdgeIt& e) const { return e.aNode(); }
alpar@104
    68
alpar@104
    69
    NodeIt bNode(const OutEdgeIt& e) const { return head(e); }
alpar@104
    70
    NodeIt bNode(const InEdgeIt& e) const { return tail(e); }
alpar@104
    71
    //NodeIt bNode(const SymEdgeIt& e) const { return e.bNode(); }
alpar@104
    72
alpar@104
    73
    EachNodeIt& getFirst(EachNodeIt& v) const { 
alpar@104
    74
      v=EachNodeIt(*this); return v; }
alpar@104
    75
    EachEdgeIt& getFirst(EachEdgeIt& e) const { 
alpar@104
    76
      e=EachEdgeIt(*this); return e; }
alpar@104
    77
    OutEdgeIt& getFirst(OutEdgeIt& e, const NodeIt v) const { 
alpar@104
    78
      e=OutEdgeIt(*this,v); return e; }
alpar@104
    79
    InEdgeIt& getFirst(InEdgeIt& e, const NodeIt v) const { 
alpar@104
    80
      e=InEdgeIt(*this,v); return e; }
alpar@104
    81
alpar@104
    82
    template< typename It >
alpar@104
    83
    It first() const { 
alpar@104
    84
      It e;
alpar@104
    85
      getFirst(e);
alpar@104
    86
      return e; 
alpar@104
    87
    }
alpar@104
    88
alpar@104
    89
    template< typename It >
alpar@104
    90
    It first(NodeIt v) const { 
alpar@104
    91
      It e;
alpar@104
    92
      getFirst(e, v);
alpar@104
    93
      return e; 
alpar@104
    94
    }
alpar@104
    95
alpar@104
    96
    bool valid(EdgeIt e) const { return e.n!=INVALID; }
alpar@104
    97
    bool valid(EachEdgeIt e) const { return e.n<int(edges.size()); }
alpar@104
    98
    bool valid(NodeIt n) const { return n.n<int(nodes.size()); }
alpar@104
    99
    
alpar@105
   100
    template <typename It> It next(It it) const
alpar@105
   101
      //    { It tmp(it); return goNext(tmp); }
alpar@105
   102
    { It tmp; tmp.n=it.n+1; return tmp; }
alpar@104
   103
alpar@104
   104
    NodeIt& goNext(NodeIt& it) const { ++it.n; return it; }
alpar@104
   105
    OutEdgeIt& goNext(OutEdgeIt& it) const
alpar@104
   106
    { it.n=edges[it.n].next_out; return it; }
alpar@104
   107
    InEdgeIt& goNext(InEdgeIt& it) const
alpar@104
   108
    { it.n=edges[it.n].next_in; return it; }
alpar@104
   109
    EachEdgeIt& goNext(EachEdgeIt& it) const { ++it.n; return it; }
alpar@104
   110
alpar@104
   111
    int id(NodeIt v) const { return v.n; }
alpar@104
   112
    int id(EdgeIt e) const { return e.n; }
alpar@104
   113
alpar@104
   114
    NodeIt addNode() {
alpar@104
   115
      NodeIt n; n.n=nodes.size();
alpar@104
   116
      nodes.push_back(NodeT()); //FIXME: Hmmm...
alpar@104
   117
      return n;
alpar@104
   118
    }
alpar@104
   119
    EdgeIt addEdge(NodeIt u, NodeIt v) {
alpar@104
   120
      EdgeIt e; e.n=edges.size(); edges.push_back(EdgeT()); //FIXME: Hmmm...
alpar@104
   121
      edges[e.n].tail=u.n; edges[e.n].head=v.n;
alpar@104
   122
      edges[e.n].next_out=nodes[u.n].first_out;
alpar@104
   123
      edges[e.n].next_in=nodes[v.n].first_in;
alpar@104
   124
      nodes[u.n].first_out=nodes[v.n].first_in=e.n;
alpar@104
   125
      return e;
alpar@104
   126
    }
alpar@104
   127
alpar@104
   128
    void clear() {nodes.clear();edges.clear();}
alpar@104
   129
alpar@104
   130
    class NodeIt {
alpar@104
   131
      friend class SmartGraph;
alpar@104
   132
      template <typename T> friend class NodeMap;
alpar@104
   133
      
alpar@104
   134
      friend class EdgeIt;
alpar@104
   135
      friend class OutEdgeIt;
alpar@104
   136
      friend class InEdgeIt;
alpar@104
   137
      friend class SymEdgeIt;
alpar@104
   138
alpar@104
   139
    protected:
alpar@104
   140
      int n;
alpar@104
   141
      friend int SmartGraph::id(NodeIt v) const; 
alpar@104
   142
    public:
alpar@104
   143
      NodeIt() {}
alpar@104
   144
      NodeIt(int nn) {n=nn;}
alpar@104
   145
      bool operator==(const NodeIt i) const {return n==i.n;}
alpar@104
   146
      bool operator!=(const NodeIt i) const {return n!=i.n;}
alpar@104
   147
    };
alpar@104
   148
    
alpar@104
   149
    class EachNodeIt : public NodeIt {
alpar@104
   150
      friend class SmartGraph;
alpar@104
   151
    public:
alpar@104
   152
      EachNodeIt(const SmartGraph& G) : NodeIt(0) { }
alpar@104
   153
      EachNodeIt() : NodeIt() { }
alpar@104
   154
    };
alpar@104
   155
alpar@104
   156
    class EdgeIt {
alpar@104
   157
      friend class SmartGraph;
alpar@104
   158
      template <typename T> friend class EdgeMap;
alpar@104
   159
      
alpar@104
   160
      friend class NodeIt;
alpar@104
   161
      friend class EachNodeIt;
alpar@104
   162
    protected:
alpar@104
   163
      int n;
alpar@104
   164
      friend int SmartGraph::id(EdgeIt e) const;
alpar@104
   165
    public:
alpar@104
   166
      EdgeIt() { }
alpar@104
   167
      EdgeIt(int nn) {n=nn;}
alpar@104
   168
      bool operator==(const EdgeIt i) const {return n==i.n;}
alpar@104
   169
      bool operator!=(const EdgeIt i) const {return n!=i.n;}
alpar@104
   170
    };
alpar@104
   171
    
alpar@104
   172
    class EachEdgeIt : public EdgeIt {
alpar@104
   173
      friend class SmartGraph;
alpar@104
   174
    public:
alpar@104
   175
      EachEdgeIt(const SmartGraph& G) : EdgeIt(0) { }
alpar@104
   176
      EachEdgeIt() : EdgeIt() { }
alpar@104
   177
    };
alpar@104
   178
    
alpar@104
   179
    class OutEdgeIt : public EdgeIt {
alpar@104
   180
      friend class SmartGraph;
alpar@104
   181
    public: 
alpar@104
   182
      OutEdgeIt() : EdgeIt() { }
alpar@104
   183
      OutEdgeIt(const SmartGraph& G,const NodeIt v)
alpar@104
   184
	: EdgeIt(G.nodes[v.n].first_out) {}
alpar@104
   185
    };
alpar@104
   186
    
alpar@104
   187
    class InEdgeIt : public EdgeIt {
alpar@104
   188
      friend class SmartGraph;
alpar@104
   189
    public: 
alpar@104
   190
      InEdgeIt() : EdgeIt() { }
alpar@104
   191
      InEdgeIt(const SmartGraph& G,NodeIt v) :EdgeIt(G.nodes[v.n].first_in){}
alpar@104
   192
    };
alpar@105
   193
alpar@105
   194
    // Map types
alpar@105
   195
alpar@105
   196
    template <typename T>
alpar@105
   197
    class NodeMap {
alpar@105
   198
      const SmartGraph& G; 
alpar@105
   199
      std::vector<T> container;
alpar@105
   200
    public:
alpar@105
   201
      typedef T ValueType;
alpar@105
   202
      typedef NodeIt KeyType;
alpar@105
   203
      NodeMap(const SmartGraph& _G) : G(_G), container(G.nodeNum()) { }
alpar@105
   204
      NodeMap(const SmartGraph& _G, T a) : 
alpar@105
   205
	G(_G), container(G.nodeNum(), a) { }
alpar@105
   206
      void set(NodeIt n, T a) { container[n.n]=a; }
alpar@105
   207
      T get(NodeIt n) const { return container[n.n]; }
alpar@105
   208
      T& operator[](NodeIt n) { return container[n.n]; }
alpar@105
   209
      const T& operator[](NodeIt n) const { return container[n.n]; }
alpar@105
   210
      void update() { container.resize(G.nodeNum()); }
alpar@105
   211
      void update(T a) { container.resize(G.nodeNum(), a); }
alpar@105
   212
    };
alpar@105
   213
alpar@105
   214
    template <typename T>
alpar@105
   215
    class EdgeMap {
alpar@105
   216
      const SmartGraph& G; 
alpar@105
   217
      std::vector<T> container;
alpar@105
   218
    public:
alpar@105
   219
      typedef T ValueType;
alpar@105
   220
      typedef EdgeIt KeyType;
alpar@105
   221
      EdgeMap(const SmartGraph& _G) : G(_G), container(G.edgeNum()) { }
alpar@105
   222
      EdgeMap(const SmartGraph& _G, T a) : 
alpar@105
   223
	G(_G), container(G.edgeNum(), a) { }
alpar@105
   224
      void set(EdgeIt e, T a) { container[e.n]=a; }
alpar@105
   225
      T get(EdgeIt e) const { return container[e.n]; }
alpar@105
   226
      T& operator[](EdgeIt e) { return container[e.n]; } 
alpar@105
   227
      const T& operator[](EdgeIt e) const { return container[e.n]; } 
alpar@105
   228
      void update() { container.resize(G.edgeNum()); }
alpar@105
   229
      void update(T a) { container.resize(G.edgeNum(), a); }
alpar@105
   230
    };
alpar@105
   231
alpar@105
   232
alpar@105
   233
alpar@105
   234
alpar@104
   235
  };
alpar@105
   236
} //namespace hugo
alpar@104
   237
alpar@104
   238
#endif //SMART_GRAPH_H