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