// // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef _CONSTANT_UNION_INCLUDED_ #define _CONSTANT_UNION_INCLUDED_ #include class ConstantUnion { public: ConstantUnion() { iConst = 0; type = EbtVoid; } POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator) void setIConst(int i) {iConst = i; type = EbtInt; } void setFConst(float f) {fConst = f; type = EbtFloat; } void setBConst(bool b) {bConst = b; type = EbtBool; } int getIConst() { return iConst; } float getFConst() { return fConst; } bool getBConst() { return bConst; } int getIConst() const { return iConst; } float getFConst() const { return fConst; } bool getBConst() const { return bConst; } bool operator==(const int i) const { return i == iConst; } bool operator==(const float f) const { return f == fConst; } bool operator==(const bool b) const { return b == bConst; } bool operator==(const ConstantUnion& constant) const { if (constant.type != type) return false; switch (type) { case EbtInt: return constant.iConst == iConst; case EbtFloat: return constant.fConst == fConst; case EbtBool: return constant.bConst == bConst; default: return false; } } bool operator!=(const int i) const { return !operator==(i); } bool operator!=(const float f) const { return !operator==(f); } bool operator!=(const bool b) const { return !operator==(b); } bool operator!=(const ConstantUnion& constant) const { return !operator==(constant); } bool operator>(const ConstantUnion& constant) const { assert(type == constant.type); switch (type) { case EbtInt: return iConst > constant.iConst; case EbtFloat: return fConst > constant.fConst; default: return false; // Invalid operation, handled at semantic analysis } } bool operator<(const ConstantUnion& constant) const { assert(type == constant.type); switch (type) { case EbtInt: return iConst < constant.iConst; case EbtFloat: return fConst < constant.fConst; default: return false; // Invalid operation, handled at semantic analysis } } ConstantUnion operator+(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst + constant.iConst); break; case EbtFloat: returnValue.setFConst(fConst + constant.fConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator-(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst - constant.iConst); break; case EbtFloat: returnValue.setFConst(fConst - constant.fConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator*(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst * constant.iConst); break; case EbtFloat: returnValue.setFConst(fConst * constant.fConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator%(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst % constant.iConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator>>(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator<<(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst << constant.iConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator&(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst & constant.iConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator|(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst | constant.iConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator^(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator&&(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtBool: returnValue.setBConst(bConst && constant.bConst); break; default: assert(false && "Default missing"); } return returnValue; } ConstantUnion operator||(const ConstantUnion& constant) const { ConstantUnion returnValue; assert(type == constant.type); switch (type) { case EbtBool: returnValue.setBConst(bConst || constant.bConst); break; default: assert(false && "Default missing"); } return returnValue; } TBasicType getType() const { return type; } private: union { int iConst; // used for ivec, scalar ints bool bConst; // used for bvec, scalar bools float fConst; // used for vec, mat, scalar floats } ; TBasicType type; }; #endif // _CONSTANT_UNION_INCLUDED_