2 // Copyright (c) 2002-2010 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.
7 #ifndef _CONSTANT_UNION_INCLUDED_
8 #define _CONSTANT_UNION_INCLUDED_
15 POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
16 void setIConst(int i) {iConst = i; type = EbtInt; }
17 void setFConst(float f) {fConst = f; type = EbtFloat; }
18 void setBConst(bool b) {bConst = b; type = EbtBool; }
20 int getIConst() { return iConst; }
21 float getFConst() { return fConst; }
22 bool getBConst() { return bConst; }
23 int getIConst() const { return iConst; }
24 float getFConst() const { return fConst; }
25 bool getBConst() const { return bConst; }
27 bool operator==(const int i) const
32 bool operator==(const float f) const
37 bool operator==(const bool b) const
42 bool operator==(const ConstantUnion& constant) const
44 if (constant.type != type)
49 return constant.iConst == iConst;
51 return constant.fConst == fConst;
53 return constant.bConst == bConst;
61 bool operator!=(const int i) const
63 return !operator==(i);
66 bool operator!=(const float f) const
68 return !operator==(f);
71 bool operator!=(const bool b) const
73 return !operator==(b);
76 bool operator!=(const ConstantUnion& constant) const
78 return !operator==(constant);
81 bool operator>(const ConstantUnion& constant) const
83 assert(type == constant.type);
86 return iConst > constant.iConst;
88 return fConst > constant.fConst;
90 return false; // Invalid operation, handled at semantic analysis
96 bool operator<(const ConstantUnion& constant) const
98 assert(type == constant.type);
101 return iConst < constant.iConst;
103 return fConst < constant.fConst;
105 return false; // Invalid operation, handled at semantic analysis
111 ConstantUnion operator+(const ConstantUnion& constant) const
113 ConstantUnion returnValue;
114 assert(type == constant.type);
116 case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
117 case EbtFloat: returnValue.setFConst(fConst + constant.fConst); break;
118 default: assert(false && "Default missing");
124 ConstantUnion operator-(const ConstantUnion& constant) const
126 ConstantUnion returnValue;
127 assert(type == constant.type);
129 case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
130 case EbtFloat: returnValue.setFConst(fConst - constant.fConst); break;
131 default: assert(false && "Default missing");
137 ConstantUnion operator*(const ConstantUnion& constant) const
139 ConstantUnion returnValue;
140 assert(type == constant.type);
142 case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
143 case EbtFloat: returnValue.setFConst(fConst * constant.fConst); break;
144 default: assert(false && "Default missing");
150 ConstantUnion operator%(const ConstantUnion& constant) const
152 ConstantUnion returnValue;
153 assert(type == constant.type);
155 case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
156 default: assert(false && "Default missing");
162 ConstantUnion operator>>(const ConstantUnion& constant) const
164 ConstantUnion returnValue;
165 assert(type == constant.type);
167 case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break;
168 default: assert(false && "Default missing");
174 ConstantUnion operator<<(const ConstantUnion& constant) const
176 ConstantUnion returnValue;
177 assert(type == constant.type);
179 case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
180 default: assert(false && "Default missing");
186 ConstantUnion operator&(const ConstantUnion& constant) const
188 ConstantUnion returnValue;
189 assert(type == constant.type);
191 case EbtInt: returnValue.setIConst(iConst & constant.iConst); break;
192 default: assert(false && "Default missing");
198 ConstantUnion operator|(const ConstantUnion& constant) const
200 ConstantUnion returnValue;
201 assert(type == constant.type);
203 case EbtInt: returnValue.setIConst(iConst | constant.iConst); break;
204 default: assert(false && "Default missing");
210 ConstantUnion operator^(const ConstantUnion& constant) const
212 ConstantUnion returnValue;
213 assert(type == constant.type);
215 case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break;
216 default: assert(false && "Default missing");
222 ConstantUnion operator&&(const ConstantUnion& constant) const
224 ConstantUnion returnValue;
225 assert(type == constant.type);
227 case EbtBool: returnValue.setBConst(bConst && constant.bConst); break;
228 default: assert(false && "Default missing");
234 ConstantUnion operator||(const ConstantUnion& constant) const
236 ConstantUnion returnValue;
237 assert(type == constant.type);
239 case EbtBool: returnValue.setBConst(bConst || constant.bConst); break;
240 default: assert(false && "Default missing");
246 TBasicType getType() const { return type; }
250 int iConst; // used for ivec, scalar ints
251 bool bConst; // used for bvec, scalar bools
252 float fConst; // used for vec, mat, scalar floats
258 #endif // _CONSTANT_UNION_INCLUDED_