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}