1 /* 2 * ProGuard -- shrinking, optimization, obfuscation, and preverification 3 * of Java bytecode. 4 * 5 * Copyright (c) 2002-2014 Eric Lafortune (eric@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 */ value()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 */ negate()46 public abstract IntegerValue negate(); 47 48 /** 49 * Converts this IntegerValue to a byte IntegerValue. 50 */ convertToByte()51 public abstract IntegerValue convertToByte(); 52 53 /** 54 * Converts this IntegerValue to a character IntegerValue. 55 */ convertToCharacter()56 public abstract IntegerValue convertToCharacter(); 57 58 /** 59 * Converts this IntegerValue to a short IntegerValue. 60 */ convertToShort()61 public abstract IntegerValue convertToShort(); 62 63 /** 64 * Converts this IntegerValue to a LongValue. 65 */ convertToLong()66 public abstract LongValue convertToLong(); 67 68 /** 69 * Converts this IntegerValue to a FloatValue. 70 */ convertToFloat()71 public abstract FloatValue convertToFloat(); 72 73 /** 74 * Converts this IntegerValue to a DoubleValue. 75 */ convertToDouble()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 */ generalize(IntegerValue other)85 public abstract IntegerValue generalize(IntegerValue other); 86 87 /** 88 * Returns the sum of this IntegerValue and the given IntegerValue. 89 */ add(IntegerValue other)90 public abstract IntegerValue add(IntegerValue other); 91 92 /** 93 * Returns the difference of this IntegerValue and the given IntegerValue. 94 */ subtract(IntegerValue other)95 public abstract IntegerValue subtract(IntegerValue other); 96 97 /** 98 * Returns the difference of the given IntegerValue and this IntegerValue. 99 */ subtractFrom(IntegerValue other)100 public abstract IntegerValue subtractFrom(IntegerValue other); 101 102 /** 103 * Returns the product of this IntegerValue and the given IntegerValue. 104 */ multiply(IntegerValue other)105 public abstract IntegerValue multiply(IntegerValue other) 106 throws ArithmeticException; 107 108 /** 109 * Returns the quotient of this IntegerValue and the given IntegerValue. 110 */ divide(IntegerValue other)111 public abstract IntegerValue divide(IntegerValue other) 112 throws ArithmeticException; 113 114 /** 115 * Returns the quotient of the given IntegerValue and this IntegerValue. 116 */ divideOf(IntegerValue other)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 */ remainder(IntegerValue other)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 */ remainderOf(IntegerValue other)131 public abstract IntegerValue remainderOf(IntegerValue other) 132 throws ArithmeticException; 133 134 /** 135 * Returns this IntegerValue, shifted left by the given IntegerValue. 136 */ shiftLeft(IntegerValue other)137 public abstract IntegerValue shiftLeft(IntegerValue other); 138 139 /** 140 * Returns this IntegerValue, shifted right by the given IntegerValue. 141 */ shiftRight(IntegerValue other)142 public abstract IntegerValue shiftRight(IntegerValue other); 143 144 /** 145 * Returns this unsigned IntegerValue, shifted left by the given 146 * IntegerValue. 147 */ unsignedShiftRight(IntegerValue other)148 public abstract IntegerValue unsignedShiftRight(IntegerValue other); 149 150 /** 151 * Returns the given IntegerValue, shifted left by this IntegerValue. 152 */ shiftLeftOf(IntegerValue other)153 public abstract IntegerValue shiftLeftOf(IntegerValue other); 154 155 /** 156 * Returns the given IntegerValue, shifted right by this IntegerValue. 157 */ shiftRightOf(IntegerValue other)158 public abstract IntegerValue shiftRightOf(IntegerValue other); 159 160 /** 161 * Returns the given unsigned IntegerValue, shifted left by this 162 * IntegerValue. 163 */ unsignedShiftRightOf(IntegerValue other)164 public abstract IntegerValue unsignedShiftRightOf(IntegerValue other); 165 166 /** 167 * Returns the given LongValue, shifted left by this IntegerValue. 168 */ shiftLeftOf(LongValue other)169 public abstract LongValue shiftLeftOf(LongValue other); 170 171 /** 172 * Returns the given LongValue, shifted right by this IntegerValue. 173 */ shiftRightOf(LongValue other)174 public abstract LongValue shiftRightOf(LongValue other); 175 176 /** 177 * Returns the given unsigned LongValue, shifted right by this IntegerValue. 178 */ unsignedShiftRightOf(LongValue other)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 */ and(IntegerValue other)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 */ or(IntegerValue other)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 */ xor(IntegerValue other)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 */ equal(IntegerValue other)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 */ lessThan(IntegerValue other)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 */ lessThanOrEqual(IntegerValue other)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 */ notEqual(IntegerValue other)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 */ greaterThan(IntegerValue other)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 */ greaterThanOrEqual(IntegerValue other)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 */ generalize(UnknownIntegerValue other)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 */ add(UnknownIntegerValue other)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 */ subtract(UnknownIntegerValue other)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 */ subtractFrom(UnknownIntegerValue other)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 */ multiply(UnknownIntegerValue other)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 */ divide(UnknownIntegerValue other)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 */ divideOf(UnknownIntegerValue other)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 */ remainder(UnknownIntegerValue other)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 */ remainderOf(UnknownIntegerValue other)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 */ shiftLeft(UnknownIntegerValue other)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 */ shiftRight(UnknownIntegerValue other)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 */ unsignedShiftRight(UnknownIntegerValue other)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 */ shiftLeftOf(UnknownIntegerValue other)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 */ shiftRightOf(UnknownIntegerValue other)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 */ unsignedShiftRightOf(UnknownIntegerValue other)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 */ shiftLeftOf(UnknownLongValue other)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 */ shiftRightOf(UnknownLongValue other)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 */ unsignedShiftRightOf(UnknownLongValue other)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 */ and(UnknownIntegerValue other)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 */ or(UnknownIntegerValue other)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 */ xor(UnknownIntegerValue other)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 */ equal(UnknownIntegerValue other)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 */ lessThan(UnknownIntegerValue other)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 */ lessThanOrEqual(UnknownIntegerValue other)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 */ notEqual(UnknownIntegerValue other)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 */ greaterThan(UnknownIntegerValue other)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 */ greaterThanOrEqual(UnknownIntegerValue other)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 */ generalize(SpecificIntegerValue other)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 */ add(SpecificIntegerValue other)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 */ subtract(SpecificIntegerValue other)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 */ subtractFrom(SpecificIntegerValue other)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 */ multiply(SpecificIntegerValue other)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 */ divide(SpecificIntegerValue other)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 */ divideOf(SpecificIntegerValue other)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 */ remainder(SpecificIntegerValue other)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 */ remainderOf(SpecificIntegerValue other)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 */ shiftLeft(SpecificIntegerValue other)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 */ shiftRight(SpecificIntegerValue other)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 */ unsignedShiftRight(SpecificIntegerValue other)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 */ shiftLeftOf(SpecificIntegerValue other)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 */ shiftRightOf(SpecificIntegerValue other)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 */ unsignedShiftRightOf(SpecificIntegerValue other)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 */ shiftLeftOf(SpecificLongValue other)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 */ shiftRightOf(SpecificLongValue other)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 */ unsignedShiftRightOf(SpecificLongValue other)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 */ and(SpecificIntegerValue other)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 */ or(SpecificIntegerValue other)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 */ xor(SpecificIntegerValue other)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 */ equal(SpecificIntegerValue other)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 */ lessThan(SpecificIntegerValue other)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 */ lessThanOrEqual(SpecificIntegerValue other)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 */ notEqual(SpecificIntegerValue other)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 */ greaterThan(SpecificIntegerValue other)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 */ greaterThanOrEqual(SpecificIntegerValue other)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 */ generalize(ParticularIntegerValue other)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 */ add(ParticularIntegerValue other)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 */ subtract(ParticularIntegerValue other)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 */ subtractFrom(ParticularIntegerValue other)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 */ multiply(ParticularIntegerValue other)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 */ divide(ParticularIntegerValue other)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 */ divideOf(ParticularIntegerValue other)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 */ remainder(ParticularIntegerValue other)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 */ remainderOf(ParticularIntegerValue other)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 */ shiftLeft(ParticularIntegerValue other)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 */ shiftRight(ParticularIntegerValue other)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 */ unsignedShiftRight(ParticularIntegerValue other)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 */ shiftLeftOf(ParticularIntegerValue other)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 */ shiftRightOf(ParticularIntegerValue other)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 */ unsignedShiftRightOf(ParticularIntegerValue other)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 */ shiftLeftOf(ParticularLongValue other)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 */ shiftRightOf(ParticularLongValue other)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 */ unsignedShiftRightOf(ParticularLongValue other)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 */ and(ParticularIntegerValue other)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 */ or(ParticularIntegerValue other)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 */ xor(ParticularIntegerValue other)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 */ equal(ParticularIntegerValue other)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 */ lessThan(ParticularIntegerValue other)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 */ lessThanOrEqual(ParticularIntegerValue other)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 */ notEqual(ParticularIntegerValue other)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 */ greaterThan(ParticularIntegerValue other)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 */ greaterThanOrEqual(ParticularIntegerValue other)975 public final int greaterThanOrEqual(ParticularIntegerValue other) 976 { 977 return -lessThan(other); 978 } 979 980 981 // Implementations for Value. 982 integerValue()983 public final IntegerValue integerValue() 984 { 985 return this; 986 } 987 generalize(Value other)988 public final Value generalize(Value other) 989 { 990 return this.generalize(other.integerValue()); 991 } 992 computationalType()993 public final int computationalType() 994 { 995 return TYPE_INTEGER; 996 } 997 internalType()998 public final String internalType() 999 { 1000 return String.valueOf(ClassConstants.TYPE_INT); 1001 } 1002 } 1003