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