#include #include #include #include #include #include #include #include "Interface.h" #include "Graph.h" #include "CostModel.h" using std::cout; using std::endl; using std::string; using std::map; using std::list; using std::queue; using std::stack; using std::vector; class CompareGreater { public: bool operator()(const list& lhs, const list& rhs) const { return lhs.begin()->getDFSnumber() > rhs.begin()->getDFSnumber(); return true; } }; class SearchClassJar { public: SearchClassJar(const string& n) : name(n) {} bool operator()( Container::const_iterator& ptr ) const { return ptr->getName() == name; } private: string name; }; class Command { public: Command(const string& n) : name(n) {} virtual ~Command() {} const string & getName() const { return name; } virtual void execute() = 0; virtual void undo() {} private: string name; Command() : name("unknown") {} }; class BuildGraphCommand : public Command { public: BuildGraphCommand(const string & fn ) : Command("BuildGraph"), fileName(fn), nestedClassCount(0) {} void execute(); int getNestedClassCount() const { return nestedClassCount; } private: string fileName; int nestedClassCount; vector< Container::const_iterator > cinfoPtr; void printCinfoPtr() const; BuildGraphCommand(); void checkForPolymorphicEdges(const string&, const string&); bool isTemplate( const string & ) const; void buildStuffInNamespace(const Container&); void buildClasses(const Container& classes); void BuildGraphCommand::printTypeInfo( Container::const_iterator); void doNestedClassInfo(const string&, const Container&); void doClassVariableInfo(const string&, const Container&); void doClassFunctionInfo(const string&, const Container&); void processFunctionLocals(const string&, const Container&); void addEdge(const Edge&); }; class BuildStrongComponents : public Command { public: BuildStrongComponents(const Graph& graph) : Command("BuildStrongComponents"), graph(graph), cycleCount(0) {} void execute(); void printReverseDfsNumbering() const; void printCycles(const list&) const; list getCycles() const { return cycles; } private: Graph graph; int cycleCount; static int dfsNumber; Graph gReverse; list strongComponents; list cycles; void buildGReverse(list< list >&, Graph&); void assignReverseDFSnumber(list< list >&, list< list >::iterator); void buildStrong(list< list >&, list< list >::iterator&, Graph&, int); void sortGreverse() { list< list >& g_rev = gReverse.getAdjList(); g_rev.sort(CompareGreater()); } void reverseEdgesInStrongComponents(); list< list >::iterator findFront(list< list >&, list::iterator) const; void printVisited() const; }; class InvalidCommand : public Command { public: InvalidCommand() : Command("InvalidCommand") {} void execute(); }; class BreakCyclesCommand : public Command { public: BreakCyclesCommand(const CostModel& m, const Graph& graph); void execute(); bool checkForCycles() const; void printComponents(const list&) const; Graph getEdgesRemoved () { return edgesRemoved; } static int getBreakCount() { return breakCount; } private: CostModel model; Graph cycles; Graph edgesRemoved; list graphList; static int breakCount; }; class FindOrderCommand : public Command { public: FindOrderCommand(const Graph& g, const map& in) : Command("FindOrderCommand"), graph(g), indegrees(in) {} void execute(); stack getOrder(); private: Graph graph; map indegrees; queue zeros; stack order; void findZeros(); };