/*
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
* Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package proguard.evaluation.value;
import proguard.classfile.ClassConstants;
/**
* This class represents a partially evaluated integer value.
*
* @author Eric Lafortune
*/
public abstract class IntegerValue extends Category1Value
{
/**
* Returns the specific integer value, if applicable.
*/
public int value()
{
return 0;
}
// Basic unary methods.
/**
* Returns the negated value of this IntegerValue.
*/
public abstract IntegerValue negate();
/**
* Converts this IntegerValue to a byte IntegerValue.
*/
public abstract IntegerValue convertToByte();
/**
* Converts this IntegerValue to a character IntegerValue.
*/
public abstract IntegerValue convertToCharacter();
/**
* Converts this IntegerValue to a short IntegerValue.
*/
public abstract IntegerValue convertToShort();
/**
* Converts this IntegerValue to a LongValue.
*/
public abstract LongValue convertToLong();
/**
* Converts this IntegerValue to a FloatValue.
*/
public abstract FloatValue convertToFloat();
/**
* Converts this IntegerValue to a DoubleValue.
*/
public abstract DoubleValue convertToDouble();
// Basic binary methods.
/**
* Returns the generalization of this IntegerValue and the given other
* IntegerValue.
*/
public abstract IntegerValue generalize(IntegerValue other);
/**
* Returns the sum of this IntegerValue and the given IntegerValue.
*/
public abstract IntegerValue add(IntegerValue other);
/**
* Returns the difference of this IntegerValue and the given IntegerValue.
*/
public abstract IntegerValue subtract(IntegerValue other);
/**
* Returns the difference of the given IntegerValue and this IntegerValue.
*/
public abstract IntegerValue subtractFrom(IntegerValue other);
/**
* Returns the product of this IntegerValue and the given IntegerValue.
*/
public abstract IntegerValue multiply(IntegerValue other)
throws ArithmeticException;
/**
* Returns the quotient of this IntegerValue and the given IntegerValue.
*/
public abstract IntegerValue divide(IntegerValue other)
throws ArithmeticException;
/**
* Returns the quotient of the given IntegerValue and this IntegerValue.
*/
public abstract IntegerValue divideOf(IntegerValue other)
throws ArithmeticException;
/**
* Returns the remainder of this IntegerValue divided by the given
* IntegerValue.
*/
public abstract IntegerValue remainder(IntegerValue other)
throws ArithmeticException;
/**
* Returns the remainder of the given IntegerValue divided by this
* IntegerValue.
*/
public abstract IntegerValue remainderOf(IntegerValue other)
throws ArithmeticException;
/**
* Returns this IntegerValue, shifted left by the given IntegerValue.
*/
public abstract IntegerValue shiftLeft(IntegerValue other);
/**
* Returns this IntegerValue, shifted right by the given IntegerValue.
*/
public abstract IntegerValue shiftRight(IntegerValue other);
/**
* Returns this unsigned IntegerValue, shifted left by the given
* IntegerValue.
*/
public abstract IntegerValue unsignedShiftRight(IntegerValue other);
/**
* Returns the given IntegerValue, shifted left by this IntegerValue.
*/
public abstract IntegerValue shiftLeftOf(IntegerValue other);
/**
* Returns the given IntegerValue, shifted right by this IntegerValue.
*/
public abstract IntegerValue shiftRightOf(IntegerValue other);
/**
* Returns the given unsigned IntegerValue, shifted left by this
* IntegerValue.
*/
public abstract IntegerValue unsignedShiftRightOf(IntegerValue other);
/**
* Returns the given LongValue, shifted left by this IntegerValue.
*/
public abstract LongValue shiftLeftOf(LongValue other);
/**
* Returns the given LongValue, shifted right by this IntegerValue.
*/
public abstract LongValue shiftRightOf(LongValue other);
/**
* Returns the given unsigned LongValue, shifted right by this IntegerValue.
*/
public abstract LongValue unsignedShiftRightOf(LongValue other);
/**
* Returns the logical and of this IntegerValue and the given
* IntegerValue.
*/
public abstract IntegerValue and(IntegerValue other);
/**
* Returns the logical or of this IntegerValue and the given
* IntegerValue.
*/
public abstract IntegerValue or(IntegerValue other);
/**
* Returns the logical xor of this IntegerValue and the given
* IntegerValue.
*/
public abstract IntegerValue xor(IntegerValue other);
/**
* Returns whether this IntegerValue and the given IntegerValue are equal:
* NEVER
, MAYBE
, or ALWAYS
.
*/
public abstract int equal(IntegerValue other);
/**
* Returns whether this IntegerValue is less than the given IntegerValue:
* NEVER
, MAYBE
, or ALWAYS
.
*/
public abstract int lessThan(IntegerValue other);
/**
* Returns whether this IntegerValue is less than or equal to the given
* IntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public abstract int lessThanOrEqual(IntegerValue other);
// Derived binary methods.
/**
* Returns whether this IntegerValue and the given IntegerValue are different:
* NEVER
, MAYBE
, or ALWAYS
.
*/
public final int notEqual(IntegerValue other)
{
return -equal(other);
}
/**
* Returns whether this IntegerValue is greater than the given IntegerValue:
* NEVER
, MAYBE
, or ALWAYS
.
*/
public final int greaterThan(IntegerValue other)
{
return -lessThanOrEqual(other);
}
/**
* Returns whether this IntegerValue is greater than or equal to the given IntegerValue:
* NEVER
, MAYBE
, or ALWAYS
.
*/
public final int greaterThanOrEqual(IntegerValue other)
{
return -lessThan(other);
}
// Similar binary methods, but this time with unknown arguments.
/**
* Returns the generalization of this IntegerValue and the given other
* UnknownIntegerValue.
*/
public IntegerValue generalize(UnknownIntegerValue other)
{
return generalize((IntegerValue)other);
}
/**
* Returns the sum of this IntegerValue and the given UnknownIntegerValue.
*/
public IntegerValue add(UnknownIntegerValue other)
{
return add((IntegerValue)other);
}
/**
* Returns the difference of this IntegerValue and the given UnknownIntegerValue.
*/
public IntegerValue subtract(UnknownIntegerValue other)
{
return subtract((IntegerValue)other);
}
/**
* Returns the difference of the given UnknownIntegerValue and this IntegerValue.
*/
public IntegerValue subtractFrom(UnknownIntegerValue other)
{
return subtractFrom((IntegerValue)other);
}
/**
* Returns the product of this IntegerValue and the given UnknownIntegerValue.
*/
public IntegerValue multiply(UnknownIntegerValue other)
{
return multiply((IntegerValue)other);
}
/**
* Returns the quotient of this IntegerValue and the given
* UnknownIntegerValue.
*/
public IntegerValue divide(UnknownIntegerValue other)
{
return divide((IntegerValue)other);
}
/**
* Returns the quotient of the given UnknownIntegerValue and this
* IntegerValue.
*/
public IntegerValue divideOf(UnknownIntegerValue other)
{
return divideOf((IntegerValue)other);
}
/**
* Returns the remainder of this IntegerValue divided by the given
* UnknownIntegerValue.
*/
public IntegerValue remainder(UnknownIntegerValue other)
{
return remainder((IntegerValue)other);
}
/**
* Returns the remainder of the given UnknownIntegerValue divided by this
* IntegerValue.
*/
public IntegerValue remainderOf(UnknownIntegerValue other)
{
return remainderOf((IntegerValue)other);
}
/**
* Returns this IntegerValue, shifted left by the given UnknownIntegerValue.
*/
public IntegerValue shiftLeft(UnknownIntegerValue other)
{
return shiftLeft((IntegerValue)other);
}
/**
* Returns this IntegerValue, shifted right by the given UnknownIntegerValue.
*/
public IntegerValue shiftRight(UnknownIntegerValue other)
{
return shiftRight((IntegerValue)other);
}
/**
* Returns this unsigned IntegerValue, shifted right by the given
* UnknownIntegerValue.
*/
public IntegerValue unsignedShiftRight(UnknownIntegerValue other)
{
return unsignedShiftRight((IntegerValue)other);
}
/**
* Returns the given UnknownIntegerValue, shifted left by this IntegerValue.
*/
public IntegerValue shiftLeftOf(UnknownIntegerValue other)
{
return shiftLeftOf((IntegerValue)other);
}
/**
* Returns the given UnknownIntegerValue, shifted right by this IntegerValue.
*/
public IntegerValue shiftRightOf(UnknownIntegerValue other)
{
return shiftRightOf((IntegerValue)other);
}
/**
* Returns the given unsigned UnknownIntegerValue, shifted right by this
* IntegerValue.
*/
public IntegerValue unsignedShiftRightOf(UnknownIntegerValue other)
{
return unsignedShiftRightOf((IntegerValue)other);
}
/**
* Returns the given UnknownLongValue, shifted left by this IntegerValue.
*/
public LongValue shiftLeftOf(UnknownLongValue other)
{
return shiftLeftOf((LongValue)other);
}
/**
* Returns the given UnknownLongValue, shifted right by this IntegerValue.
*/
public LongValue shiftRightOf(UnknownLongValue other)
{
return shiftRightOf((LongValue)other);
}
/**
* Returns the given unsigned UnknownLongValue, shifted right by this
* IntegerValue.
*/
public LongValue unsignedShiftRightOf(UnknownLongValue other)
{
return unsignedShiftRightOf((LongValue)other);
}
/**
* Returns the logical and of this IntegerValue and the given
* UnknownIntegerValue.
*/
public IntegerValue and(UnknownIntegerValue other)
{
return and((IntegerValue)other);
}
/**
* Returns the logical or of this IntegerValue and the given
* UnknownIntegerValue.
*/
public IntegerValue or(UnknownIntegerValue other)
{
return or((IntegerValue)other);
}
/**
* Returns the logical xor of this IntegerValue and the given
* UnknownIntegerValue.
*/
public IntegerValue xor(UnknownIntegerValue other)
{
return xor((IntegerValue)other);
}
/**
* Returns whether this IntegerValue and the given UnknownIntegerValue are
* equal: NEVER
, MAYBE
, or ALWAYS
.
*/
public int equal(UnknownIntegerValue other)
{
return equal((IntegerValue)other);
}
/**
* Returns whether this IntegerValue is less than the given
* UnknownIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public int lessThan(UnknownIntegerValue other)
{
return lessThan((IntegerValue)other);
}
/**
* Returns whether this IntegerValue is less than or equal to the given
* UnknownIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public int lessThanOrEqual(UnknownIntegerValue other)
{
return lessThanOrEqual((IntegerValue)other);
}
// Derived binary methods.
/**
* Returns whether this IntegerValue and the given UnknownIntegerValue are
* different: NEVER
, MAYBE
, or ALWAYS
.
*/
public final int notEqual(UnknownIntegerValue other)
{
return -equal(other);
}
/**
* Returns whether this IntegerValue is greater than the given
* UnknownIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public final int greaterThan(UnknownIntegerValue other)
{
return -lessThanOrEqual(other);
}
/**
* Returns whether this IntegerValue is greater than or equal to the given
* UnknownIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public final int greaterThanOrEqual(UnknownIntegerValue other)
{
return -lessThan(other);
}
// Similar binary methods, but this time with specific arguments.
/**
* Returns the generalization of this IntegerValue and the given other
* SpecificIntegerValue.
*/
public IntegerValue generalize(SpecificIntegerValue other)
{
return generalize((IntegerValue)other);
}
/**
* Returns the sum of this IntegerValue and the given SpecificIntegerValue.
*/
public IntegerValue add(SpecificIntegerValue other)
{
return add((IntegerValue)other);
}
/**
* Returns the difference of this IntegerValue and the given SpecificIntegerValue.
*/
public IntegerValue subtract(SpecificIntegerValue other)
{
return subtract((IntegerValue)other);
}
/**
* Returns the difference of the given SpecificIntegerValue and this IntegerValue.
*/
public IntegerValue subtractFrom(SpecificIntegerValue other)
{
return subtractFrom((IntegerValue)other);
}
/**
* Returns the product of this IntegerValue and the given SpecificIntegerValue.
*/
public IntegerValue multiply(SpecificIntegerValue other)
{
return multiply((IntegerValue)other);
}
/**
* Returns the quotient of this IntegerValue and the given
* SpecificIntegerValue.
*/
public IntegerValue divide(SpecificIntegerValue other)
{
return divide((IntegerValue)other);
}
/**
* Returns the quotient of the given SpecificIntegerValue and this
* IntegerValue.
*/
public IntegerValue divideOf(SpecificIntegerValue other)
{
return divideOf((IntegerValue)other);
}
/**
* Returns the remainder of this IntegerValue divided by the given
* SpecificIntegerValue.
*/
public IntegerValue remainder(SpecificIntegerValue other)
{
return remainder((IntegerValue)other);
}
/**
* Returns the remainder of the given SpecificIntegerValue divided by this
* IntegerValue.
*/
public IntegerValue remainderOf(SpecificIntegerValue other)
{
return remainderOf((IntegerValue)other);
}
/**
* Returns this IntegerValue, shifted left by the given SpecificIntegerValue.
*/
public IntegerValue shiftLeft(SpecificIntegerValue other)
{
return shiftLeft((IntegerValue)other);
}
/**
* Returns this IntegerValue, shifted right by the given SpecificIntegerValue.
*/
public IntegerValue shiftRight(SpecificIntegerValue other)
{
return shiftRight((IntegerValue)other);
}
/**
* Returns this unsigned IntegerValue, shifted right by the given
* SpecificIntegerValue.
*/
public IntegerValue unsignedShiftRight(SpecificIntegerValue other)
{
return unsignedShiftRight((IntegerValue)other);
}
/**
* Returns the given SpecificIntegerValue, shifted left by this IntegerValue.
*/
public IntegerValue shiftLeftOf(SpecificIntegerValue other)
{
return shiftLeftOf((IntegerValue)other);
}
/**
* Returns the given SpecificIntegerValue, shifted right by this IntegerValue.
*/
public IntegerValue shiftRightOf(SpecificIntegerValue other)
{
return shiftRightOf((IntegerValue)other);
}
/**
* Returns the given unsigned SpecificIntegerValue, shifted right by this
* IntegerValue.
*/
public IntegerValue unsignedShiftRightOf(SpecificIntegerValue other)
{
return unsignedShiftRightOf((IntegerValue)other);
}
/**
* Returns the given SpecificLongValue, shifted left by this IntegerValue.
*/
public LongValue shiftLeftOf(SpecificLongValue other)
{
return shiftLeftOf((LongValue)other);
}
/**
* Returns the given SpecificLongValue, shifted right by this IntegerValue.
*/
public LongValue shiftRightOf(SpecificLongValue other)
{
return shiftRightOf((LongValue)other);
}
/**
* Returns the given unsigned SpecificLongValue, shifted right by this
* IntegerValue.
*/
public LongValue unsignedShiftRightOf(SpecificLongValue other)
{
return unsignedShiftRightOf((LongValue)other);
}
/**
* Returns the logical and of this IntegerValue and the given
* SpecificIntegerValue.
*/
public IntegerValue and(SpecificIntegerValue other)
{
return and((IntegerValue)other);
}
/**
* Returns the logical or of this IntegerValue and the given
* SpecificIntegerValue.
*/
public IntegerValue or(SpecificIntegerValue other)
{
return or((IntegerValue)other);
}
/**
* Returns the logical xor of this IntegerValue and the given
* SpecificIntegerValue.
*/
public IntegerValue xor(SpecificIntegerValue other)
{
return xor((IntegerValue)other);
}
/**
* Returns whether this IntegerValue and the given SpecificIntegerValue are
* equal: NEVER
, MAYBE
, or ALWAYS
.
*/
public int equal(SpecificIntegerValue other)
{
return equal((IntegerValue)other);
}
/**
* Returns whether this IntegerValue is less than the given
* SpecificIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public int lessThan(SpecificIntegerValue other)
{
return lessThan((IntegerValue)other);
}
/**
* Returns whether this IntegerValue is less than or equal to the given
* SpecificIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public int lessThanOrEqual(SpecificIntegerValue other)
{
return lessThanOrEqual((IntegerValue)other);
}
// Derived binary methods.
/**
* Returns whether this IntegerValue and the given SpecificIntegerValue are
* different: NEVER
, MAYBE
, or ALWAYS
.
*/
public final int notEqual(SpecificIntegerValue other)
{
return -equal(other);
}
/**
* Returns whether this IntegerValue is greater than the given
* SpecificIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public final int greaterThan(SpecificIntegerValue other)
{
return -lessThanOrEqual(other);
}
/**
* Returns whether this IntegerValue is greater than or equal to the given
* SpecificIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public final int greaterThanOrEqual(SpecificIntegerValue other)
{
return -lessThan(other);
}
// Similar binary methods, but this time with particular arguments.
/**
* Returns the generalization of this IntegerValue and the given other
* ParticularIntegerValue.
*/
public IntegerValue generalize(ParticularIntegerValue other)
{
return generalize((SpecificIntegerValue)other);
}
/**
* Returns the sum of this IntegerValue and the given ParticularIntegerValue.
*/
public IntegerValue add(ParticularIntegerValue other)
{
return add((SpecificIntegerValue)other);
}
/**
* Returns the difference of this IntegerValue and the given ParticularIntegerValue.
*/
public IntegerValue subtract(ParticularIntegerValue other)
{
return subtract((SpecificIntegerValue)other);
}
/**
* Returns the difference of the given ParticularIntegerValue and this IntegerValue.
*/
public IntegerValue subtractFrom(ParticularIntegerValue other)
{
return subtractFrom((SpecificIntegerValue)other);
}
/**
* Returns the product of this IntegerValue and the given ParticularIntegerValue.
*/
public IntegerValue multiply(ParticularIntegerValue other)
{
return multiply((SpecificIntegerValue)other);
}
/**
* Returns the quotient of this IntegerValue and the given
* ParticularIntegerValue.
*/
public IntegerValue divide(ParticularIntegerValue other)
{
return divide((SpecificIntegerValue)other);
}
/**
* Returns the quotient of the given ParticularIntegerValue and this
* IntegerValue.
*/
public IntegerValue divideOf(ParticularIntegerValue other)
{
return divideOf((SpecificIntegerValue)other);
}
/**
* Returns the remainder of this IntegerValue divided by the given
* ParticularIntegerValue.
*/
public IntegerValue remainder(ParticularIntegerValue other)
{
return remainder((SpecificIntegerValue)other);
}
/**
* Returns the remainder of the given ParticularIntegerValue divided by this
* IntegerValue.
*/
public IntegerValue remainderOf(ParticularIntegerValue other)
{
return remainderOf((SpecificIntegerValue)other);
}
/**
* Returns this IntegerValue, shifted left by the given ParticularIntegerValue.
*/
public IntegerValue shiftLeft(ParticularIntegerValue other)
{
return shiftLeft((SpecificIntegerValue)other);
}
/**
* Returns this IntegerValue, shifted right by the given ParticularIntegerValue.
*/
public IntegerValue shiftRight(ParticularIntegerValue other)
{
return shiftRight((SpecificIntegerValue)other);
}
/**
* Returns this unsigned IntegerValue, shifted right by the given
* ParticularIntegerValue.
*/
public IntegerValue unsignedShiftRight(ParticularIntegerValue other)
{
return unsignedShiftRight((SpecificIntegerValue)other);
}
/**
* Returns the given ParticularIntegerValue, shifted left by this IntegerValue.
*/
public IntegerValue shiftLeftOf(ParticularIntegerValue other)
{
return shiftLeftOf((SpecificIntegerValue)other);
}
/**
* Returns the given ParticularIntegerValue, shifted right by this IntegerValue.
*/
public IntegerValue shiftRightOf(ParticularIntegerValue other)
{
return shiftRightOf((SpecificIntegerValue)other);
}
/**
* Returns the given unsigned ParticularIntegerValue, shifted right by this
* IntegerValue.
*/
public IntegerValue unsignedShiftRightOf(ParticularIntegerValue other)
{
return unsignedShiftRightOf((SpecificIntegerValue)other);
}
/**
* Returns the given ParticularLongValue, shifted left by this IntegerValue.
*/
public LongValue shiftLeftOf(ParticularLongValue other)
{
return shiftLeftOf((SpecificLongValue)other);
}
/**
* Returns the given ParticularLongValue, shifted right by this IntegerValue.
*/
public LongValue shiftRightOf(ParticularLongValue other)
{
return shiftRightOf((SpecificLongValue)other);
}
/**
* Returns the given unsigned ParticularLongValue, shifted right by this
* IntegerValue.
*/
public LongValue unsignedShiftRightOf(ParticularLongValue other)
{
return unsignedShiftRightOf((SpecificLongValue)other);
}
/**
* Returns the logical and of this IntegerValue and the given
* ParticularIntegerValue.
*/
public IntegerValue and(ParticularIntegerValue other)
{
return and((SpecificIntegerValue)other);
}
/**
* Returns the logical or of this IntegerValue and the given
* ParticularIntegerValue.
*/
public IntegerValue or(ParticularIntegerValue other)
{
return or((SpecificIntegerValue)other);
}
/**
* Returns the logical xor of this IntegerValue and the given
* ParticularIntegerValue.
*/
public IntegerValue xor(ParticularIntegerValue other)
{
return xor((SpecificIntegerValue)other);
}
/**
* Returns whether this IntegerValue and the given ParticularIntegerValue are
* equal: NEVER
, MAYBE
, or ALWAYS
.
*/
public int equal(ParticularIntegerValue other)
{
return equal((SpecificIntegerValue)other);
}
/**
* Returns whether this IntegerValue is less than the given
* ParticularIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public int lessThan(ParticularIntegerValue other)
{
return lessThan((SpecificIntegerValue)other);
}
/**
* Returns whether this IntegerValue is less than or equal to the given
* ParticularIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public int lessThanOrEqual(ParticularIntegerValue other)
{
return lessThanOrEqual((SpecificIntegerValue)other);
}
// Derived binary methods.
/**
* Returns whether this IntegerValue and the given ParticularIntegerValue are
* different: NEVER
, MAYBE
, or ALWAYS
.
*/
public final int notEqual(ParticularIntegerValue other)
{
return -equal(other);
}
/**
* Returns whether this IntegerValue is greater than the given
* ParticularIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public final int greaterThan(ParticularIntegerValue other)
{
return -lessThanOrEqual(other);
}
/**
* Returns whether this IntegerValue is greater than or equal to the given
* ParticularIntegerValue: NEVER
, MAYBE
, or
* ALWAYS
.
*/
public final int greaterThanOrEqual(ParticularIntegerValue other)
{
return -lessThan(other);
}
// Implementations for Value.
public final IntegerValue integerValue()
{
return this;
}
public final Value generalize(Value other)
{
return this.generalize(other.integerValue());
}
public final int computationalType()
{
return TYPE_INTEGER;
}
public final String internalType()
{
return String.valueOf(ClassConstants.TYPE_INT);
}
}