Home | History | Annotate | Download | only in value
      1 /*
      2  * ProGuard -- shrinking, optimization, obfuscation, and preverification
      3  *             of Java bytecode.
      4  *
      5  * Copyright (c) 2002-2014 Eric Lafortune (eric (at) graphics.cornell.edu)
      6  *
      7  * This program is free software; you can redistribute it and/or modify it
      8  * under the terms of the GNU General Public License as published by the Free
      9  * Software Foundation; either version 2 of the License, or (at your option)
     10  * any later version.
     11  *
     12  * This program is distributed in the hope that it will be useful, but WITHOUT
     13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
     15  * more details.
     16  *
     17  * You should have received a copy of the GNU General Public License along
     18  * with this program; if not, write to the Free Software Foundation, Inc.,
     19  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
     20  */
     21 package proguard.evaluation.value;
     22 
     23 import proguard.classfile.ClassConstants;
     24 
     25 /**
     26  * This class represents a partially evaluated integer value.
     27  *
     28  * @author Eric Lafortune
     29  */
     30 public abstract class IntegerValue extends Category1Value
     31 {
     32     /**
     33      * Returns the specific integer value, if applicable.
     34      */
     35     public int value()
     36     {
     37         return 0;
     38     }
     39 
     40 
     41     // Basic unary methods.
     42 
     43     /**
     44      * Returns the negated value of this IntegerValue.
     45      */
     46     public abstract IntegerValue negate();
     47 
     48     /**
     49      * Converts this IntegerValue to a byte IntegerValue.
     50      */
     51     public abstract IntegerValue convertToByte();
     52 
     53     /**
     54      * Converts this IntegerValue to a character IntegerValue.
     55      */
     56     public abstract IntegerValue convertToCharacter();
     57 
     58     /**
     59      * Converts this IntegerValue to a short IntegerValue.
     60      */
     61     public abstract IntegerValue convertToShort();
     62 
     63     /**
     64      * Converts this IntegerValue to a LongValue.
     65      */
     66     public abstract LongValue convertToLong();
     67 
     68     /**
     69      * Converts this IntegerValue to a FloatValue.
     70      */
     71     public abstract FloatValue convertToFloat();
     72 
     73     /**
     74      * Converts this IntegerValue to a DoubleValue.
     75      */
     76     public abstract DoubleValue convertToDouble();
     77 
     78 
     79     // Basic binary methods.
     80 
     81     /**
     82      * Returns the generalization of this IntegerValue and the given other
     83      * IntegerValue.
     84      */
     85     public abstract IntegerValue generalize(IntegerValue other);
     86 
     87     /**
     88      * Returns the sum of this IntegerValue and the given IntegerValue.
     89      */
     90     public abstract IntegerValue add(IntegerValue other);
     91 
     92     /**
     93      * Returns the difference of this IntegerValue and the given IntegerValue.
     94      */
     95     public abstract IntegerValue subtract(IntegerValue other);
     96 
     97     /**
     98      * Returns the difference of the given IntegerValue and this IntegerValue.
     99      */
    100     public abstract IntegerValue subtractFrom(IntegerValue other);
    101 
    102     /**
    103      * Returns the product of this IntegerValue and the given IntegerValue.
    104      */
    105     public abstract IntegerValue multiply(IntegerValue other)
    106     throws ArithmeticException;
    107 
    108     /**
    109      * Returns the quotient of this IntegerValue and the given IntegerValue.
    110      */
    111     public abstract IntegerValue divide(IntegerValue other)
    112     throws ArithmeticException;
    113 
    114     /**
    115      * Returns the quotient of the given IntegerValue and this IntegerValue.
    116      */
    117     public abstract IntegerValue divideOf(IntegerValue other)
    118     throws ArithmeticException;
    119 
    120     /**
    121      * Returns the remainder of this IntegerValue divided by the given
    122      * IntegerValue.
    123      */
    124     public abstract IntegerValue remainder(IntegerValue other)
    125     throws ArithmeticException;
    126 
    127     /**
    128      * Returns the remainder of the given IntegerValue divided by this
    129      * IntegerValue.
    130      */
    131     public abstract IntegerValue remainderOf(IntegerValue other)
    132     throws ArithmeticException;
    133 
    134     /**
    135      * Returns this IntegerValue, shifted left by the given IntegerValue.
    136      */
    137     public abstract IntegerValue shiftLeft(IntegerValue other);
    138 
    139     /**
    140      * Returns this IntegerValue, shifted right by the given IntegerValue.
    141      */
    142     public abstract IntegerValue shiftRight(IntegerValue other);
    143 
    144     /**
    145      * Returns this unsigned IntegerValue, shifted left by the given
    146      * IntegerValue.
    147      */
    148     public abstract IntegerValue unsignedShiftRight(IntegerValue other);
    149 
    150     /**
    151      * Returns the given IntegerValue, shifted left by this IntegerValue.
    152      */
    153     public abstract IntegerValue shiftLeftOf(IntegerValue other);
    154 
    155     /**
    156      * Returns the given IntegerValue, shifted right by this IntegerValue.
    157      */
    158     public abstract IntegerValue shiftRightOf(IntegerValue other);
    159 
    160     /**
    161      * Returns the given unsigned IntegerValue, shifted left by this
    162      * IntegerValue.
    163      */
    164     public abstract IntegerValue unsignedShiftRightOf(IntegerValue other);
    165 
    166     /**
    167      * Returns the given LongValue, shifted left by this IntegerValue.
    168      */
    169     public abstract LongValue shiftLeftOf(LongValue other);
    170 
    171     /**
    172      * Returns the given LongValue, shifted right by this IntegerValue.
    173      */
    174     public abstract LongValue shiftRightOf(LongValue other);
    175 
    176     /**
    177      * Returns the given unsigned LongValue, shifted right by this IntegerValue.
    178      */
    179     public abstract LongValue unsignedShiftRightOf(LongValue other);
    180 
    181     /**
    182      * Returns the logical <i>and</i> of this IntegerValue and the given
    183      * IntegerValue.
    184      */
    185     public abstract IntegerValue and(IntegerValue other);
    186 
    187     /**
    188      * Returns the logical <i>or</i> of this IntegerValue and the given
    189      * IntegerValue.
    190      */
    191     public abstract IntegerValue or(IntegerValue other);
    192 
    193     /**
    194      * Returns the logical <i>xor</i> of this IntegerValue and the given
    195      * IntegerValue.
    196      */
    197     public abstract IntegerValue xor(IntegerValue other);
    198 
    199     /**
    200      * Returns whether this IntegerValue and the given IntegerValue are equal:
    201      * <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    202      */
    203     public abstract int equal(IntegerValue other);
    204 
    205     /**
    206      * Returns whether this IntegerValue is less than the given IntegerValue:
    207      * <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    208      */
    209     public abstract int lessThan(IntegerValue other);
    210 
    211     /**
    212      * Returns whether this IntegerValue is less than or equal to the given
    213      * IntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    214      * <code>ALWAYS</code>.
    215      */
    216     public abstract int lessThanOrEqual(IntegerValue other);
    217 
    218 
    219     // Derived binary methods.
    220 
    221     /**
    222      * Returns whether this IntegerValue and the given IntegerValue are different:
    223      * <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    224      */
    225     public final int notEqual(IntegerValue other)
    226     {
    227         return -equal(other);
    228     }
    229 
    230     /**
    231      * Returns whether this IntegerValue is greater than the given IntegerValue:
    232      * <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    233      */
    234     public final int greaterThan(IntegerValue other)
    235     {
    236         return -lessThanOrEqual(other);
    237     }
    238 
    239     /**
    240      * Returns whether this IntegerValue is greater than or equal to the given IntegerValue:
    241      * <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    242      */
    243     public final int greaterThanOrEqual(IntegerValue other)
    244     {
    245         return -lessThan(other);
    246     }
    247 
    248 
    249     // Similar binary methods, but this time with unknown arguments.
    250 
    251     /**
    252      * Returns the generalization of this IntegerValue and the given other
    253      * UnknownIntegerValue.
    254      */
    255     public IntegerValue generalize(UnknownIntegerValue other)
    256     {
    257         return generalize((IntegerValue)other);
    258     }
    259 
    260 
    261     /**
    262      * Returns the sum of this IntegerValue and the given UnknownIntegerValue.
    263      */
    264     public IntegerValue add(UnknownIntegerValue other)
    265     {
    266         return add((IntegerValue)other);
    267     }
    268 
    269     /**
    270      * Returns the difference of this IntegerValue and the given UnknownIntegerValue.
    271      */
    272     public IntegerValue subtract(UnknownIntegerValue other)
    273     {
    274         return subtract((IntegerValue)other);
    275     }
    276 
    277     /**
    278      * Returns the difference of the given UnknownIntegerValue and this IntegerValue.
    279      */
    280     public IntegerValue subtractFrom(UnknownIntegerValue other)
    281     {
    282         return subtractFrom((IntegerValue)other);
    283     }
    284 
    285     /**
    286      * Returns the product of this IntegerValue and the given UnknownIntegerValue.
    287      */
    288     public IntegerValue multiply(UnknownIntegerValue other)
    289     {
    290         return multiply((IntegerValue)other);
    291     }
    292 
    293     /**
    294      * Returns the quotient of this IntegerValue and the given
    295      * UnknownIntegerValue.
    296      */
    297     public IntegerValue divide(UnknownIntegerValue other)
    298     {
    299         return divide((IntegerValue)other);
    300     }
    301 
    302     /**
    303      * Returns the quotient of the given UnknownIntegerValue and this
    304      * IntegerValue.
    305      */
    306     public IntegerValue divideOf(UnknownIntegerValue other)
    307     {
    308         return divideOf((IntegerValue)other);
    309     }
    310 
    311     /**
    312      * Returns the remainder of this IntegerValue divided by the given
    313      * UnknownIntegerValue.
    314      */
    315     public IntegerValue remainder(UnknownIntegerValue other)
    316     {
    317         return remainder((IntegerValue)other);
    318     }
    319 
    320     /**
    321      * Returns the remainder of the given UnknownIntegerValue divided by this
    322      * IntegerValue.
    323      */
    324     public IntegerValue remainderOf(UnknownIntegerValue other)
    325     {
    326         return remainderOf((IntegerValue)other);
    327     }
    328 
    329     /**
    330      * Returns this IntegerValue, shifted left by the given UnknownIntegerValue.
    331      */
    332     public IntegerValue shiftLeft(UnknownIntegerValue other)
    333     {
    334         return shiftLeft((IntegerValue)other);
    335     }
    336 
    337     /**
    338      * Returns this IntegerValue, shifted right by the given UnknownIntegerValue.
    339      */
    340     public IntegerValue shiftRight(UnknownIntegerValue other)
    341     {
    342         return shiftRight((IntegerValue)other);
    343     }
    344 
    345     /**
    346      * Returns this unsigned IntegerValue, shifted right by the given
    347      * UnknownIntegerValue.
    348      */
    349     public IntegerValue unsignedShiftRight(UnknownIntegerValue other)
    350     {
    351         return unsignedShiftRight((IntegerValue)other);
    352     }
    353 
    354     /**
    355      * Returns the given UnknownIntegerValue, shifted left by this IntegerValue.
    356      */
    357     public IntegerValue shiftLeftOf(UnknownIntegerValue other)
    358     {
    359         return shiftLeftOf((IntegerValue)other);
    360     }
    361 
    362     /**
    363      * Returns the given UnknownIntegerValue, shifted right by this IntegerValue.
    364      */
    365     public IntegerValue shiftRightOf(UnknownIntegerValue other)
    366     {
    367         return shiftRightOf((IntegerValue)other);
    368     }
    369 
    370     /**
    371      * Returns the given unsigned UnknownIntegerValue, shifted right by this
    372      * IntegerValue.
    373      */
    374     public IntegerValue unsignedShiftRightOf(UnknownIntegerValue other)
    375     {
    376         return unsignedShiftRightOf((IntegerValue)other);
    377     }
    378 
    379     /**
    380      * Returns the given UnknownLongValue, shifted left by this IntegerValue.
    381      */
    382     public LongValue shiftLeftOf(UnknownLongValue other)
    383     {
    384         return shiftLeftOf((LongValue)other);
    385     }
    386 
    387     /**
    388      * Returns the given UnknownLongValue, shifted right by this IntegerValue.
    389      */
    390     public LongValue shiftRightOf(UnknownLongValue other)
    391     {
    392         return shiftRightOf((LongValue)other);
    393     }
    394 
    395     /**
    396      * Returns the given unsigned UnknownLongValue, shifted right by this
    397      * IntegerValue.
    398      */
    399     public LongValue unsignedShiftRightOf(UnknownLongValue other)
    400     {
    401         return unsignedShiftRightOf((LongValue)other);
    402     }
    403 
    404     /**
    405      * Returns the logical <i>and</i> of this IntegerValue and the given
    406      * UnknownIntegerValue.
    407      */
    408     public IntegerValue and(UnknownIntegerValue other)
    409     {
    410         return and((IntegerValue)other);
    411     }
    412 
    413     /**
    414      * Returns the logical <i>or</i> of this IntegerValue and the given
    415      * UnknownIntegerValue.
    416      */
    417     public IntegerValue or(UnknownIntegerValue other)
    418     {
    419         return or((IntegerValue)other);
    420     }
    421 
    422     /**
    423      * Returns the logical <i>xor</i> of this IntegerValue and the given
    424      * UnknownIntegerValue.
    425      */
    426     public IntegerValue xor(UnknownIntegerValue other)
    427     {
    428         return xor((IntegerValue)other);
    429     }
    430 
    431     /**
    432      * Returns whether this IntegerValue and the given UnknownIntegerValue are
    433      * equal: <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    434      */
    435     public int equal(UnknownIntegerValue other)
    436     {
    437         return equal((IntegerValue)other);
    438     }
    439 
    440     /**
    441      * Returns whether this IntegerValue is less than the given
    442      * UnknownIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    443      * <code>ALWAYS</code>.
    444      */
    445     public int lessThan(UnknownIntegerValue other)
    446     {
    447         return lessThan((IntegerValue)other);
    448     }
    449 
    450     /**
    451      * Returns whether this IntegerValue is less than or equal to the given
    452      * UnknownIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    453      * <code>ALWAYS</code>.
    454      */
    455     public int lessThanOrEqual(UnknownIntegerValue other)
    456     {
    457         return lessThanOrEqual((IntegerValue)other);
    458     }
    459 
    460 
    461     // Derived binary methods.
    462 
    463     /**
    464      * Returns whether this IntegerValue and the given UnknownIntegerValue are
    465      * different: <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    466      */
    467     public final int notEqual(UnknownIntegerValue other)
    468     {
    469         return -equal(other);
    470     }
    471 
    472     /**
    473      * Returns whether this IntegerValue is greater than the given
    474      * UnknownIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    475      * <code>ALWAYS</code>.
    476      */
    477     public final int greaterThan(UnknownIntegerValue other)
    478     {
    479         return -lessThanOrEqual(other);
    480     }
    481 
    482     /**
    483      * Returns whether this IntegerValue is greater than or equal to the given
    484      * UnknownIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    485      * <code>ALWAYS</code>.
    486      */
    487     public final int greaterThanOrEqual(UnknownIntegerValue other)
    488     {
    489         return -lessThan(other);
    490     }
    491 
    492 
    493     // Similar binary methods, but this time with specific arguments.
    494 
    495     /**
    496      * Returns the generalization of this IntegerValue and the given other
    497      * SpecificIntegerValue.
    498      */
    499     public IntegerValue generalize(SpecificIntegerValue other)
    500     {
    501         return generalize((IntegerValue)other);
    502     }
    503 
    504 
    505     /**
    506      * Returns the sum of this IntegerValue and the given SpecificIntegerValue.
    507      */
    508     public IntegerValue add(SpecificIntegerValue other)
    509     {
    510         return add((IntegerValue)other);
    511     }
    512 
    513     /**
    514      * Returns the difference of this IntegerValue and the given SpecificIntegerValue.
    515      */
    516     public IntegerValue subtract(SpecificIntegerValue other)
    517     {
    518         return subtract((IntegerValue)other);
    519     }
    520 
    521     /**
    522      * Returns the difference of the given SpecificIntegerValue and this IntegerValue.
    523      */
    524     public IntegerValue subtractFrom(SpecificIntegerValue other)
    525     {
    526         return subtractFrom((IntegerValue)other);
    527     }
    528 
    529     /**
    530      * Returns the product of this IntegerValue and the given SpecificIntegerValue.
    531      */
    532     public IntegerValue multiply(SpecificIntegerValue other)
    533     {
    534         return multiply((IntegerValue)other);
    535     }
    536 
    537     /**
    538      * Returns the quotient of this IntegerValue and the given
    539      * SpecificIntegerValue.
    540      */
    541     public IntegerValue divide(SpecificIntegerValue other)
    542     {
    543         return divide((IntegerValue)other);
    544     }
    545 
    546     /**
    547      * Returns the quotient of the given SpecificIntegerValue and this
    548      * IntegerValue.
    549      */
    550     public IntegerValue divideOf(SpecificIntegerValue other)
    551     {
    552         return divideOf((IntegerValue)other);
    553     }
    554 
    555     /**
    556      * Returns the remainder of this IntegerValue divided by the given
    557      * SpecificIntegerValue.
    558      */
    559     public IntegerValue remainder(SpecificIntegerValue other)
    560     {
    561         return remainder((IntegerValue)other);
    562     }
    563 
    564     /**
    565      * Returns the remainder of the given SpecificIntegerValue divided by this
    566      * IntegerValue.
    567      */
    568     public IntegerValue remainderOf(SpecificIntegerValue other)
    569     {
    570         return remainderOf((IntegerValue)other);
    571     }
    572 
    573     /**
    574      * Returns this IntegerValue, shifted left by the given SpecificIntegerValue.
    575      */
    576     public IntegerValue shiftLeft(SpecificIntegerValue other)
    577     {
    578         return shiftLeft((IntegerValue)other);
    579     }
    580 
    581     /**
    582      * Returns this IntegerValue, shifted right by the given SpecificIntegerValue.
    583      */
    584     public IntegerValue shiftRight(SpecificIntegerValue other)
    585     {
    586         return shiftRight((IntegerValue)other);
    587     }
    588 
    589     /**
    590      * Returns this unsigned IntegerValue, shifted right by the given
    591      * SpecificIntegerValue.
    592      */
    593     public IntegerValue unsignedShiftRight(SpecificIntegerValue other)
    594     {
    595         return unsignedShiftRight((IntegerValue)other);
    596     }
    597 
    598     /**
    599      * Returns the given SpecificIntegerValue, shifted left by this IntegerValue.
    600      */
    601     public IntegerValue shiftLeftOf(SpecificIntegerValue other)
    602     {
    603         return shiftLeftOf((IntegerValue)other);
    604     }
    605 
    606     /**
    607      * Returns the given SpecificIntegerValue, shifted right by this IntegerValue.
    608      */
    609     public IntegerValue shiftRightOf(SpecificIntegerValue other)
    610     {
    611         return shiftRightOf((IntegerValue)other);
    612     }
    613 
    614     /**
    615      * Returns the given unsigned SpecificIntegerValue, shifted right by this
    616      * IntegerValue.
    617      */
    618     public IntegerValue unsignedShiftRightOf(SpecificIntegerValue other)
    619     {
    620         return unsignedShiftRightOf((IntegerValue)other);
    621     }
    622 
    623     /**
    624      * Returns the given SpecificLongValue, shifted left by this IntegerValue.
    625      */
    626     public LongValue shiftLeftOf(SpecificLongValue other)
    627     {
    628         return shiftLeftOf((LongValue)other);
    629     }
    630 
    631     /**
    632      * Returns the given SpecificLongValue, shifted right by this IntegerValue.
    633      */
    634     public LongValue shiftRightOf(SpecificLongValue other)
    635     {
    636         return shiftRightOf((LongValue)other);
    637     }
    638 
    639     /**
    640      * Returns the given unsigned SpecificLongValue, shifted right by this
    641      * IntegerValue.
    642      */
    643     public LongValue unsignedShiftRightOf(SpecificLongValue other)
    644     {
    645         return unsignedShiftRightOf((LongValue)other);
    646     }
    647 
    648     /**
    649      * Returns the logical <i>and</i> of this IntegerValue and the given
    650      * SpecificIntegerValue.
    651      */
    652     public IntegerValue and(SpecificIntegerValue other)
    653     {
    654         return and((IntegerValue)other);
    655     }
    656 
    657     /**
    658      * Returns the logical <i>or</i> of this IntegerValue and the given
    659      * SpecificIntegerValue.
    660      */
    661     public IntegerValue or(SpecificIntegerValue other)
    662     {
    663         return or((IntegerValue)other);
    664     }
    665 
    666     /**
    667      * Returns the logical <i>xor</i> of this IntegerValue and the given
    668      * SpecificIntegerValue.
    669      */
    670     public IntegerValue xor(SpecificIntegerValue other)
    671     {
    672         return xor((IntegerValue)other);
    673     }
    674 
    675     /**
    676      * Returns whether this IntegerValue and the given SpecificIntegerValue are
    677      * equal: <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    678      */
    679     public int equal(SpecificIntegerValue other)
    680     {
    681         return equal((IntegerValue)other);
    682     }
    683 
    684     /**
    685      * Returns whether this IntegerValue is less than the given
    686      * SpecificIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    687      * <code>ALWAYS</code>.
    688      */
    689     public int lessThan(SpecificIntegerValue other)
    690     {
    691         return lessThan((IntegerValue)other);
    692     }
    693 
    694     /**
    695      * Returns whether this IntegerValue is less than or equal to the given
    696      * SpecificIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    697      * <code>ALWAYS</code>.
    698      */
    699     public int lessThanOrEqual(SpecificIntegerValue other)
    700     {
    701         return lessThanOrEqual((IntegerValue)other);
    702     }
    703 
    704 
    705     // Derived binary methods.
    706 
    707     /**
    708      * Returns whether this IntegerValue and the given SpecificIntegerValue are
    709      * different: <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    710      */
    711     public final int notEqual(SpecificIntegerValue other)
    712     {
    713         return -equal(other);
    714     }
    715 
    716     /**
    717      * Returns whether this IntegerValue is greater than the given
    718      * SpecificIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    719      * <code>ALWAYS</code>.
    720      */
    721     public final int greaterThan(SpecificIntegerValue other)
    722     {
    723         return -lessThanOrEqual(other);
    724     }
    725 
    726     /**
    727      * Returns whether this IntegerValue is greater than or equal to the given
    728      * SpecificIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    729      * <code>ALWAYS</code>.
    730      */
    731     public final int greaterThanOrEqual(SpecificIntegerValue other)
    732     {
    733         return -lessThan(other);
    734     }
    735 
    736 
    737     // Similar binary methods, but this time with particular arguments.
    738 
    739     /**
    740      * Returns the generalization of this IntegerValue and the given other
    741      * ParticularIntegerValue.
    742      */
    743     public IntegerValue generalize(ParticularIntegerValue other)
    744     {
    745         return generalize((SpecificIntegerValue)other);
    746     }
    747 
    748 
    749     /**
    750      * Returns the sum of this IntegerValue and the given ParticularIntegerValue.
    751      */
    752     public IntegerValue add(ParticularIntegerValue other)
    753     {
    754         return add((SpecificIntegerValue)other);
    755     }
    756 
    757     /**
    758      * Returns the difference of this IntegerValue and the given ParticularIntegerValue.
    759      */
    760     public IntegerValue subtract(ParticularIntegerValue other)
    761     {
    762         return subtract((SpecificIntegerValue)other);
    763     }
    764 
    765     /**
    766      * Returns the difference of the given ParticularIntegerValue and this IntegerValue.
    767      */
    768     public IntegerValue subtractFrom(ParticularIntegerValue other)
    769     {
    770         return subtractFrom((SpecificIntegerValue)other);
    771     }
    772 
    773     /**
    774      * Returns the product of this IntegerValue and the given ParticularIntegerValue.
    775      */
    776     public IntegerValue multiply(ParticularIntegerValue other)
    777     {
    778         return multiply((SpecificIntegerValue)other);
    779     }
    780 
    781     /**
    782      * Returns the quotient of this IntegerValue and the given
    783      * ParticularIntegerValue.
    784      */
    785     public IntegerValue divide(ParticularIntegerValue other)
    786     {
    787         return divide((SpecificIntegerValue)other);
    788     }
    789 
    790     /**
    791      * Returns the quotient of the given ParticularIntegerValue and this
    792      * IntegerValue.
    793      */
    794     public IntegerValue divideOf(ParticularIntegerValue other)
    795     {
    796         return divideOf((SpecificIntegerValue)other);
    797     }
    798 
    799     /**
    800      * Returns the remainder of this IntegerValue divided by the given
    801      * ParticularIntegerValue.
    802      */
    803     public IntegerValue remainder(ParticularIntegerValue other)
    804     {
    805         return remainder((SpecificIntegerValue)other);
    806     }
    807 
    808     /**
    809      * Returns the remainder of the given ParticularIntegerValue divided by this
    810      * IntegerValue.
    811      */
    812     public IntegerValue remainderOf(ParticularIntegerValue other)
    813     {
    814         return remainderOf((SpecificIntegerValue)other);
    815     }
    816 
    817     /**
    818      * Returns this IntegerValue, shifted left by the given ParticularIntegerValue.
    819      */
    820     public IntegerValue shiftLeft(ParticularIntegerValue other)
    821     {
    822         return shiftLeft((SpecificIntegerValue)other);
    823     }
    824 
    825     /**
    826      * Returns this IntegerValue, shifted right by the given ParticularIntegerValue.
    827      */
    828     public IntegerValue shiftRight(ParticularIntegerValue other)
    829     {
    830         return shiftRight((SpecificIntegerValue)other);
    831     }
    832 
    833     /**
    834      * Returns this unsigned IntegerValue, shifted right by the given
    835      * ParticularIntegerValue.
    836      */
    837     public IntegerValue unsignedShiftRight(ParticularIntegerValue other)
    838     {
    839         return unsignedShiftRight((SpecificIntegerValue)other);
    840     }
    841 
    842     /**
    843      * Returns the given ParticularIntegerValue, shifted left by this IntegerValue.
    844      */
    845     public IntegerValue shiftLeftOf(ParticularIntegerValue other)
    846     {
    847         return shiftLeftOf((SpecificIntegerValue)other);
    848     }
    849 
    850     /**
    851      * Returns the given ParticularIntegerValue, shifted right by this IntegerValue.
    852      */
    853     public IntegerValue shiftRightOf(ParticularIntegerValue other)
    854     {
    855         return shiftRightOf((SpecificIntegerValue)other);
    856     }
    857 
    858     /**
    859      * Returns the given unsigned ParticularIntegerValue, shifted right by this
    860      * IntegerValue.
    861      */
    862     public IntegerValue unsignedShiftRightOf(ParticularIntegerValue other)
    863     {
    864         return unsignedShiftRightOf((SpecificIntegerValue)other);
    865     }
    866 
    867     /**
    868      * Returns the given ParticularLongValue, shifted left by this IntegerValue.
    869      */
    870     public LongValue shiftLeftOf(ParticularLongValue other)
    871     {
    872         return shiftLeftOf((SpecificLongValue)other);
    873     }
    874 
    875     /**
    876      * Returns the given ParticularLongValue, shifted right by this IntegerValue.
    877      */
    878     public LongValue shiftRightOf(ParticularLongValue other)
    879     {
    880         return shiftRightOf((SpecificLongValue)other);
    881     }
    882 
    883     /**
    884      * Returns the given unsigned ParticularLongValue, shifted right by this
    885      * IntegerValue.
    886      */
    887     public LongValue unsignedShiftRightOf(ParticularLongValue other)
    888     {
    889         return unsignedShiftRightOf((SpecificLongValue)other);
    890     }
    891 
    892     /**
    893      * Returns the logical <i>and</i> of this IntegerValue and the given
    894      * ParticularIntegerValue.
    895      */
    896     public IntegerValue and(ParticularIntegerValue other)
    897     {
    898         return and((SpecificIntegerValue)other);
    899     }
    900 
    901     /**
    902      * Returns the logical <i>or</i> of this IntegerValue and the given
    903      * ParticularIntegerValue.
    904      */
    905     public IntegerValue or(ParticularIntegerValue other)
    906     {
    907         return or((SpecificIntegerValue)other);
    908     }
    909 
    910     /**
    911      * Returns the logical <i>xor</i> of this IntegerValue and the given
    912      * ParticularIntegerValue.
    913      */
    914     public IntegerValue xor(ParticularIntegerValue other)
    915     {
    916         return xor((SpecificIntegerValue)other);
    917     }
    918 
    919     /**
    920      * Returns whether this IntegerValue and the given ParticularIntegerValue are
    921      * equal: <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    922      */
    923     public int equal(ParticularIntegerValue other)
    924     {
    925         return equal((SpecificIntegerValue)other);
    926     }
    927 
    928     /**
    929      * Returns whether this IntegerValue is less than the given
    930      * ParticularIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    931      * <code>ALWAYS</code>.
    932      */
    933     public int lessThan(ParticularIntegerValue other)
    934     {
    935         return lessThan((SpecificIntegerValue)other);
    936     }
    937 
    938     /**
    939      * Returns whether this IntegerValue is less than or equal to the given
    940      * ParticularIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    941      * <code>ALWAYS</code>.
    942      */
    943     public int lessThanOrEqual(ParticularIntegerValue other)
    944     {
    945         return lessThanOrEqual((SpecificIntegerValue)other);
    946     }
    947 
    948 
    949     // Derived binary methods.
    950 
    951     /**
    952      * Returns whether this IntegerValue and the given ParticularIntegerValue are
    953      * different: <code>NEVER</code>, <code>MAYBE</code>, or <code>ALWAYS</code>.
    954      */
    955     public final int notEqual(ParticularIntegerValue other)
    956     {
    957         return -equal(other);
    958     }
    959 
    960     /**
    961      * Returns whether this IntegerValue is greater than the given
    962      * ParticularIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    963      * <code>ALWAYS</code>.
    964      */
    965     public final int greaterThan(ParticularIntegerValue other)
    966     {
    967         return -lessThanOrEqual(other);
    968     }
    969 
    970     /**
    971      * Returns whether this IntegerValue is greater than or equal to the given
    972      * ParticularIntegerValue: <code>NEVER</code>, <code>MAYBE</code>, or
    973      * <code>ALWAYS</code>.
    974      */
    975     public final int greaterThanOrEqual(ParticularIntegerValue other)
    976     {
    977         return -lessThan(other);
    978     }
    979 
    980 
    981     // Implementations for Value.
    982 
    983     public final IntegerValue integerValue()
    984     {
    985         return this;
    986     }
    987 
    988     public final Value generalize(Value other)
    989     {
    990         return this.generalize(other.integerValue());
    991     }
    992 
    993     public final int computationalType()
    994     {
    995         return TYPE_INTEGER;
    996     }
    997 
    998     public final String internalType()
    999     {
   1000         return String.valueOf(ClassConstants.TYPE_INT);
   1001     }
   1002 }
   1003