git-svn-id: https://wala.svn.sourceforge.net/svnroot/wala/trunk@954 f5eafffb-2e1d-0410-98e4-8ec43c5233c4
This commit is contained in:
sjfink 2007-04-13 19:34:57 +00:00
parent 7dc2cde09a
commit fc661c9a01
2 changed files with 76 additions and 80 deletions

View File

@ -14,17 +14,18 @@ import java.io.Serializable;
/**
* @author sfink
* @author Julian Dolby (dolby@us.ibm.com)
* @author Julian Dolby (dolby@us.ibm.com)
*/
abstract public class BitVectorBase<T extends BitVectorBase>
implements Cloneable, Serializable
{
abstract public class BitVectorBase<T extends BitVectorBase> implements Cloneable, Serializable {
protected final static boolean DEBUG = false;
protected final static int LOG_BITS_PER_UNIT = 5;
protected final static int BITS_PER_UNIT = 32;
protected final static int MASK = 0xffffffff;
protected final static int LOW_MASK = 0x1f;
protected int bits[];
@ -67,7 +68,6 @@ abstract public class BitVectorBase<T extends BitVectorBase>
}
}
/**
* Gets the hashcode.
*/
@ -153,16 +153,18 @@ abstract public class BitVectorBase<T extends BitVectorBase>
{ 0xFFFF0000 },
{ 0xFF000000, 0x0000FF00 },
{ 0xF0000000, 0x00F00000, 0x0000F000, 0x000000F0 },
{ 0xC0000000, 0x0C000000, 0x00C00000, 0x000C0000, 0x0000C000, 0x00000C00, 0x000000C0, 0x0000000C},
{ 0x80000000, 0x20000000, 0x08000000, 0x02000000, 0x00800000, 0x00200000, 0x00080000, 0x00020000, 0x00008000, 0x00002000, 0x00000800, 0x00000200, 0x00000080, 0x00000020, 0x00000008, 0x00000002 }
};
{ 0xC0000000, 0x0C000000, 0x00C00000, 0x000C0000, 0x0000C000, 0x00000C00, 0x000000C0, 0x0000000C },
{ 0x80000000, 0x20000000, 0x08000000, 0x02000000, 0x00800000, 0x00200000, 0x00080000, 0x00020000, 0x00008000, 0x00002000,
0x00000800, 0x00000200, 0x00000080, 0x00000020, 0x00000008, 0x00000002 } };
public int max() {
int lastWord = bits.length - 1;
while (lastWord >= 0 && bits[lastWord] == 0) lastWord--;
while (lastWord >= 0 && bits[lastWord] == 0)
lastWord--;
if (lastWord < 0) return -1;
if (lastWord < 0)
return -1;
int count = lastWord * BITS_PER_UNIT;
@ -178,7 +180,7 @@ abstract public class BitVectorBase<T extends BitVectorBase>
}
}
return count + (31-j);
return count + (31 - j);
}
/**
@ -197,7 +199,7 @@ abstract public class BitVectorBase<T extends BitVectorBase>
start++;
} while (bit != 0);
} else {
start += (BITS_PER_UNIT - (start&LOW_MASK));
start += (BITS_PER_UNIT - (start & LOW_MASK));
}
word++;

View File

@ -14,17 +14,14 @@ import com.ibm.wala.util.debug.Assertions;
/**
* @author Julian Dolby (dolby@us.ibm.com)
*
*
*/
public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
int offset;
private int wordDiff(int offset1, int offset2) {
return
(offset1>offset2)?
(offset1-offset2)>>LOG_BITS_PER_UNIT:
- ((offset2-offset1)>>LOG_BITS_PER_UNIT);
return (offset1 > offset2) ? (offset1 - offset2) >> LOG_BITS_PER_UNIT : -((offset2 - offset1) >> LOG_BITS_PER_UNIT);
}
/**
@ -36,7 +33,7 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
int[] oldbits = bits;
bits = new int[subscript(newCapacity) + 1];
for (int i = 0; i < oldbits.length; i++) {
bits[i-wordDiff] = oldbits[i];
bits[i - wordDiff] = oldbits[i];
}
offset = newOffset;
}
@ -45,17 +42,17 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
* @param set
*/
private void ensureCapacity(int newOffset, int newCapacity) {
if (newOffset < offset || newCapacity>(bits.length<< LOG_BITS_PER_UNIT)) {
if (newOffset < offset || newCapacity > (bits.length << LOG_BITS_PER_UNIT)) {
expand(newOffset, newCapacity);
}
}
// private void ensureCapacity(OffsetBitVector set) {
// int newOffset = Math.min(offset, set.offset);
// int newCapacity =
// Math.max(length(),set.length())-newOffset;
// ensureCapacity(newOffset, newCapacity);
// }
// private void ensureCapacity(OffsetBitVector set) {
// int newOffset = Math.min(offset, set.offset);
// int newCapacity =
// Math.max(length(),set.length())-newOffset;
// ensureCapacity(newOffset, newCapacity);
// }
public OffsetBitVector() {
this(0, 1);
@ -68,7 +65,7 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
* the size of the string
*/
public OffsetBitVector(int offset, int nbits) {
offset = (offset&~LOW_MASK);
offset = (offset & ~LOW_MASK);
this.offset = offset;
this.bits = new int[subscript(nbits) + 1];
}
@ -90,7 +87,7 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
}
void growCapacity(float fraction) {
expand(offset, (int) (fraction*(bits.length<<LOG_BITS_PER_UNIT)));
expand(offset, (int) (fraction * (bits.length << LOG_BITS_PER_UNIT)));
}
public int getOffset() {
@ -111,16 +108,16 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
int shiftBits;
int subscript;
if (bit < offset) {
int newOffset = bit&~LOW_MASK;
expand(newOffset, length()-1-newOffset);
int newOffset = bit & ~LOW_MASK;
expand(newOffset, length() - 1 - newOffset);
shiftBits = bit & LOW_MASK;
subscript = 0;
} else {
bit -= offset;
bit -= offset;
shiftBits = bit & LOW_MASK;
subscript = subscript(bit);
if (subscript >= bits.length) {
expand(offset, bit);
expand(offset, bit);
}
}
@ -180,8 +177,8 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
* @return min j >= start s.t get(j)
*/
public int nextSetBit(int start) {
int nb = super.nextSetBit(Math.max(0, start-offset));
return nb == -1? -1: offset + nb;
int nb = super.nextSetBit(Math.max(0, start - offset));
return nb == -1 ? -1 : offset + nb;
}
/**
@ -189,7 +186,7 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
*/
public final void not() {
if (offset != 0) {
expand(0, offset+length()-1);
expand(0, offset + length() - 1);
}
for (int i = 0; i < bits.length; i++) {
bits[i] ^= MASK;
@ -212,7 +209,7 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
* Sets all bits.
*/
public final void setAll() {
expand(0, length()-1);
expand(0, length() - 1);
for (int i = 0; i < bits.length; i++) {
bits[i] = MASK;
}
@ -248,13 +245,13 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
}
int wordDiff = wordDiff(offset, set.offset);
int maxWord = Math.min(bits.length, set.bits.length-wordDiff);
int maxWord = Math.min(bits.length, set.bits.length - wordDiff);
int i = Math.max(0, -wordDiff);
for ( ; i < maxWord; i++) {
if ((bits[i] & set.bits[i+wordDiff]) != 0) {
return false;
for (; i < maxWord; i++) {
if ((bits[i] & set.bits[i + wordDiff]) != 0) {
return false;
}
}
@ -274,73 +271,72 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
}
int wordDiff = wordDiff(offset, set.offset);
int maxWord = Math.min(bits.length, set.bits.length-wordDiff);
int maxWord = Math.min(bits.length, set.bits.length - wordDiff);
int i = 0;
if (wordDiff < 0) {
for ( ; i < -wordDiff; i++) {
if (bits[i] != 0) {
return false;
}
for (; i < -wordDiff; i++) {
if (bits[i] != 0) {
return false;
}
}
} else {
for(int j = 0; j < wordDiff; j++) {
if (set.bits[j] != 0) {
return false;
}
for (int j = 0; j < wordDiff; j++) {
if (set.bits[j] != 0) {
return false;
}
}
}
for ( ; i < maxWord; i++) {
if (bits[i] != set.bits[i+wordDiff]) {
return false;
for (; i < maxWord; i++) {
if (bits[i] != set.bits[i + wordDiff]) {
return false;
}
}
for(int j = maxWord+wordDiff; j < set.bits.length; j++) {
for (int j = maxWord + wordDiff; j < set.bits.length; j++) {
if (set.bits[j] != 0) {
return false;
return false;
}
}
for ( ; i < bits.length; i++) {
for (; i < bits.length; i++) {
if (bits[i] != 0) {
return false;
}
return false;
}
}
return true;
}
/*
* @param other
* @return true iff this is a subset of other
* @param other @return true iff this is a subset of other
*/
public boolean isSubset(OffsetBitVector other) {
if (this == other) { // should help alias analysis
return true;
}
int wordDiff = wordDiff(offset, other.offset);
int maxWord = Math.min(bits.length, other.bits.length-wordDiff);
int maxWord = Math.min(bits.length, other.bits.length - wordDiff);
int i = 0;
for ( ; i < -wordDiff; i++) {
for (; i < -wordDiff; i++) {
if (bits[i] != 0) {
return false;
}
}
for ( ; i < maxWord; i++) {
if ((bits[i] & ~other.bits[i+wordDiff]) != 0) {
for (; i < maxWord; i++) {
if ((bits[i] & ~other.bits[i + wordDiff]) != 0) {
return false;
}
}
for ( ; i < bits.length; i++) {
for (; i < bits.length; i++) {
if (bits[i] != 0) {
return false;
return false;
}
}
@ -370,21 +366,21 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
}
int wordDiff = wordDiff(offset, set.offset);
int maxWord = Math.min(bits.length, set.bits.length-wordDiff);
int maxWord = Math.min(bits.length, set.bits.length - wordDiff);
int i = 0;
for ( ; i < -wordDiff; i++) {
for (; i < -wordDiff; i++) {
bits[i] = 0;
}
for ( ; i < maxWord; i++) {
bits[i] &= set.bits[i+wordDiff];
for (; i < maxWord; i++) {
bits[i] &= set.bits[i + wordDiff];
}
for ( ; i < bits.length; i++) {
for (; i < bits.length; i++) {
bits[i] = 0;
}
}
}
/**
@ -399,14 +395,13 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
}
int newOffset = Math.min(offset, set.offset);
int newCapacity =
Math.max(length(),set.length())-newOffset;
int newCapacity = Math.max(length(), set.length()) - newOffset;
ensureCapacity(newOffset, newCapacity);
int wordDiff = wordDiff(newOffset, set.offset);
for (int i = 0; i < set.bits.length; i++) {
bits[i-wordDiff] |= set.bits[i];
bits[i - wordDiff] |= set.bits[i];
}
}
@ -423,14 +418,13 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
}
int newOffset = Math.min(offset, set.offset);
int newCapacity =
Math.max(length(),set.length())-newOffset;
int newCapacity = Math.max(length(), set.length()) - newOffset;
ensureCapacity(newOffset, newCapacity);
int wordDiff = wordDiff(newOffset, set.offset);
for (int i = 0; i < set.bits.length; i++) {
bits[i-wordDiff] ^= set.bits[i];
bits[i - wordDiff] ^= set.bits[i];
}
}
@ -444,15 +438,15 @@ public final class OffsetBitVector extends BitVectorBase<OffsetBitVector> {
}
int wordDiff = wordDiff(offset, set.offset);
int maxWord = Math.min(bits.length, set.bits.length-wordDiff);
int maxWord = Math.min(bits.length, set.bits.length - wordDiff);
int i = Math.max(0, -wordDiff);
for ( ; i < maxWord; i++) {
bits[i] &= ~set.bits[i+wordDiff];
for (; i < maxWord; i++) {
bits[i] &= ~set.bits[i + wordDiff];
}
}
/**
* Return the NOT of a bit string
*/