[Lemon-commits] [lemon_svn] alpar: r137 - hugo/trunk/src/work/alpar

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:37:32 CET 2006


Author: alpar
Date: Fri Feb 20 01:29:19 2004
New Revision: 137

Added:
   hugo/trunk/src/work/alpar/smart_graph.h

Log:
A smart (and fast) graph class


Added: hugo/trunk/src/work/alpar/smart_graph.h
==============================================================================
--- (empty file)
+++ hugo/trunk/src/work/alpar/smart_graph.h	Fri Feb 20 01:29:19 2004
@@ -0,0 +1,234 @@
+#ifndef SMART_GRAPH_H
+#define SMART_GRAPH_H
+
+#include <iostream>
+#include <vector>
+
+namespace marci {
+
+  class SmartGraph {
+
+    static const int INVALID=-1;
+
+    struct NodeT 
+    {
+      int first_in,first_out;      
+      NodeT() : first_in(INVALID), first_out(INVALID) {}
+    };
+    struct EdgeT 
+    {
+      int head, tail, next_in, next_out;      
+      //FIXME: is this necessary?
+      EdgeT() : next_in(INVALID), next_out(INVALID) {}  
+    };
+
+    std::vector<NodeT> nodes;
+    std::vector<EdgeT> edges;
+    
+
+  public:
+
+    class NodeIt;
+    class EachNodeIt;
+    class EdgeIt;
+    class EachEdgeIt;
+    class OutEdgeIt;
+    class InEdgeIt;
+    
+//      class NodeIt { int n; };
+//     class EachNodeIt : public NodeIt { };
+//     class EdgeIt { int n; };
+//     class EachEdgeIt : public EdgeIt {};
+//     class OutEdgeIt : public EdgeIt {};
+//     class InEdgeIt : public EdgeIt {};
+    //    class SymEdgeIt;
+   
+ template <typename T> class NodeMap;
+    template <typename T> class EdgeMap;
+    
+  private:
+    
+    template <typename T> friend class NodeMap;
+    template <typename T> friend class EdgeMap;
+
+    template <typename T>
+    class NodeMap {
+      const SmartGraph& G; 
+      std::vector<T> container;
+    public:
+      typedef T ValueType;
+      typedef NodeIt KeyType;
+      NodeMap(const SmartGraph& _G) : G(_G), container(G.nodeNum()) { }
+      NodeMap(const SmartGraph& _G, T a) : 
+	G(_G), container(G.nodeNum(), a) { }
+      void set(NodeIt n, T a) { container[n.n]=a; }
+      T get(NodeIt n) const { return container[n.n]; }
+      T& operator[](NodeIt n) { return container[n.n]; }
+      const T& operator[](NodeIt n) const { return container[n.n]; }
+      void resize() { container.resize(G.nodeNum()); }
+      void resize(T a) { container.resize(G.nodeNum(), a); }
+    };
+
+    template <typename T>
+    class EdgeMap {
+      const SmartGraph& G; 
+      std::vector<T> container;
+    public:
+      typedef T ValueType;
+      typedef EdgeIt KeyType;
+      EdgeMap(const SmartGraph& _G) : G(_G), container(G.edgeNum()) { }
+      EdgeMap(const SmartGraph& _G, T a) : 
+	G(_G), container(G.edgeNum(), a) { }
+      void set(EdgeIt e, T a) { container[e.n]=a; }
+      T get(EdgeIt e) const { return container[e.n]; }
+      T& operator[](EdgeIt e) { return container[e.n]; } 
+      const T& operator[](EdgeIt e) const { return container[e.n]; } 
+      void resize() { container.resize(G.edgeNum()); }
+      void resize(T a) { container.resize(G.edgeNum(), a); }
+    };
+
+  public:
+
+    /* default constructor */
+
+    SmartGraph() : nodes(), edges() { }
+    
+    ~SmartGraph() {}
+
+    int nodeNum() const { return nodes.size(); }  //FIXME: What is this?
+    int edgeNum() const { return edges.size(); }  //FIXME: What is this?
+
+    NodeIt tail(EdgeIt e) const { return edges[e.n].tail; }
+    NodeIt head(EdgeIt e) const { return edges[e.n].head; }
+
+    NodeIt aNode(const OutEdgeIt& e) const { return tail(e); }
+    NodeIt aNode(const InEdgeIt& e) const { return head(e); }
+    //NodeIt aNode(const SymEdgeIt& e) const { return e.aNode(); }
+
+    NodeIt bNode(const OutEdgeIt& e) const { return head(e); }
+    NodeIt bNode(const InEdgeIt& e) const { return tail(e); }
+    //NodeIt bNode(const SymEdgeIt& e) const { return e.bNode(); }
+
+    EachNodeIt& getFirst(EachNodeIt& v) const { 
+      v=EachNodeIt(*this); return v; }
+    EachEdgeIt& getFirst(EachEdgeIt& e) const { 
+      e=EachEdgeIt(*this); return e; }
+    OutEdgeIt& getFirst(OutEdgeIt& e, const NodeIt v) const { 
+      e=OutEdgeIt(*this,v); return e; }
+    InEdgeIt& getFirst(InEdgeIt& e, const NodeIt v) const { 
+      e=InEdgeIt(*this,v); return e; }
+
+    template< typename It >
+    It first() const { 
+      It e;
+      getFirst(e);
+      return e; 
+    }
+
+    template< typename It >
+    It first(NodeIt v) const { 
+      It e;
+      getFirst(e, v);
+      return e; 
+    }
+
+    bool valid(EdgeIt e) const { return e.n!=INVALID; }
+    bool valid(EachEdgeIt e) const { return e.n<int(edges.size()); }
+    bool valid(NodeIt n) const { return n.n<int(nodes.size()); }
+    
+    template <typename It> It next(It it) const { 
+      It tmp(it); return goNext(it); }
+
+    NodeIt& goNext(NodeIt& it) const { ++it.n; return it; }
+    OutEdgeIt& goNext(OutEdgeIt& it) const
+    { it.n=edges[it.n].next_out; return it; }
+    InEdgeIt& goNext(InEdgeIt& it) const
+    { it.n=edges[it.n].next_in; return it; }
+    EachEdgeIt& goNext(EachEdgeIt& it) const { ++it.n; return it; }
+
+    int id(NodeIt v) const { return v.n; }
+    int id(EdgeIt e) const { return e.n; }
+
+    NodeIt addNode() {
+      NodeIt n; n.n=nodes.size();
+      nodes.push_back(NodeT()); //FIXME: Hmmm...
+      return n;
+    }
+    EdgeIt addEdge(NodeIt u, NodeIt v) {
+      EdgeIt e; e.n=edges.size(); edges.push_back(EdgeT()); //FIXME: Hmmm...
+      edges[e.n].tail=u.n; edges[e.n].head=v.n;
+      edges[e.n].next_out=nodes[u.n].first_out;
+      edges[e.n].next_in=nodes[v.n].first_in;
+      nodes[u.n].first_out=nodes[v.n].first_in=e.n;
+      return e;
+    }
+
+    void clear() {nodes.clear();edges.clear();}
+
+    class NodeIt {
+      friend class SmartGraph;
+      template <typename T> friend class NodeMap;
+      
+      friend class EdgeIt;
+      friend class OutEdgeIt;
+      friend class InEdgeIt;
+      friend class SymEdgeIt;
+
+    protected:
+      int n;
+      friend int SmartGraph::id(NodeIt v) const; 
+    public:
+      NodeIt() {}
+      NodeIt(int nn) {n=nn;}
+      bool operator==(const NodeIt i) const {return n==i.n;}
+      bool operator!=(const NodeIt i) const {return n!=i.n;}
+    };
+    
+    class EachNodeIt : public NodeIt {
+      friend class SmartGraph;
+    public:
+      EachNodeIt(const SmartGraph& G) : NodeIt(0) { }
+      EachNodeIt() : NodeIt() { }
+    };
+
+    class EdgeIt {
+      friend class SmartGraph;
+      template <typename T> friend class EdgeMap;
+      
+      friend class NodeIt;
+      friend class EachNodeIt;
+    protected:
+      int n;
+      friend int SmartGraph::id(EdgeIt e) const;
+    public:
+      EdgeIt() { }
+      EdgeIt(int nn) {n=nn;}
+      bool operator==(const EdgeIt i) const {return n==i.n;}
+      bool operator!=(const EdgeIt i) const {return n!=i.n;}
+    };
+    
+    class EachEdgeIt : public EdgeIt {
+      friend class SmartGraph;
+    public:
+      EachEdgeIt(const SmartGraph& G) : EdgeIt(0) { }
+      EachEdgeIt() : EdgeIt() { }
+    };
+    
+    class OutEdgeIt : public EdgeIt {
+      friend class SmartGraph;
+    public: 
+      OutEdgeIt() : EdgeIt() { }
+      OutEdgeIt(const SmartGraph& G,const NodeIt v)
+	: EdgeIt(G.nodes[v.n].first_out) {}
+    };
+    
+    class InEdgeIt : public EdgeIt {
+      friend class SmartGraph;
+    public: 
+      InEdgeIt() : EdgeIt() { }
+      InEdgeIt(const SmartGraph& G,NodeIt v) :EdgeIt(G.nodes[v.n].first_in){}
+    };
+  };
+} //namespace marci
+
+#endif //SMART_GRAPH_H



More information about the Lemon-commits mailing list