7 #ifndef COMPILER_DEPGRAPH_DEPENDENCY_GRAPH_BUILDER_H
8 #define COMPILER_DEPGRAPH_DEPENDENCY_GRAPH_BUILDER_H
27 typedef std::stack<TGraphSymbol*> TSymbolStack;
28 typedef std::set<TGraphParentNode*> TParentNodeSet;
39 ~TNodeSetStack() { clear(); }
43 TParentNodeSet* getTopSet()
const
46 TParentNodeSet* topSet = nodeSets.top();
47 return !topSet->empty() ? topSet :
NULL;
50 void pushSet() { nodeSets.push(
new TParentNodeSet()); }
54 delete nodeSets.top();
64 TParentNodeSet* oldTopSet = nodeSets.top();
67 if (!nodeSets.empty()) {
68 TParentNodeSet* newTopSet = nodeSets.top();
69 newTopSet->insert(oldTopSet->begin(), oldTopSet->end());
84 nodeSets.top()->insert(node);
89 while (!nodeSets.empty())
94 typedef std::stack<TParentNodeSet*> TParentNodeSetStack;
96 TParentNodeSetStack nodeSets;
103 class TNodeSetMaintainer {
106 : sets(factory->mNodeSets) { sets.pushSet(); }
107 ~TNodeSetMaintainer() { sets.popSet(); }
117 class TNodeSetPropagatingMaintainer {
120 : sets(factory->mNodeSets) { sets.pushSet(); }
121 ~TNodeSetPropagatingMaintainer() { sets.popSetIntoNext(); }
136 class TLeftmostSymbolMaintainer {
139 : leftmostSymbols(factory->mLeftmostSymbols)
141 needsPlaceholderSymbol = leftmostSymbols.empty() || leftmostSymbols.top() != &subtree;
142 if (needsPlaceholderSymbol)
143 leftmostSymbols.push(&subtree);
146 ~TLeftmostSymbolMaintainer()
148 if (needsPlaceholderSymbol)
149 leftmostSymbols.pop();
153 TSymbolStack& leftmostSymbols;
154 bool needsPlaceholderSymbol;
160 , mRightSubtree(
NULL)
164 void connectMultipleNodesToSingleNode(TParentNodeSet* nodes,
TGraphNode* node)
const;
177 TNodeSetStack mNodeSets;
178 TSymbolStack mLeftmostSymbols;
181 #endif // COMPILER_DEPGRAPH_DEPENDENCY_GRAPH_BUILDER_H
virtual bool visitLoop(Visit visit, TIntermLoop *)
virtual bool visitBinary(Visit visit, TIntermBinary *)
TIntermTraverser(bool preVisit=true, bool inVisit=false, bool postVisit=false, bool rightToLeft=false)
virtual bool visitAggregate(Visit visit, TIntermAggregate *)
#define ASSERT(expression)
virtual void traverse(TIntermTraverser *)=0
static void build(TIntermNode *node, TDependencyGraph *graph)
virtual void visitSymbol(TIntermSymbol *)
virtual bool visitSelection(Visit visit, TIntermSelection *)