Add unsigned integer types to the compiler ConstantUnion class.

TRAC #23080

Signed-off-by: Nicolas Capens
Signed-off-by: Shannon Woods
Author: Jamie Madill

git-svn-id: https://angleproject.googlecode.com/svn/branches/es3proto@2401 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/ConstantUnion.h b/src/compiler/ConstantUnion.h
index 32af4d3..b3355cd 100644
--- a/src/compiler/ConstantUnion.h
+++ b/src/compiler/ConstantUnion.h
@@ -17,15 +17,14 @@
         type = EbtVoid;
     }
 
-    POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)        
+    POOL_ALLOCATOR_NEW_DELETE(GlobalPoolAllocator)
     void setIConst(int i) {iConst = i; type = EbtInt; }
+    void setUConst(unsigned int u) { uConst = u; type = EbtUInt; }
     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; }
+    int getUConst() const { return uConst; }
     float getFConst() const { return fConst; }
     bool getBConst() const { return bConst; }
 
@@ -34,6 +33,11 @@
         return i == iConst;
     }
 
+    bool operator==(const unsigned int u) const
+    {
+        return u == uConst;
+    }
+
     bool operator==(const float f) const
     {
         return f == fConst;
@@ -52,6 +56,8 @@
         switch (type) {
         case EbtInt:
             return constant.iConst == iConst;
+        case EbtUInt:
+            return constant.uConst == uConst;
         case EbtFloat:
             return constant.fConst == fConst;
         case EbtBool:
@@ -66,6 +72,11 @@
         return !operator==(i);
     }
 
+    bool operator!=(const unsigned int u) const
+    {
+        return !operator==(u);
+    }
+
     bool operator!=(const float f) const
     {
         return !operator==(f);
@@ -87,6 +98,8 @@
         switch (type) {
         case EbtInt:
             return iConst > constant.iConst;
+        case EbtUInt:
+            return uConst > constant.uConst;
         case EbtFloat:
             return fConst > constant.fConst;
         default:
@@ -100,6 +113,8 @@
         switch (type) {
         case EbtInt:
             return iConst < constant.iConst;
+        case EbtUInt:
+            return uConst < constant.uConst;
         case EbtFloat:
             return fConst < constant.fConst;
         default:
@@ -113,6 +128,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
+        case EbtUInt: returnValue.setUConst(uConst + constant.uConst); break;
         case EbtFloat: returnValue.setFConst(fConst + constant.fConst); break;
         default: assert(false && "Default missing");
         }
@@ -126,6 +142,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
+        case EbtUInt: returnValue.setUConst(uConst - constant.uConst); break;
         case EbtFloat: returnValue.setFConst(fConst - constant.fConst); break;
         default: assert(false && "Default missing");
         }
@@ -139,6 +156,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
+        case EbtUInt: returnValue.setUConst(uConst * constant.uConst); break;
         case EbtFloat: returnValue.setFConst(fConst * constant.fConst); break; 
         default: assert(false && "Default missing");
         }
@@ -152,6 +170,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
+        case EbtUInt: returnValue.setUConst(uConst % constant.uConst); break;
         default:     assert(false && "Default missing");
         }
 
@@ -164,6 +183,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break;
+        case EbtUInt: returnValue.setUConst(uConst >> constant.uConst); break;
         default:     assert(false && "Default missing");
         }
 
@@ -176,6 +196,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
+        case EbtUInt: returnValue.setUConst(uConst << constant.uConst); break;
         default:     assert(false && "Default missing");
         }
 
@@ -188,6 +209,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt:  returnValue.setIConst(iConst & constant.iConst); break;
+        case EbtUInt:  returnValue.setUConst(uConst & constant.uConst); break;
         default:     assert(false && "Default missing");
         }
 
@@ -200,6 +222,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt:  returnValue.setIConst(iConst | constant.iConst); break;
+        case EbtUInt:  returnValue.setUConst(uConst | constant.uConst); break;
         default:     assert(false && "Default missing");
         }
 
@@ -212,6 +235,7 @@
         assert(type == constant.type);
         switch (type) {
         case EbtInt:  returnValue.setIConst(iConst ^ constant.iConst); break;
+        case EbtUInt:  returnValue.setUConst(uConst ^ constant.uConst); break;
         default:     assert(false && "Default missing");
         }
 
@@ -247,6 +271,7 @@
 
     union  {
         int iConst;  // used for ivec, scalar ints
+        unsigned int uConst; // used for uvec, scalar uints
         bool bConst; // used for bvec, scalar bools
         float fConst;   // used for vec, mat, scalar floats
     } ;