/*******************************************************************************
* Copyright (c) 2002 - 2006 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package com.ibm.wala.fixpoint;
import com.ibm.wala.util.intset.BitVector;
import com.ibm.wala.util.intset.BitVectorIntSet;
import com.ibm.wala.util.intset.IntSet;
import com.ibm.wala.util.intset.MutableSharedBitVectorIntSet;
/**
* A bit vector variable for dataflow analysis.
*/
public class BitVectorVariable extends AbstractVariable<BitVectorVariable> {
private MutableSharedBitVectorIntSet V;
public BitVectorVariable() {
}
/*
* @see com.ibm.wala.fixpoint.IVariable#copyState(com.ibm.wala.fixpoint.IVariable)
*/
@Override
public void copyState(BitVectorVariable other) {
if (other == null) {
throw new IllegalArgumentException("null other");
}
if (V == null) {
if (other.V == null) {
return;
} else {
V = new MutableSharedBitVectorIntSet(other.V);
return;
}
}
if (other.V != null) {
V.copySet(other.V);
} else {
V = null;
}
}
/**
* Add all the bits in B to this bit vector
*/
public void addAll(BitVector B) {
if (B == null) {
throw new IllegalArgumentException("null B");
}
if (V == null) {
V = new MutableSharedBitVectorIntSet(new BitVectorIntSet(B));
return;
} else {
V.addAll(new BitVectorIntSet(B));
}
}
/**
* Add all the bits from other to this bit vector
*/
public void addAll(BitVectorVariable other) {
if (other == null) {
throw new IllegalArgumentException("null other");
}
if (V == null) {
copyState(other);
} else {
if (other.V != null) {
V.addAll(other.V);
}
}
}
/**
* Does this variable have the same value as another?
*/
public boolean sameValue(BitVectorVariable other) {
if (other == null) {
throw new IllegalArgumentException("null other");
}
if (V == null) {
return (other.V == null);
} else {
if (other.V == null) {
return false;
} else {
return V.sameValue(other.V);
}
}
}
@Override
public String toString() {
if (V == null) {
return "[Empty]";
}
return V.toString();
}
/**
* Set a particular bit
* @param b the bit to set
*/
public void set(int b) {
if (b < 0) {
throw new IllegalArgumentException("illegal b: " + b);
}
if (V == null) {
V = new MutableSharedBitVectorIntSet();
}
V.add(b);
}
/**
* Is a particular bit set?
* @param b the bit to check
*/
public boolean get(int b) {
if (V == null) {
return false;
} else {
return V.contains(b);
}
}
/**
* @return the value of this variable as a bit vector ... null if the
* bit vector is empty.
*/
public IntSet getValue() {
return V;
}
public void clear(int i) {
if (V != null) {
V.remove(i);
}
}
@Override
public boolean equals(Object obj) {
return this == obj;
}
public int populationCount() {
if (V == null) {
return 0;
} else {
return V.size();
}
}
}