16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1997-2012, International Business Machines
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File DIGITLST.H
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   02/25/97    aliu        Converted from java.
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   03/21/97    clhuang     Updated per C++ implementation.
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   04/15/97    aliu        Changed MAX_COUNT to DBL_DIG.  Changed Digit to char.
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   09/09/97    aliu        Adapted for exponential notation support.
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   08/02/98    stephen     Added nearest/even rounding
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   06/29/99    stephen     Made LONG_DIGITS a macro to satisfy SUN compiler
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   07/09/99    stephen     Removed kMaxCount (unused, for HP compiler)
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef DIGITLST_H
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DIGITLST_H
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/decimfmt.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <float.h>
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "decContext.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "decNumber.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Decimal digits in a 64-bit int
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define INT64_DIGITS 19
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef enum EDigitListValues {
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MAX_DBL_DIGITS = DBL_DIG,
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MAX_I64_DIGITS = INT64_DIGITS,
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MAX_DIGITS = MAX_I64_DIGITS,
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MAX_EXPONENT = DBL_DIG,
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DIGIT_PADDING = 3,
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DEFAULT_DIGITS = 40,   // Initial storage size, will grow as needed.
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     // "+." + fDigits + "e" + fDecimalAt
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MAX_DEC_DIGITS = MAX_DIGITS + DIGIT_PADDING + MAX_EXPONENT
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} EDigitListValues;
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass CharString;
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Export an explicit template instantiation of the MaybeStackHeaderAndArray that
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    is used as a data member of DigitList.
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    MSVC requires this, even though it should not be necessary.
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    No direct access to the MaybeStackHeaderAndArray leaks out of the i18n library.
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    Macintosh produces duplicate definition linker errors with the explicit template
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//    instantiation.
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !U_PLATFORM_IS_DARWIN_BASED
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtemplate class U_I18N_API MaybeStackHeaderAndArray<decNumber, char, DEFAULT_DIGITS>;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum EStackMode { kOnStack };
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgenum EFastpathBits { kFastpathOk = 1, kNoDecimal = 2 };
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Digit List is actually a Decimal Floating Point number.
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The original implementation has been replaced by a thin wrapper onto a
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * decimal number from the decNumber library.
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The original DigitList API has been retained, to minimize the impact of
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the change on the rest of the ICU formatting code.
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The change to decNumber enables support for big decimal numbers, and
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * allows rounding computations to be done directly in decimal, avoiding
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * extra, and inaccurate, conversions to and from doubles.
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Original DigitList comments:
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Digit List utility class. Private to DecimalFormat.  Handles the transcoding
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * between numeric values and strings of characters.  Only handles
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * non-negative numbers.  The division of labor between DigitList and
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * DecimalFormat is that DigitList handles the radix 10 representation
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * issues; DecimalFormat handles the locale-specific issues such as
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * positive/negative, grouping, decimal point, currency, and so on.
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <P>
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A DigitList is really a representation of a floating point value.
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * It may be an integer value; we assume that a double has sufficient
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * precision to represent all digits of a long.
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <P>
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The DigitList representation consists of a string of characters,
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which are the digits radix 10, from '0' to '9'.  It also has a radix
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 10 exponent associated with it.  The value represented by a DigitList
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * object can be computed by mulitplying the fraction f, where 0 <= f < 1,
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * derived by placing all the digits of the list to the right of the
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * decimal point, by 10^exponent.
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * --------
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * DigitList vs. decimalNumber:
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    DigitList stores digits with the most significant first.
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    decNumber stores digits with the least significant first.
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    DigitList, decimal point is before the most significant.
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    decNumber, decimal point is after the least signficant digit.
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       digitList:    0.ddddd * 10 ^ exp
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       decNumber:    ddddd. * 10 ^ exp
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       digitList exponent = decNumber exponent + digit count
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    digitList, digits are platform invariant chars, '0' - '9'
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *    decNumber, digits are binary, one per byte, 0 - 9.
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       (decNumber library is configurable in how digits are stored, ICU has configured
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *        it this way for convenience in replacing the old DigitList implementation.)
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_I18N_API DigitList : public UMemory { // Declare external to make compiler happy
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DigitList();
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ~DigitList();
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* copy constructor
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param DigitList The object to be copied.
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the newly created object.
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DigitList(const DigitList&); // copy constructor
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* assignment operator
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param DigitList The object to be copied.
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the newly created object.
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DigitList& operator=(const DigitList&);  // assignment operator
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return true if another object is semantically equal to this one.
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param other The DigitList to be compared for equality
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if another object is semantically equal to this one.
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * return false otherwise.
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool operator==(const DigitList& other) const;
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t  compare(const DigitList& other);
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UBool operator!=(const DigitList& other) const { return !operator==(other); }
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Clears out the digits.
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Use before appending them.
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Typically, you set a series of digits with append, then at the point
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * you hit the decimal point, you set myDigitList.fDecimalAt = myDigitList.fCount;
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * then go on appending digits.
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void clear(void);
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Remove, by rounding, any fractional part of the decimal number,
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  leaving an integer value.
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void toIntegralValue();
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Appends digits to the list.
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    CAUTION:  this function is not recommended for new code.
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              In the original DigitList implementation, decimal numbers were
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              parsed by appending them to a digit list as they were encountered.
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              With the revamped DigitList based on decNumber, append is very
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              inefficient, and the interaction with the exponent value is confusing.
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              Best avoided.
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              TODO:  remove this function once all use has been replaced.
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              TODO:  describe alternative to append()
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param digit The digit to be appended.
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void append(char digit);
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to get the value of the digit list
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns 0.0 if zero length.
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the value of the digit list.
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double getDouble(void) const;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to get the value of the digit list
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Make sure that fitsIntoLong() is called before calling this function.
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns 0 if zero length.
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the value of the digit list, return 0 if it is zero length
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getLong(void) /*const*/;
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to get the value of the digit list
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Make sure that fitsIntoInt64() is called before calling this function.
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns 0 if zero length.
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the value of the digit list, return 0 if it is zero length
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int64_t getInt64(void) /*const*/;
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Utility routine to get the value of the digit list as a decimal string.
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void getDecimal(CharString &str, UErrorCode &status);
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return true if the number represented by this object can fit into
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a long.
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ignoreNegativeZero True if negative zero is ignored.
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the number represented by this object can fit into
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a long, return false otherwise.
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fitsIntoLong(UBool ignoreNegativeZero) /*const*/;
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return true if the number represented by this object can fit into
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * an int64_t.
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ignoreNegativeZero True if negative zero is ignored.
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the number represented by this object can fit into
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a long, return false otherwise.
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool fitsIntoInt64(UBool ignoreNegativeZero) /*const*/;
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to set the value of the digit list from a double.
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source The value to be set
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void set(double source);
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to set the value of the digit list from a long.
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If a non-zero maximumDigits is specified, no more than that number of
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * significant digits will be produced.
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source The value to be set
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void set(int32_t source);
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to set the value of the digit list from an int64.
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If a non-zero maximumDigits is specified, no more than that number of
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * significant digits will be produced.
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source The value to be set
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void set(int64_t source);
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to set the value of the digit list from an int64.
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Does not set the decnumber unless requested later
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If a non-zero maximumDigits is specified, no more than that number of
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * significant digits will be produced.
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source The value to be set
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setInteger(int64_t source);
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   /**
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Utility routine to set the value of the digit list from a decimal number
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * string.
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param source The value to be set.  The string must be nul-terminated.
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param fastpathBits special flags for fast parsing
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void set(const StringPiece &source, UErrorCode &status, uint32_t fastpathBits = 0);
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Multiply    this = this * arg
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *    This digitlist will be expanded if necessary to accomodate the result.
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  @param arg  the number to multiply by.
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void mult(const DigitList &arg, UErrorCode &status);
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *   Divide    this = this / arg
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void div(const DigitList &arg, UErrorCode &status);
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //  The following functions replace direct access to the original DigitList implmentation
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //  data structures.
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setRoundingMode(DecimalFormat::ERoundingMode m);
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /** Test a number for zero.
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return  TRUE if the number is zero
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isZero(void) const;
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /** Test for a Nan
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return  TRUE if the number is a NaN
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isNaN(void) const {return decNumberIsNaN(fDecNumber);}
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool isInfinite() const {return decNumberIsInfinite(fDecNumber);}
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**  Reduce, or normalize.  Removes trailing zeroes, adjusts exponent appropriately. */
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void     reduce();
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**  Remove trailing fraction zeros, adjust exponent accordingly. */
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void     trim();
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /** Set to zero */
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void     setToZero() {uprv_decNumberZero(fDecNumber);}
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /** get the number of digits in the decimal number */
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t  digits() const {return fDecNumber->digits;}
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Round the number to the given number of digits.
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param maximumDigits The maximum number of digits to be shown.
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Upon return, count will be less than or equal to maximumDigits.
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void round(int32_t maximumDigits);
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void roundFixedPoint(int32_t maximumFractionDigits);
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /** Ensure capacity for digits.  Grow the storage if it is currently less than
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *      the requested size.   Capacity is not reduced if it is already greater
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *      than requested.
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void  ensureCapacity(int32_t  requestedSize, UErrorCode &status);
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool    isPositive(void) const { return decNumberIsNegative(fDecNumber) == 0;}
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void     setPositive(UBool s);
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void     setDecimalAt(int32_t d);
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t  getDecimalAt();
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void     setCount(int32_t c);
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t  getCount() const;
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Set the digit in platform (invariant) format, from '0'..'9'
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param i index of digit
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param v digit value, from '0' to '9' in platform invariant format
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void     setDigit(int32_t i, char v);
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Get the digit in platform (invariant) format, from '0'..'9' inclusive
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param i index of digit
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return invariant format of the digit
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char     getDigit(int32_t i);
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Get the digit's value, as an integer from 0..9 inclusive.
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Note that internally this value is a decNumberUnit, but ICU configures it to be a uint8_t.
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param i index of digit
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return value of that digit
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint8_t     getDigitValue(int32_t i);
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /*
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * These data members are intentionally public and can be set directly.
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *<P>
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The value represented is given by placing the decimal point before
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * fDigits[fDecimalAt].  If fDecimalAt is < 0, then leading zeros between
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the decimal point and the first nonzero digit are implied.  If fDecimalAt
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is > fCount, then trailing zeros between the fDigits[fCount-1] and the
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * decimal point are implied.
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <P>
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Equivalently, the represented value is given by f * 10^fDecimalAt.  Here
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * f is a value 0.1 <= f < 1 arrived at by placing the digits in fDigits to
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the right of the decimal.
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <P>
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * DigitList is normalized, so if it is non-zero, fDigits[0] is non-zero.  We
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * don't allow denormalized numbers because our exponent is effectively of
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * unlimited magnitude.  The fCount value contains the number of significant
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * digits present in fDigits[].
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <P>
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Zero is represented by any DigitList with fCount == 0 or with each fDigits[i]
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for all i <= fCount == '0'.
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * int32_t                         fDecimalAt;
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * int32_t                         fCount;
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UBool                           fIsPositive;
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * char                            *fDigits;
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * DecimalFormat::ERoundingMode    fRoundingMode;
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    decContext    fContext;   // public access to status flags.
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    decNumber     *fDecNumber;
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    MaybeStackHeaderAndArray<decNumber, char, DEFAULT_DIGITS>  fStorage;
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Cached double value corresponding to this decimal number.
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This is an optimization for the formatting implementation, which may
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ask for the double value multiple times.
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    union DoubleOrInt64 {
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      double        fDouble;
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      int64_t       fInt64;
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } fUnion;
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum EHave {
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      kNone=0,
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      kDouble,
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      kInt64
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } fHave;
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool shouldRoundUp(int32_t maximumDigits) const;
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    using UMemory::operator new;
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    using UMemory::operator delete;
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Placement new for stack usage
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static inline void * U_EXPORT2 operator new(size_t /*size*/, void * onStack, EStackMode  /*mode*/) U_NO_THROW { return onStack; }
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Placement delete for stack usage
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static inline void U_EXPORT2 operator delete(void * /*ptr*/, void * /*onStack*/, EStackMode /*mode*/)  U_NO_THROW {}
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline void internalSetDouble(double d) {
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fHave = kDouble;
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fUnion.fDouble=d;
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline void internalSetInt64(int64_t d) {
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fHave = kInt64;
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fUnion.fInt64=d;
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline void internalClear() {
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fHave = kNone;
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // #if !UCONFIG_NO_FORMATTING
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif // _DIGITLST
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof
452