Program Listing for File SCCAnalysis.h

Program Listing for File SCCAnalysis.h#

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

#ifndef SCC_ANALYSIS_H
#define SCC_ANALYSIS_H

#include <GraphAccess.h>
#include <GraphGroup.h>
#include "rosedll.h"

class SCCAnalOperator
{
  public:
    virtual void CreateSCC() = 0;
    virtual void SCCAdd( GraphAccessInterface::Node *n) = 0;
    virtual ~SCCAnalOperator() {}
};

class SCCAnalysis
{
  public:
    void operator()( const GraphAccessInterface *dg, SCCAnalOperator &op);
    void operator() (const GraphAccessInterface *dg,
                     GraphAccessInterface::Node *node,
                     SCCAnalOperator &op);
    void operator() (const GraphAccessInterface *dg,
                     GraphAccessInterface::NodeIterator iter,
                     SCCAnalOperator& op);
};

class SCCGroupGraphOperator : public SCCAnalOperator
{
  public:
   SCCGroupGraphOperator(GroupGraphCreate *g) : sccNode(0), graph(g) {}
   virtual ~SCCGroupGraphOperator() {}
   virtual void CreateSCC() { SetCurSCC( new GroupGraphNode(graph) ); }
   void SCCAdd( GraphAccessInterface::Node *n)
      { sccNode->AddNode( n );
        nodeMap.InsertMapping(n, sccNode); }
   GroupGraphNode* GetSCCNode( GraphAccessInterface::Node *n)
      { return nodeMap.Map(n); }
   GroupGraphCreate* GetGroupGraphCreate() const { return graph; }
  protected:
    void SetCurSCC( GroupGraphNode *scc )
        { sccNode = scc; graph->AddGroupNode(sccNode); }
  private:
   GroupGraphNode *sccNode;
   GroupGraphCreate *graph;
   PtrMapWrap <GraphAccessInterface::Node, GroupGraphNode> nodeMap;
};

class DAGBaseGraphImpl;
class ROSE_UTIL_API SCCGraphCreate : public GroupGraphCreate
{
  DAGBaseGraphImpl *impl;
 public:
  SCCGraphCreate( const GraphAccessInterface *orig, SCCGroupGraphOperator *op = 0);
  void TopoSort( bool reverse = false );
};

#endif