1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Copyright (C) 1997-2010, International Business Machines Corporation and    *
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* others. All Rights Reserved.                                                *
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File FMTABLE.CPP
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   Date        Name        Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*   03/25/97    clhuang     Initial Implementation.
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru********************************************************************************
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*/
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/fmtable.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/measure.h"
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/curramt.h"
2427f654740f2a26ad62a5c155af9199af9e69b889claireho#include "charstr.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cstring.h"
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "decNumber.h"
2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "digitlst.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class Formattable
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(Formattable)
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// NOTE: As of 3.0, there are limitations to the UObject API.  It does
4127f654740f2a26ad62a5c155af9199af9e69b889claireho// not (yet) support cloning, operator=, nor operator==.  To
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// work around this, I implement some simple inlines here.  Later
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// these can be modified or removed.  [alan]
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// NOTE: These inlines assume that all fObjects are in fact instances
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// of the Measure class, which is true as of 3.0.  [alan]
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Return TRUE if *a == *b.
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UBool objectEquals(const UObject* a, const UObject* b) {
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // LATER: return *a == *b;
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *((const Measure*) a) == *((const Measure*) b);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Return a clone of *a.
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UObject* objectClone(const UObject* a) {
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // LATER: return a->clone();
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((const Measure*) a)->clone();
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Return TRUE if *a is an instance of Measure.
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UBool instanceOfMeasure(const UObject* a) {
6227f654740f2a26ad62a5c155af9199af9e69b889claireho    // BEGIN android-changed : no RTTI support
6327f654740f2a26ad62a5c155af9199af9e69b889claireho    // return dynamic_cast<const Measure*>(a) != NULL;
6427f654740f2a26ad62a5c155af9199af9e69b889claireho    return (const Measure*)a != NULL;
6527f654740f2a26ad62a5c155af9199af9e69b889claireho    // END android-changed
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Creates a new Formattable array and copies the values from the specified
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * original.
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param array the original array
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param count the original array count
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the new Formattable array.
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
7550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic Formattable* createArrayCopy(const Formattable* array, int32_t count) {
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable *result = new Formattable[count];
77c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (result != NULL) {
78c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        for (int32_t i=0; i<count; ++i)
79c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            result[i] = array[i]; // Don't memcpy!
80c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set 'ec' to 'err' only if 'ec' is not already set to a failing UErrorCode.
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
8950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void setError(UErrorCode& ec, UErrorCode err) {
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(ec)) {
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = err;
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//  Common initialization code, shared by constructors.
9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//  Put everything into a known state.
9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//
9950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid  Formattable::init() {
10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fValue.fInt64 = 0;
10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kLong;
10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fDecimalStr = NULL;
10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fDecimalNum = NULL;
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fBogus.setToBogus();
10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// default constructor.
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a long value 0.
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoFormattable::Formattable() {
11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a Date instance.
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(UDate date, ISDATE /*isDate*/)
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kDate;
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDate = date;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a double value.
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(double value)
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kDouble;
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDouble = value;
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Creates a formattable object with an int32_t value.
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(int32_t value)
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = value;
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Creates a formattable object with an int64_t value.
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(int64_t value)
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kInt64;
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = value;
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// Creates a formattable object with a decimal number value from a string.
15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
15750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoFormattable::Formattable(const StringPiece &number, UErrorCode &status) {
15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    setDecimalNumber(number, status);
16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// -------------------------------------
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a UnicodeString instance.
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(const UnicodeString& stringToCopy)
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kString;
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = new UnicodeString(stringToCopy);
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a UnicodeString* value.
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// (adopting symantics)
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(UnicodeString* stringToAdopt)
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kString;
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = stringToAdopt;
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(UObject* objectToAdopt)
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kObject;
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fObject = objectToAdopt;
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(const Formattable* arrayToCopy, int32_t count)
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kArray)
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kArray;
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fArray = createArrayCopy(arrayToCopy, count);
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fCount = count;
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// copy constructor
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(const Formattable &source)
20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     :  UObject(*this)
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    init();
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *this = source;
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// assignment operator
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable&
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::operator=(const Formattable& source)
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (this != &source)
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Disposes the current formattable value/setting.
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dispose();
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Sets the correct data type for this value.
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fType = source.fType;
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch (fType)
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kArray:
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets each element in the array one by one and records the array count.
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fArrayAndCount.fCount = source.fValue.fArrayAndCount.fCount;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fArrayAndCount.fArray = createArrayCopy(source.fValue.fArrayAndCount.fArray,
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                           source.fValue.fArrayAndCount.fCount);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kString:
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the string value.
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fString = new UnicodeString(*source.fValue.fString);
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kDouble:
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the double value.
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fDouble = source.fValue.fDouble;
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kLong:
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kInt64:
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the long value.
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fInt64 = source.fValue.fInt64;
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kDate:
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the Date value.
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fDate = source.fValue.fDate;
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kObject:
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fObject = objectClone(source.fValue.fObject);
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
25550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
25650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        UErrorCode status = U_ZERO_ERROR;
25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (source.fDecimalNum != NULL) {
25850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fDecimalNum = new DigitList(*source.fDecimalNum);
25950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (source.fDecimalStr != NULL) {
26127f654740f2a26ad62a5c155af9199af9e69b889claireho            fDecimalStr = new CharString(*source.fDecimalStr, status);
26250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            if (U_FAILURE(status)) {
26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                delete fDecimalStr;
26450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                fDecimalStr = NULL;
26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            }
26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *this;
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::operator==(const Formattable& that) const
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (this == &that) return TRUE;
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Returns FALSE if the data types are different.
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != that.fType) return FALSE;
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Compares the actual data values.
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool equal = TRUE;
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kDate:
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (fValue.fDate == that.fValue.fDate);
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kDouble:
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (fValue.fDouble == that.fValue.fDouble);
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kLong:
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kInt64:
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (fValue.fInt64 == that.fValue.fInt64);
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kString:
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (*(fValue.fString) == *(that.fValue.fString));
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kArray:
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fValue.fArrayAndCount.fCount != that.fValue.fArrayAndCount.fCount) {
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            equal = FALSE;
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Checks each element for equality.
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=0; i<fValue.fArrayAndCount.fCount; ++i) {
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (fValue.fArrayAndCount.fArray[i] != that.fValue.fArrayAndCount.fArray[i]) {
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                equal = FALSE;
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kObject:
313c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL || that.fValue.fObject == NULL) {
314c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            equal = FALSE;
315c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
316c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            equal = objectEquals(fValue.fObject, that.fValue.fObject);
317c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // TODO:  compare digit lists if numeric.
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return equal;
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::~Formattable()
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid Formattable::dispose()
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Deletes the data value if necessary.
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kString:
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fValue.fString;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kArray:
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete[] fValue.fArrayAndCount.fArray;
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kObject:
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fValue.fObject;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
35050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
35150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fType = kLong;
35250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fValue.fInt64 = 0;
35350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete fDecimalStr;
35450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fDecimalStr = NULL;
35550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    delete fDecimalNum;
35650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fDecimalNum = NULL;
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable *
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::clone() const {
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return new Formattable(*this);
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the data type of this Formattable object.
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Type
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getType() const
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fType;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::isNumeric() const {
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kDouble:
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kLong:
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kInt64:
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//Formattable::getLong(UErrorCode* status) const
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getLong(UErrorCode& status) const
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (int32_t)fValue.fInt64;
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64:
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fValue.fInt64 > INT32_MAX) {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MAX;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (fValue.fInt64 < INT32_MIN) {
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MIN;
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return (int32_t)fValue.fInt64;
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fValue.fDouble > INT32_MAX) {
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MAX;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (fValue.fDouble < INT32_MIN) {
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MIN;
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return (int32_t)fValue.fDouble; // loses fraction
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kObject:
417c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL) {
418c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_MEMORY_ALLOCATION_ERROR;
419c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return 0;
420c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO Later replace this with instanceof call
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (instanceOfMeasure(fValue.fObject)) {
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return ((const Measure*) fValue.fObject)->
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                getNumber().getLong(status);
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_INVALID_FORMAT_ERROR;
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint64_t
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getInt64(UErrorCode& status) const
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64:
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fValue.fInt64;
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
44527f654740f2a26ad62a5c155af9199af9e69b889claireho        if (fValue.fDouble >= U_INT64_MAX) {
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return U_INT64_MAX;
44827f654740f2a26ad62a5c155af9199af9e69b889claireho        } else if (fValue.fDouble <= U_INT64_MIN) {
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return U_INT64_MIN;
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return (int64_t)fValue.fDouble;
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kObject:
455c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL) {
456c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_MEMORY_ALLOCATION_ERROR;
457c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return 0;
458c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO Later replace this with instanceof call
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (instanceOfMeasure(fValue.fObject)) {
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return ((const Measure*) fValue.fObject)->
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                getNumber().getInt64(status);
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_INVALID_FORMAT_ERROR;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querudouble
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getDouble(UErrorCode& status) const
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64: // loses precision
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (double)fValue.fInt64;
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fValue.fDouble;
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kObject:
485c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL) {
486c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_MEMORY_ALLOCATION_ERROR;
487c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return 0;
488c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO Later replace this with instanceof call
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (instanceOfMeasure(fValue.fObject)) {
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return ((const Measure*) fValue.fObject)->
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                getNumber().getDouble(status);
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_INVALID_FORMAT_ERROR;
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UObject*
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getObject() const {
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (fType == kObject) ? fValue.fObject : NULL;
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a double value d.
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setDouble(double d)
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kDouble;
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDouble = d;
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a long value l.
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setLong(int32_t l)
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kLong;
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = l;
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to an int64 value ll.
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setInt64(int64_t ll)
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kInt64;
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = ll;
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a Date instance d.
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setDate(UDate d)
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kDate;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDate = d;
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a string value stringToCopy.
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setString(const UnicodeString& stringToCopy)
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kString;
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = new UnicodeString(stringToCopy);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to an array of Formattable objects.
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setArray(const Formattable* array, int32_t count)
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kArray;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fArray = createArrayCopy(array, count);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fCount = count;
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Adopts the stringToAdopt value.
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::adoptString(UnicodeString* stringToAdopt)
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kString;
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = stringToAdopt;
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
584b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Adopts the array value and its count.
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::adoptArray(Formattable* array, int32_t count)
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kArray;
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fArray = array;
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fCount = count;
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::adoptObject(UObject* objectToAdopt) {
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kObject;
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fObject = objectToAdopt;
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getString(UnicodeString& result, UErrorCode& status) const
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kString) {
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result.setToBogus();
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
610c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fString == NULL) {
611c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            setError(status, U_MEMORY_ALLOCATION_ERROR);
612c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
613c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            result = *fValue.fString;
614c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UnicodeString&
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getString(UErrorCode& status) const
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kString) {
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return *getBogus();
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
627c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fValue.fString == NULL) {
628c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        setError(status, U_MEMORY_ALLOCATION_ERROR);
629c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return *getBogus();
630c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *fValue.fString;
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getString(UErrorCode& status)
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kString) {
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return *getBogus();
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
642c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fValue.fString == NULL) {
643c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	setError(status, U_MEMORY_ALLOCATION_ERROR);
644c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	return *getBogus();
645c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *fValue.fString;
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst Formattable*
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getArray(int32_t& count, UErrorCode& status) const
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kArray) {
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count = 0;
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = fValue.fArrayAndCount.fCount;
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fValue.fArrayAndCount.fArray;
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the bogus string, ensures mondo bogosity.
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString*
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getBogus() const
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UnicodeString*)&fBogus; /* cast away const :-( */
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
67150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
67250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// --------------------------------------
67350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoStringPiece Formattable::getDecimalNumber(UErrorCode &status) {
67450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
67550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return "";
67650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
67750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (fDecimalStr != NULL) {
67827f654740f2a26ad62a5c155af9199af9e69b889claireho        return fDecimalStr->toStringPiece();
67950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
68050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
68150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (fDecimalNum == NULL) {
68250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // No decimal number for the formattable yet.  Which means the value was
68350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // set directly by the user as an int, int64 or double.  If the value came
68450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // from parsing, or from the user setting a decimal number, fDecimalNum
68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        // would already be set.
68650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        //
68750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fDecimalNum = new DigitList;
68850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        if (fDecimalNum == NULL) {
68950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            status = U_MEMORY_ALLOCATION_ERROR;
69050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return "";
69150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
69250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
69350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        switch (fType) {
69450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case kDouble:
69550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fDecimalNum->set(this->getDouble());
69650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            break;
69750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case kLong:
69850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fDecimalNum->set(this->getLong());
69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            break;
70050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        case kInt64:
70150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            fDecimalNum->set(this->getInt64());
70250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            break;
70350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        default:
70450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            // The formattable's value is not a numeric type.
70550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            status = U_INVALID_STATE_ERROR;
70650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            return "";
70750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        }
70850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
70950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
71027f654740f2a26ad62a5c155af9199af9e69b889claireho    fDecimalStr = new CharString;
71150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (fDecimalStr == NULL) {
71250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_MEMORY_ALLOCATION_ERROR;
71350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return "";
71450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
71550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fDecimalNum->getDecimal(*fDecimalStr, status);
71650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
71727f654740f2a26ad62a5c155af9199af9e69b889claireho    return fDecimalStr->toStringPiece();
71850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
71950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
72050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
72150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
72250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// ---------------------------------------
72350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
72450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoFormattable::adoptDigitList(DigitList *dl) {
72550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    dispose();
72650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
72750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    fDecimalNum = dl;
72850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
72950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Set the value into the Union of simple type values.
73050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Cannot use the set() functions because they would delete the fDecimalNum value,
73150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
73250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (fDecimalNum->fitsIntoLong(FALSE)) {
73350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fType = kLong;
73450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fValue.fInt64 = fDecimalNum->getLong();
73550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else if (fDecimalNum->fitsIntoInt64(FALSE)) {
73650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fType = kInt64;
73750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fValue.fInt64 = fDecimalNum->getInt64();
73850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    } else {
73950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fType = kDouble;
74050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        fValue.fDouble = fDecimalNum->getDouble();
74150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
74250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
74350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
74450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
74550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho// ---------------------------------------
74650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehovoid
74750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoFormattable::setDecimalNumber(const StringPiece &numberString, UErrorCode &status) {
74850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
74950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
75050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
75150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    dispose();
75250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
75350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Copy the input string and nul-terminate it.
75450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //    The decNumber library requires nul-terminated input.  StringPiece input
75550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    //    is not guaranteed nul-terminated.  Too bad.
75627f654740f2a26ad62a5c155af9199af9e69b889claireho    //    CharString automatically adds the nul.
75750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    DigitList *dnum = new DigitList();
75850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (dnum == NULL) {
75950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        status = U_MEMORY_ALLOCATION_ERROR;
76050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;
76150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
76227f654740f2a26ad62a5c155af9199af9e69b889claireho    dnum->set(CharString(numberString, status).toStringPiece(), status);
76350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    if (U_FAILURE(status)) {
76450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        delete dnum;
76550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        return;   // String didn't contain a decimal number.
76650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    }
76750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    adoptDigitList(dnum);
76850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
76950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // Note that we do not hang on to the caller's input string.
77050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    // If we are asked for the string, we will regenerate one from fDecimalNum.
77150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho}
77250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// console I/O
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef _DEBUG
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_IOSTREAM_SOURCE >= 199711
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <iostream>
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing namespace std;
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#elif U_IOSTREAM_SOURCE >= 198506
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <iostream.h>
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/datefmt.h"
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unistrm.h"
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass FormattableStreamer /* not : public UObject because all methods are static */ {
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static void streamOut(ostream& stream, const Formattable& obj);
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FormattableStreamer() {} // private - forbid instantiation
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This is for debugging purposes only.  This will send a displayable
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// form of the Formattable object to the output stream.
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattableStreamer::streamOut(ostream& stream, const Formattable& obj)
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static DateFormat *defDateFormat = 0;
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buffer;
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch(obj.getType()) {
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kDate :
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Creates a DateFormat instance for formatting the
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Date instance.
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (defDateFormat == 0) {
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                defDateFormat = DateFormat::createInstance();
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            defDateFormat->format(obj.getDate(), buffer);
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << buffer;
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kDouble :
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Output the double as is.
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << obj.getDouble() << 'D';
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kLong :
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Output the double as is.
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << obj.getLong() << 'L';
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kString:
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Output the double as is.  Please see UnicodeString console
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // I/O routine for more details.
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << '"' << obj.getString(buffer) << '"';
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kArray:
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t i, count;
831b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const Formattable* array;
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            array = obj.getArray(count);
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << '[';
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Recursively calling the console I/O routine for each element in the array.
835b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i=0; i<count; ++i) {
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                FormattableStreamer::streamOut(stream, array[i]);
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                stream << ( (i==(count-1)) ? "" : ", " );
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
839b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << ']';
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default:
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Not a recognizable Formattable object.
843b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << "INVALID_Formattable";
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    stream.flush();
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof
856