1 //
2 // Copyright (c) 2002-2014 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 
7 #ifndef COMPILER_TRANSLATOR_CONSTANTUNION_H_
8 #define COMPILER_TRANSLATOR_CONSTANTUNION_H_
9 
10 #include <assert.h>
11 
12 #include "compiler/translator/Common.h"
13 #include "compiler/translator/BaseTypes.h"
14 
15 namespace sh
16 {
17 
18 class TDiagnostics;
19 
20 class TConstantUnion
21 {
22   public:
23     POOL_ALLOCATOR_NEW_DELETE();
24     TConstantUnion();
25 
26     bool cast(TBasicType newType, const TConstantUnion &constant);
27 
setIConst(int i)28     void setIConst(int i)
29     {
30         iConst = i;
31         type   = EbtInt;
32     }
setUConst(unsigned int u)33     void setUConst(unsigned int u)
34     {
35         uConst = u;
36         type   = EbtUInt;
37     }
setFConst(float f)38     void setFConst(float f)
39     {
40         fConst = f;
41         type   = EbtFloat;
42     }
setBConst(bool b)43     void setBConst(bool b)
44     {
45         bConst = b;
46         type   = EbtBool;
47     }
48 
setYuvCscStandardEXTConst(TYuvCscStandardEXT s)49     void setYuvCscStandardEXTConst(TYuvCscStandardEXT s)
50     {
51         yuvCscStandardEXTConst = s;
52         type                   = EbtYuvCscStandardEXT;
53     }
54 
55     int getIConst() const;
56     unsigned int getUConst() const;
57     float getFConst() const;
58     bool getBConst() const;
59     TYuvCscStandardEXT getYuvCscStandardEXTConst() const;
60 
61     bool operator==(const int i) const;
62     bool operator==(const unsigned int u) const;
63     bool operator==(const float f) const;
64     bool operator==(const bool b) const;
65     bool operator==(const TYuvCscStandardEXT s) const;
66     bool operator==(const TConstantUnion &constant) const;
67     bool operator!=(const int i) const;
68     bool operator!=(const unsigned int u) const;
69     bool operator!=(const float f) const;
70     bool operator!=(const bool b) const;
71     bool operator!=(const TYuvCscStandardEXT s) const;
72     bool operator!=(const TConstantUnion &constant) const;
73     bool operator>(const TConstantUnion &constant) const;
74     bool operator<(const TConstantUnion &constant) const;
75     static TConstantUnion add(const TConstantUnion &lhs,
76                               const TConstantUnion &rhs,
77                               TDiagnostics *diag,
78                               const TSourceLoc &line);
79     static TConstantUnion sub(const TConstantUnion &lhs,
80                               const TConstantUnion &rhs,
81                               TDiagnostics *diag,
82                               const TSourceLoc &line);
83     static TConstantUnion mul(const TConstantUnion &lhs,
84                               const TConstantUnion &rhs,
85                               TDiagnostics *diag,
86                               const TSourceLoc &line);
87     TConstantUnion operator%(const TConstantUnion &constant) const;
88     static TConstantUnion rshift(const TConstantUnion &lhs,
89                                  const TConstantUnion &rhs,
90                                  TDiagnostics *diag,
91                                  const TSourceLoc &line);
92     static TConstantUnion lshift(const TConstantUnion &lhs,
93                                  const TConstantUnion &rhs,
94                                  TDiagnostics *diag,
95                                  const TSourceLoc &line);
96     TConstantUnion operator&(const TConstantUnion &constant) const;
97     TConstantUnion operator|(const TConstantUnion &constant) const;
98     TConstantUnion operator^(const TConstantUnion &constant) const;
99     TConstantUnion operator&&(const TConstantUnion &constant) const;
100     TConstantUnion operator||(const TConstantUnion &constant) const;
101 
getType()102     TBasicType getType() const { return type; }
103   private:
104     union {
105         int iConst;           // used for ivec, scalar ints
106         unsigned int uConst;  // used for uvec, scalar uints
107         bool bConst;          // used for bvec, scalar bools
108         float fConst;         // used for vec, mat, scalar floats
109         TYuvCscStandardEXT yuvCscStandardEXTConst;
110     };
111 
112     TBasicType type;
113 };
114 
115 }  // namespace sh
116 
117 #endif  // COMPILER_TRANSLATOR_CONSTANTUNION_H_
118