Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / angle / src / compiler / translator / NodeSearch.h
1 //
2 // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // NodeSearch.h: Utilities for searching translator node graphs
7 //
8
9 #ifndef TRANSLATOR_NODESEARCH_H_
10 #define TRANSLATOR_NODESEARCH_H_
11
12 #include "compiler/translator/IntermNode.h"
13
14 namespace sh
15 {
16
17 template <class Parent>
18 class NodeSearchTraverser : public TIntermTraverser
19 {
20   public:
21     NodeSearchTraverser()
22         : mFound(false)
23     {}
24
25     bool found() const { return mFound; }
26
27     static bool search(TIntermNode *node)
28     {
29         Parent searchTraverser;
30         node->traverse(&searchTraverser);
31         return searchTraverser.found();
32     }
33
34   protected:
35     bool mFound;
36 };
37
38 class FindDiscard : public NodeSearchTraverser<FindDiscard>
39 {
40   public:
41     virtual bool visitBranch(Visit visit, TIntermBranch *node)
42     {
43         switch (node->getFlowOp())
44         {
45           case EOpKill:
46             mFound = true;
47             break;
48
49           default: break;
50         }
51
52         return !mFound;
53     }
54 };
55
56 class FindSideEffectRewriting : public NodeSearchTraverser<FindSideEffectRewriting>
57 {
58   public:
59     virtual bool visitBinary(Visit visit, TIntermBinary *node)
60     {
61         switch (node->getOp())
62         {
63           case EOpLogicalOr:
64           case EOpLogicalAnd:
65             if (node->getRight()->hasSideEffects())
66             {
67                 mFound = true;
68             }
69             break;
70
71           default: break;
72         }
73
74         return !mFound;
75     }
76 };
77
78 }
79
80 #endif // TRANSLATOR_NODESEARCH_H_