166ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com// 266ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. 366ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com// Use of this source code is governed by a BSD-style license that can be 466ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com// found in the LICENSE file. 566ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com// 666ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 7dcefb75e81f3eec28fb1d2d3b3847682659e7378Geoff Lang#include "compiler/translator/depgraph/DependencyGraph.h" 866ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 966ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com// These methods do a breadth-first traversal through the graph and mark visited nodes. 1066ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 1166ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphNode::traverse(TDependencyGraphTraverser* graphTraverser) 1266ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 1366ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->markVisited(this); 1466ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 1566ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 1666ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphParentNode::traverse(TDependencyGraphTraverser* graphTraverser) 1766ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 1866ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphNode::traverse(graphTraverser); 1966ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 2066ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->incrementDepth(); 2166ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 2266ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com // Visit the parent node's children. 2366ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com for (TGraphNodeSet::const_iterator iter = mDependentNodes.begin(); 2466ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com iter != mDependentNodes.end(); 2566ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com ++iter) 2666ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com { 2766ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphNode* node = *iter; 2866ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com if (!graphTraverser->isVisited(node)) 2966ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com node->traverse(graphTraverser); 3066ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com } 3166ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 3266ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->decrementDepth(); 3366ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 3466ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 3566ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphArgument::traverse(TDependencyGraphTraverser* graphTraverser) 3666ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 3766ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->visitArgument(this); 3866ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphParentNode::traverse(graphTraverser); 3966ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 4066ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 4166ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphFunctionCall::traverse(TDependencyGraphTraverser* graphTraverser) 4266ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 4366ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->visitFunctionCall(this); 4466ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphParentNode::traverse(graphTraverser); 4566ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 4666ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 4766ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphSymbol::traverse(TDependencyGraphTraverser* graphTraverser) 4866ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 4966ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->visitSymbol(this); 5066ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphParentNode::traverse(graphTraverser); 5166ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 5266ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 5366ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphSelection::traverse(TDependencyGraphTraverser* graphTraverser) 5466ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 5566ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->visitSelection(this); 5666ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphNode::traverse(graphTraverser); 5766ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 5866ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 5966ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphLoop::traverse(TDependencyGraphTraverser* graphTraverser) 6066ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 6166ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->visitLoop(this); 6266ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphNode::traverse(graphTraverser); 6366ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 6466ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com 6566ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.comvoid TGraphLogicalOp::traverse(TDependencyGraphTraverser* graphTraverser) 6666ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com{ 6766ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com graphTraverser->visitLogicalOp(this); 6866ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com TGraphNode::traverse(graphTraverser); 6966ebd0143ea40a9beb83eab5d86e24f52825b3famaxvujovic@gmail.com} 70