better Mask.setval(BitVector) implementation
authoradam <adam@megacz.com>
Mon, 3 Nov 2008 09:24:30 +0000 (10:24 +0100)
committeradam <adam@megacz.com>
Mon, 3 Nov 2008 09:24:30 +0000 (10:24 +0100)
src/edu/berkeley/fleet/util/Mask.java

index 6aadf39..c342354 100644 (file)
@@ -58,13 +58,15 @@ public class Mask {
         return (in & valmask) >>> valmaskmin;
     }
     public long setval(long in, BitVector targ) {
-        long ret = 0;
-        for(int i=0; i<targ.length(); i++)
-            if (targ.get(i))
+        long ret = in;
+        if (targ.length() != (1+valmaskmax-valmaskmin))
+            throw new RuntimeException("size mismatch trying to do "+this+".setval("+targ+")");
+        for(int i=valmaskmin; i<=valmaskmax; i++)
+            if (targ.get(i-valmaskmin))
                 ret |= (1L << i);
-        if (targ.get(targ.length()-1))
-            ret |= (-1L << targ.length());
-        return setval(in, ret);
+            else
+                ret &= ~(1L << i);
+        return ret;
     }
     public long setval(long in, long targ) {
         if (((targ << valmaskmin) & ~valmask) != 0) throw new RuntimeException("setval() with argument bigger than mask field");