16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1997-2013, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File FMTABLE.H
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   02/29/97    aliu        Creation.
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************************
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef FMTABLE_H
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define FMTABLE_H
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Formattable is a thin wrapper for primitive types used for formatting and parsing
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_FORMATTING
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/stringpiece.h"
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uformattable.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass CharString;
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass DigitList;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \def UNUM_INTERNAL_STACKARRAY_SIZE
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_PLATFORM == U_PF_OS400
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UNUM_INTERNAL_STACKARRAY_SIZE 144
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UNUM_INTERNAL_STACKARRAY_SIZE 128
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Formattable objects can be passed to the Format class or
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * its subclasses for formatting.  Formattable is a thin wrapper
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * class which interconverts between the primitive numeric types
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (double, long, etc.) as well as UDate and UnicodeString.
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Internally, a Formattable object is a union of primitive types.
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * As such, it can only store one flavor of data at a time.  To
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * determine what flavor of data it contains, use the getType method.
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>As of ICU 3.0, Formattable may also wrap a UObject pointer,
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which it owns.  This allows an instance of any ICU class to be
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * encapsulated in a Formattable.  For legacy reasons and for
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * efficiency, primitive numeric types are still stored directly
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * within a Formattable.
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The Formattable class is not suitable for subclassing.
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>See UFormattable for a C wrapper.
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_I18N_API Formattable : public UObject {
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This enum is only used to let callers distinguish between
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the Formattable(UDate) constructor and the Formattable(double)
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * constructor; the compiler cannot distinguish the signatures,
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * since UDate is currently typedefed to be either double or long.
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If UDate is changed later to be a bonafide class
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or struct, then we no longer need this enum.
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum ISDATE { kIsDate };
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Default constructor
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(); // Type kLong, value 0
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with a UDate instance.
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param d the UDate instance.
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param flag the flag to indicate this is a date. Always set it to kIsDate
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(UDate d, ISDATE flag);
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with a double number.
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param d the double number.
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(double d);
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with a long number.
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param l the long number.
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(int32_t l);
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with an int64_t number
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ll the int64_t number.
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.8
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(int64_t ll);
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with a char string pointer.
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Assumes that the char string is null terminated.
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param strToCopy the char string.
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(const char* strToCopy);
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object of an appropriate numeric type from a
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a decimal number in string form.  The Formattable will retain the
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * full precision of the input in decimal format, even when it exceeds
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * what can be represented by a double or int64_t.
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param number  the unformatted (not localized) string representation
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                     of the Decimal number.
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status  the error code.  Possible errors include U_INVALID_FORMAT_ERROR
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                if the format of the string does not conform to that of a
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                decimal number.
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.4
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(const StringPiece &number, UErrorCode &status);
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with a UnicodeString object to copy from.
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param strToCopy the UnicodeString string.
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(const UnicodeString& strToCopy);
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with a UnicodeString object to adopt from.
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param strToAdopt the UnicodeString string.
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(UnicodeString* strToAdopt);
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object with an array of Formattable objects.
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param arrayToCopy the Formattable object array.
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param count the array count.
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(const Formattable* arrayToCopy, int32_t count);
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Creates a Formattable object that adopts the given UObject.
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param objectToAdopt the UObject to set this object to
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(UObject* objectToAdopt);
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Copy constructor.
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable(const Formattable&);
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Assignment operator.
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param rhs   The Formattable object to copy into this object.
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable&    operator=(const Formattable &rhs);
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Equality comparison.
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param other    the object to be compared with.
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return        TRUE if other are equal to this, FALSE otherwise.
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool          operator==(const Formattable &other) const;
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Equality operator.
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param other    the object to be compared with.
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return        TRUE if other are unequal to this, FALSE otherwise.
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool          operator!=(const Formattable& other) const
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      { return !operator==(other); }
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Destructor.
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual         ~Formattable();
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Clone this object.
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Clones can be used concurrently in multiple threads.
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If an error occurs, then NULL is returned.
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The caller must delete the clone.
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a clone of this object
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see getDynamicClassID
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.8
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable *clone() const;
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Selector for flavor of data type contained within a
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Formattable object.  Formattable is a union of several
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * different types, and at any time contains exactly one type.
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum Type {
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Selector indicating a UDate value.  Use getDate to retrieve
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * the value.
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kDate,
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Selector indicating a double value.  Use getDouble to
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * retrieve the value.
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kDouble,
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Selector indicating a 32-bit integer value.  Use getLong to
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * retrieve the value.
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kLong,
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Selector indicating a UnicodeString value.  Use getString
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * to retrieve the value.
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kString,
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Selector indicating an array of Formattables.  Use getArray
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * to retrieve the value.
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kArray,
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Selector indicating a 64-bit integer value.  Use getInt64
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * to retrieve the value.
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.8
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kInt64,
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Selector indicating a UObject value.  Use getObject to
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * retrieve the value.
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 3.0
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kObject
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   };
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the data type of this Formattable object.
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the data type of this Formattable object.
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Type            getType(void) const;
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns TRUE if the data type of this Formattable object
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is kDouble, kLong, or kInt64
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return TRUE if this is a pure numeric object
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool           isNumeric() const;
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the double value of this object. If this object is not of type
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kDouble then the result is undefined.
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the double value of this object.
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double          getDouble(void) const { return fValue.fDouble; }
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the double value of this object. If this object is of type
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * long, int64 or Decimal Number then a conversion is peformed, with
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * possible loss of precision.  If the type is kObject and the
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * object is a Measure, then the result of
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * getNumber().getDouble(status) is returned.  If this object is
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * neither a numeric type nor a Measure, then 0 is returned and
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the status is set to U_INVALID_FORMAT_ERROR.
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status the error code
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the double value of this object.
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    double          getDouble(UErrorCode& status) const;
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the long value of this object. If this object is not of type
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kLong then the result is undefined.
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the long value of this object.
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         getLong(void) const { return (int32_t)fValue.fInt64; }
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the long value of this object. If the magnitude is too
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * large to fit in a long, then the maximum or minimum long value,
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * as appropriate, is returned and the status is set to
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * U_INVALID_FORMAT_ERROR.  If this object is of type kInt64 and
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * it fits within a long, then no precision is lost.  If it is of
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * type kDouble, then a conversion is peformed, with
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * truncation of any fractional part.  If the type is kObject and
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the object is a Measure, then the result of
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * getNumber().getLong(status) is returned.  If this object is
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * neither a numeric type nor a Measure, then 0 is returned and
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the status is set to U_INVALID_FORMAT_ERROR.
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status the error code
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the long value of this object.
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t         getLong(UErrorCode& status) const;
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the int64 value of this object. If this object is not of type
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kInt64 then the result is undefined.
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the int64 value of this object.
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.8
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int64_t         getInt64(void) const { return fValue.fInt64; }
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the int64 value of this object. If this object is of a numeric
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * type and the magnitude is too large to fit in an int64, then
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the maximum or minimum int64 value, as appropriate, is returned
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and the status is set to U_INVALID_FORMAT_ERROR.  If the
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * magnitude fits in an int64, then a casting conversion is
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * peformed, with truncation of any fractional part.  If the type
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is kObject and the object is a Measure, then the result of
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * getNumber().getDouble(status) is returned.  If this object is
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * neither a numeric type nor a Measure, then 0 is returned and
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the status is set to U_INVALID_FORMAT_ERROR.
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status the error code
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the int64 value of this object.
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int64_t         getInt64(UErrorCode& status) const;
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the Date value of this object. If this object is not of type
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kDate then the result is undefined.
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the Date value of this object.
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UDate           getDate() const { return fValue.fDate; }
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the Date value of this object.  If the type is not a date,
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * status is set to U_INVALID_FORMAT_ERROR and the return value is
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * undefined.
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status the error code.
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return    the Date value of this object.
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     UDate          getDate(UErrorCode& status) const;
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the string value of this object. If this object is not of type
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kString then the result is undefined.
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result    Output param to receive the Date value of this object.
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          A reference to 'result'.
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString&  getString(UnicodeString& result) const
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      { result=*fValue.fString; return result; }
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the string value of this object. If the type is not a
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * string, status is set to U_INVALID_FORMAT_ERROR and a bogus
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * string is returned.
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result    Output param to receive the Date value of this object.
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    the error code.
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          A reference to 'result'.
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString&  getString(UnicodeString& result, UErrorCode& status) const;
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets a const reference to the string value of this object. If
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this object is not of type kString then the result is
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * undefined.
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   a const reference to the string value of this object.
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline const UnicodeString& getString(void) const;
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets a const reference to the string value of this object.  If
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the type is not a string, status is set to
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * U_INVALID_FORMAT_ERROR and the result is a bogus string.
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    the error code.
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   a const reference to the string value of this object.
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString& getString(UErrorCode& status) const;
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets a reference to the string value of this object. If this
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * object is not of type kString then the result is undefined.
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   a reference to the string value of this object.
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UnicodeString& getString(void);
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets a reference to the string value of this object. If the
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * type is not a string, status is set to U_INVALID_FORMAT_ERROR
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and the result is a bogus string.
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status    the error code.
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return   a reference to the string value of this object.
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString& getString(UErrorCode& status);
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the array value and count of this object. If this object
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is not of type kArray then the result is undefined.
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param count    fill-in with the count of this object.
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the array value of this object.
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Formattable* getArray(int32_t& count) const
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      { count=fValue.fArrayAndCount.fCount; return fValue.fArrayAndCount.fArray; }
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Gets the array value and count of this object. If the type is
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * not an array, status is set to U_INVALID_FORMAT_ERROR, count is
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * set to 0, and the result is NULL.
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param count    fill-in with the count of this object.
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status the error code.
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return         the array value of this object.
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const Formattable* getArray(int32_t& count, UErrorCode& status) const;
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Accesses the specified element in the array value of this
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Formattable object. If this object is not of type kArray then
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the result is undefined.
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index the specified index.
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the accessed element in the array.
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Formattable&    operator[](int32_t index) { return fValue.fArrayAndCount.fArray[index]; }
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a pointer to the UObject contained within this
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * formattable, or NULL if this object does not contain a UObject.
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a UObject pointer, or NULL
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UObject*  getObject() const;
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a numeric string representation of the number contained within this
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * formattable, or NULL if this object does not contain numeric type.
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * For values obtained by parsing, the returned decimal number retains
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the full precision and range of the original input, unconstrained by
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the limits of a double floating point or a 64 bit int.
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This function is not thread safe, and therfore is not declared const,
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * even though it is logically const.
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Possible errors include U_MEMORY_ALLOCATION_ERROR, and
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * U_INVALID_STATE if the formattable object has not been set to
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a numeric type.
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status the error code.
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the unformatted string representation of a number.
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.4
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringPiece getDecimalNumber(UErrorCode &status);
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     /**
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the double value of this object and changes the type to
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kDouble.
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param d    the new double value to be set.
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            setDouble(double d);
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the long value of this object and changes the type to
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kLong.
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param l    the new long value to be set.
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            setLong(int32_t l);
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the int64 value of this object and changes the type to
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kInt64.
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ll    the new int64 value to be set.
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.8
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            setInt64(int64_t ll);
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the Date value of this object and changes the type to
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kDate.
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param d    the new Date value to be set.
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            setDate(UDate d);
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the string value of this object and changes the type to
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * kString.
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param stringToCopy    the new string value to be set.
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            setString(const UnicodeString& stringToCopy);
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the array value and count of this object and changes the
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * type to kArray.
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param array    the array value.
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param count    the number of array elements to be copied.
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            setArray(const Formattable* array, int32_t count);
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets and adopts the string value and count of this object and
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * changes the type to kArray.
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param stringToAdopt    the new string value to be adopted.
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            adoptString(UnicodeString* stringToAdopt);
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets and adopts the array value and count of this object and
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * changes the type to kArray.
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            adoptArray(Formattable* array, int32_t count);
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets and adopts the UObject value of this object and changes
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the type to kObject.  After this call, the caller must not
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * delete the given object.
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param objectToAdopt the UObject value to be adopted
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.0
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            adoptObject(UObject* objectToAdopt);
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Sets the the numeric value from a decimal number string, and changes
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the type to to a numeric type appropriate for the number.
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The syntax of the number is a "numeric string"
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * as defined in the Decimal Arithmetic Specification, available at
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * http://speleotrove.com/decimal
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The full precision and range of the input number will be retained,
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * even when it exceeds what can be represented by a double or an int64.
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param numberString  a string representation of the unformatted decimal number.
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status        the error code.  Set to U_INVALID_FORMAT_ERROR if the
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *                      incoming string is not a valid decimal number.
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.4
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void             setDecimalNumber(const StringPiece &numberString,
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      UErrorCode &status);
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ICU "poor man's RTTI", returns a UClassID for the actual class.
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.2
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID() const;
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ICU "poor man's RTTI", returns a UClassID for this class.
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.2
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UClassID U_EXPORT2 getStaticClassID();
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_DRAFT_API
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Convert the UFormattable to a Formattable.  Internally, this is a reinterpret_cast.
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param fmt a valid UFormattable
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the UFormattable as a Formattable object pointer.  This is an alias to the original
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UFormattable, and so is only valid while the original argument remains in scope.
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @draft ICU 52
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static inline Formattable *fromUFormattable(UFormattable *fmt);
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Convert the const UFormattable to a const Formattable.  Internally, this is a reinterpret_cast.
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param fmt a valid UFormattable
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the UFormattable as a Formattable object pointer.  This is an alias to the original
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UFormattable, and so is only valid while the original argument remains in scope.
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @draft ICU 52
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static inline const Formattable *fromUFormattable(const UFormattable *fmt);
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Convert this object pointer to a UFormattable.
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object as a UFormattable pointer.   This is an alias to this object,
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and so is only valid while this object remains in scope.
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @draft ICU 52
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UFormattable *toUFormattable();
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Convert this object pointer to a UFormattable.
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object as a UFormattable pointer.   This is an alias to this object,
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and so is only valid while this object remains in scope.
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @draft ICU 52
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline const UFormattable *toUFormattable() const;
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_DRAFT_API */
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_DEPRECATED_API
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Deprecated variant of getLong(UErrorCode&).
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status the error code
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the long value of this object.
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @deprecated ICU 3.0 use getLong(UErrorCode&) instead
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline int32_t getLong(UErrorCode* status) const;
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_DEPRECATED_API */
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Internal function, do not use.
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * TODO:  figure out how to make this be non-public.
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *        NumberFormat::format(Formattable, ...
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *        needs to get at the DigitList, if it exists, for
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *        big decimal formatting.
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  @internal
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DigitList *getDigitList() const { return fDecimalNum;}
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  @internal
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DigitList *getInternalDigitList();
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Adopt, and set value from, a DigitList
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *     Internal Function, do not use.
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  @param dl the Digit List to be adopted
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  @internal
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void adoptDigitList(DigitList *dl);
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Internal function to return the CharString pointer.
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status error code
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return pointer to the CharString - may become invalid if the object is modified
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CharString *internalGetCharString(UErrorCode &status);
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Cleans up the memory for unwanted values.  For example, the adopted
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * string or array objects.
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            dispose(void);
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Common initialization, for use by constructors.
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void            init();
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString* getBogus() const;
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    union {
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UObject*        fObject;
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UnicodeString*  fString;
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        double          fDouble;
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int64_t         fInt64;
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UDate           fDate;
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        struct {
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          Formattable*  fArray;
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t       fCount;
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }               fArrayAndCount;
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } fValue;
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    CharString           *fDecimalStr;
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DigitList            *fDecimalNum;
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    char                fStackData[UNUM_INTERNAL_STACKARRAY_SIZE]; // must be big enough for DigitList
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    Type                fType;
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString       fBogus; // Bogus string when it's needed.
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UDate Formattable::getDate(UErrorCode& status) const {
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (fType != kDate) {
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if (U_SUCCESS(status)) {
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            status = U_INVALID_FORMAT_ERROR;
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return 0;
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fValue.fDate;
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline const UnicodeString& Formattable::getString(void) const {
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return *fValue.fString;
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString& Formattable::getString(void) {
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return *fValue.fString;
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_DEPRECATED_API
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t Formattable::getLong(UErrorCode* status) const {
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return getLong(*status);
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_DEPRECATED_API */
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_DRAFT_API
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UFormattable* Formattable::toUFormattable() {
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return reinterpret_cast<UFormattable*>(this);
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline const UFormattable* Formattable::toUFormattable() const {
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return reinterpret_cast<const UFormattable*>(this);
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline Formattable* Formattable::fromUFormattable(UFormattable *fmt) {
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return reinterpret_cast<Formattable *>(fmt);
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline const Formattable* Formattable::fromUFormattable(const UFormattable *fmt) {
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return reinterpret_cast<const Formattable *>(fmt);
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_DRAFT_API */
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* #if !UCONFIG_NO_FORMATTING */
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif //_FMTABLE
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof
765