Program Listing for File GraphScope.h

Program Listing for File GraphScope.h#

Return to documentation for file (src/util/graphs/GraphScope.h)

#ifndef GRAPH_SCOPE_H
#define GRAPH_SCOPE_H

#include <GraphAccess.h>
#include <assert.h>

template <class Graph>
class GraphReverseEdge
  : public GraphAccessTemplate<typename Graph::Node, typename Graph::Edge>
{
  Graph* impl;
 public:
  typedef typename Graph::Node Node;
  typedef typename Graph::Edge Edge;
  typedef typename Graph::NodeIterator NodeIterator;
  typedef typename Graph::EdgeIterator EdgeIterator;
  GraphReverseEdge(Graph* _impl) : impl(_impl) {}
  ~GraphReverseEdge() {}
  typename Graph::EdgeIterator
   GetNodeEdgeIterator(const typename Graph::Node *n, GraphAccess::EdgeDirection dir) const
   {return impl->GetNodeEdgeIterator(n, GraphAccess::Reverse(dir) ); }
  typename Graph::Node*
    GetEdgeEndPoint( const typename Graph::Edge *e, GraphAccess::EdgeDirection dir) const
   { return impl->GetEdgeEndPoint(e, GraphAccess::Reverse(dir) ); }

  typename Graph::NodeIterator GetNodeIterator() const { return impl->GetNodeIterator(); }
  bool ContainEdge( const typename Graph::Edge* e) const {return impl->ContainEdge(e); }
  bool ContainNode( const typename Graph::Node* n) const { return impl->ContainNode(n); }
};

template <class Graph>
class GraphSelect
  : public GraphAccessTemplate<typename Graph::Node, typename Graph::Edge>
{
 protected:
  const Graph* impl;
 public:
  GraphSelect(const Graph* _impl) : impl(_impl) {}
  ~GraphSelect() {}

  class GraphSelectNodeIterator
       : public IteratorImplTemplate<typename Graph::Node*,
                                     typename Graph::NodeIterator>
      {
        typedef IteratorImplTemplate<typename Graph::Node*,
                                     typename Graph::NodeIterator> BaseClass;
        const GraphSelect<Graph>* graphsel;
        void SetIterator()
         {
           for ( ; !BaseClass::impl.ReachEnd(); BaseClass::impl.Advance()) {
              if (graphsel->ContainNode(BaseClass::impl.Current()))
                 break;
           }
         }
      public:
        GraphSelectNodeIterator(const GraphSelect<Graph>* _graphsel,
                                const typename Graph::NodeIterator& _impl)
              : IteratorImplTemplate<typename Graph::Node*,
                                     typename Graph::NodeIterator>(_impl),
                graphsel(_graphsel)
             { SetIterator(); }
        virtual ~GraphSelectNodeIterator() {}
        void Advance() { BaseClass::impl.Advance(); SetIterator(); }
        void Reset() { BaseClass::impl.Reset(); SetIterator(); }
        IteratorImpl<typename Graph::Node*>* Clone() const
           { return new GraphSelectNodeIterator(*this); }
    } ;
  class GraphSelectEdgeIterator
       : public IteratorImplTemplate<typename Graph::Edge*,
                                     typename Graph::EdgeIterator>
      {
       typedef IteratorImplTemplate<typename Graph::Edge*,
                                     typename Graph::EdgeIterator> BaseClass;
        const GraphSelect<Graph>* graphsel;
        void SetIterator()
         {
           for ( ; !BaseClass::impl.ReachEnd(); BaseClass::impl.Advance()) {
              if (graphsel->ContainEdge(BaseClass::impl.Current()))
                 break;
           }
         }
      public:
        GraphSelectEdgeIterator(const GraphSelect<Graph>* _graphsel,
                                const typename Graph::EdgeIterator& _impl)
              : IteratorImplTemplate<typename Graph::Edge*,
                                     typename Graph::EdgeIterator>(_impl),
                graphsel(_graphsel)
             { SetIterator(); }
        virtual ~GraphSelectEdgeIterator() {}
        void Advance() { BaseClass::impl.Advance(); SetIterator(); }
        void Reset() { BaseClass::impl.Reset(); SetIterator(); }
        IteratorImpl<typename Graph::Edge*>* Clone() const
           { return new GraphSelectEdgeIterator(*this); }
     };

  typename Graph::NodeIterator GetNodeIterator() const
    { return new GraphSelectNodeIterator(this, impl->GetNodeIterator()); }
  typename Graph::EdgeIterator
  GetNodeEdgeIterator(const typename Graph::Node *n,
                              GraphAccess::EdgeDirection dir) const
   {return new GraphSelectEdgeIterator(this,impl->GetNodeEdgeIterator(n,dir)); }
  typename Graph::Node* GetEdgeEndPoint(const typename Graph::Edge* e,
                                        GraphAccess::EdgeDirection dir) const
   { return impl->GetEdgeEndPoint(e, dir); }
};

#endif