Upstream version 5.34.92.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 namespace sh
13 {
14
15 template <class Parent>
16 class NodeSearchTraverser : public TIntermTraverser
17 {
18   public:
19     NodeSearchTraverser()
20         : mFound(false)
21     {}
22
23     bool found() const { return mFound; }
24
25     static bool search(TIntermNode *node)
26     {
27         Parent searchTraverser;
28         node->traverse(&searchTraverser);
29         return searchTraverser.found();
30     }
31
32   protected:
33     bool mFound;
34 };
35
36 class FindDiscard : public NodeSearchTraverser<FindDiscard>
37 {
38   public:
39     virtual bool visitBranch(Visit visit, TIntermBranch *node)
40     {
41         switch (node->getFlowOp())
42         {
43           case EOpKill:
44             mFound = true;
45             break;
46
47           default: break;
48         }
49
50         return !mFound;
51     }
52 };
53
54 class FindSideEffectRewriting : public NodeSearchTraverser<FindSideEffectRewriting>
55 {
56   public:
57     virtual bool visitBinary(Visit visit, TIntermBinary *node)
58     {
59         switch (node->getOp())
60         {
61           case EOpLogicalOr:
62           case EOpLogicalAnd:
63             if (node->getRight()->hasSideEffects())
64             {
65                 mFound = true;
66             }
67             break;
68
69           default: break;
70         }
71
72         return !mFound;
73     }
74 };
75
76 }
77
78 #endif // TRANSLATOR_NODESEARCH_H_