001/** 002 * AbstractNumericPrimitive.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.NoSuchElementException; 024 025import net.sf.jaccumulator.Domain; 026import net.sf.jaccumulator.StructureStrategy; 027import net.sf.jaccumulator.booleans.BooleanPrimitive; 028import net.sf.jaccumulator.bytes.BytePrimitive; 029import net.sf.jaccumulator.characters.CharacterPrimitive; 030import net.sf.jaccumulator.doubles.DoublePrimitive; 031import net.sf.jaccumulator.floats.FloatPrimitive; 032import net.sf.jaccumulator.integers.IntegerPrimitive; 033import net.sf.jaccumulator.lex.To; 034import net.sf.jaccumulator.longs.LongPrimitive; 035import net.sf.jaccumulator.reals.Real; 036import net.sf.jaccumulator.reals.SealedReal; 037import net.sf.jaccumulator.scalars.NumericPrecision; 038import net.sf.jaccumulator.scalars.Scalar; 039import net.sf.jaccumulator.scalars.SealedScalar; 040import net.sf.jaccumulator.shorts.ShortPrimitive; 041import net.sf.jaccumulator.texts.Text; 042import net.sf.jaccumulator.texts.TextPrimitive; 043import net.sf.jaccumulator.unlimiteds.UnlimitedDecimalPrimitive; 044import net.sf.jaccumulator.unlimiteds.UnlimitedIntegerPrimitive; 045 046/** 047 * Common read and write behavior for representations of {@link Domain#REAL 048 * real} number explicitly implemented either as a {@code boolean} vector into 049 * the real number domain, or any {@link BigDecimal unlimited} array 050 * 051 * @param <PRIMITIVE> 052 * this primitive type (used to facilitate operation chaining on write 053 * operations) 054 * @since JAccumulator 4.0 055 * @author Nicole Tedesco (<a 056 * href="mailto:Nicole@NicoleTedesco.com">Nicole@NicoleTedesco.com</a>) 057 */ 058public abstract class AbstractNumericPrimitive<PRIMITIVE extends Primitive<PRIMITIVE>> 059 extends 060 AbstractPrimitive<PRIMITIVE> 061{ 062 private static final long serialVersionUID = 6556054216961386143L; 063 064 public AbstractNumericPrimitive() 065 { 066 super(); 067 } 068 069 public AbstractNumericPrimitive( 070 final Domain aDomain, 071 final NumericPrecision aPrecision ) 072 { 073 super(aDomain, aPrecision); 074 } 075 076 public AbstractNumericPrimitive( final NumericPrecision aPrecision ) 077 { 078 super(Domain.REAL, aPrecision); 079 } 080 081 @Override 082 public PRIMITIVE append( final boolean aValue ) 083 { 084 return this.setText(this.toString() + aValue); 085 } 086 087 @Override 088 public PRIMITIVE append( final char c ) 089 { 090 return this.setText(this.toString() + c); 091 } 092 093 @Override 094 public PRIMITIVE append( final char[] content ) 095 { 096 return this.setText(this.toString() + new String(content)); 097 } 098 099 @Override 100 public PRIMITIVE append( final char[] content, final int contentIndex ) 101 { 102 return this.append(content, contentIndex, content.length - contentIndex); 103 } 104 105 @Override 106 public PRIMITIVE append( 107 final char[] content, 108 final int contentIndex, 109 final int contentLength ) 110 { 111 return this.setText(this.toString() 112 + String.valueOf(content, contentIndex, contentLength)); 113 } 114 115 @Override 116 public PRIMITIVE append( final CharSequence s ) 117 { 118 return this.setText(this.toString() + s); 119 } 120 121 @Override 122 public PRIMITIVE append( final CharSequence s, final int start ) 123 { 124 return this.append(s, start, s.length()); 125 } 126 127 @Override 128 public PRIMITIVE append( 129 final CharSequence s, 130 final int start, 131 final int end ) 132 { 133 return this.setText(this.toString() + s.subSequence(start, end)); 134 } 135 136 @Override 137 public PRIMITIVE append( final double aValue ) 138 { 139 return this.setText(this.toString() + aValue); 140 } 141 142 @Override 143 public PRIMITIVE append( final float aValue ) 144 { 145 return this.setText(this.toString() + aValue); 146 } 147 148 @Override 149 public PRIMITIVE append( final int aValue ) 150 { 151 return this.setText(this.toString() + aValue); 152 } 153 154 @Override 155 public PRIMITIVE append( final long aValue ) 156 { 157 return this.setText(this.toString() + aValue); 158 } 159 160 @Override 161 public PRIMITIVE append( final Object aValue ) 162 { 163 return this.setText(this.toString() + aValue.toString()); 164 } 165 166 @Override 167 public PRIMITIVE append( final StringBuffer sb ) 168 { 169 return this.setText(this.toString() + sb); 170 } 171 172 @Override 173 public PRIMITIVE appendCodePoint( final int codePoint ) 174 { 175 return this.setText(this.toString() 176 + String.copyValueOf(Character.toChars(codePoint))); 177 } 178 179 @Override 180 public char charAt( final int index ) 181 { 182 return this.toString().charAt(index); 183 } 184 185 @Override 186 public void clear() 187 { 188 this.setZero(); 189 } 190 191 @Override 192 public PRIMITIVE clearContents() throws UnsupportedOperationException 193 { 194 return this.setZero(); 195 } 196 197 @Override 198 public PRIMITIVE clearText() throws UnsupportedOperationException 199 { 200 return this.setZero(); 201 } 202 203 @Override 204 public int codePointAt( final int index ) 205 { 206 return this.toString().codePointAt(index); 207 } 208 209 @Override 210 public int codePointBefore( final int index ) 211 { 212 return this.toString().codePointBefore(index); 213 } 214 215 @Override 216 public int codePointCount( final int beginIndex, final int endIndex ) 217 { 218 return this.toString().codePointCount(beginIndex, endIndex); 219 } 220 221 @Override 222 public final int compareTo( final SealedPrimitive<?> aComparable ) 223 { 224 return this.compareToReal(aComparable); 225 } 226 227 @Override 228 public final int compareToPrimitive( final SealedPrimitive<?> aComparable ) 229 { 230 return this.compareToReal(aComparable); 231 } 232 233 @Override 234 public PRIMITIVE copyUsingText( final CharSequence aValue ) 235 { 236 final PRIMITIVE aModel = this.copy(); 237 To.REAL.reactToText(aValue, aModel); 238 return aModel; 239 } 240 241 @Override 242 public PRIMITIVE delete( final int start, final int end ) 243 { 244 final String myString = this.toString(); 245 return this.setText(myString.substring(0, start) 246 + myString.substring(end)); 247 } 248 249 @Override 250 public PRIMITIVE deleteCharAt( final int anIndex ) 251 { 252 final StringBuilder sb = new StringBuilder(this.toString()); 253 sb.deleteCharAt(anIndex); 254 return this.setText(sb.toString()); 255 } 256 257 @Override 258 public boolean equals( final Object anObject ) 259 { 260 if (anObject == this) return true; 261 if (anObject instanceof SealedPrimitive<?>) { 262 final SealedPrimitive<?> aPrimitive = (SealedPrimitive<?>)anObject; 263 return this.isEqualToPrimitive(aPrimitive); 264 } 265 if (anObject instanceof SealedReal<?>) { 266 final SealedReal<?> aReal = (SealedReal<?>)anObject; 267 return this.isEqualToReal(aReal); 268 } 269 if (anObject instanceof SealedScalar<?>) { 270 final SealedScalar<?> aScalar = (SealedScalar<?>)anObject; 271 return this.isEqualToScalar(aScalar); 272 } 273 return this.isEqualToText(anObject.toString()); 274 } 275 276 @Override 277 public StructureStrategy getStructureStrategy() 278 { 279 return StructureStrategy.BITS; 280 } 281 282 @Override 283 public int indexOfText( final CharSequence str ) 284 { 285 return this.toString().indexOf(str.toString()); 286 } 287 288 @Override 289 public int indexOfText( final CharSequence str, final int beginIndex ) 290 { 291 return this.toString().indexOf(str.toString(), beginIndex); 292 } 293 294 @Override 295 public <P extends Primitive<?>> P inducePostDecrement( final P aTarget ) 296 throws NullPointerException, 297 NoSuchElementException, 298 UnsupportedOperationException, 299 IllegalStateException 300 { 301 this.inducePostDecrement((Real<?>)aTarget); 302 return aTarget; 303 } 304 305 @Override 306 public <R extends Real<?>> R inducePostDecrement( final R aTarget ) 307 throws NullPointerException, 308 NoSuchElementException, 309 UnsupportedOperationException, 310 IllegalStateException 311 { 312 this.inducePostDecrement((Scalar<?>)aTarget); 313 return aTarget; 314 } 315 316 @Override 317 public <P extends Primitive<?>> P inducePostIncrement( final P aTarget ) 318 throws NullPointerException, 319 NoSuchElementException, 320 UnsupportedOperationException, 321 IllegalStateException 322 { 323 this.inducePostIncrement((Real<?>)aTarget); 324 return aTarget; 325 } 326 327 @Override 328 public <R extends Real<?>> R inducePostIncrement( final R aTarget ) 329 throws NullPointerException, 330 NoSuchElementException, 331 UnsupportedOperationException, 332 IllegalStateException 333 { 334 this.inducePostIncrement((Scalar<?>)aTarget); 335 return aTarget; 336 } 337 338 @Override 339 public <P extends Primitive<?>> P inducePrimitiveValue( final P aTarget ) 340 throws NullPointerException, 341 NoSuchElementException, 342 UnsupportedOperationException, 343 IllegalStateException 344 { 345 this.induceRealValue(aTarget); 346 return aTarget; 347 } 348 349 @Override 350 public <TEXT extends Text<?>> TEXT induceTextValue( final TEXT aTarget ) 351 throws NullPointerException, 352 NoSuchElementException, 353 UnsupportedOperationException, 354 IllegalStateException 355 { 356 aTarget.setText(this.toString()); 357 return aTarget; 358 } 359 360 @Override 361 public PRIMITIVE insert( final int anIndex, final boolean aValue ) 362 { 363 final String myString = this.toString(); 364 return this.setText(myString.substring(0, anIndex) 365 + String.valueOf(aValue) + myString.substring(anIndex)); 366 } 367 368 @Override 369 public PRIMITIVE insert( final int anIndex, final char aValue ) 370 { 371 final String myString = this.toString(); 372 return this.setText(myString.substring(0, anIndex) 373 + String.valueOf(aValue) + myString.substring(anIndex)); 374 } 375 376 @Override 377 public PRIMITIVE insert( final int anIndex, final char[] content ) 378 { 379 final String myString = this.toString(); 380 return this.setText(myString.substring(0, anIndex) 381 + String.copyValueOf(content) + myString.substring(anIndex)); 382 } 383 384 @Override 385 public PRIMITIVE insert( 386 final int targetIndex, 387 final char[] content, 388 final int contentIndex, 389 final int contentLength ) 390 { 391 final String myString = this.toString(); 392 return this.setText(myString.substring(0, contentIndex) 393 + String.copyValueOf(content, contentIndex, contentLength) 394 + myString.substring(contentIndex)); 395 } 396 397 @Override 398 public PRIMITIVE insert( final int anIndex, final CharSequence content ) 399 { 400 final String myString = this.toString(); 401 return this.setText(myString.substring(0, anIndex) + content 402 + myString.substring(anIndex)); 403 } 404 405 @Override 406 public PRIMITIVE insert( 407 final int targetIndex, 408 final CharSequence content, 409 final int contentIndex ) 410 { 411 return this.insert(targetIndex, content, contentIndex, content.length()); 412 } 413 414 @Override 415 public PRIMITIVE insert( 416 final int targetIndex, 417 final CharSequence content, 418 final int contentStartIndex, 419 final int contentEndIndexPlusOne ) 420 { 421 final String myString = this.toString(); 422 return this.setText(myString.substring(0, targetIndex) 423 + content.subSequence(contentStartIndex, contentEndIndexPlusOne) 424 + myString.substring(targetIndex)); 425 } 426 427 @Override 428 public PRIMITIVE insert( final int anIndex, final double aValue ) 429 { 430 final String myString = this.toString(); 431 return this.setText(myString.substring(0, anIndex) 432 + String.valueOf(aValue) + myString.substring(anIndex)); 433 } 434 435 @Override 436 public PRIMITIVE insert( final int anIndex, final float aValue ) 437 { 438 final String myString = this.toString(); 439 return this.setText(myString.substring(0, anIndex) 440 + String.valueOf(aValue) + myString.substring(anIndex)); 441 } 442 443 @Override 444 public PRIMITIVE insert( final int anIndex, final int aValue ) 445 { 446 final String myString = this.toString(); 447 return this.setText(myString.substring(0, anIndex) 448 + String.valueOf(aValue) + myString.substring(anIndex)); 449 } 450 451 @Override 452 public PRIMITIVE insert( final int anIndex, final long aValue ) 453 { 454 final String myString = this.toString(); 455 return this.setText(myString.substring(0, anIndex) 456 + String.valueOf(aValue) + myString.substring(anIndex)); 457 } 458 459 @Override 460 public PRIMITIVE insert( final int anIndex, final Object aValue ) 461 { 462 final String myString = this.toString(); 463 return this.setText(myString.substring(0, anIndex) 464 + String.valueOf(aValue) + myString.substring(anIndex)); 465 } 466 467 @Override 468 public boolean isEmpty() 469 { 470 return false; 471 } 472 473 @Override 474 public final boolean isEqualToPrimitive( final SealedPrimitive<?> aValue ) 475 { 476 final NumericPrecision myPrecision = this.getPrecision(); 477 final NumericPrecision aPrecision = aValue.getPrecision(); 478 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 479 switch (prec) { 480 case NULL: 481 return this.isZero(); 482 case BIT: 483 return this.isEqual(aValue.booleanValue()); 484 case BYTE: 485 return this.isEqual(aValue.byteValue()); 486 case SHORT: 487 return this.isEqual(aValue.shortValue()); 488 case CHARACTER: 489 return this.isEqual(aValue.charValue()); 490 case INTEGER: 491 return this.isEqual(aValue.intValue()); 492 case LONG: 493 return this.isEqual(aValue.longValue()); 494 case FLOAT: 495 return this.isEqual(aValue.floatValue()); 496 case DOUBLE: 497 return this.isEqual(aValue.doubleValue()); 498 case UNLIMITED_INTEGER: 499 return this.isEqual(aValue.toUnlimitedInteger()); 500 case UNLIMITED_DECIMAL: 501 return this.isEqual(aValue.toUnlimitedDecimal()); 502 } 503 return this.isEqualToText(aValue); 504 } 505 506 @Override 507 public final boolean isEqualToText( final CharSequence aValue ) 508 { 509 return this.toString().equals(aValue.toString()); 510 } 511 512 @Override 513 public final boolean isGreaterOrEqualToPrimitive( 514 final SealedPrimitive<?> aValue ) 515 { 516 final NumericPrecision myPrecision = this.getPrecision(); 517 final NumericPrecision aPrecision = aValue.getPrecision(); 518 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 519 switch (prec) { 520 case NULL: 521 return !this.isNegative(); 522 case BIT: 523 return this.isGreaterOrEqual(aValue.booleanValue()); 524 case BYTE: 525 return this.isGreaterOrEqual(aValue.byteValue()); 526 case SHORT: 527 return this.isGreaterOrEqual(aValue.shortValue()); 528 case CHARACTER: 529 return this.isGreaterOrEqual(aValue.charValue()); 530 case INTEGER: 531 return this.isGreaterOrEqual(aValue.intValue()); 532 case LONG: 533 return this.isGreaterOrEqual(aValue.longValue()); 534 case FLOAT: 535 return this.isGreaterOrEqual(aValue.floatValue()); 536 case DOUBLE: 537 return this.isGreaterOrEqual(aValue.doubleValue()); 538 case UNLIMITED_INTEGER: 539 return this.isGreaterOrEqual(aValue.toUnlimitedInteger()); 540 case UNLIMITED_DECIMAL: 541 return this.isGreaterOrEqual(aValue.toUnlimitedDecimal()); 542 } 543 return this.isGreaterOrEqualToText(aValue); 544 } 545 546 @Override 547 public final boolean isGreaterOrEqualToText( final CharSequence aValue ) 548 { 549 return 0 <= this.toString().compareTo(aValue.toString()); 550 } 551 552 @Override 553 public final boolean isGreaterThanPrimitive( final SealedPrimitive<?> aValue ) 554 { 555 final NumericPrecision myPrecision = this.getPrecision(); 556 final NumericPrecision aPrecision = aValue.getPrecision(); 557 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 558 switch (prec) { 559 case NULL: 560 return this.isPositive(); 561 case BIT: 562 return this.isGreater(aValue.booleanValue()); 563 case BYTE: 564 return this.isGreater(aValue.byteValue()); 565 case SHORT: 566 return this.isGreater(aValue.shortValue()); 567 case CHARACTER: 568 return this.isGreater(aValue.charValue()); 569 case INTEGER: 570 return this.isGreater(aValue.intValue()); 571 case LONG: 572 return this.isGreater(aValue.longValue()); 573 case FLOAT: 574 return this.isGreater(aValue.floatValue()); 575 case DOUBLE: 576 return this.isGreater(aValue.doubleValue()); 577 case UNLIMITED_INTEGER: 578 return this.isGreater(aValue.toUnlimitedInteger()); 579 case UNLIMITED_DECIMAL: 580 return this.isGreater(aValue.toUnlimitedDecimal()); 581 } 582 return this.isGreaterThanText(aValue); 583 } 584 585 @Override 586 public final boolean isGreaterThanText( final CharSequence aValue ) 587 { 588 return 0 < this.toString().compareTo(aValue.toString()); 589 } 590 591 @Override 592 public final boolean isLessOrEqualToPrimitive( 593 final SealedPrimitive<?> aValue ) 594 { 595 final NumericPrecision myPrecision = this.getPrecision(); 596 final NumericPrecision aPrecision = aValue.getPrecision(); 597 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 598 switch (prec) { 599 case NULL: 600 return !this.isPositive(); 601 case BIT: 602 return this.isLessOrEqual(aValue.booleanValue()); 603 case BYTE: 604 return this.isLessOrEqual(aValue.byteValue()); 605 case SHORT: 606 return this.isLessOrEqual(aValue.shortValue()); 607 case CHARACTER: 608 return this.isLessOrEqual(aValue.charValue()); 609 case INTEGER: 610 return this.isLessOrEqual(aValue.intValue()); 611 case LONG: 612 return this.isLessOrEqual(aValue.longValue()); 613 case FLOAT: 614 return this.isLessOrEqual(aValue.floatValue()); 615 case DOUBLE: 616 return this.isLessOrEqual(aValue.doubleValue()); 617 case UNLIMITED_INTEGER: 618 return this.isLessOrEqual(aValue.toUnlimitedInteger()); 619 case UNLIMITED_DECIMAL: 620 return this.isLessOrEqual(aValue.toUnlimitedDecimal()); 621 } 622 return this.isLessOrEqualToText(aValue); 623 } 624 625 @Override 626 public final boolean isLessOrEqualToText( final CharSequence aValue ) 627 { 628 return this.toString().compareTo(aValue.toString()) <= 0; 629 } 630 631 @Override 632 public final boolean isLessThanPrimitive( final SealedPrimitive<?> aValue ) 633 { 634 final NumericPrecision myPrecision = this.getPrecision(); 635 final NumericPrecision aPrecision = aValue.getPrecision(); 636 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 637 switch (prec) { 638 case NULL: 639 return this.isNegative(); 640 case BIT: 641 return this.isLess(aValue.booleanValue()); 642 case BYTE: 643 return this.isLess(aValue.byteValue()); 644 case SHORT: 645 return this.isLess(aValue.shortValue()); 646 case CHARACTER: 647 return this.isLess(aValue.charValue()); 648 case INTEGER: 649 return this.isLess(aValue.intValue()); 650 case LONG: 651 return this.isLess(aValue.longValue()); 652 case FLOAT: 653 return this.isLess(aValue.floatValue()); 654 case DOUBLE: 655 return this.isLess(aValue.doubleValue()); 656 case UNLIMITED_INTEGER: 657 return this.isLess(aValue.toUnlimitedInteger()); 658 case UNLIMITED_DECIMAL: 659 return this.isLess(aValue.toUnlimitedDecimal()); 660 } 661 return this.isLessThanText(aValue); 662 } 663 664 @Override 665 public final boolean isLessThanText( final CharSequence aValue ) 666 { 667 return this.toString().compareTo(aValue.toString()) < 0; 668 } 669 670 @Override 671 public final boolean isNotEqualToPrimitive( final SealedPrimitive<?> aValue ) 672 { 673 final NumericPrecision myPrecision = this.getPrecision(); 674 final NumericPrecision aPrecision = aValue.getPrecision(); 675 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 676 switch (prec) { 677 case NULL: 678 return !this.isZero(); 679 case BIT: 680 return this.isNotEqual(aValue.booleanValue()); 681 case BYTE: 682 return this.isNotEqual(aValue.byteValue()); 683 case SHORT: 684 return this.isNotEqual(aValue.shortValue()); 685 case CHARACTER: 686 return this.isNotEqual(aValue.charValue()); 687 case INTEGER: 688 return this.isNotEqual(aValue.intValue()); 689 case LONG: 690 return this.isNotEqual(aValue.longValue()); 691 case FLOAT: 692 return this.isNotEqual(aValue.floatValue()); 693 case DOUBLE: 694 return this.isNotEqual(aValue.doubleValue()); 695 case UNLIMITED_INTEGER: 696 return this.isNotEqual(aValue.toUnlimitedInteger()); 697 case UNLIMITED_DECIMAL: 698 return this.isNotEqual(aValue.toUnlimitedDecimal()); 699 } 700 return this.isNotEqualToText(aValue); 701 } 702 703 @Override 704 public final boolean isNotEqualToText( final CharSequence aValue ) 705 { 706 return this.toString().compareTo(aValue.toString()) != 0; 707 } 708 709 @Override 710 public boolean isText() 711 { 712 return false; 713 } 714 715 @Override 716 public int length() 717 { 718 return this.toString().length(); 719 } 720 721 @Override 722 public PRIMITIVE lowerCase() 723 { 724 return this.setScalar(Character.toLowerCase(this.intValue())); 725 } 726 727 @Override 728 public final PRIMITIVE prepend( final boolean aValue ) 729 { 730 return this.setText(String.valueOf(aValue) + this.toString()); 731 } 732 733 @Override 734 public final PRIMITIVE prepend( final char c ) 735 { 736 return this.setText(String.valueOf(c) + this.toString()); 737 } 738 739 @Override 740 public final PRIMITIVE prepend( final char[] content ) 741 { 742 return this.setText(new String(content) + this.toString()); 743 } 744 745 @Override 746 public final PRIMITIVE prepend( final char[] content, final int contentIndex ) 747 { 748 return this.prepend(content, contentIndex, content.length 749 - contentIndex); 750 } 751 752 @Override 753 public final PRIMITIVE prepend( 754 final char[] content, 755 final int contentIndex, 756 final int contentLength ) 757 { 758 return this.setText(this.toString() 759 + String.valueOf(content, contentIndex, contentLength)); 760 } 761 762 @Override 763 public final PRIMITIVE prepend( final CharSequence s ) 764 { 765 return this.setText(s.toString() + this.toString()); 766 } 767 768 @Override 769 public final PRIMITIVE prepend( final CharSequence s, final int start ) 770 { 771 return this.prepend(s, start, s.length()); 772 } 773 774 @Override 775 public final PRIMITIVE prepend( 776 final CharSequence s, 777 final int start, 778 final int end ) 779 { 780 return this.setText(this.toString() + s.subSequence(start, end)); 781 } 782 783 @Override 784 public final PRIMITIVE prepend( final double aValue ) 785 { 786 return this.setText(String.valueOf(aValue) + this.toString()); 787 } 788 789 @Override 790 public final PRIMITIVE prepend( final float aValue ) 791 { 792 return this.setText(String.valueOf(aValue) + this.toString()); 793 } 794 795 @Override 796 public final PRIMITIVE prepend( final int aValue ) 797 { 798 return this.setText(String.valueOf(aValue) + this.toString()); 799 } 800 801 @Override 802 public final PRIMITIVE prepend( final long aValue ) 803 { 804 return this.setText(String.valueOf(aValue) + this.toString()); 805 } 806 807 @Override 808 public final PRIMITIVE prepend( final Object aValue ) 809 { 810 return this.setText(aValue.toString() + this.toString()); 811 } 812 813 @Override 814 public PRIMITIVE replace( 815 final CharSequence target, 816 final CharSequence replacement ) 817 { 818 final String myString = this.toString(); 819 return this.setText(myString.replace(target, replacement)); 820 } 821 822 @Override 823 public PRIMITIVE replace( final int start, final int end, final String str ) 824 { 825 final String myString = this.toString(); 826 return this.setText(myString.substring(0, start) + str 827 + myString.substring(end + 1)); 828 } 829 830 @Override 831 public PRIMITIVE replaceAll( final String regex, final String replacement ) 832 { 833 final String myString = this.toString(); 834 return this.setText(myString.replaceAll(regex, replacement)); 835 } 836 837 @Override 838 public PRIMITIVE replaceCharacter( final char oldChar, final char newChar ) 839 { 840 final String myString = this.toString(); 841 return this.setText(myString.replace(oldChar, newChar)); 842 } 843 844 @Override 845 public PRIMITIVE replaceFirst( final String regex, final String replacement ) 846 { 847 final String myString = this.toString(); 848 return this.setText(myString.replaceFirst(regex, replacement)); 849 } 850 851 @Override 852 public PRIMITIVE reverse() 853 { 854 final StringBuilder content = new StringBuilder(this.toString()); 855 content.reverse(); 856 return this.setText(content); 857 } 858 859 @Override 860 public final PRIMITIVE setBoolean( final Boolean aValue ) 861 throws UnsupportedOperationException, 862 IllegalArgumentException, 863 ArithmeticException, 864 NullPointerException 865 { 866 return this.setScalar(aValue.booleanValue()); 867 } 868 869 @Override 870 public final PRIMITIVE setCharacter( final Character aValue ) 871 throws UnsupportedOperationException, 872 IllegalArgumentException, 873 ArithmeticException, 874 NullPointerException 875 { 876 return this.setScalar(aValue.charValue()); 877 } 878 879 @Override 880 public PRIMITIVE setCharAt( final int index, final char ch ) 881 { 882 final String myString = this.toString(); 883 final StringBuilder sb = new StringBuilder(myString); 884 sb.setCharAt(index, ch); 885 return this.setText(sb.toString()); 886 } 887 888 @Override 889 public PRIMITIVE setLength( final int newLength ) 890 { 891 final String myText = this.toString(); 892 final int myLength = myText.length(); 893 if (myLength < 1) return this.clearText(); 894 return this.setText(myText.subSequence(0, myLength - 1)); 895 } 896 897 @Override 898 public PRIMITIVE setNumber( final Number aValue ) 899 throws UnsupportedOperationException, 900 IllegalArgumentException, 901 ArithmeticException, 902 NullPointerException 903 { 904 final NumericPrecision myPrecision = this.getPrecision(); 905 final NumericPrecision aPrecision = NumericPrecision.getPrecisionFor(aValue); 906 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 907 switch (prec) { 908 case BIT: 909 case BYTE: 910 return this.setScalar(aValue.byteValue()); 911 case SHORT: 912 return this.setScalar(aValue.shortValue()); 913 case CHARACTER: 914 case INTEGER: 915 return this.setScalar(aValue.intValue()); 916 case LONG: 917 return this.setScalar(aValue.longValue()); 918 case FLOAT: 919 return this.setScalar(aValue.floatValue()); 920 case UNLIMITED_DECIMAL: 921 try { 922 final BigDecimal ud = (BigDecimal)aValue; 923 return this.setReal(ud); 924 } catch (final ClassCastException ex) { 925 } 926 break; 927 case UNLIMITED_INTEGER: 928 try { 929 final BigInteger ui = (BigInteger)aValue; 930 return this.setReal(ui); 931 } catch (final ClassCastException ex) { 932 } 933 break; 934 } 935 return this.setScalar(aValue.doubleValue()); 936 } 937 938 @Override 939 public PRIMITIVE setPrimitive( final SealedPrimitive<?> aValue ) 940 throws UnsupportedOperationException, 941 IllegalArgumentException, 942 ArithmeticException, 943 NullPointerException 944 { 945 final NumericPrecision myPrecision = this.getPrecision(); 946 final NumericPrecision aPrecision = NumericPrecision.getPrecisionFor(aValue); 947 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 948 switch (prec) { 949 case NULL: 950 return this.setZero(); 951 case BIT: 952 return this.setScalar(aValue.booleanValue()); 953 case BYTE: 954 return this.setScalar(aValue.byteValue()); 955 case SHORT: 956 return this.setScalar(aValue.shortValue()); 957 case CHARACTER: 958 return this.setScalar(aValue.charValue()); 959 case INTEGER: 960 return this.setScalar(aValue.intValue()); 961 case LONG: 962 return this.setScalar(aValue.longValue()); 963 case FLOAT: 964 return this.setScalar(aValue.floatValue()); 965 case UNLIMITED_DECIMAL: 966 return this.setReal(aValue.toUnlimitedDecimal()); 967 case UNLIMITED_INTEGER: 968 return this.setReal(aValue.toUnlimitedInteger()); 969 } 970 return this.setScalar(aValue.doubleValue()); 971 } 972 973 @Override 974 public PRIMITIVE setReal( final SealedReal<?> aValue ) 975 throws UnsupportedOperationException, 976 IllegalArgumentException, 977 ArithmeticException, 978 NullPointerException 979 { 980 final NumericPrecision myPrecision = this.getPrecision(); 981 final NumericPrecision aPrecision = NumericPrecision.getPrecisionFor(aValue); 982 final NumericPrecision prec = myPrecision.maximumOf(aPrecision); 983 switch (prec) { 984 case NULL: 985 return this.setZero(); 986 case BIT: 987 return this.setScalar(aValue.booleanValue()); 988 case BYTE: 989 return this.setScalar(aValue.byteValue()); 990 case SHORT: 991 return this.setScalar(aValue.shortValue()); 992 case CHARACTER: 993 return this.setScalar(aValue.charValue()); 994 case INTEGER: 995 return this.setScalar(aValue.intValue()); 996 case LONG: 997 return this.setScalar(aValue.longValue()); 998 case FLOAT: 999 return this.setScalar(aValue.floatValue()); 1000 case UNLIMITED_DECIMAL: 1001 return this.setReal(aValue.toUnlimitedDecimal()); 1002 case UNLIMITED_INTEGER: 1003 return this.setReal(aValue.toUnlimitedInteger()); 1004 } 1005 return this.setScalar(aValue.doubleValue()); 1006 } 1007 1008 @Override 1009 @SuppressWarnings( "unchecked" ) 1010 public PRIMITIVE setText( final CharSequence content ) 1011 throws UnsupportedOperationException, 1012 NullPointerException, 1013 IllegalArgumentException 1014 { 1015 To.REAL.reactToText(content, this); 1016 return (PRIMITIVE)this; 1017 } 1018 1019 @Override 1020 public CharSequence subSequence( final int start, final int end ) 1021 { 1022 return this.toString().subSequence(start, end); 1023 } 1024 1025 @Override 1026 public String substring( final int start ) 1027 { 1028 return this.toString().substring(start); 1029 } 1030 1031 @Override 1032 public String substring( final int start, final int end ) 1033 { 1034 return this.toString().substring(start, end); 1035 } 1036 1037 @Override 1038 public String textPostDecrement() 1039 throws UnsupportedOperationException, 1040 ArithmeticException, 1041 IllegalArgumentException 1042 { 1043 final String myValue = this.toString(); 1044 this.decrement(); 1045 return myValue; 1046 } 1047 1048 @Override 1049 public String textPostIncrement() 1050 throws UnsupportedOperationException, 1051 ArithmeticException, 1052 IllegalArgumentException 1053 { 1054 final String myValue = this.toString(); 1055 this.increment(); 1056 return myValue; 1057 } 1058 1059 @Override 1060 public PRIMITIVE titleCase() 1061 { 1062 return this.setScalar(Character.toTitleCase(this.intValue())); 1063 } 1064 1065 @Override 1066 @SuppressWarnings( "unchecked" ) 1067 public PRIMITIVE trim() 1068 { 1069 return (PRIMITIVE)this; 1070 } 1071 1072 @Override 1073 public PRIMITIVE upperCase() 1074 { 1075 return this.setScalar(Character.toUpperCase(this.intValue())); 1076 } 1077 1078 public final static Primitive<?> toPrimitive( final SealedReal<?> aReal ) 1079 { 1080 switch (aReal.getPrecision()) { 1081 case NULL: 1082 return Constant.NULL; 1083 case UNKNOWN: 1084 return new TextPrimitive(aReal.toString()); 1085 case BIT: 1086 return new BooleanPrimitive(aReal.booleanValue()); 1087 case BYTE: 1088 return new BytePrimitive(aReal.byteValue()); 1089 case CHARACTER: 1090 return new CharacterPrimitive(aReal.charValue()); 1091 case SHORT: 1092 return new ShortPrimitive(aReal.shortValue()); 1093 case INTEGER: 1094 return new IntegerPrimitive(aReal.intValue()); 1095 case LONG: 1096 return new LongPrimitive(aReal.longValue()); 1097 case FLOAT: 1098 return new FloatPrimitive(aReal.floatValue()); 1099 case UNLIMITED_INTEGER: 1100 return new UnlimitedIntegerPrimitive(aReal.toUnlimitedInteger()); 1101 case UNLIMITED_DECIMAL: 1102 return new UnlimitedDecimalPrimitive(aReal.toUnlimitedDecimal()); 1103 } 1104 return new DoublePrimitive(aReal.doubleValue()); 1105 } 1106 1107 public final static Primitive<?> toPrimitive( final SealedScalar<?> aScalar ) 1108 { 1109 switch (aScalar.getPrecision()) { 1110 case NULL: 1111 return Constant.NULL; 1112 case UNKNOWN: 1113 return new TextPrimitive(aScalar.toString()); 1114 case BIT: 1115 return new BooleanPrimitive(aScalar.booleanValue()); 1116 case BYTE: 1117 return new BytePrimitive(aScalar.byteValue()); 1118 case CHARACTER: 1119 return new CharacterPrimitive(aScalar.charValue()); 1120 case SHORT: 1121 return new ShortPrimitive(aScalar.shortValue()); 1122 case INTEGER: 1123 return new IntegerPrimitive(aScalar.intValue()); 1124 case LONG: 1125 return new LongPrimitive(aScalar.longValue()); 1126 case FLOAT: 1127 return new FloatPrimitive(aScalar.floatValue()); 1128 } 1129 return new DoublePrimitive(aScalar.doubleValue()); 1130 } 1131}