Program Listing for File DepGraph.h

Program Listing for File DepGraph.h#

Return to documentation for file (src/midend/programTransformation/loopProcessing/depGraph/DepGraph.h)

#ifndef DEP_GRAPH
#define DEP_GRAPH

#include <VirtualGraphCreate.h>
#include <DepInfoSet.h>

class DepInfoEdge : public MultiGraphElemTemplate<DepInfo>
{
 public:
  DepInfoEdge(MultiGraphCreate* c, const DepInfo& d)
           : MultiGraphElemTemplate<DepInfo>(c, d) {}
  std::string toString() const { return GetInfo().toString(); }
  DepInfoConstIterator get_depIterator() const
    { return new SingleIterator<DepInfo>(GetInfo()); }
};

class DepInfoSetEdge : public MultiGraphElemTemplate<DepInfoSet>
{
 public:
  DepInfoSetEdge(MultiGraphCreate* c, const DepInfoSet& d)
           : MultiGraphElemTemplate<DepInfoSet>(c, d) {}
  std::string toString() const { return GetInfo().toString(); }
  DepInfoConstIterator get_depIterator() const
    { return GetInfo().GetConstIterator(); }
};

typedef IteratorImpl<DepInfoEdge*> DepInfoEdgeIteratorImpl;
typedef IteratorWrap<DepInfoEdge*, DepInfoEdgeIteratorImpl> DepInfoEdgeIterator;
template <class EdgeIterator>
class DepInfoEdgeConstInfoIterator : public IteratorImpl<DepInfo>
{
   EdgeIterator impl;
 public:
   DepInfoEdgeConstInfoIterator( const EdgeIterator& p): impl(p) {}
   DepInfo Current() const { return impl.Current()->GetInfo(); }
   void Reset() { impl.Reset(); }
   void Advance() { impl.Advance(); }
   bool ReachEnd() const { return impl.ReachEnd(); }
   IteratorImpl<DepInfo>* Clone() const
        { return new DepInfoEdgeConstInfoIterator(*this); }
};

typedef IteratorImpl<DepInfoSetEdge*> DepInfoSetEdgeIteratorImpl;
typedef IteratorWrap<DepInfoSetEdge*, DepInfoSetEdgeIteratorImpl>
DepInfoSetEdgeIterator;

inline bool SelectDepType( const DepInfo &info, const DepType& sel)
     { return (info.GetDepType() & sel) != 0; }

inline bool SelectDepLevel( const DepInfo &d, int level)
   {
     int num1 = 0, num2 = 0;
     d.CarryLevels(num1,num2);
     return (level <= num2);
   }

template <class Node>
class DepInfoGraphCreate : public VirtualGraphCreateTemplate<Node,DepInfoEdge>
{
 public:
  DepInfoGraphCreate(BaseGraphCreate *_impl = 0)
     : VirtualGraphCreateTemplate<Node,DepInfoEdge>(_impl) {}
  DepInfoEdge* CreateEdge( Node *n1, Node *n2, const DepInfo &info)
       { assert(!info.IsTop());
         DepInfoEdge *e = new DepInfoEdge(this, info);
         VirtualGraphCreateTemplate<Node,DepInfoEdge>::AddEdge(n1, n2, e);
         return e;
       }
  void DeleteEdge(DepInfoEdge *e)
      { VirtualGraphCreateTemplate<Node,DepInfoEdge>::DeleteEdge(e); }
};

template <class Node>
class DepInfoSetGraphCreate : public VirtualGraphCreateTemplate<Node,DepInfoSetEdge>
{
 public:
  DepInfoSetGraphCreate(BaseGraphCreate *_impl = 0)
     : VirtualGraphCreateTemplate<Node,DepInfoSetEdge>(_impl) {}

  DepInfoSetEdge* CreateEdge( Node *n1, Node *n2, const DepInfo &info)
       { assert(!info.IsTop());
          DepInfoSetEdge *e = CreateEdge(n1,n2, DepInfoSet());
         e->GetInfo().AddDep(info);
         return e;
       }
  DepInfoSetEdge* CreateEdge(Node *n1, Node* n2, const DepInfoSet& tmp)
      {
         GraphCrossEdgeIterator<DepInfoSetGraphCreate> p(this, n1, n2);
         DepInfoSetEdge *e = p.ReachEnd()? 0 : p.Current();
         if (e == 0) {
           e = new DepInfoSetEdge(this, tmp);
           this->AddEdge(n1,n2, e);
         }
         else
           e->GetInfo() |= tmp;
         return e;
      }
  void DeleteEdge(DepInfoSetEdge *e)
      { VirtualGraphCreateTemplate<Node,DepInfoSetEdge>::DeleteEdge(e); }
};

#endif