1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
4fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius*   Copyright (C) 1997-2013, International Business Machines
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File DIGITLST.H
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   02/25/97    aliu        Converted from java.
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   03/21/97    clhuang     Updated per C++ implementation.
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   04/15/97    aliu        Changed MAX_COUNT to DBL_DIG.  Changed Digit to char.
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   09/09/97    aliu        Adapted for exponential notation support.
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   08/02/98    stephen     Added nearest/even rounding
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   06/29/99    stephen     Made LONG_DIGITS a macro to satisfy SUN compiler
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   07/09/99    stephen     Removed kMaxCount (unused, for HP compiler)
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru******************************************************************************
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef DIGITLST_H
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define DIGITLST_H
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uobject.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/decimfmt.h"
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <float.h>
3250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "decContext.h"
3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "decNumber.h"
3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Decimal digits in a 64-bit int
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define INT64_DIGITS 19
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querutypedef enum EDigitListValues {
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MAX_DBL_DIGITS = DBL_DIG,
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MAX_I64_DIGITS = INT64_DIGITS,
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MAX_DIGITS = MAX_I64_DIGITS,
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MAX_EXPONENT = DBL_DIG,
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DIGIT_PADDING = 3,
4550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    DEFAULT_DIGITS = 40,   // Initial storage size, will grow as needed.
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     // "+." + fDigits + "e" + fDecimalAt
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MAX_DEC_DIGITS = MAX_DIGITS + DIGIT_PADDING + MAX_EXPONENT
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} EDigitListValues;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5327f654740f2a26ad62a5c155af9199af9e69b889clairehoclass CharString;
5427f654740f2a26ad62a5c155af9199af9e69b889claireho
5527f654740f2a26ad62a5c155af9199af9e69b889claireho// Export an explicit template instantiation of the MaybeStackHeaderAndArray that
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//    is used as a data member of DigitList.
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//    MSVC requires this, even though it should not be necessary.
5927f654740f2a26ad62a5c155af9199af9e69b889claireho//    No direct access to the MaybeStackHeaderAndArray leaks out of the i18n library.
6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//    Macintosh produces duplicate definition linker errors with the explicit template
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//    instantiation.
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
64103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#if !U_PLATFORM_IS_DARWIN_BASED
6527f654740f2a26ad62a5c155af9199af9e69b889clairehotemplate class U_I18N_API MaybeStackHeaderAndArray<decNumber, char, DEFAULT_DIGITS>;
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif
6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
69103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusenum EStackMode { kOnStack };
70103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
7154dcd9b6a06071f647dac967e9e267abb9410720Craig Corneliusenum EFastpathBits { kFastpathOk = 1, kNoDecimal = 2 };
7254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Digit List is actually a Decimal Floating Point number.
7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * The original implementation has been replaced by a thin wrapper onto a
7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * decimal number from the decNumber library.
7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * The original DigitList API has been retained, to minimize the impact of
7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * the change on the rest of the ICU formatting code.
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * The change to decNumber enables support for big decimal numbers, and
8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * allows rounding computations to be done directly in decimal, avoiding
8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * extra, and inaccurate, conversions to and from doubles.
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Original DigitList comments:
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Digit List utility class. Private to DecimalFormat.  Handles the transcoding
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * between numeric values and strings of characters.  Only handles
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * non-negative numbers.  The division of labor between DigitList and
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * DecimalFormat is that DigitList handles the radix 10 representation
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * issues; DecimalFormat handles the locale-specific issues such as
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * positive/negative, grouping, decimal point, currency, and so on.
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <P>
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * A DigitList is really a representation of a floating point value.
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * It may be an integer value; we assume that a double has sufficient
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * precision to represent all digits of a long.
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * <P>
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The DigitList representation consists of a string of characters,
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * which are the digits radix 10, from '0' to '9'.  It also has a radix
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 10 exponent associated with it.  The value represented by a DigitList
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * object can be computed by mulitplying the fraction f, where 0 <= f < 1,
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * derived by placing all the digits of the list to the right of the
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * decimal point, by 10^exponent.
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * --------
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * DigitList vs. decimalNumber:
10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *    DigitList stores digits with the most significant first.
11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *    decNumber stores digits with the least significant first.
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *    DigitList, decimal point is before the most significant.
11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *    decNumber, decimal point is after the least signficant digit.
11450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
11550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *       digitList:    0.ddddd * 10 ^ exp
11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *       decNumber:    ddddd. * 10 ^ exp
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *       digitList exponent = decNumber exponent + digit count
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
12027f654740f2a26ad62a5c155af9199af9e69b889claireho *    digitList, digits are platform invariant chars, '0' - '9'
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *    decNumber, digits are binary, one per byte, 0 - 9.
12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *       (decNumber library is configurable in how digits are stored, ICU has configured
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *        it this way for convenience in replacing the old DigitList implementation.)
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass U_I18N_API DigitList : public UMemory { // Declare external to make compiler happy
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DigitList();
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ~DigitList();
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* copy constructor
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param DigitList The object to be copied.
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the newly created object.
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DigitList(const DigitList&); // copy constructor
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* assignment operator
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param DigitList The object to be copied.
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the newly created object.
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    DigitList& operator=(const DigitList&);  // assignment operator
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return true if another object is semantically equal to this one.
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param other The DigitList to be compared for equality
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return true if another object is semantically equal to this one.
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * return false otherwise.
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool operator==(const DigitList& other) const;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t  compare(const DigitList& other);
15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
155b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    inline UBool operator!=(const DigitList& other) const { return !operator==(other); }
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Clears out the digits.
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Use before appending them.
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Typically, you set a series of digits with append, then at the point
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * you hit the decimal point, you set myDigitList.fDecimalAt = myDigitList.fCount;
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * then go on appending digits.
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void clear(void);
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  Remove, by rounding, any fractional part of the decimal number,
16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  leaving an integer value.
16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void toIntegralValue();
17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Appends digits to the list.
17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *    CAUTION:  this function is not recommended for new code.
17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *              In the original DigitList implementation, decimal numbers were
17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *              parsed by appending them to a digit list as they were encountered.
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *              With the revamped DigitList based on decNumber, append is very
17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *              inefficient, and the interaction with the exponent value is confusing.
17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *              Best avoided.
18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *              TODO:  remove this function once all use has been replaced.
18127f654740f2a26ad62a5c155af9199af9e69b889claireho     *              TODO:  describe alternative to append()
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param digit The digit to be appended.
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
18450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void append(char digit);
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Utility routine to get the value of the digit list
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Returns 0.0 if zero length.
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the value of the digit list.
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    double getDouble(void) const;
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Utility routine to get the value of the digit list
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Make sure that fitsIntoLong() is called before calling this function.
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Returns 0 if zero length.
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the value of the digit list, return 0 if it is zero length
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t getLong(void) /*const*/;
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Utility routine to get the value of the digit list
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Make sure that fitsIntoInt64() is called before calling this function.
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Returns 0 if zero length.
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return the value of the digit list, return 0 if it is zero length
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int64_t getInt64(void) /*const*/;
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  Utility routine to get the value of the digit list as a decimal string.
21127f654740f2a26ad62a5c155af9199af9e69b889claireho     */
21227f654740f2a26ad62a5c155af9199af9e69b889claireho    void getDecimal(CharString &str, UErrorCode &status);
21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return true if the number represented by this object can fit into
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * a long.
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param ignoreNegativeZero True if negative zero is ignored.
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return true if the number represented by this object can fit into
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * a long, return false otherwise.
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool fitsIntoLong(UBool ignoreNegativeZero) /*const*/;
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Return true if the number represented by this object can fit into
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * an int64_t.
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param ignoreNegativeZero True if negative zero is ignored.
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @return true if the number represented by this object can fit into
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * a long, return false otherwise.
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool fitsIntoInt64(UBool ignoreNegativeZero) /*const*/;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Utility routine to set the value of the digit list from a double.
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param source The value to be set
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void set(double source);
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Utility routine to set the value of the digit list from a long.
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * If a non-zero maximumDigits is specified, no more than that number of
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * significant digits will be produced.
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param source The value to be set
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void set(int32_t source);
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Utility routine to set the value of the digit list from an int64.
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * If a non-zero maximumDigits is specified, no more than that number of
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * significant digits will be produced.
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * @param source The value to be set
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void set(int64_t source);
25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
254103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /**
255103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * Utility routine to set the value of the digit list from an int64.
256103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * Does not set the decnumber unless requested later
257103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * If a non-zero maximumDigits is specified, no more than that number of
258103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * significant digits will be produced.
259103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @param source The value to be set
260103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     */
261103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    void setInteger(int64_t source);
262103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho   /**
26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Utility routine to set the value of the digit list from a decimal number
26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * string.
26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param source The value to be set.  The string must be nul-terminated.
26754dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @param fastpathBits special flags for fast parsing
26850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
26954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    void set(const StringPiece &source, UErrorCode &status, uint32_t fastpathBits = 0);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
27250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Multiply    this = this * arg
27350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *    This digitlist will be expanded if necessary to accomodate the result.
27450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *  @param arg  the number to multiply by.
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
27650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void mult(const DigitList &arg, UErrorCode &status);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
27950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *   Divide    this = this / arg
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
28150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void div(const DigitList &arg, UErrorCode &status);
28250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
28350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //  The following functions replace direct access to the original DigitList implmentation
28450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //  data structures.
28550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
28650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void setRoundingMode(DecimalFormat::ERoundingMode m);
28750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
28850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /** Test a number for zero.
28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return  TRUE if the number is zero
29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UBool isZero(void) const;
29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /** Test for a Nan
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return  TRUE if the number is a NaN
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
296b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isNaN(void) const {return decNumberIsNaN(fDecNumber);}
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
298b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool isInfinite() const {return decNumberIsInfinite(fDecNumber);}
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**  Reduce, or normalize.  Removes trailing zeroes, adjusts exponent appropriately. */
30150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void     reduce();
30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**  Remove trailing fraction zeros, adjust exponent accordingly. */
30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void     trim();
30550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
30650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /** Set to zero */
307b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    void     setToZero() {uprv_decNumberZero(fDecNumber);}
30850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /** get the number of digits in the decimal number */
310b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t  digits() const {return fDecNumber->digits;}
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /**
31350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Round the number to the given number of digits.
31450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param maximumDigits The maximum number of digits to be shown.
31550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Upon return, count will be less than or equal to maximumDigits.
31650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
31750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void round(int32_t maximumDigits);
31850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
31950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void roundFixedPoint(int32_t maximumFractionDigits);
32050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
32150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /** Ensure capacity for digits.  Grow the storage if it is currently less than
32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *      the requested size.   Capacity is not reduced if it is already greater
32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *      than requested.
32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
32550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void  ensureCapacity(int32_t  requestedSize, UErrorCode &status);
32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
327b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UBool    isPositive(void) const { return decNumberIsNegative(fDecNumber) == 0;}
32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void     setPositive(UBool s);
32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
33050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void     setDecimalAt(int32_t d);
33150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t  getDecimalAt();
33250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
33350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void     setCount(int32_t c);
33450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    int32_t  getCount() const;
33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
33627f654740f2a26ad62a5c155af9199af9e69b889claireho    /**
33727f654740f2a26ad62a5c155af9199af9e69b889claireho     * Set the digit in platform (invariant) format, from '0'..'9'
33827f654740f2a26ad62a5c155af9199af9e69b889claireho     * @param i index of digit
33927f654740f2a26ad62a5c155af9199af9e69b889claireho     * @param v digit value, from '0' to '9' in platform invariant format
34027f654740f2a26ad62a5c155af9199af9e69b889claireho     */
34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void     setDigit(int32_t i, char v);
34227f654740f2a26ad62a5c155af9199af9e69b889claireho
34327f654740f2a26ad62a5c155af9199af9e69b889claireho    /**
34427f654740f2a26ad62a5c155af9199af9e69b889claireho     * Get the digit in platform (invariant) format, from '0'..'9' inclusive
34527f654740f2a26ad62a5c155af9199af9e69b889claireho     * @param i index of digit
34627f654740f2a26ad62a5c155af9199af9e69b889claireho     * @return invariant format of the digit
34727f654740f2a26ad62a5c155af9199af9e69b889claireho     */
34850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    char     getDigit(int32_t i);
34950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
35127f654740f2a26ad62a5c155af9199af9e69b889claireho    /**
35227f654740f2a26ad62a5c155af9199af9e69b889claireho     * Get the digit's value, as an integer from 0..9 inclusive.
35327f654740f2a26ad62a5c155af9199af9e69b889claireho     * Note that internally this value is a decNumberUnit, but ICU configures it to be a uint8_t.
35427f654740f2a26ad62a5c155af9199af9e69b889claireho     * @param i index of digit
35527f654740f2a26ad62a5c155af9199af9e69b889claireho     * @return value of that digit
35627f654740f2a26ad62a5c155af9199af9e69b889claireho     */
35727f654740f2a26ad62a5c155af9199af9e69b889claireho    uint8_t     getDigitValue(int32_t i);
35827f654740f2a26ad62a5c155af9199af9e69b889claireho
35927f654740f2a26ad62a5c155af9199af9e69b889claireho
36050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoprivate:
36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /*
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * These data members are intentionally public and can be set directly.
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     *<P>
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * The value represented is given by placing the decimal point before
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * fDigits[fDecimalAt].  If fDecimalAt is < 0, then leading zeros between
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the decimal point and the first nonzero digit are implied.  If fDecimalAt
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * is > fCount, then trailing zeros between the fDigits[fCount-1] and the
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * decimal point are implied.
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * <P>
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Equivalently, the represented value is given by f * 10^fDecimalAt.  Here
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * f is a value 0.1 <= f < 1 arrived at by placing the digits in fDigits to
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * the right of the decimal.
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * <P>
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * DigitList is normalized, so if it is non-zero, fDigits[0] is non-zero.  We
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * don't allow denormalized numbers because our exponent is effectively of
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * unlimited magnitude.  The fCount value contains the number of significant
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * digits present in fDigits[].
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * <P>
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * Zero is represented by any DigitList with fCount == 0 or with each fDigits[i]
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * for all i <= fCount == '0'.
38150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
38250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * int32_t                         fDecimalAt;
38350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * int32_t                         fCount;
38450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * UBool                           fIsPositive;
38550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * char                            *fDigits;
38650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * DecimalFormat::ERoundingMode    fRoundingMode;
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehopublic:
390b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    decContext    fContext;   // public access to status flags.
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoprivate:
39350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    decNumber     *fDecNumber;
39427f654740f2a26ad62a5c155af9199af9e69b889claireho    MaybeStackHeaderAndArray<decNumber, char, DEFAULT_DIGITS>  fStorage;
39527f654740f2a26ad62a5c155af9199af9e69b889claireho
39650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /* Cached double value corresponding to this decimal number.
39750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * This is an optimization for the formatting implementation, which may
39850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * ask for the double value multiple times.
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
400103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    union DoubleOrInt64 {
401103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      double        fDouble;
402103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      int64_t       fInt64;
403103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } fUnion;
404103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    enum EHave {
405103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      kNone=0,
406103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      kDouble,
407103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      kInt64
408103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    } fHave;
40950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
41050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool shouldRoundUp(int32_t maximumDigits) const;
413103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
414103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius public:
415103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
416fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#if U_OVERRIDE_CXX_ALLOCATION
417103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    using UMemory::operator new;
41854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    using UMemory::operator delete;
419fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#else
420fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static inline void * U_EXPORT2 operator new(size_t size) U_NO_THROW { return ::operator new(size); };
421fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    static inline void U_EXPORT2 operator delete(void *ptr )  U_NO_THROW { ::operator delete(ptr); };
422fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
423103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
424103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /**
425103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * Placement new for stack usage
426103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * @internal
427103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     */
42854dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static inline void * U_EXPORT2 operator new(size_t /*size*/, void * onStack, EStackMode  /*mode*/) U_NO_THROW { return onStack; }
42954dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius
43054dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    /**
43154dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * Placement delete for stack usage
43254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     * @internal
43354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius     */
43454dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius    static inline void U_EXPORT2 operator delete(void * /*ptr*/, void * /*onStack*/, EStackMode /*mode*/)  U_NO_THROW {}
435103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
436103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius private:
437103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    inline void internalSetDouble(double d) {
438103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      fHave = kDouble;
439103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      fUnion.fDouble=d;
440103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
441103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    inline void internalSetInt64(int64_t d) {
442103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      fHave = kInt64;
443103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      fUnion.fInt64=d;
444103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
445103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    inline void internalClear() {
446103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius      fHave = kNone;
447103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
44950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif // #if !UCONFIG_NO_FORMATTING
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif // _DIGITLST
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof
457