blob: b3355cd657c56c03cb24517468d042b3d783fc40 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
shannon.woods%transgaming.com@gtempaccount.comc0d0c222013-04-13 03:29:36 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// 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 _CONSTANT_UNION_INCLUDED_
8#define _CONSTANT_UNION_INCLUDED_
9
alokp@chromium.org4e4facd2010-06-02 15:21:22 +000010#include <assert.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +000012class ConstantUnion {
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000013public:
apatrick@chromium.orga1d80592012-01-25 21:52:10 +000014 ConstantUnion()
15 {
16 iConst = 0;
shannon.woods%transgaming.com@gtempaccount.comc0d0c222013-04-13 03:29:36 +000017 type = EbtVoid;
apatrick@chromium.orga1d80592012-01-25 21:52:10 +000018 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000019
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +000020 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000021 void setIConst(int i) {iConst = i; type = EbtInt; }
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +000022 void setUConst(unsigned int u) { uConst = u; type = EbtUInt; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000023 void setFConst(float f) {fConst = f; type = EbtFloat; }
24 void setBConst(bool b) {bConst = b; type = EbtBool; }
25
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000026 int getIConst() const { return iConst; }
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +000027 int getUConst() const { return uConst; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000028 float getFConst() const { return fConst; }
29 bool getBConst() const { return bConst; }
30
31 bool operator==(const int i) const
32 {
daniel@transgaming.come90a0d52011-02-18 02:52:06 +000033 return i == iConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000034 }
35
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +000036 bool operator==(const unsigned int u) const
37 {
38 return u == uConst;
39 }
40
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000041 bool operator==(const float f) const
42 {
daniel@transgaming.come90a0d52011-02-18 02:52:06 +000043 return f == fConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000044 }
45
46 bool operator==(const bool b) const
47 {
daniel@transgaming.come90a0d52011-02-18 02:52:06 +000048 return b == bConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000049 }
50
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +000051 bool operator==(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000052 {
53 if (constant.type != type)
54 return false;
55
56 switch (type) {
57 case EbtInt:
daniel@transgaming.come90a0d52011-02-18 02:52:06 +000058 return constant.iConst == iConst;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +000059 case EbtUInt:
60 return constant.uConst == uConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000061 case EbtFloat:
daniel@transgaming.come90a0d52011-02-18 02:52:06 +000062 return constant.fConst == fConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000063 case EbtBool:
daniel@transgaming.come90a0d52011-02-18 02:52:06 +000064 return constant.bConst == bConst;
daniel@transgaming.comcd3a1b92011-03-15 18:23:46 +000065 default:
66 return false;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000067 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000068 }
69
70 bool operator!=(const int i) const
71 {
72 return !operator==(i);
73 }
74
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +000075 bool operator!=(const unsigned int u) const
76 {
77 return !operator==(u);
78 }
79
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000080 bool operator!=(const float f) const
81 {
82 return !operator==(f);
83 }
84
85 bool operator!=(const bool b) const
86 {
87 return !operator==(b);
88 }
89
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +000090 bool operator!=(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000091 {
92 return !operator==(constant);
93 }
94
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +000095 bool operator>(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000096 {
97 assert(type == constant.type);
98 switch (type) {
99 case EbtInt:
daniel@transgaming.comb31f35a2011-02-11 13:19:35 +0000100 return iConst > constant.iConst;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000101 case EbtUInt:
102 return uConst > constant.uConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000103 case EbtFloat:
daniel@transgaming.comb31f35a2011-02-11 13:19:35 +0000104 return fConst > constant.fConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000105 default:
daniel@transgaming.comb31f35a2011-02-11 13:19:35 +0000106 return false; // Invalid operation, handled at semantic analysis
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000107 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000108 }
109
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000110 bool operator<(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000111 {
112 assert(type == constant.type);
113 switch (type) {
114 case EbtInt:
daniel@transgaming.comb31f35a2011-02-11 13:19:35 +0000115 return iConst < constant.iConst;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000116 case EbtUInt:
117 return uConst < constant.uConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000118 case EbtFloat:
daniel@transgaming.comb31f35a2011-02-11 13:19:35 +0000119 return fConst < constant.fConst;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000120 default:
daniel@transgaming.comb31f35a2011-02-11 13:19:35 +0000121 return false; // Invalid operation, handled at semantic analysis
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000122 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000123 }
124
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000125 ConstantUnion operator+(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000126 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000127 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000128 assert(type == constant.type);
129 switch (type) {
130 case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000131 case EbtUInt: returnValue.setUConst(uConst + constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000132 case EbtFloat: returnValue.setFConst(fConst + constant.fConst); break;
133 default: assert(false && "Default missing");
134 }
135
136 return returnValue;
137 }
138
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000139 ConstantUnion operator-(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000140 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000141 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000142 assert(type == constant.type);
143 switch (type) {
144 case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000145 case EbtUInt: returnValue.setUConst(uConst - constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000146 case EbtFloat: returnValue.setFConst(fConst - constant.fConst); break;
147 default: assert(false && "Default missing");
148 }
149
150 return returnValue;
151 }
152
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000153 ConstantUnion operator*(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000154 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000155 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000156 assert(type == constant.type);
157 switch (type) {
158 case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000159 case EbtUInt: returnValue.setUConst(uConst * constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000160 case EbtFloat: returnValue.setFConst(fConst * constant.fConst); break;
161 default: assert(false && "Default missing");
162 }
163
164 return returnValue;
165 }
166
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000167 ConstantUnion operator%(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000168 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000169 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000170 assert(type == constant.type);
171 switch (type) {
172 case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000173 case EbtUInt: returnValue.setUConst(uConst % constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000174 default: assert(false && "Default missing");
175 }
176
177 return returnValue;
178 }
179
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000180 ConstantUnion operator>>(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000181 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000182 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000183 assert(type == constant.type);
184 switch (type) {
185 case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000186 case EbtUInt: returnValue.setUConst(uConst >> constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000187 default: assert(false && "Default missing");
188 }
189
190 return returnValue;
191 }
192
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000193 ConstantUnion operator<<(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000194 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000195 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000196 assert(type == constant.type);
197 switch (type) {
198 case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000199 case EbtUInt: returnValue.setUConst(uConst << constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000200 default: assert(false && "Default missing");
201 }
202
203 return returnValue;
204 }
205
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000206 ConstantUnion operator&(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000207 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000208 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000209 assert(type == constant.type);
210 switch (type) {
211 case EbtInt: returnValue.setIConst(iConst & constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000212 case EbtUInt: returnValue.setUConst(uConst & constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000213 default: assert(false && "Default missing");
214 }
215
216 return returnValue;
217 }
218
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000219 ConstantUnion operator|(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000220 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000221 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000222 assert(type == constant.type);
223 switch (type) {
224 case EbtInt: returnValue.setIConst(iConst | constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000225 case EbtUInt: returnValue.setUConst(uConst | constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000226 default: assert(false && "Default missing");
227 }
228
229 return returnValue;
230 }
231
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000232 ConstantUnion operator^(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000233 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000234 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000235 assert(type == constant.type);
236 switch (type) {
237 case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break;
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000238 case EbtUInt: returnValue.setUConst(uConst ^ constant.uConst); break;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000239 default: assert(false && "Default missing");
240 }
241
242 return returnValue;
243 }
244
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000245 ConstantUnion operator&&(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000246 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000247 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000248 assert(type == constant.type);
249 switch (type) {
250 case EbtBool: returnValue.setBConst(bConst && constant.bConst); break;
251 default: assert(false && "Default missing");
252 }
253
254 return returnValue;
255 }
256
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000257 ConstantUnion operator||(const ConstantUnion& constant) const
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000258 {
alokp@chromium.org6ff56fd2010-05-05 16:37:50 +0000259 ConstantUnion returnValue;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000260 assert(type == constant.type);
261 switch (type) {
262 case EbtBool: returnValue.setBConst(bConst || constant.bConst); break;
263 default: assert(false && "Default missing");
264 }
265
266 return returnValue;
267 }
268
alokp@chromium.org76b82082010-03-24 17:59:39 +0000269 TBasicType getType() const { return type; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000270private:
271
272 union {
273 int iConst; // used for ivec, scalar ints
shannonwoods@chromium.org3c9d95a2013-05-30 00:19:46 +0000274 unsigned int uConst; // used for uvec, scalar uints
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000275 bool bConst; // used for bvec, scalar bools
276 float fConst; // used for vec, mat, scalar floats
277 } ;
278
279 TBasicType type;
280};
281
282#endif // _CONSTANT_UNION_INCLUDED_