001/** 002 * Variant.java 003 * 004 * Copyright (c) 2004-2012, Nicole C. Tedesco. All rights reserved. 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 007 * use this file except in compliance with the License. You may obtain a copy of 008 * the License at: 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 014 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 015 * License for the specific language governing permissions and limitations under 016 * the License. 017 */ 018 019package net.sf.jaccumulator.primitives; 020 021import java.math.BigDecimal; 022import java.math.BigInteger; 023import java.util.EnumMap; 024import java.util.Map; 025 026import net.sf.jaccumulator.ControlIntention; 027import net.sf.jaccumulator.Domain; 028import net.sf.jaccumulator.booleans.BooleanPrimitive; 029import net.sf.jaccumulator.bytes.BytePrimitive; 030import net.sf.jaccumulator.characters.CharacterPrimitive; 031import net.sf.jaccumulator.doubles.DoublePrimitive; 032import net.sf.jaccumulator.floats.FloatPrimitive; 033import net.sf.jaccumulator.integers.EnumerationPrimitive; 034import net.sf.jaccumulator.integers.IntegerPrimitive; 035import net.sf.jaccumulator.integers.ModuloIntegerPrimitive; 036import net.sf.jaccumulator.lex.PrimitiveAction; 037import net.sf.jaccumulator.lex.To; 038import net.sf.jaccumulator.longs.LongPrimitive; 039import net.sf.jaccumulator.reals.SealedReal; 040import net.sf.jaccumulator.scalars.NumericPrecision; 041import net.sf.jaccumulator.scalars.RoundingStrategy; 042import net.sf.jaccumulator.scalars.SealedScalar; 043import net.sf.jaccumulator.shorts.ShortPrimitive; 044import net.sf.jaccumulator.texts.TextPrimitive; 045import net.sf.jaccumulator.unlimiteds.UnlimitedDecimalPrimitive; 046import net.sf.jaccumulator.unlimiteds.UnlimitedIntegerPrimitive; 047 048/** 049 * An {@link Primitive primitive} that adjusts its numeric 050 * {@link NumericPrecision precision}, and hence its implementation, based on 051 * the precision of function arguments 052 * 053 * @since JAccumulator 4.0 054 * @author Nicole Tedesco (<a 055 * href="mailto:Nicole@NicoleTedesco.com">Nicole@NicoleTedesco.com</a>) 056 */ 057public final class Variant 058 extends 059 AbstractPrimitiveWrapper<Variant> 060{ 061 private final static Map<NumericPrecision,Promoter> _thePromoters = new EnumMap<NumericPrecision,Promoter>( 062 NumericPrecision.class); 063 064 private static final long serialVersionUID = 5567792842256304953L; 065 static { 066 _thePromoters.put(NumericPrecision.UNKNOWN, new StringPromoter()); 067 _thePromoters.put(NumericPrecision.NULL, new NullPromoter()); 068 _thePromoters.put(NumericPrecision.BIT, new BooleanPromoter()); 069 _thePromoters.put(NumericPrecision.BYTE, new BytePromoter()); 070 _thePromoters.put(NumericPrecision.SHORT, new ShortPromoter()); 071 _thePromoters.put(NumericPrecision.CHARACTER, new CharacterPromoter()); 072 _thePromoters.put(NumericPrecision.INTEGER, new IntegerPromoter()); 073 _thePromoters.put(NumericPrecision.LONG, new LongPromoter()); 074 _thePromoters.put(NumericPrecision.FLOAT, new FloatPromoter()); 075 _thePromoters.put(NumericPrecision.DOUBLE, new DoublePromoter()); 076 _thePromoters.put(NumericPrecision.UNLIMITED_INTEGER, 077 new UnlimitedIntegerPromoter()); 078 _thePromoters.put(NumericPrecision.UNLIMITED_DECIMAL, 079 new UnlimitedDecimalPromoter()); 080 }; 081 082 private final Factory[] _theFactories = { Creator.INSTANCE, 083 Creator.INSTANCE, Creator.INSTANCE, Creator.INSTANCE, 084 Creator.INSTANCE, Creator.INSTANCE, Creator.INSTANCE, 085 Creator.INSTANCE, Creator.INSTANCE, Creator.INSTANCE, 086 Creator.INSTANCE, Creator.INSTANCE, }; 087 088 private Promoter _thePromoter; 089 private final PrimitiveAction<Primitive<?>> _theRealTranslator; 090 private Primitive<?> _theTarget; 091 private final Primitive<?>[] _theTargets = new Primitive<?>[NumericPrecision.values().length]; 092 093 public Variant( final BigDecimal aValue ) 094 { 095 this(new UnlimitedDecimalPrimitive(aValue)); 096 } 097 098 public Variant( final BigInteger aValue ) 099 { 100 this(new UnlimitedIntegerPrimitive(aValue)); 101 } 102 103 public Variant( final boolean aValue ) 104 { 105 this(new BooleanPrimitive(aValue)); 106 } 107 108 public Variant( final byte aValue ) 109 { 110 this(new BytePrimitive(aValue)); 111 } 112 113 public Variant( final char aValue ) 114 { 115 this(new CharacterPrimitive(aValue)); 116 } 117 118 public Variant( final double aValue ) 119 { 120 this(new DoublePrimitive(aValue)); 121 } 122 123 public <E extends Enum<E>> Variant( final E aValue ) 124 { 125 this(new EnumerationPrimitive(aValue)); 126 } 127 128 public Variant( final float aValue ) 129 { 130 this(new FloatPrimitive(aValue)); 131 } 132 133 public Variant( final int aValue ) 134 { 135 this(new IntegerPrimitive(aValue)); 136 } 137 138 public Variant( final long aValue ) 139 { 140 this(new LongPrimitive(aValue)); 141 } 142 143 public Variant( final Primitive<?>... targets ) 144 { 145 this(To.REAL, targets); 146 } 147 148 public Variant( 149 final PrimitiveAction<Primitive<?>> aRealTranslator, 150 final Primitive<?>... targets ) 151 { 152 this._theRealTranslator = aRealTranslator; 153 for (final Primitive<?> aTarget : targets) { 154 final NumericPrecision prec = aTarget.getPrecision(); 155 final int index = prec.ordinal(); 156 this._theTargets[index] = aTarget; 157 this._theFactories[index] = Getter.INSTANCE; 158 } 159 if (0 < targets.length) { 160 this.setTarget(targets[0]); 161 final NumericPrecision prec = this.getTarget().getPrecision(); 162 this._thePromoter = _thePromoters.get(prec); 163 } else { 164 this.setTarget(this._theTargets[NumericPrecision.DOUBLE.ordinal()] = toPrimitive(NumericPrecision.DOUBLE)); 165 this._thePromoter = _thePromoters.get(NumericPrecision.DOUBLE); 166 } 167 } 168 169 public Variant( final short aValue ) 170 { 171 this(new ShortPrimitive(aValue)); 172 } 173 174 public Variant( final String aValue ) 175 { 176 this(new TextPrimitive(aValue)); 177 } 178 179 private final boolean hasModulo() 180 { 181 if (this._theFactories[NumericPrecision.INTEGER.ordinal()] instanceof Getter) { 182 final Factory aFactory = this._theFactories[NumericPrecision.INTEGER.ordinal()]; 183 final Primitive<?> anInteger = aFactory.get(this, 184 NumericPrecision.INTEGER); 185 final Domain aDomain = anInteger.getDomain(); 186 return aDomain == Domain.MODULO; 187 } 188 return false; 189 } 190 191 private final Primitive<?> setPrecision( final NumericPrecision prec ) 192 { 193 this._thePromoter = _thePromoters.get(prec); 194 return this.setTarget(this._theFactories[prec.ordinal()].get(this, prec)); 195 } 196 197 private final Primitive<?> setTarget( final Primitive<?> aTarget ) 198 { 199 return this._theTarget = aTarget; 200 } 201 202 @Override 203 public final Variant absoluteValue() throws UnsupportedOperationException 204 { 205 if (this.getDomain() == Domain.TEXT) { 206 final ControlIntention ci = this.getRealTranslator().reactToText( 207 this.toString(), this); 208 if (ci == ControlIntention.REJECT) { 209 this.assertPrecision(NumericPrecision.INTEGER); 210 } 211 } 212 this.getTarget().absoluteValue(); 213 return this; 214 } 215 216 @Override 217 public final Variant and( final BigInteger aValue ) 218 throws UnsupportedOperationException, 219 IllegalArgumentException, 220 ArithmeticException 221 { 222 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 223 this.getTarget().and(aValue); 224 return this; 225 } 226 227 @Override 228 public final Variant and( final boolean aValue ) 229 throws UnsupportedOperationException, 230 IllegalArgumentException, 231 ArithmeticException 232 { 233 this.assertPrecision(NumericPrecision.BIT); 234 this.getTarget().and(aValue); 235 return this; 236 } 237 238 @Override 239 public final Variant and( final byte aValue ) 240 throws UnsupportedOperationException, 241 IllegalArgumentException, 242 ArithmeticException 243 { 244 this.assertPrecision(NumericPrecision.BYTE); 245 this.getTarget().and(aValue); 246 return this; 247 } 248 249 @Override 250 public final Variant and( final char aValue ) 251 throws UnsupportedOperationException, 252 IllegalArgumentException, 253 ArithmeticException 254 { 255 this.assertPrecision(NumericPrecision.CHARACTER); 256 this.getTarget().and(aValue); 257 return this; 258 } 259 260 @Override 261 public final Variant and( final int aValue ) 262 throws UnsupportedOperationException, 263 IllegalArgumentException, 264 ArithmeticException 265 { 266 this.assertPrecision(NumericPrecision.INTEGER); 267 this.getTarget().and(aValue); 268 return this; 269 } 270 271 @Override 272 public final Variant and( final long aValue ) 273 throws UnsupportedOperationException, 274 IllegalArgumentException, 275 ArithmeticException 276 { 277 this.assertPrecision(NumericPrecision.LONG); 278 this.getTarget().and(aValue); 279 return this; 280 } 281 282 @Override 283 public final Variant and( final short aValue ) 284 throws UnsupportedOperationException, 285 IllegalArgumentException, 286 ArithmeticException 287 { 288 this.assertPrecision(NumericPrecision.SHORT); 289 this.getTarget().and(aValue); 290 return this; 291 } 292 293 @Override 294 public final Variant angleWith( final double aValue ) 295 throws UnsupportedOperationException, 296 IllegalArgumentException, 297 ArithmeticException 298 { 299 this.assertPrecision(NumericPrecision.DOUBLE); 300 this.getTarget().angleWith(aValue); 301 return this; 302 } 303 304 @Override 305 public final Variant append( final boolean aValue ) 306 throws UnsupportedOperationException 307 { 308 this._thePromoter.asString(this).append(aValue); 309 return this; 310 } 311 312 @Override 313 public final Variant append( final char c ) 314 throws UnsupportedOperationException 315 { 316 this._thePromoter.asString(this).append(c); 317 return this; 318 } 319 320 @Override 321 public final Variant append( final char[] content ) 322 throws UnsupportedOperationException 323 { 324 this._thePromoter.asString(this).append(content); 325 return this; 326 } 327 328 @Override 329 public final Variant append( final char[] content, final int contentIndex ) 330 throws UnsupportedOperationException 331 { 332 this._thePromoter.asString(this).append(content, contentIndex); 333 return this; 334 } 335 336 @Override 337 public final Variant append( 338 final char[] content, 339 final int contentIndex, 340 final int contentLength ) throws UnsupportedOperationException 341 { 342 this._thePromoter.asString(this).append(content, contentIndex, 343 contentLength); 344 return this; 345 } 346 347 @Override 348 public final Variant append( final CharSequence s ) 349 throws UnsupportedOperationException 350 { 351 this._thePromoter.asString(this).append(s); 352 return this; 353 } 354 355 @Override 356 public final Variant append( 357 final CharSequence content, 358 final int contentStartIndex ) throws UnsupportedOperationException 359 { 360 this._thePromoter.asString(this).append(content, contentStartIndex); 361 return this; 362 } 363 364 @Override 365 public final Variant append( 366 final CharSequence s, 367 final int start, 368 final int end ) throws UnsupportedOperationException 369 { 370 this._thePromoter.asString(this).append(s, start, end); 371 return this; 372 } 373 374 @Override 375 public final Variant append( final double aValue ) 376 throws UnsupportedOperationException 377 { 378 this._thePromoter.asString(this).append(aValue); 379 return this; 380 } 381 382 @Override 383 public final Variant append( final float aValue ) 384 throws UnsupportedOperationException 385 { 386 this._thePromoter.asString(this).append(aValue); 387 return this; 388 } 389 390 @Override 391 public final Variant append( final int aValue ) 392 throws UnsupportedOperationException 393 { 394 this._thePromoter.asString(this).append(aValue); 395 return this; 396 } 397 398 @Override 399 public final Variant append( final long aValue ) 400 throws UnsupportedOperationException 401 { 402 this._thePromoter.asString(this).append(aValue); 403 return this; 404 } 405 406 @Override 407 public final Variant append( final Object aValue ) 408 throws UnsupportedOperationException 409 { 410 this._thePromoter.asString(this).append(aValue); 411 return this; 412 } 413 414 @Override 415 public final Variant append( final StringBuffer sb ) 416 throws UnsupportedOperationException 417 { 418 this._thePromoter.asString(this).append(sb); 419 return this; 420 } 421 422 @Override 423 public final Variant appendCodePoint( final int codePoint ) 424 throws UnsupportedOperationException 425 { 426 this._thePromoter.asString(this).appendCodePoint(codePoint); 427 return this; 428 } 429 430 @Override 431 public final Variant arcCosine() 432 throws UnsupportedOperationException, 433 IllegalArgumentException, 434 ArithmeticException 435 { 436 this.assertPrecision(NumericPrecision.DOUBLE); 437 this.getTarget().arcCosine(); 438 return this; 439 } 440 441 @Override 442 public final Variant arcSine() 443 throws UnsupportedOperationException, 444 IllegalArgumentException, 445 ArithmeticException 446 { 447 this.assertPrecision(NumericPrecision.DOUBLE); 448 this.getTarget().arcSine(); 449 return this; 450 } 451 452 @Override 453 public final Variant arcTangent() 454 throws UnsupportedOperationException, 455 IllegalArgumentException, 456 ArithmeticException 457 { 458 this.assertPrecision(NumericPrecision.DOUBLE); 459 this.getTarget().arcTangent(); 460 return this; 461 } 462 463 @Override 464 public final Variant assertDomain( final Domain aDomain ) 465 { 466 final Domain myDomain = this.getDomain(); 467 if (myDomain == aDomain) return this; 468 final NumericPrecision myPrecision = this.getPrecision(); 469 switch (aDomain) { 470 case EMPTY: 471 if (myPrecision != NumericPrecision.NULL) 472 return this.assertPrecision(NumericPrecision.NULL); 473 break; 474 case MODULO: 475 if (this.hasModulo()) { 476 this.assertPrecision(NumericPrecision.INTEGER); 477 } else { 478 final Primitive<?> aModulo = new ModuloIntegerPrimitive( 479 this.intValue(), this.intValue()); 480 this._theTargets[NumericPrecision.INTEGER.ordinal()] = aModulo; 481 this._thePromoter = _thePromoters.get(NumericPrecision.INTEGER); 482 this._theFactories[NumericPrecision.INTEGER.ordinal()] = Getter.INSTANCE; 483 this.setTarget(aModulo); 484 } 485 break; 486 case COMPLEX: 487 case IMAGINARY: 488 case REAL: 489 switch (myDomain) { 490 case REAL: 491 case MODULO: 492 break; 493 default: 494 if (!myPrecision.isNumeric()) { 495 final ControlIntention ci = this.getRealTranslator().reactToText( 496 this.toString(), this); 497 if (ci == ControlIntention.REJECT) { 498 this.assertPrecision(NumericPrecision.INTEGER); 499 } 500 } 501 break; 502 } 503 break; 504 default: 505 if (myPrecision != NumericPrecision.UNKNOWN) 506 return this.assertPrecision(NumericPrecision.UNKNOWN); 507 break; 508 } 509 return this; 510 } 511 512 @Override 513 public final Variant assertPrecision( final NumericPrecision prec ) 514 { 515 if (this.getPrecision() != prec) { 516 final Primitive<?> accOld = this.getTarget(); 517 this.setPrecision(prec); 518 final Primitive<?> accNew = this.getTarget(); 519 if (accOld != accNew) { 520 if (accNew.isMutable()) { 521 accNew.setPrimitive(accOld); 522 } 523 } 524 } 525 return this; 526 } 527 528 @Override 529 public final Variant base10Log() 530 throws UnsupportedOperationException, 531 IllegalArgumentException, 532 ArithmeticException 533 { 534 this.assertPrecision(NumericPrecision.DOUBLE); 535 this.getTarget().base10Log(); 536 return this; 537 } 538 539 @Override 540 public final Variant copy() 541 { 542 final Primitive<?> aTarget = this._theTarget; 543 if (aTarget == null) return new Variant(); 544 return new Variant(aTarget.copy()); 545 } 546 547 @Override 548 public final Variant copyUsing( final BigDecimal aValue ) 549 { 550 return new Variant(aValue); 551 } 552 553 @Override 554 public final Variant copyUsing( final BigInteger aValue ) 555 { 556 return new Variant(aValue); 557 } 558 559 @Override 560 public final Variant copyUsing( final boolean aValue ) 561 { 562 return new Variant(aValue); 563 } 564 565 @Override 566 public final Variant copyUsing( final byte aValue ) 567 { 568 return new Variant(aValue); 569 } 570 571 @Override 572 public final Variant copyUsing( final char aValue ) 573 { 574 return new Variant(aValue); 575 } 576 577 @Override 578 public final Variant copyUsing( final double aValue ) 579 { 580 return new Variant(aValue); 581 } 582 583 @Override 584 public final Variant copyUsing( final float aValue ) 585 { 586 return new Variant(aValue); 587 } 588 589 @Override 590 public final Variant copyUsing( final int aValue ) 591 { 592 return new Variant(aValue); 593 } 594 595 @Override 596 public final Variant copyUsing( final long aValue ) 597 { 598 return new Variant(aValue); 599 } 600 601 @Override 602 public final Variant copyUsing( final short aValue ) 603 { 604 return new Variant(aValue); 605 } 606 607 @Override 608 public final Variant copyUsingPrimitive( final SealedPrimitive<?> aValue ) 609 { 610 return valueOfPrimitive(aValue); 611 } 612 613 @Override 614 public final Variant copyUsingReal( final SealedReal<?> aValue ) 615 { 616 return valueOfReal(aValue); 617 } 618 619 @Override 620 public final Variant copyUsingScalar( final SealedScalar<?> aValue ) 621 { 622 return valueOfScalar(aValue); 623 } 624 625 @Override 626 public final Variant copyUsingText( final CharSequence aValue ) 627 { 628 return new Variant(aValue.toString()); 629 } 630 631 @Override 632 public final Variant cosine() 633 throws UnsupportedOperationException, 634 IllegalArgumentException, 635 ArithmeticException 636 { 637 this.assertPrecision(NumericPrecision.DOUBLE); 638 this.getTarget().cosine(); 639 return this; 640 } 641 642 @Override 643 public final Variant cube() 644 throws UnsupportedOperationException, 645 IllegalArgumentException, 646 ArithmeticException 647 { 648 this.assertDomain(Domain.REAL); 649 this.getTarget().cube(); 650 return this; 651 } 652 653 @Override 654 public final Variant cubeRoot() 655 throws UnsupportedOperationException, 656 IllegalArgumentException, 657 ArithmeticException 658 { 659 this.assertPrecision(NumericPrecision.DOUBLE); 660 this.getTarget().cubeRoot(); 661 return this; 662 } 663 664 @Override 665 public final Variant decrement() 666 throws UnsupportedOperationException, 667 IllegalArgumentException, 668 ArithmeticException 669 { 670 this.assertDomain(Domain.REAL); 671 this.getTarget().decrement(); 672 return this; 673 } 674 675 @Override 676 public final Variant degrees() 677 throws UnsupportedOperationException, 678 IllegalArgumentException, 679 ArithmeticException 680 { 681 this.assertPrecision(NumericPrecision.DOUBLE); 682 this.getTarget().degrees(); 683 return this; 684 } 685 686 @Override 687 public final Variant delete( final int start, final int end ) 688 throws UnsupportedOperationException 689 { 690 this._thePromoter.asString(this).delete(start, end); 691 return this; 692 } 693 694 @Override 695 public final Variant deleteCharAt( final int anIndex ) 696 throws UnsupportedOperationException 697 { 698 this._thePromoter.asString(this).deleteCharAt(anIndex); 699 return this; 700 } 701 702 @Override 703 public final Variant difference( final BigDecimal aValue ) 704 throws UnsupportedOperationException, 705 IllegalArgumentException, 706 ArithmeticException 707 { 708 this.assertPrecision(NumericPrecision.UNLIMITED_DECIMAL); 709 this.getTarget().difference(aValue); 710 return this; 711 } 712 713 @Override 714 public final Variant difference( final BigInteger aValue ) 715 throws UnsupportedOperationException, 716 IllegalArgumentException, 717 ArithmeticException 718 { 719 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 720 this.getTarget().difference(aValue); 721 return this; 722 } 723 724 @Override 725 public final Variant difference( final boolean aValue ) 726 throws UnsupportedOperationException, 727 IllegalArgumentException, 728 ArithmeticException 729 { 730 this.assertPrecision(NumericPrecision.BIT); 731 this.getTarget().difference(aValue); 732 return this; 733 } 734 735 @Override 736 public final Variant difference( final byte aValue ) 737 throws UnsupportedOperationException, 738 IllegalArgumentException, 739 ArithmeticException 740 { 741 this.assertPrecision(NumericPrecision.BYTE); 742 this.getTarget().difference(aValue); 743 return this; 744 } 745 746 @Override 747 public final Variant difference( final char aValue ) 748 throws UnsupportedOperationException, 749 IllegalArgumentException, 750 ArithmeticException 751 { 752 this.assertPrecision(NumericPrecision.CHARACTER); 753 this.getTarget().difference(aValue); 754 return this; 755 } 756 757 @Override 758 public final Variant difference( final double aValue ) 759 throws UnsupportedOperationException, 760 IllegalArgumentException, 761 ArithmeticException 762 { 763 this.assertPrecision(NumericPrecision.DOUBLE); 764 this.getTarget().difference(aValue); 765 return this; 766 } 767 768 @Override 769 public final Variant difference( final float aValue ) 770 throws UnsupportedOperationException, 771 IllegalArgumentException, 772 ArithmeticException 773 { 774 this.assertPrecision(NumericPrecision.FLOAT); 775 this.getTarget().difference(aValue); 776 return this; 777 } 778 779 @Override 780 public final Variant difference( final int aValue ) 781 throws UnsupportedOperationException, 782 IllegalArgumentException, 783 ArithmeticException 784 { 785 this.assertPrecision(NumericPrecision.INTEGER); 786 this.getTarget().difference(aValue); 787 return this; 788 } 789 790 @Override 791 public final Variant difference( final long aValue ) 792 throws UnsupportedOperationException, 793 IllegalArgumentException, 794 ArithmeticException 795 { 796 this.assertPrecision(NumericPrecision.LONG); 797 this.getTarget().difference(aValue); 798 return this; 799 } 800 801 @Override 802 public final Variant difference( final short aValue ) 803 throws UnsupportedOperationException, 804 IllegalArgumentException, 805 ArithmeticException 806 { 807 this.assertPrecision(NumericPrecision.SHORT); 808 this.getTarget().difference(aValue); 809 return this; 810 } 811 812 @Override 813 public final Variant exponential() 814 throws UnsupportedOperationException, 815 IllegalArgumentException, 816 ArithmeticException 817 { 818 this.assertPrecision(NumericPrecision.DOUBLE); 819 this.getTarget().exponential(); 820 return this; 821 } 822 823 @Override 824 public final Variant exponentialLessOne() 825 throws UnsupportedOperationException, 826 IllegalArgumentException, 827 ArithmeticException 828 { 829 this.assertPrecision(NumericPrecision.DOUBLE); 830 this.getTarget().exponentialLessOne(); 831 return this; 832 } 833 834 @Override 835 public final Variant gcd( final BigInteger aValue ) 836 throws UnsupportedOperationException, 837 ArithmeticException, 838 IllegalArgumentException 839 { 840 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 841 this.getTarget().gcd(aValue); 842 return this; 843 } 844 845 @Override 846 public final Variant gcd( final byte aValue ) 847 throws UnsupportedOperationException, 848 ArithmeticException, 849 IllegalArgumentException 850 { 851 this.assertPrecision(NumericPrecision.BYTE); 852 this.getTarget().gcd(aValue); 853 return this; 854 } 855 856 @Override 857 public final Variant gcd( final char aValue ) 858 throws UnsupportedOperationException, 859 ArithmeticException, 860 IllegalArgumentException 861 { 862 this.assertPrecision(NumericPrecision.CHARACTER); 863 this.getTarget().gcd(aValue); 864 return this; 865 } 866 867 @Override 868 public final Variant gcd( final int aValue ) 869 throws UnsupportedOperationException, 870 ArithmeticException, 871 IllegalArgumentException 872 { 873 this.assertPrecision(NumericPrecision.INTEGER); 874 this.getTarget().gcd(aValue); 875 return this; 876 } 877 878 @Override 879 public final Variant gcd( final long aValue ) 880 throws UnsupportedOperationException, 881 ArithmeticException, 882 IllegalArgumentException 883 { 884 this.assertPrecision(NumericPrecision.LONG); 885 this.getTarget().gcd(aValue); 886 return this; 887 } 888 889 @Override 890 public final Variant gcd( final short aValue ) 891 throws UnsupportedOperationException, 892 ArithmeticException, 893 IllegalArgumentException 894 { 895 this.assertPrecision(NumericPrecision.SHORT); 896 this.getTarget().gcd(aValue); 897 return this; 898 } 899 900 public final PrimitiveAction<Primitive<?>> getRealTranslator() 901 { 902 return this._theRealTranslator; 903 } 904 905 @Override 906 public final Primitive<?> getTarget() 907 { 908 return this._theTarget; 909 } 910 911 @Override 912 public final Variant hyperbolicCosine() 913 throws UnsupportedOperationException, 914 IllegalArgumentException, 915 ArithmeticException 916 { 917 this.assertPrecision(NumericPrecision.DOUBLE); 918 this.getTarget().hyperbolicCosine(); 919 return this; 920 } 921 922 @Override 923 public final Variant hyperbolicSine() 924 throws UnsupportedOperationException, 925 IllegalArgumentException, 926 ArithmeticException 927 { 928 this.assertPrecision(NumericPrecision.DOUBLE); 929 this.getTarget().hyperbolicSine(); 930 return this; 931 } 932 933 @Override 934 public final Variant hyperbolicTangent() 935 throws UnsupportedOperationException, 936 IllegalArgumentException, 937 ArithmeticException 938 { 939 this.assertPrecision(NumericPrecision.DOUBLE); 940 this.getTarget().hyperbolicTangent(); 941 return this; 942 } 943 944 @Override 945 public final Variant increment() 946 throws UnsupportedOperationException, 947 ArithmeticException, 948 IllegalArgumentException 949 { 950 this.assertDomain(Domain.REAL); 951 this.getTarget().increment(); 952 return this; 953 } 954 955 @Override 956 public final Variant insert( final int anIndex, final boolean aValue ) 957 throws UnsupportedOperationException 958 { 959 this._thePromoter.asString(this).insert(anIndex, aValue); 960 return this; 961 } 962 963 @Override 964 public final Variant insert( final int anIndex, final char aValue ) 965 throws UnsupportedOperationException 966 { 967 this._thePromoter.asString(this).insert(anIndex, aValue); 968 return this; 969 } 970 971 @Override 972 public final Variant insert( final int anIndex, final char[] content ) 973 throws UnsupportedOperationException 974 { 975 this._thePromoter.asString(this).insert(anIndex, content); 976 return this; 977 } 978 979 @Override 980 public final Variant insert( 981 final int targetIndex, 982 final char[] content, 983 final int contentIndex, 984 final int contentLength ) throws UnsupportedOperationException 985 { 986 this._thePromoter.asString(this).insert(targetIndex, content, 987 contentIndex, contentLength); 988 return this; 989 } 990 991 @Override 992 public final Variant insert( final int anIndex, final CharSequence content ) 993 throws UnsupportedOperationException 994 { 995 this._thePromoter.asString(this).insert(anIndex, content); 996 return this; 997 } 998 999 @Override 1000 public final Variant insert( 1001 final int targetIndex, 1002 final CharSequence content, 1003 final int contentIndex ) throws UnsupportedOperationException 1004 { 1005 this._thePromoter.asString(this).insert(targetIndex, content, 1006 contentIndex); 1007 return this; 1008 } 1009 1010 @Override 1011 public final Variant insert( 1012 final int targetIndex, 1013 final CharSequence content, 1014 final int contentStartIndex, 1015 final int contentEndIndexPlusOne ) throws UnsupportedOperationException 1016 { 1017 this._thePromoter.asString(this).insert(targetIndex, content, 1018 contentStartIndex, contentEndIndexPlusOne); 1019 return this; 1020 } 1021 1022 @Override 1023 public final Variant insert( final int anIndex, final double aValue ) 1024 throws UnsupportedOperationException 1025 { 1026 this._thePromoter.asString(this).insert(anIndex, aValue); 1027 return this; 1028 } 1029 1030 @Override 1031 public final Variant insert( final int anIndex, final float aValue ) 1032 throws UnsupportedOperationException 1033 { 1034 this._thePromoter.asString(this).insert(anIndex, aValue); 1035 return this; 1036 } 1037 1038 @Override 1039 public final Variant insert( final int anIndex, final int aValue ) 1040 throws UnsupportedOperationException 1041 { 1042 this._thePromoter.asString(this).insert(anIndex, aValue); 1043 return this; 1044 } 1045 1046 @Override 1047 public final Variant insert( final int anIndex, final long aValue ) 1048 throws UnsupportedOperationException 1049 { 1050 this._thePromoter.asString(this).insert(anIndex, aValue); 1051 return this; 1052 } 1053 1054 @Override 1055 public final Variant insert( final int anIndex, final Object aValue ) 1056 throws UnsupportedOperationException 1057 { 1058 this._thePromoter.asString(this).insert(anIndex, aValue); 1059 return this; 1060 } 1061 1062 @Override 1063 public final Variant invalidate() throws UnsupportedOperationException 1064 { 1065 this.setPrecision(NumericPrecision.NULL); 1066 return this; 1067 } 1068 1069 @Override 1070 public final Variant inverse() throws UnsupportedOperationException 1071 { 1072 this.assertPrecision(this.getPrecision().toFloatingPoint()); 1073 this.getTarget().inverse(); 1074 return this; 1075 } 1076 1077 @Override 1078 public boolean isConfigurable() 1079 { 1080 return true; 1081 } 1082 1083 @Override 1084 public final Variant lowerCase() throws UnsupportedOperationException 1085 { 1086 this._thePromoter.asString(this).lowerCase(); 1087 return this; 1088 } 1089 1090 @Override 1091 public final Variant mod( final BigDecimal aValue ) 1092 throws UnsupportedOperationException, 1093 IllegalArgumentException, 1094 ArithmeticException 1095 { 1096 this.assertPrecision(NumericPrecision.UNLIMITED_DECIMAL); 1097 this.getTarget().mod(aValue); 1098 return this; 1099 } 1100 1101 @Override 1102 public final Variant mod( final BigInteger aValue ) 1103 throws UnsupportedOperationException, 1104 IllegalArgumentException, 1105 ArithmeticException 1106 { 1107 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 1108 this.getTarget().mod(aValue); 1109 return this; 1110 } 1111 1112 @Override 1113 public final Variant mod( final boolean aValue ) 1114 throws UnsupportedOperationException, 1115 IllegalArgumentException, 1116 ArithmeticException 1117 { 1118 this.assertPrecision(NumericPrecision.BIT); 1119 this.getTarget().mod(aValue); 1120 return this; 1121 } 1122 1123 @Override 1124 public final Variant mod( final byte aValue ) 1125 throws UnsupportedOperationException, 1126 IllegalArgumentException, 1127 ArithmeticException 1128 { 1129 this.assertPrecision(NumericPrecision.BYTE); 1130 this.getTarget().mod(aValue); 1131 return this; 1132 } 1133 1134 @Override 1135 public final Variant mod( final char aValue ) 1136 throws UnsupportedOperationException, 1137 IllegalArgumentException, 1138 ArithmeticException 1139 { 1140 this.assertPrecision(NumericPrecision.CHARACTER); 1141 this.getTarget().mod(aValue); 1142 return this; 1143 } 1144 1145 @Override 1146 public final Variant mod( final double aValue ) 1147 throws UnsupportedOperationException, 1148 IllegalArgumentException, 1149 ArithmeticException 1150 { 1151 this.assertPrecision(NumericPrecision.DOUBLE); 1152 this.getTarget().mod(aValue); 1153 return this; 1154 } 1155 1156 @Override 1157 public final Variant mod( final float aValue ) 1158 throws UnsupportedOperationException, 1159 IllegalArgumentException, 1160 ArithmeticException 1161 { 1162 this.assertPrecision(NumericPrecision.FLOAT); 1163 this.getTarget().mod(aValue); 1164 return this; 1165 } 1166 1167 @Override 1168 public final Variant mod( final int aValue ) 1169 throws UnsupportedOperationException, 1170 IllegalArgumentException, 1171 ArithmeticException 1172 { 1173 this.assertPrecision(NumericPrecision.INTEGER); 1174 this.getTarget().mod(aValue); 1175 return this; 1176 } 1177 1178 @Override 1179 public final Variant mod( final long aValue ) 1180 throws UnsupportedOperationException, 1181 IllegalArgumentException, 1182 ArithmeticException 1183 { 1184 this.assertPrecision(NumericPrecision.LONG); 1185 this.getTarget().mod(aValue); 1186 return this; 1187 } 1188 1189 @Override 1190 public final Variant mod( final short aValue ) 1191 throws UnsupportedOperationException, 1192 IllegalArgumentException, 1193 ArithmeticException 1194 { 1195 this.assertPrecision(NumericPrecision.SHORT); 1196 this.getTarget().mod(aValue); 1197 return this; 1198 } 1199 1200 @Override 1201 public final Variant naturalLog() 1202 throws UnsupportedOperationException, 1203 IllegalArgumentException, 1204 ArithmeticException 1205 { 1206 this.assertPrecision(NumericPrecision.DOUBLE); 1207 this.getTarget().naturalLog(); 1208 return this; 1209 } 1210 1211 @Override 1212 public final Variant naturalLogPlusOne() 1213 throws UnsupportedOperationException, 1214 IllegalArgumentException, 1215 ArithmeticException 1216 { 1217 this.assertPrecision(NumericPrecision.DOUBLE); 1218 this.getTarget().naturalLogPlusOne(); 1219 return this; 1220 } 1221 1222 @Override 1223 public final Variant negate() throws UnsupportedOperationException 1224 { 1225 this.assertDomain(Domain.REAL); 1226 switch (this.getPrecision()) { 1227 case CHARACTER: 1228 this.assertPrecision(NumericPrecision.INTEGER); 1229 default: 1230 this.getTarget().negate(); 1231 break; 1232 } 1233 return this; 1234 } 1235 1236 @Override 1237 public final Variant not() throws UnsupportedOperationException 1238 { 1239 if (this.getDomain() == Domain.TEXT) { 1240 this.getRealTranslator().reactToText(this.toString(), this); 1241 final ControlIntention ci = this.getRealTranslator().reactToText( 1242 this.toString(), this); 1243 if (ci == ControlIntention.REJECT) { 1244 this.assertPrecision(NumericPrecision.INTEGER); 1245 } 1246 } 1247 switch (this.getPrecision()) { 1248 case NULL: 1249 this.assertPrecision(NumericPrecision.INTEGER); 1250 break; 1251 case FLOAT: 1252 case DOUBLE: 1253 this.assertPrecision(NumericPrecision.LONG); 1254 break; 1255 case UNLIMITED_DECIMAL: 1256 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 1257 break; 1258 } 1259 this.getTarget().not(); 1260 return this; 1261 } 1262 1263 @Override 1264 public final Variant or( final BigInteger aValue ) 1265 throws UnsupportedOperationException, 1266 IllegalArgumentException, 1267 ArithmeticException 1268 { 1269 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 1270 this.getTarget().or(aValue); 1271 return this; 1272 } 1273 1274 @Override 1275 public final Variant or( final boolean aValue ) 1276 throws UnsupportedOperationException, 1277 IllegalArgumentException, 1278 ArithmeticException 1279 { 1280 this.assertPrecision(NumericPrecision.BIT); 1281 this.getTarget().or(aValue); 1282 return this; 1283 } 1284 1285 @Override 1286 public final Variant or( final byte aValue ) 1287 throws UnsupportedOperationException, 1288 IllegalArgumentException, 1289 ArithmeticException 1290 { 1291 this.assertPrecision(NumericPrecision.BYTE); 1292 this.getTarget().or(aValue); 1293 return this; 1294 } 1295 1296 @Override 1297 public final Variant or( final char aValue ) 1298 throws UnsupportedOperationException, 1299 IllegalArgumentException, 1300 ArithmeticException 1301 { 1302 this.assertPrecision(NumericPrecision.CHARACTER); 1303 this.getTarget().or(aValue); 1304 return this; 1305 } 1306 1307 @Override 1308 public final Variant or( final int aValue ) 1309 throws UnsupportedOperationException, 1310 IllegalArgumentException, 1311 ArithmeticException 1312 { 1313 this.assertPrecision(NumericPrecision.INTEGER); 1314 this.getTarget().or(aValue); 1315 return this; 1316 } 1317 1318 @Override 1319 public final Variant or( final long aValue ) 1320 throws UnsupportedOperationException, 1321 IllegalArgumentException, 1322 ArithmeticException 1323 { 1324 this.assertPrecision(NumericPrecision.LONG); 1325 this.getTarget().or(aValue); 1326 return this; 1327 } 1328 1329 @Override 1330 public final Variant or( final short aValue ) 1331 throws UnsupportedOperationException, 1332 IllegalArgumentException, 1333 ArithmeticException 1334 { 1335 this.assertPrecision(NumericPrecision.SHORT); 1336 this.getTarget().or(aValue); 1337 return this; 1338 } 1339 1340 @Override 1341 public final Variant power( final double n ) 1342 throws UnsupportedOperationException, 1343 IllegalArgumentException, 1344 ArithmeticException 1345 { 1346 this.assertDomain(Domain.REAL); 1347 this.getTarget().power(n); 1348 return this; 1349 } 1350 1351 @Override 1352 public final Variant power( final int n ) 1353 throws UnsupportedOperationException, 1354 IllegalArgumentException, 1355 ArithmeticException 1356 { 1357 this.assertDomain(Domain.REAL); 1358 this.getTarget().power(n); 1359 return this; 1360 } 1361 1362 @Override 1363 public final Variant prepend( final boolean aValue ) 1364 throws UnsupportedOperationException 1365 { 1366 this._thePromoter.asString(this).prepend(aValue); 1367 return this; 1368 } 1369 1370 @Override 1371 public final Variant prepend( final char aValue ) 1372 throws UnsupportedOperationException 1373 { 1374 this._thePromoter.asString(this).prepend(aValue); 1375 return this; 1376 } 1377 1378 @Override 1379 public final Variant prepend( final char[] content ) 1380 throws UnsupportedOperationException 1381 { 1382 this._thePromoter.asString(this).prepend(content); 1383 return this; 1384 } 1385 1386 @Override 1387 public final Variant prepend( final char[] content, final int contentIndex ) 1388 throws UnsupportedOperationException 1389 { 1390 this._thePromoter.asString(this).prepend(content, contentIndex); 1391 return this; 1392 } 1393 1394 @Override 1395 public final Variant prepend( 1396 final char[] content, 1397 final int contentIndex, 1398 final int contentLength ) throws UnsupportedOperationException 1399 { 1400 this._thePromoter.asString(this).prepend(content, contentIndex, 1401 contentLength); 1402 return this; 1403 } 1404 1405 @Override 1406 public final Variant prepend( final CharSequence content ) 1407 throws UnsupportedOperationException 1408 { 1409 this._thePromoter.asString(this).prepend(content); 1410 return this; 1411 } 1412 1413 @Override 1414 public final Variant prepend( 1415 final CharSequence content, 1416 final int contentIndex ) throws UnsupportedOperationException 1417 { 1418 this._thePromoter.asString(this).prepend(content, contentIndex); 1419 return this; 1420 } 1421 1422 @Override 1423 public final Variant prepend( 1424 final CharSequence content, 1425 final int contentStartIndex, 1426 final int contentEndIndexPlusOne ) throws UnsupportedOperationException 1427 { 1428 this._thePromoter.asString(this).prepend(content, contentStartIndex, 1429 contentEndIndexPlusOne); 1430 return this; 1431 } 1432 1433 @Override 1434 public final Variant prepend( final double aValue ) 1435 throws UnsupportedOperationException 1436 { 1437 this._thePromoter.asString(this).prepend(aValue); 1438 return this; 1439 } 1440 1441 @Override 1442 public final Variant prepend( final float aValue ) 1443 throws UnsupportedOperationException 1444 { 1445 this._thePromoter.asString(this).prepend(aValue); 1446 return this; 1447 } 1448 1449 @Override 1450 public final Variant prepend( final int aValue ) 1451 throws UnsupportedOperationException 1452 { 1453 this._thePromoter.asString(this).prepend(aValue); 1454 return this; 1455 } 1456 1457 @Override 1458 public final Variant prepend( final long aValue ) 1459 throws UnsupportedOperationException 1460 { 1461 this._thePromoter.asString(this).prepend(aValue); 1462 return this; 1463 } 1464 1465 @Override 1466 public final Variant prepend( final Object aValue ) 1467 throws UnsupportedOperationException 1468 { 1469 this._thePromoter.asString(this).prepend(aValue); 1470 return this; 1471 } 1472 1473 @Override 1474 public final Variant product( final BigDecimal aValue ) 1475 throws UnsupportedOperationException, 1476 IllegalArgumentException, 1477 ArithmeticException 1478 { 1479 this.assertPrecision(NumericPrecision.UNLIMITED_DECIMAL); 1480 this.getTarget().product(aValue); 1481 return this; 1482 } 1483 1484 @Override 1485 public final Variant product( final BigInteger aValue ) 1486 throws UnsupportedOperationException, 1487 IllegalArgumentException, 1488 ArithmeticException 1489 { 1490 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 1491 this.getTarget().product(aValue); 1492 return this; 1493 } 1494 1495 @Override 1496 public final Variant product( final boolean aValue ) 1497 throws UnsupportedOperationException, 1498 IllegalArgumentException, 1499 ArithmeticException 1500 { 1501 this.assertPrecision(NumericPrecision.BIT); 1502 this.getTarget().product(aValue); 1503 return this; 1504 } 1505 1506 @Override 1507 public final Variant product( final byte aValue ) 1508 throws UnsupportedOperationException, 1509 IllegalArgumentException, 1510 ArithmeticException 1511 { 1512 this.assertPrecision(NumericPrecision.BYTE); 1513 this.getTarget().product(aValue); 1514 return this; 1515 } 1516 1517 @Override 1518 public final Variant product( final char aValue ) 1519 throws UnsupportedOperationException, 1520 IllegalArgumentException, 1521 ArithmeticException 1522 { 1523 this.assertPrecision(NumericPrecision.CHARACTER); 1524 this.getTarget().product(aValue); 1525 return this; 1526 } 1527 1528 @Override 1529 public final Variant product( final double aValue ) 1530 throws UnsupportedOperationException, 1531 IllegalArgumentException, 1532 ArithmeticException 1533 { 1534 this.assertPrecision(NumericPrecision.DOUBLE); 1535 this.getTarget().product(aValue); 1536 return this; 1537 } 1538 1539 @Override 1540 public final Variant product( final float aValue ) 1541 throws UnsupportedOperationException, 1542 IllegalArgumentException, 1543 ArithmeticException 1544 { 1545 this.assertPrecision(NumericPrecision.FLOAT); 1546 this.getTarget().product(aValue); 1547 return this; 1548 } 1549 1550 @Override 1551 public final Variant product( final int aValue ) 1552 throws UnsupportedOperationException, 1553 IllegalArgumentException, 1554 ArithmeticException 1555 { 1556 this.assertPrecision(NumericPrecision.INTEGER); 1557 this.getTarget().product(aValue); 1558 return this; 1559 } 1560 1561 @Override 1562 public final Variant product( final long aValue ) 1563 throws UnsupportedOperationException, 1564 IllegalArgumentException, 1565 ArithmeticException 1566 { 1567 this.assertPrecision(NumericPrecision.LONG); 1568 this.getTarget().product(aValue); 1569 return this; 1570 } 1571 1572 @Override 1573 public final Variant product( final short aValue ) 1574 throws UnsupportedOperationException, 1575 IllegalArgumentException, 1576 ArithmeticException 1577 { 1578 this.assertPrecision(NumericPrecision.SHORT); 1579 this.getTarget().product(aValue); 1580 return this; 1581 } 1582 1583 @Override 1584 public final Variant promoteTo( final NumericPrecision prec ) 1585 { 1586 switch (prec) { 1587 case BIT: 1588 this._thePromoter.asBoolean(this); 1589 break; 1590 case BYTE: 1591 this._thePromoter.asByte(this); 1592 break; 1593 case SHORT: 1594 this._thePromoter.asShort(this); 1595 break; 1596 case CHARACTER: 1597 this._thePromoter.asCharacter(this); 1598 break; 1599 case INTEGER: 1600 this._thePromoter.asInteger(this); 1601 break; 1602 case LONG: 1603 this._thePromoter.asLong(this); 1604 break; 1605 case FLOAT: 1606 this._thePromoter.asFloat(this); 1607 break; 1608 case DOUBLE: 1609 this._thePromoter.asDouble(this); 1610 break; 1611 case UNLIMITED_INTEGER: 1612 this._thePromoter.asUnlimitedInteger(this); 1613 break; 1614 case UNLIMITED_DECIMAL: 1615 this._thePromoter.asUnlimitedDecimal(this); 1616 break; 1617 } 1618 return this; 1619 } 1620 1621 @Override 1622 public final Variant quotient( final BigDecimal aValue ) 1623 throws UnsupportedOperationException, 1624 IllegalArgumentException, 1625 ArithmeticException 1626 { 1627 this.assertPrecision(NumericPrecision.UNLIMITED_DECIMAL); 1628 this.getTarget().quotient(aValue); 1629 return this; 1630 } 1631 1632 @Override 1633 public final Variant quotient( final BigInteger aValue ) 1634 throws UnsupportedOperationException, 1635 IllegalArgumentException, 1636 ArithmeticException 1637 { 1638 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 1639 this.getTarget().quotient(aValue); 1640 return this; 1641 } 1642 1643 @Override 1644 public final Variant quotient( final boolean aValue ) 1645 throws UnsupportedOperationException, 1646 IllegalArgumentException, 1647 ArithmeticException 1648 { 1649 this.assertPrecision(NumericPrecision.BIT); 1650 this.getTarget().quotient(aValue); 1651 return this; 1652 } 1653 1654 @Override 1655 public final Variant quotient( final byte aValue ) 1656 throws UnsupportedOperationException, 1657 IllegalArgumentException, 1658 ArithmeticException 1659 { 1660 this.assertPrecision(NumericPrecision.BYTE); 1661 this.getTarget().quotient(aValue); 1662 return this; 1663 } 1664 1665 @Override 1666 public final Variant quotient( final char aValue ) 1667 throws UnsupportedOperationException, 1668 IllegalArgumentException, 1669 ArithmeticException 1670 { 1671 this.assertPrecision(NumericPrecision.CHARACTER); 1672 this.getTarget().quotient(aValue); 1673 return this; 1674 } 1675 1676 @Override 1677 public final Variant quotient( final double aValue ) 1678 throws UnsupportedOperationException, 1679 IllegalArgumentException, 1680 ArithmeticException 1681 { 1682 this.assertPrecision(NumericPrecision.DOUBLE); 1683 this.getTarget().quotient(aValue); 1684 return this; 1685 } 1686 1687 @Override 1688 public final Variant quotient( final float aValue ) 1689 throws UnsupportedOperationException, 1690 IllegalArgumentException, 1691 ArithmeticException 1692 { 1693 this.assertPrecision(NumericPrecision.FLOAT); 1694 this.getTarget().quotient(aValue); 1695 return this; 1696 } 1697 1698 @Override 1699 public final Variant quotient( final int aValue ) 1700 throws UnsupportedOperationException, 1701 IllegalArgumentException, 1702 ArithmeticException 1703 { 1704 this.assertPrecision(NumericPrecision.INTEGER); 1705 this.getTarget().quotient(aValue); 1706 return this; 1707 } 1708 1709 @Override 1710 public final Variant quotient( final long aValue ) 1711 throws UnsupportedOperationException, 1712 IllegalArgumentException, 1713 ArithmeticException 1714 { 1715 this.assertPrecision(NumericPrecision.LONG); 1716 this.getTarget().quotient(aValue); 1717 return this; 1718 } 1719 1720 @Override 1721 public final Variant quotient( final short aValue ) 1722 throws UnsupportedOperationException, 1723 IllegalArgumentException, 1724 ArithmeticException 1725 { 1726 this.assertPrecision(NumericPrecision.SHORT); 1727 this.getTarget().quotient(aValue); 1728 return this; 1729 } 1730 1731 @Override 1732 public final Variant radians() 1733 throws UnsupportedOperationException, 1734 IllegalArgumentException, 1735 ArithmeticException 1736 { 1737 this.assertPrecision(NumericPrecision.DOUBLE); 1738 this.getTarget().radians(); 1739 return this; 1740 } 1741 1742 @Override 1743 public final Variant replace( 1744 final CharSequence target, 1745 final CharSequence replacement ) 1746 { 1747 this._thePromoter.asString(this).replace(target, replacement); 1748 return this; 1749 } 1750 1751 @Override 1752 public final Variant replace( 1753 final int start, 1754 final int end, 1755 final String str ) throws UnsupportedOperationException 1756 { 1757 this._thePromoter.asString(this).replace(start, end, str); 1758 return this; 1759 } 1760 1761 @Override 1762 public final Variant replaceAll( 1763 final String regex, 1764 final String replacement ) 1765 { 1766 this._thePromoter.asString(this).replaceAll(regex, replacement); 1767 return this; 1768 } 1769 1770 @Override 1771 public final Variant replaceCharacter( 1772 final char oldChar, 1773 final char newChar ) 1774 { 1775 this._thePromoter.asString(this).replaceCharacter(oldChar, newChar); 1776 return this; 1777 } 1778 1779 @Override 1780 public final Variant replaceFirst( 1781 final String regex, 1782 final String replacement ) 1783 { 1784 this._thePromoter.asString(this).replaceFirst(regex, replacement); 1785 return this; 1786 } 1787 1788 @Override 1789 public final Variant reverse() throws UnsupportedOperationException 1790 { 1791 this._thePromoter.asString(this).reverse(); 1792 return this; 1793 } 1794 1795 @Override 1796 public final Variant round( final RoundingStrategy aRoundingStrategy ) 1797 throws UnsupportedOperationException, 1798 IllegalArgumentException, 1799 ArithmeticException, 1800 NullPointerException 1801 { 1802 this.assertDomain(Domain.REAL); 1803 this.getTarget().round(aRoundingStrategy); 1804 return this; 1805 } 1806 1807 @Override 1808 public final Variant setBoolean( final Boolean aValue ) 1809 throws UnsupportedOperationException, 1810 IllegalArgumentException, 1811 ArithmeticException, 1812 NullPointerException 1813 { 1814 this.assertPrecision(NumericPrecision.BIT); 1815 this.getTarget().setBoolean(aValue); 1816 return this; 1817 } 1818 1819 @Override 1820 public final Variant setCharacter( final Character aValue ) 1821 throws UnsupportedOperationException, 1822 IllegalArgumentException, 1823 ArithmeticException, 1824 NullPointerException 1825 { 1826 this.assertPrecision(NumericPrecision.CHARACTER); 1827 this.getTarget().setCharacter(aValue); 1828 return this; 1829 } 1830 1831 @Override 1832 public final Variant setCharAt( final int index, final char ch ) 1833 throws UnsupportedOperationException 1834 { 1835 this._thePromoter.asString(this).setCharAt(index, ch); 1836 return this; 1837 } 1838 1839 @Override 1840 public final Variant setE() 1841 throws UnsupportedOperationException, 1842 IllegalArgumentException, 1843 ArithmeticException 1844 { 1845 this.assertPrecision(NumericPrecision.DOUBLE); 1846 this.getTarget().setE(); 1847 return this; 1848 } 1849 1850 @Override 1851 public <E extends Enum<E>> Variant setEnumeration( final E aValue ) 1852 throws UnsupportedOperationException, 1853 ArithmeticException, 1854 IllegalArgumentException, 1855 NullPointerException 1856 { 1857 if (!this.hasModulo()) { 1858 final Primitive<?> anEnumeration = new EnumerationPrimitive(aValue); 1859 this._theTargets[NumericPrecision.INTEGER.ordinal()] = anEnumeration; 1860 this._thePromoter = _thePromoters.get(NumericPrecision.INTEGER); 1861 this._theFactories[NumericPrecision.INTEGER.ordinal()] = Getter.INSTANCE; 1862 this.setTarget(anEnumeration); 1863 } else { 1864 this.assertPrecision(NumericPrecision.INTEGER); 1865 this.getTarget().setEnumeration(aValue); 1866 } 1867 return this; 1868 } 1869 1870 @Override 1871 public final Variant setFalse() 1872 throws UnsupportedOperationException, 1873 ArithmeticException 1874 { 1875 this.assertPrecision(NumericPrecision.BIT); 1876 this.getTarget().setFalse(); 1877 return this; 1878 } 1879 1880 @Override 1881 public final Variant setLength( final int newLength ) 1882 throws UnsupportedOperationException 1883 { 1884 this._thePromoter.asString(this).setLength(newLength); 1885 return this; 1886 } 1887 1888 @Override 1889 public final Variant setMaximum() 1890 throws UnsupportedOperationException, 1891 ArithmeticException, 1892 IllegalArgumentException 1893 { 1894 this.assertDomain(Domain.REAL); 1895 this.getTarget().setMaximum(); 1896 return this; 1897 } 1898 1899 @Override 1900 public final Variant setMinimum() 1901 throws UnsupportedOperationException, 1902 ArithmeticException, 1903 IllegalArgumentException 1904 { 1905 this.assertDomain(Domain.REAL); 1906 this.getTarget().setMinimum(); 1907 return this; 1908 } 1909 1910 @Override 1911 public final Variant setNegativeInfinity() 1912 throws UnsupportedOperationException 1913 { 1914 this.assertPrecision(NumericPrecision.DOUBLE); 1915 this.getTarget().setNegativeInfinity(); 1916 return this; 1917 } 1918 1919 @Override 1920 public final Variant setPi() 1921 throws UnsupportedOperationException, 1922 ArithmeticException, 1923 IllegalArgumentException 1924 { 1925 this.assertPrecision(NumericPrecision.DOUBLE); 1926 this.getTarget().setPi(); 1927 return this; 1928 } 1929 1930 @Override 1931 public final Variant setPositiveInfinity() 1932 throws UnsupportedOperationException, 1933 ArithmeticException, 1934 IllegalArgumentException 1935 { 1936 this.assertPrecision(NumericPrecision.DOUBLE); 1937 this.getTarget().setPositiveInfinity(); 1938 return this; 1939 } 1940 1941 @Override 1942 public final Variant setReal( final BigDecimal aValue ) 1943 throws UnsupportedOperationException, 1944 IllegalArgumentException, 1945 ArithmeticException, 1946 NullPointerException 1947 { 1948 this.setPrecision(NumericPrecision.UNLIMITED_DECIMAL).setReal(aValue); 1949 return this; 1950 } 1951 1952 @Override 1953 public final Variant setReal( final BigInteger aValue ) 1954 throws UnsupportedOperationException, 1955 IllegalArgumentException, 1956 ArithmeticException, 1957 NullPointerException 1958 { 1959 this.setPrecision(NumericPrecision.UNLIMITED_INTEGER).setReal(aValue); 1960 return this; 1961 } 1962 1963 @Override 1964 public final Variant setReal( final SealedReal<?> aValue ) 1965 throws UnsupportedOperationException, 1966 IllegalArgumentException, 1967 ArithmeticException, 1968 NullPointerException 1969 { 1970 this.assertPrecision(this.getPrecision().maximumOf( 1971 aValue.getPrecision())); 1972 this.getTarget().setReal(aValue); 1973 return this; 1974 } 1975 1976 @Override 1977 public final Variant setScalar( final boolean aValue ) 1978 throws UnsupportedOperationException 1979 { 1980 this.setPrecision(NumericPrecision.BIT).setScalar(aValue); 1981 return this; 1982 } 1983 1984 @Override 1985 public final Variant setScalar( final byte aValue ) 1986 throws UnsupportedOperationException 1987 { 1988 this.setPrecision(NumericPrecision.BYTE).setScalar(aValue); 1989 return this; 1990 } 1991 1992 @Override 1993 public final Variant setScalar( final char aValue ) 1994 throws UnsupportedOperationException 1995 { 1996 this.setPrecision(NumericPrecision.CHARACTER).setScalar(aValue); 1997 return this; 1998 } 1999 2000 @Override 2001 public final Variant setScalar( final double aValue ) 2002 throws UnsupportedOperationException 2003 { 2004 this.setPrecision(NumericPrecision.DOUBLE).setScalar(aValue); 2005 return this; 2006 } 2007 2008 @Override 2009 public final Variant setScalar( final float aValue ) 2010 throws UnsupportedOperationException 2011 { 2012 this.setPrecision(NumericPrecision.FLOAT).setScalar(aValue); 2013 return this; 2014 } 2015 2016 @Override 2017 public final Variant setScalar( final int aValue ) 2018 throws UnsupportedOperationException 2019 { 2020 this.setPrecision(NumericPrecision.INTEGER).setScalar(aValue); 2021 return this; 2022 } 2023 2024 @Override 2025 public final Variant setScalar( final long aValue ) 2026 throws UnsupportedOperationException 2027 { 2028 this.setPrecision(NumericPrecision.LONG).setScalar(aValue); 2029 return this; 2030 } 2031 2032 @Override 2033 public final Variant setScalar( final SealedScalar<?> aValue ) 2034 throws UnsupportedOperationException, 2035 IllegalArgumentException, 2036 ArithmeticException, 2037 NullPointerException 2038 { 2039 this.assertPrecision(this.getPrecision().maximumOf( 2040 aValue.getPrecision())); 2041 this.getTarget().setScalar(aValue); 2042 return this; 2043 } 2044 2045 @Override 2046 public final Variant setScalar( final short aValue ) 2047 throws UnsupportedOperationException 2048 { 2049 this.setPrecision(NumericPrecision.SHORT).setScalar(aValue); 2050 return this; 2051 } 2052 2053 @Override 2054 public final Variant setText( final CharSequence content ) 2055 throws UnsupportedOperationException, 2056 NullPointerException, 2057 IllegalArgumentException 2058 { 2059 this._thePromoter.asString(this).setText(content); 2060 return this; 2061 } 2062 2063 @Override 2064 public final Variant setTrue() 2065 throws UnsupportedOperationException, 2066 ArithmeticException 2067 { 2068 this.assertPrecision(NumericPrecision.BIT); 2069 this.getTarget().setTrue(); 2070 return this; 2071 } 2072 2073 @Override 2074 public final Variant setUnity() 2075 throws UnsupportedOperationException, 2076 IllegalArgumentException, 2077 ArithmeticException 2078 { 2079 this.assertPrecision(NumericPrecision.BYTE); 2080 this.getTarget().setUnity(); 2081 return this; 2082 } 2083 2084 @Override 2085 public final Variant setZero() 2086 throws UnsupportedOperationException, 2087 IllegalArgumentException, 2088 ArithmeticException 2089 { 2090 this.assertPrecision(NumericPrecision.BYTE); 2091 this.getTarget().setZero(); 2092 return this; 2093 } 2094 2095 @Override 2096 public final Variant shiftLeft( final int count ) 2097 throws UnsupportedOperationException, 2098 IllegalArgumentException, 2099 ArithmeticException 2100 { 2101 this.assertPrecision(NumericPrecision.BYTE); 2102 this.getTarget().shiftLeft(count); 2103 return this; 2104 } 2105 2106 @Override 2107 public final Variant shiftRight( final int count ) 2108 throws UnsupportedOperationException, 2109 IllegalArgumentException, 2110 ArithmeticException 2111 { 2112 this.assertPrecision(NumericPrecision.BYTE); 2113 this.getTarget().shiftRight(count); 2114 return this; 2115 } 2116 2117 @Override 2118 public final Variant shiftRightExtendZero( final int count ) 2119 throws UnsupportedOperationException, 2120 IllegalArgumentException, 2121 ArithmeticException 2122 { 2123 this.assertPrecision(NumericPrecision.BYTE); 2124 this.getTarget().shiftRightExtendZero(count); 2125 return this; 2126 } 2127 2128 @Override 2129 public final Variant sine() 2130 throws UnsupportedOperationException, 2131 IllegalArgumentException, 2132 ArithmeticException 2133 { 2134 this.assertPrecision(NumericPrecision.DOUBLE); 2135 this.getTarget().sine(); 2136 return this; 2137 } 2138 2139 @Override 2140 public final Variant square() 2141 throws UnsupportedOperationException, 2142 IllegalArgumentException, 2143 ArithmeticException 2144 { 2145 this.assertDomain(Domain.REAL); 2146 this.getTarget().square(); 2147 return this; 2148 } 2149 2150 @Override 2151 public final Variant squareRoot() 2152 throws UnsupportedOperationException, 2153 IllegalArgumentException, 2154 ArithmeticException 2155 { 2156 this.assertPrecision(NumericPrecision.DOUBLE); 2157 this.getTarget().squareRoot(); 2158 return this; 2159 } 2160 2161 @Override 2162 public final CharSequence subSequence( final int start, final int end ) 2163 { 2164 return this._thePromoter.asString(this).subSequence(start, end); 2165 } 2166 2167 @Override 2168 public final String substring( final int beginIndex ) 2169 throws IndexOutOfBoundsException 2170 { 2171 return this._thePromoter.asString(this).substring(beginIndex); 2172 } 2173 2174 @Override 2175 public final String substring( final int beginIndex, final int endIndex ) 2176 throws IndexOutOfBoundsException 2177 { 2178 return this._thePromoter.asString(this).substring(beginIndex, endIndex); 2179 } 2180 2181 @Override 2182 public final Variant sum( final BigDecimal aValue ) 2183 throws UnsupportedOperationException, 2184 IllegalArgumentException, 2185 ArithmeticException 2186 { 2187 this.assertPrecision(NumericPrecision.UNLIMITED_DECIMAL); 2188 this.getTarget().sum(aValue); 2189 return this; 2190 } 2191 2192 @Override 2193 public final Variant sum( final BigInteger aValue ) 2194 throws UnsupportedOperationException, 2195 IllegalArgumentException, 2196 ArithmeticException 2197 { 2198 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 2199 this.getTarget().sum(aValue); 2200 return this; 2201 } 2202 2203 @Override 2204 public final Variant sum( final boolean aValue ) 2205 throws UnsupportedOperationException, 2206 IllegalArgumentException, 2207 ArithmeticException 2208 { 2209 this.assertPrecision(NumericPrecision.BIT); 2210 this.getTarget().sum(aValue); 2211 return this; 2212 } 2213 2214 @Override 2215 public final Variant sum( final byte aValue ) 2216 throws UnsupportedOperationException, 2217 IllegalArgumentException, 2218 ArithmeticException 2219 { 2220 this.assertPrecision(NumericPrecision.BYTE); 2221 this.getTarget().sum(aValue); 2222 return this; 2223 } 2224 2225 @Override 2226 public final Variant sum( final char aValue ) 2227 throws UnsupportedOperationException, 2228 IllegalArgumentException, 2229 ArithmeticException 2230 { 2231 this.assertPrecision(NumericPrecision.CHARACTER); 2232 this.getTarget().sum(aValue); 2233 return this; 2234 } 2235 2236 @Override 2237 public final Variant sum( final double aValue ) 2238 throws UnsupportedOperationException, 2239 IllegalArgumentException, 2240 ArithmeticException 2241 { 2242 this.assertPrecision(NumericPrecision.DOUBLE); 2243 this.getTarget().sum(aValue); 2244 return this; 2245 } 2246 2247 @Override 2248 public final Variant sum( final float aValue ) 2249 throws UnsupportedOperationException, 2250 IllegalArgumentException, 2251 ArithmeticException 2252 { 2253 this.assertPrecision(NumericPrecision.FLOAT); 2254 this.getTarget().sum(aValue); 2255 return this; 2256 } 2257 2258 @Override 2259 public final Variant sum( final int aValue ) 2260 throws UnsupportedOperationException, 2261 IllegalArgumentException, 2262 ArithmeticException 2263 { 2264 this.assertPrecision(NumericPrecision.INTEGER); 2265 this.getTarget().sum(aValue); 2266 return this; 2267 } 2268 2269 @Override 2270 public final Variant sum( final long aValue ) 2271 throws UnsupportedOperationException, 2272 IllegalArgumentException, 2273 ArithmeticException 2274 { 2275 this.assertPrecision(NumericPrecision.LONG); 2276 this.getTarget().sum(aValue); 2277 return this; 2278 } 2279 2280 @Override 2281 public final Variant sum( final short aValue ) 2282 throws UnsupportedOperationException, 2283 IllegalArgumentException, 2284 ArithmeticException 2285 { 2286 this.assertPrecision(NumericPrecision.SHORT); 2287 this.getTarget().sum(aValue); 2288 return this; 2289 } 2290 2291 @Override 2292 public final Variant swapPrimitives( final Primitive<?> aValue ) 2293 throws UnsupportedOperationException 2294 { 2295 final NumericPrecision prec = this.getPrecision().maximumOf( 2296 aValue.getPrecision()); 2297 this.assertPrecision(prec); 2298 this.getTarget().swapPrimitives(aValue); 2299 return this; 2300 } 2301 2302 @Override 2303 public final Variant tangent() 2304 throws UnsupportedOperationException, 2305 IllegalArgumentException, 2306 ArithmeticException 2307 { 2308 this.assertPrecision(NumericPrecision.DOUBLE); 2309 this.getTarget().tangent(); 2310 return this; 2311 } 2312 2313 @Override 2314 public final Variant upperCase() throws UnsupportedOperationException 2315 { 2316 this._thePromoter.asString(this).upperCase(); 2317 return this; 2318 } 2319 2320 @Override 2321 public final Variant xor( final BigInteger aValue ) 2322 throws UnsupportedOperationException, 2323 IllegalArgumentException, 2324 ArithmeticException 2325 { 2326 this.assertPrecision(NumericPrecision.UNLIMITED_INTEGER); 2327 this.getTarget().xor(aValue); 2328 return this; 2329 } 2330 2331 @Override 2332 public final Variant xor( final boolean aValue ) 2333 throws UnsupportedOperationException, 2334 IllegalArgumentException, 2335 ArithmeticException 2336 { 2337 this.assertPrecision(NumericPrecision.BIT); 2338 this.getTarget().xor(aValue); 2339 return this; 2340 } 2341 2342 @Override 2343 public final Variant xor( final byte aValue ) 2344 throws UnsupportedOperationException, 2345 IllegalArgumentException, 2346 ArithmeticException 2347 { 2348 this.assertPrecision(NumericPrecision.BYTE); 2349 this.getTarget().xor(aValue); 2350 return this; 2351 } 2352 2353 @Override 2354 public final Variant xor( final char aValue ) 2355 throws UnsupportedOperationException, 2356 IllegalArgumentException, 2357 ArithmeticException 2358 { 2359 this.assertPrecision(NumericPrecision.CHARACTER); 2360 this.getTarget().xor(aValue); 2361 return this; 2362 } 2363 2364 @Override 2365 public final Variant xor( final int aValue ) 2366 throws UnsupportedOperationException, 2367 IllegalArgumentException, 2368 ArithmeticException 2369 { 2370 this.assertPrecision(NumericPrecision.INTEGER); 2371 this.getTarget().xor(aValue); 2372 return this; 2373 } 2374 2375 @Override 2376 public final Variant xor( final long aValue ) 2377 throws UnsupportedOperationException, 2378 IllegalArgumentException, 2379 ArithmeticException 2380 { 2381 this.assertPrecision(NumericPrecision.LONG); 2382 this.getTarget().xor(aValue); 2383 return this; 2384 } 2385 2386 @Override 2387 public final Variant xor( final short aValue ) 2388 throws UnsupportedOperationException, 2389 IllegalArgumentException, 2390 ArithmeticException 2391 { 2392 this.assertPrecision(NumericPrecision.SHORT); 2393 this.getTarget().xor(aValue); 2394 return this; 2395 } 2396 2397 private static final Primitive<?> toPrimitive( final CharSequence aSignal ) 2398 { 2399 final Primitive<?> aModel = toPrimitive(aSignal, null); 2400 if (aModel == null) return new TextPrimitive(aSignal.toString()); 2401 return aModel; 2402 } 2403 2404 private static final Primitive<?> toPrimitive( 2405 final CharSequence aSignal, 2406 final Primitive<?> aDefault ) 2407 { 2408 final Number aNumber = To.toNumber(aSignal, null); 2409 if (aNumber != null) { 2410 final NumericPrecision prec = NumericPrecision.getPrecisionFor(aNumber); 2411 switch (prec) { 2412 case UNLIMITED_INTEGER: 2413 try { 2414 final BigInteger ui = (BigInteger)aSignal; 2415 return new UnlimitedIntegerPrimitive(ui); 2416 } catch (final Exception ex) { 2417 } 2418 break; 2419 case UNLIMITED_DECIMAL: 2420 try { 2421 final BigDecimal ud = (BigDecimal)aSignal; 2422 return new UnlimitedDecimalPrimitive(ud); 2423 } catch (final Exception ex) { 2424 } 2425 break; 2426 case BYTE: 2427 return new BytePrimitive(aNumber.byteValue()); 2428 case SHORT: 2429 return new ShortPrimitive(aNumber.shortValue()); 2430 case INTEGER: 2431 return new IntegerPrimitive(aNumber.intValue()); 2432 case LONG: 2433 return new LongPrimitive(aNumber.longValue()); 2434 case FLOAT: 2435 return new FloatPrimitive(aNumber.floatValue()); 2436 case DOUBLE: 2437 return new DoublePrimitive(aNumber.doubleValue()); 2438 } 2439 return aDefault; 2440 } 2441 final Boolean aBoolean = To.getSpecialBooleanIgnoreCase(aSignal); 2442 if (aBoolean != null) return new BooleanPrimitive(aBoolean); 2443 return aDefault; 2444 } 2445 2446 public static final Primitive<?> toPrimitive( final Number aNumber ) 2447 { 2448 switch (NumericPrecision.getPrecisionFor(aNumber)) { 2449 case NULL: 2450 return Constant.NULL; 2451 case BIT: 2452 case BYTE: 2453 return new BytePrimitive(aNumber.byteValue()); 2454 case SHORT: 2455 return new ShortPrimitive(aNumber.shortValue()); 2456 case CHARACTER: 2457 return new CharacterPrimitive((char)aNumber.intValue()); 2458 case INTEGER: 2459 return new IntegerPrimitive(aNumber.intValue()); 2460 case LONG: 2461 return new LongPrimitive(aNumber.longValue()); 2462 case FLOAT: 2463 return new FloatPrimitive(aNumber.floatValue()); 2464 case DOUBLE: 2465 return new DoublePrimitive(aNumber.doubleValue()); 2466 case UNLIMITED_INTEGER: 2467 try { 2468 return new UnlimitedIntegerPrimitive((BigInteger)aNumber); 2469 } catch (final ClassCastException ex) { 2470 return new DoublePrimitive(aNumber.doubleValue()); 2471 } 2472 case UNLIMITED_DECIMAL: 2473 try { 2474 return new UnlimitedDecimalPrimitive((BigDecimal)aNumber); 2475 } catch (final ClassCastException ex) { 2476 return new DoublePrimitive(aNumber.doubleValue()); 2477 } 2478 } 2479 return new TextPrimitive(aNumber.toString()); 2480 } 2481 2482 public static final Primitive<?> toPrimitive( final NumericPrecision prec ) 2483 { 2484 switch (prec) { 2485 case NULL: 2486 return Constant.NULL; 2487 case BIT: 2488 return new BooleanPrimitive(); 2489 case BYTE: 2490 return new BytePrimitive(); 2491 case SHORT: 2492 return new ShortPrimitive(); 2493 case CHARACTER: 2494 return new CharacterPrimitive(); 2495 case INTEGER: 2496 return new IntegerPrimitive(); 2497 case LONG: 2498 return new LongPrimitive(); 2499 case FLOAT: 2500 return new FloatPrimitive(); 2501 case DOUBLE: 2502 return new DoublePrimitive(); 2503 case UNLIMITED_INTEGER: 2504 return new UnlimitedIntegerPrimitive(); 2505 case UNLIMITED_DECIMAL: 2506 return new UnlimitedDecimalPrimitive(); 2507 } 2508 return new TextPrimitive(); 2509 } 2510 2511 public static final Primitive<?> toPrimitive( final SealedReal<?> aReal ) 2512 { 2513 switch (aReal.getPrecision()) { 2514 case NULL: 2515 return Constant.NULL; 2516 case BIT: 2517 return new BooleanPrimitive(aReal); 2518 case BYTE: 2519 return new BytePrimitive(aReal); 2520 case SHORT: 2521 return new ShortPrimitive(aReal); 2522 case CHARACTER: 2523 return new CharacterPrimitive(aReal); 2524 case INTEGER: 2525 return new IntegerPrimitive(aReal); 2526 case LONG: 2527 return new LongPrimitive(aReal); 2528 case FLOAT: 2529 return new FloatPrimitive(aReal); 2530 case DOUBLE: 2531 return new DoublePrimitive(aReal); 2532 case UNLIMITED_INTEGER: 2533 return new UnlimitedIntegerPrimitive(aReal); 2534 case UNLIMITED_DECIMAL: 2535 return new UnlimitedDecimalPrimitive(aReal); 2536 } 2537 return new TextPrimitive(aReal.toString()); 2538 } 2539 2540 public static final Primitive<?> toPrimitive( final SealedScalar<?> aScalar ) 2541 { 2542 switch (aScalar.getPrecision()) { 2543 case NULL: 2544 return Constant.NULL; 2545 case BIT: 2546 return new BooleanPrimitive(aScalar); 2547 case BYTE: 2548 return new BytePrimitive(aScalar); 2549 case SHORT: 2550 return new ShortPrimitive(aScalar); 2551 case CHARACTER: 2552 return new CharacterPrimitive(aScalar); 2553 case INTEGER: 2554 return new IntegerPrimitive(aScalar); 2555 case LONG: 2556 return new LongPrimitive(aScalar); 2557 case FLOAT: 2558 return new FloatPrimitive(aScalar); 2559 case DOUBLE: 2560 return new DoublePrimitive(aScalar); 2561 } 2562 return new TextPrimitive(aScalar.toString()); 2563 } 2564 2565 public static final Variant valueOfPrimitive( 2566 final SealedPrimitive<?> aValue ) 2567 { 2568 switch (aValue.getPrecision()) { 2569 case NULL: 2570 return new Variant(); 2571 case BIT: 2572 return new Variant(aValue.booleanValue()); 2573 case BYTE: 2574 return new Variant(aValue.byteValue()); 2575 case SHORT: 2576 return new Variant(aValue.shortValue()); 2577 case CHARACTER: 2578 return new Variant(aValue.charValue()); 2579 case INTEGER: 2580 return new Variant(aValue.intValue()); 2581 case LONG: 2582 return new Variant(aValue.longValue()); 2583 case FLOAT: 2584 return new Variant(aValue.floatValue()); 2585 case DOUBLE: 2586 return new Variant(aValue.doubleValue()); 2587 case UNLIMITED_INTEGER: 2588 return new Variant(aValue.toUnlimitedInteger()); 2589 case UNLIMITED_DECIMAL: 2590 return new Variant(aValue.toUnlimitedDecimal()); 2591 } 2592 return new Variant(aValue.toString()); 2593 } 2594 2595 public static final Variant valueOfReal( final SealedReal<?> aReal ) 2596 { 2597 switch (aReal.getPrecision()) { 2598 case NULL: 2599 return new Variant(); 2600 case BIT: 2601 return new Variant(aReal.booleanValue()); 2602 case BYTE: 2603 return new Variant(aReal.byteValue()); 2604 case SHORT: 2605 return new Variant(aReal.shortValue()); 2606 case CHARACTER: 2607 return new Variant(aReal.charValue()); 2608 case INTEGER: 2609 return new Variant(aReal.intValue()); 2610 case LONG: 2611 return new Variant(aReal.longValue()); 2612 case FLOAT: 2613 return new Variant(aReal.floatValue()); 2614 case DOUBLE: 2615 return new Variant(aReal.doubleValue()); 2616 case UNLIMITED_INTEGER: 2617 return new Variant(aReal.toUnlimitedInteger()); 2618 case UNLIMITED_DECIMAL: 2619 return new Variant(aReal.toUnlimitedDecimal()); 2620 } 2621 return new Variant(aReal.toString()); 2622 } 2623 2624 public static final Variant valueOfScalar( final SealedScalar<?> aScalar ) 2625 { 2626 switch (aScalar.getPrecision()) { 2627 case NULL: 2628 return new Variant(); 2629 case BIT: 2630 return new Variant(aScalar.booleanValue()); 2631 case BYTE: 2632 return new Variant(aScalar.byteValue()); 2633 case SHORT: 2634 return new Variant(aScalar.shortValue()); 2635 case CHARACTER: 2636 return new Variant(aScalar.charValue()); 2637 case INTEGER: 2638 return new Variant(aScalar.intValue()); 2639 case UNLIMITED_INTEGER: 2640 case LONG: 2641 return new Variant(aScalar.longValue()); 2642 case FLOAT: 2643 return new Variant(aScalar.floatValue()); 2644 case UNLIMITED_DECIMAL: 2645 case DOUBLE: 2646 return new Variant(aScalar.doubleValue()); 2647 } 2648 return new Variant(aScalar.toString()); 2649 } 2650 2651 private static class BooleanPromoter 2652 extends 2653 Promoter 2654 { 2655 public BooleanPromoter() 2656 { 2657 } 2658 2659 @Override 2660 public final Primitive<?> asBoolean( final Variant aVariant ) 2661 { 2662 return aVariant._theTarget; 2663 } 2664 2665 @Override 2666 public final Primitive<?> asByte( final Variant aVariant ) 2667 { 2668 return this.convertTo(aVariant, NumericPrecision.BYTE); 2669 } 2670 2671 @Override 2672 public final Primitive<?> asCharacter( final Variant aVariant ) 2673 { 2674 return this.convertTo(aVariant, NumericPrecision.CHARACTER); 2675 } 2676 2677 @Override 2678 public final Primitive<?> asDouble( final Variant aVariant ) 2679 { 2680 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 2681 } 2682 2683 @Override 2684 public final Primitive<?> asFloat( final Variant aVariant ) 2685 { 2686 return this.convertTo(aVariant, NumericPrecision.FLOAT); 2687 } 2688 2689 @Override 2690 public final Primitive<?> asInteger( final Variant aVariant ) 2691 { 2692 return this.convertTo(aVariant, NumericPrecision.INTEGER); 2693 } 2694 2695 @Override 2696 public final Primitive<?> asLong( final Variant aVariant ) 2697 { 2698 return this.convertTo(aVariant, NumericPrecision.LONG); 2699 } 2700 2701 @Override 2702 public final Primitive<?> asShort( final Variant aVariant ) 2703 { 2704 return this.convertTo(aVariant, NumericPrecision.SHORT); 2705 } 2706 2707 @Override 2708 public final Primitive<?> asString( final Variant aVariant ) 2709 { 2710 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 2711 } 2712 2713 @Override 2714 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 2715 { 2716 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 2717 } 2718 2719 @Override 2720 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 2721 { 2722 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 2723 } 2724 } 2725 2726 private static class BytePromoter 2727 extends 2728 Promoter 2729 { 2730 public BytePromoter() 2731 { 2732 } 2733 2734 @Override 2735 public final Primitive<?> asBoolean( final Variant aVariant ) 2736 { 2737 return aVariant._theTarget; 2738 } 2739 2740 @Override 2741 public final Primitive<?> asByte( final Variant aVariant ) 2742 { 2743 return aVariant._theTarget; 2744 } 2745 2746 @Override 2747 public final Primitive<?> asCharacter( final Variant aVariant ) 2748 { 2749 return this.convertTo(aVariant, NumericPrecision.CHARACTER); 2750 } 2751 2752 @Override 2753 public final Primitive<?> asDouble( final Variant aVariant ) 2754 { 2755 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 2756 } 2757 2758 @Override 2759 public final Primitive<?> asFloat( final Variant aVariant ) 2760 { 2761 return this.convertTo(aVariant, NumericPrecision.FLOAT); 2762 } 2763 2764 @Override 2765 public final Primitive<?> asInteger( final Variant aVariant ) 2766 { 2767 return this.convertTo(aVariant, NumericPrecision.INTEGER); 2768 } 2769 2770 @Override 2771 public final Primitive<?> asLong( final Variant aVariant ) 2772 { 2773 return this.convertTo(aVariant, NumericPrecision.LONG); 2774 } 2775 2776 @Override 2777 public final Primitive<?> asShort( final Variant aVariant ) 2778 { 2779 return this.convertTo(aVariant, NumericPrecision.SHORT); 2780 } 2781 2782 @Override 2783 public final Primitive<?> asString( final Variant aVariant ) 2784 { 2785 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 2786 } 2787 2788 @Override 2789 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 2790 { 2791 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 2792 } 2793 2794 @Override 2795 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 2796 { 2797 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 2798 } 2799 } 2800 2801 private static class CharacterPromoter 2802 extends 2803 Promoter 2804 { 2805 public CharacterPromoter() 2806 { 2807 } 2808 2809 @Override 2810 public final Primitive<?> asBoolean( final Variant aVariant ) 2811 { 2812 return aVariant._theTarget; 2813 } 2814 2815 @Override 2816 public final Primitive<?> asByte( final Variant aVariant ) 2817 { 2818 return this.convertTo(aVariant, NumericPrecision.INTEGER); 2819 } 2820 2821 @Override 2822 public final Primitive<?> asCharacter( final Variant aVariant ) 2823 { 2824 return aVariant._theTarget; 2825 } 2826 2827 @Override 2828 public final Primitive<?> asDouble( final Variant aVariant ) 2829 { 2830 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 2831 } 2832 2833 @Override 2834 public final Primitive<?> asFloat( final Variant aVariant ) 2835 { 2836 return this.convertTo(aVariant, NumericPrecision.FLOAT); 2837 } 2838 2839 @Override 2840 public final Primitive<?> asInteger( final Variant aVariant ) 2841 { 2842 return this.convertTo(aVariant, NumericPrecision.INTEGER); 2843 } 2844 2845 @Override 2846 public final Primitive<?> asLong( final Variant aVariant ) 2847 { 2848 return this.convertTo(aVariant, NumericPrecision.LONG); 2849 } 2850 2851 @Override 2852 public final Primitive<?> asShort( final Variant aVariant ) 2853 { 2854 return this.convertTo(aVariant, NumericPrecision.INTEGER); 2855 } 2856 2857 @Override 2858 public final Primitive<?> asString( final Variant aVariant ) 2859 { 2860 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 2861 } 2862 2863 @Override 2864 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 2865 { 2866 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 2867 } 2868 2869 @Override 2870 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 2871 { 2872 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 2873 } 2874 } 2875 2876 private static final class Creator 2877 extends 2878 Factory 2879 { 2880 public final static Factory INSTANCE = new Creator(); 2881 2882 public Creator() 2883 { 2884 } 2885 2886 @Override 2887 public final Primitive<?> get( 2888 final Variant aVariant, 2889 final NumericPrecision prec ) 2890 { 2891 final Primitive<?> aTarget = toPrimitive(prec); 2892 final int index = prec.ordinal(); 2893 aVariant._theTargets[index] = aTarget; 2894 aVariant._theFactories[index] = Getter.INSTANCE; 2895 return aTarget; 2896 } 2897 } 2898 2899 private static class DoublePromoter 2900 extends 2901 Promoter 2902 { 2903 public DoublePromoter() 2904 { 2905 } 2906 2907 @Override 2908 public final Primitive<?> asBoolean( final Variant aVariant ) 2909 { 2910 return aVariant._theTarget; 2911 } 2912 2913 @Override 2914 public final Primitive<?> asByte( final Variant aVariant ) 2915 { 2916 return aVariant._theTarget; 2917 } 2918 2919 @Override 2920 public final Primitive<?> asCharacter( final Variant aVariant ) 2921 { 2922 return aVariant._theTarget; 2923 } 2924 2925 @Override 2926 public final Primitive<?> asDouble( final Variant aVariant ) 2927 { 2928 return aVariant._theTarget; 2929 } 2930 2931 @Override 2932 public final Primitive<?> asFloat( final Variant aVariant ) 2933 { 2934 return aVariant._theTarget; 2935 } 2936 2937 @Override 2938 public final Primitive<?> asInteger( final Variant aVariant ) 2939 { 2940 return aVariant._theTarget; 2941 } 2942 2943 @Override 2944 public final Primitive<?> asLong( final Variant aVariant ) 2945 { 2946 return aVariant._theTarget; 2947 } 2948 2949 @Override 2950 public final Primitive<?> asShort( final Variant aVariant ) 2951 { 2952 return aVariant._theTarget; 2953 } 2954 2955 @Override 2956 public final Primitive<?> asString( final Variant aVariant ) 2957 { 2958 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 2959 } 2960 2961 @Override 2962 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 2963 { 2964 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 2965 } 2966 2967 @Override 2968 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 2969 { 2970 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 2971 } 2972 } 2973 2974 private static abstract class Factory 2975 { 2976 public Factory() 2977 { 2978 } 2979 2980 public abstract Primitive<?> get( 2981 final Variant aVariant, 2982 final NumericPrecision prec ); 2983 } 2984 2985 private static class FloatPromoter 2986 extends 2987 Promoter 2988 { 2989 public FloatPromoter() 2990 { 2991 } 2992 2993 @Override 2994 public final Primitive<?> asBoolean( final Variant aVariant ) 2995 { 2996 return aVariant._theTarget; 2997 } 2998 2999 @Override 3000 public final Primitive<?> asByte( final Variant aVariant ) 3001 { 3002 return aVariant._theTarget; 3003 } 3004 3005 @Override 3006 public final Primitive<?> asCharacter( final Variant aVariant ) 3007 { 3008 return aVariant._theTarget; 3009 } 3010 3011 @Override 3012 public final Primitive<?> asDouble( final Variant aVariant ) 3013 { 3014 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 3015 } 3016 3017 @Override 3018 public final Primitive<?> asFloat( final Variant aVariant ) 3019 { 3020 return aVariant._theTarget; 3021 } 3022 3023 @Override 3024 public final Primitive<?> asInteger( final Variant aVariant ) 3025 { 3026 return aVariant._theTarget; 3027 } 3028 3029 @Override 3030 public final Primitive<?> asLong( final Variant aVariant ) 3031 { 3032 return aVariant._theTarget; 3033 } 3034 3035 @Override 3036 public final Primitive<?> asShort( final Variant aVariant ) 3037 { 3038 return aVariant._theTarget; 3039 } 3040 3041 @Override 3042 public final Primitive<?> asString( final Variant aVariant ) 3043 { 3044 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 3045 } 3046 3047 @Override 3048 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3049 { 3050 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 3051 } 3052 3053 @Override 3054 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3055 { 3056 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 3057 } 3058 } 3059 3060 private static final class Getter 3061 extends 3062 Factory 3063 { 3064 public final static Factory INSTANCE = new Getter(); 3065 3066 public Getter() 3067 { 3068 } 3069 3070 @Override 3071 public final Primitive<?> get( 3072 final Variant aVariant, 3073 final NumericPrecision prec ) 3074 { 3075 return aVariant._theTargets[prec.ordinal()]; 3076 } 3077 } 3078 3079 private static class IntegerPromoter 3080 extends 3081 Promoter 3082 { 3083 public IntegerPromoter() 3084 { 3085 } 3086 3087 @Override 3088 public final Primitive<?> asBoolean( final Variant aVariant ) 3089 { 3090 return aVariant._theTarget; 3091 } 3092 3093 @Override 3094 public final Primitive<?> asByte( final Variant aVariant ) 3095 { 3096 return aVariant._theTarget; 3097 } 3098 3099 @Override 3100 public final Primitive<?> asCharacter( final Variant aVariant ) 3101 { 3102 return aVariant._theTarget; 3103 } 3104 3105 @Override 3106 public final Primitive<?> asDouble( final Variant aVariant ) 3107 { 3108 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 3109 } 3110 3111 @Override 3112 public final Primitive<?> asFloat( final Variant aVariant ) 3113 { 3114 return this.convertTo(aVariant, NumericPrecision.FLOAT); 3115 } 3116 3117 @Override 3118 public final Primitive<?> asInteger( final Variant aVariant ) 3119 { 3120 return aVariant._theTarget; 3121 } 3122 3123 @Override 3124 public final Primitive<?> asLong( final Variant aVariant ) 3125 { 3126 return this.convertTo(aVariant, NumericPrecision.LONG); 3127 } 3128 3129 @Override 3130 public final Primitive<?> asShort( final Variant aVariant ) 3131 { 3132 return aVariant._theTarget; 3133 } 3134 3135 @Override 3136 public final Primitive<?> asString( final Variant aVariant ) 3137 { 3138 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 3139 } 3140 3141 @Override 3142 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3143 { 3144 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 3145 } 3146 3147 @Override 3148 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3149 { 3150 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 3151 } 3152 } 3153 3154 private static class LongPromoter 3155 extends 3156 Promoter 3157 { 3158 public LongPromoter() 3159 { 3160 } 3161 3162 @Override 3163 public final Primitive<?> asBoolean( final Variant aVariant ) 3164 { 3165 return aVariant._theTarget; 3166 } 3167 3168 @Override 3169 public final Primitive<?> asByte( final Variant aVariant ) 3170 { 3171 return aVariant._theTarget; 3172 } 3173 3174 @Override 3175 public final Primitive<?> asCharacter( final Variant aVariant ) 3176 { 3177 return aVariant._theTarget; 3178 } 3179 3180 @Override 3181 public final Primitive<?> asDouble( final Variant aVariant ) 3182 { 3183 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 3184 } 3185 3186 @Override 3187 public final Primitive<?> asFloat( final Variant aVariant ) 3188 { 3189 return this.convertTo(aVariant, NumericPrecision.FLOAT); 3190 } 3191 3192 @Override 3193 public final Primitive<?> asInteger( final Variant aVariant ) 3194 { 3195 return aVariant._theTarget; 3196 } 3197 3198 @Override 3199 public final Primitive<?> asLong( final Variant aVariant ) 3200 { 3201 return aVariant._theTarget; 3202 } 3203 3204 @Override 3205 public final Primitive<?> asShort( final Variant aVariant ) 3206 { 3207 return aVariant._theTarget; 3208 } 3209 3210 @Override 3211 public final Primitive<?> asString( final Variant aVariant ) 3212 { 3213 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 3214 } 3215 3216 @Override 3217 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3218 { 3219 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 3220 } 3221 3222 @Override 3223 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3224 { 3225 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 3226 } 3227 } 3228 3229 private static class NullPromoter 3230 extends 3231 Promoter 3232 { 3233 public NullPromoter() 3234 { 3235 } 3236 3237 @Override 3238 public final Primitive<?> asBoolean( final Variant aVariant ) 3239 { 3240 return this.convertTo(aVariant, NumericPrecision.BIT); 3241 } 3242 3243 @Override 3244 public final Primitive<?> asByte( final Variant aVariant ) 3245 { 3246 return this.convertTo(aVariant, NumericPrecision.BYTE); 3247 } 3248 3249 @Override 3250 public final Primitive<?> asCharacter( final Variant aVariant ) 3251 { 3252 return this.convertTo(aVariant, NumericPrecision.CHARACTER); 3253 } 3254 3255 @Override 3256 public final Primitive<?> asDouble( final Variant aVariant ) 3257 { 3258 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 3259 } 3260 3261 @Override 3262 public final Primitive<?> asFloat( final Variant aVariant ) 3263 { 3264 return this.convertTo(aVariant, NumericPrecision.FLOAT); 3265 } 3266 3267 @Override 3268 public final Primitive<?> asInteger( final Variant aVariant ) 3269 { 3270 return this.convertTo(aVariant, NumericPrecision.INTEGER); 3271 } 3272 3273 @Override 3274 public final Primitive<?> asLong( final Variant aVariant ) 3275 { 3276 return this.convertTo(aVariant, NumericPrecision.LONG); 3277 } 3278 3279 @Override 3280 public final Primitive<?> asShort( final Variant aVariant ) 3281 { 3282 return this.convertTo(aVariant, NumericPrecision.SHORT); 3283 } 3284 3285 @Override 3286 public final Primitive<?> asString( final Variant aVariant ) 3287 { 3288 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 3289 } 3290 3291 @Override 3292 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3293 { 3294 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 3295 } 3296 3297 @Override 3298 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3299 { 3300 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 3301 } 3302 } 3303 3304 private static abstract class Promoter 3305 { 3306 public Promoter() 3307 { 3308 } 3309 3310 public abstract Primitive<?> asBoolean( final Variant aVariant ); 3311 3312 public abstract Primitive<?> asByte( final Variant aVariant ); 3313 3314 public abstract Primitive<?> asCharacter( final Variant aVariant ); 3315 3316 public abstract Primitive<?> asDouble( final Variant aVariant ); 3317 3318 public abstract Primitive<?> asFloat( final Variant aVariant ); 3319 3320 public abstract Primitive<?> asInteger( final Variant aVariant ); 3321 3322 public abstract Primitive<?> asLong( final Variant aVariant ); 3323 3324 public abstract Primitive<?> asShort( final Variant aVariant ); 3325 3326 public abstract Primitive<?> asString( final Variant aVariant ); 3327 3328 public abstract Primitive<?> asUnlimitedDecimal( final Variant aVariant ); 3329 3330 public abstract Primitive<?> asUnlimitedInteger( final Variant aVariant ); 3331 3332 public final Primitive<?> convertTo( 3333 final Variant aVariant, 3334 final NumericPrecision prec ) 3335 { 3336 final Primitive<?> original = aVariant._theTarget; 3337 final Primitive<?> proposed = aVariant._theFactories[prec.ordinal()].get( 3338 aVariant, prec); 3339 if (original != proposed) { 3340 if (proposed.isMutable()) { 3341 proposed.setPrimitive(original); 3342 } 3343 aVariant._theTarget = proposed; 3344 aVariant._thePromoter = _thePromoters.get(prec); 3345 } 3346 return proposed; 3347 } 3348 } 3349 3350 private static class ShortPromoter 3351 extends 3352 Promoter 3353 { 3354 public ShortPromoter() 3355 { 3356 } 3357 3358 @Override 3359 public final Primitive<?> asBoolean( final Variant aVariant ) 3360 { 3361 return aVariant._theTarget; 3362 } 3363 3364 @Override 3365 public final Primitive<?> asByte( final Variant aVariant ) 3366 { 3367 return aVariant._theTarget; 3368 } 3369 3370 @Override 3371 public final Primitive<?> asCharacter( final Variant aVariant ) 3372 { 3373 return this.convertTo(aVariant, NumericPrecision.CHARACTER); 3374 } 3375 3376 @Override 3377 public final Primitive<?> asDouble( final Variant aVariant ) 3378 { 3379 return this.convertTo(aVariant, NumericPrecision.DOUBLE); 3380 } 3381 3382 @Override 3383 public final Primitive<?> asFloat( final Variant aVariant ) 3384 { 3385 return this.convertTo(aVariant, NumericPrecision.FLOAT); 3386 } 3387 3388 @Override 3389 public final Primitive<?> asInteger( final Variant aVariant ) 3390 { 3391 return this.convertTo(aVariant, NumericPrecision.INTEGER); 3392 } 3393 3394 @Override 3395 public final Primitive<?> asLong( final Variant aVariant ) 3396 { 3397 return this.convertTo(aVariant, NumericPrecision.LONG); 3398 } 3399 3400 @Override 3401 public final Primitive<?> asShort( final Variant aVariant ) 3402 { 3403 return aVariant._theTarget; 3404 } 3405 3406 @Override 3407 public final Primitive<?> asString( final Variant aVariant ) 3408 { 3409 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 3410 } 3411 3412 @Override 3413 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3414 { 3415 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 3416 } 3417 3418 @Override 3419 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3420 { 3421 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 3422 } 3423 } 3424 3425 private static class StringPromoter 3426 extends 3427 Promoter 3428 { 3429 public StringPromoter() 3430 { 3431 } 3432 3433 private final Primitive<?> toScalar( 3434 final Variant aVariant, 3435 final NumericPrecision minPrec ) 3436 { 3437 final Primitive<?> aPrimitive = toPrimitive(aVariant.toString()); 3438 final NumericPrecision prec = aPrimitive.getPrecision(); 3439 final int index = prec.ordinal(); 3440 aVariant._theTarget = aPrimitive; 3441 aVariant._theTargets[index] = aPrimitive; 3442 aVariant._theFactories[index] = Getter.INSTANCE; 3443 aVariant._thePromoter = _thePromoters.get(prec); 3444 if (prec.isLessPreciseThan(minPrec)) 3445 return aVariant._thePromoter.convertTo(aVariant, minPrec); 3446 return aPrimitive; 3447 } 3448 3449 @Override 3450 public final Primitive<?> asBoolean( final Variant aVariant ) 3451 { 3452 return this.toScalar(aVariant, NumericPrecision.BIT); 3453 } 3454 3455 @Override 3456 public final Primitive<?> asByte( final Variant aVariant ) 3457 { 3458 return this.toScalar(aVariant, NumericPrecision.BYTE); 3459 } 3460 3461 @Override 3462 public final Primitive<?> asCharacter( final Variant aVariant ) 3463 { 3464 return aVariant._theTarget; 3465 } 3466 3467 @Override 3468 public final Primitive<?> asDouble( final Variant aVariant ) 3469 { 3470 return this.toScalar(aVariant, NumericPrecision.DOUBLE); 3471 } 3472 3473 @Override 3474 public final Primitive<?> asFloat( final Variant aVariant ) 3475 { 3476 return this.toScalar(aVariant, NumericPrecision.FLOAT); 3477 } 3478 3479 @Override 3480 public final Primitive<?> asInteger( final Variant aVariant ) 3481 { 3482 return this.toScalar(aVariant, NumericPrecision.INTEGER); 3483 } 3484 3485 @Override 3486 public final Primitive<?> asLong( final Variant aVariant ) 3487 { 3488 return this.toScalar(aVariant, NumericPrecision.LONG); 3489 } 3490 3491 @Override 3492 public final Primitive<?> asShort( final Variant aVariant ) 3493 { 3494 return this.toScalar(aVariant, NumericPrecision.SHORT); 3495 } 3496 3497 @Override 3498 public final Primitive<?> asString( final Variant aVariant ) 3499 { 3500 return aVariant._theTarget; 3501 } 3502 3503 @Override 3504 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3505 { 3506 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 3507 } 3508 3509 @Override 3510 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3511 { 3512 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_INTEGER); 3513 } 3514 } 3515 3516 private static class UnlimitedDecimalPromoter 3517 extends 3518 Promoter 3519 { 3520 public UnlimitedDecimalPromoter() 3521 { 3522 } 3523 3524 @Override 3525 public final Primitive<?> asBoolean( final Variant aVariant ) 3526 { 3527 return aVariant._theTarget; 3528 } 3529 3530 @Override 3531 public final Primitive<?> asByte( final Variant aVariant ) 3532 { 3533 return aVariant._theTarget; 3534 } 3535 3536 @Override 3537 public final Primitive<?> asCharacter( final Variant aVariant ) 3538 { 3539 return aVariant._theTarget; 3540 } 3541 3542 @Override 3543 public final Primitive<?> asDouble( final Variant aVariant ) 3544 { 3545 return aVariant._theTarget; 3546 } 3547 3548 @Override 3549 public final Primitive<?> asFloat( final Variant aVariant ) 3550 { 3551 return aVariant._theTarget; 3552 } 3553 3554 @Override 3555 public final Primitive<?> asInteger( final Variant aVariant ) 3556 { 3557 return aVariant._theTarget; 3558 } 3559 3560 @Override 3561 public final Primitive<?> asLong( final Variant aVariant ) 3562 { 3563 return aVariant._theTarget; 3564 } 3565 3566 @Override 3567 public final Primitive<?> asShort( final Variant aVariant ) 3568 { 3569 return aVariant._theTarget; 3570 } 3571 3572 @Override 3573 public final Primitive<?> asString( final Variant aVariant ) 3574 { 3575 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 3576 } 3577 3578 @Override 3579 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3580 { 3581 return aVariant._theTarget; 3582 } 3583 3584 @Override 3585 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3586 { 3587 return aVariant._theTarget; 3588 } 3589 } 3590 3591 private static class UnlimitedIntegerPromoter 3592 extends 3593 Promoter 3594 { 3595 public UnlimitedIntegerPromoter() 3596 { 3597 } 3598 3599 @Override 3600 public final Primitive<?> asBoolean( final Variant aVariant ) 3601 { 3602 return aVariant._theTarget; 3603 } 3604 3605 @Override 3606 public final Primitive<?> asByte( final Variant aVariant ) 3607 { 3608 return aVariant._theTarget; 3609 } 3610 3611 @Override 3612 public final Primitive<?> asCharacter( final Variant aVariant ) 3613 { 3614 return aVariant._theTarget; 3615 } 3616 3617 @Override 3618 public final Primitive<?> asDouble( final Variant aVariant ) 3619 { 3620 return aVariant._theTarget; 3621 } 3622 3623 @Override 3624 public final Primitive<?> asFloat( final Variant aVariant ) 3625 { 3626 return aVariant._theTarget; 3627 } 3628 3629 @Override 3630 public final Primitive<?> asInteger( final Variant aVariant ) 3631 { 3632 return aVariant._theTarget; 3633 } 3634 3635 @Override 3636 public final Primitive<?> asLong( final Variant aVariant ) 3637 { 3638 return aVariant._theTarget; 3639 } 3640 3641 @Override 3642 public final Primitive<?> asShort( final Variant aVariant ) 3643 { 3644 return aVariant._theTarget; 3645 } 3646 3647 @Override 3648 public final Primitive<?> asString( final Variant aVariant ) 3649 { 3650 return this.convertTo(aVariant, NumericPrecision.UNKNOWN); 3651 } 3652 3653 @Override 3654 public final Primitive<?> asUnlimitedDecimal( final Variant aVariant ) 3655 { 3656 return this.convertTo(aVariant, NumericPrecision.UNLIMITED_DECIMAL); 3657 } 3658 3659 @Override 3660 public final Primitive<?> asUnlimitedInteger( final Variant aVariant ) 3661 { 3662 return aVariant._theTarget; 3663 } 3664 } 3665}