fmtable.cpp revision c69afcec261fc345fda8daf46f0ea6b4351dc777
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*******************************************************************************
3c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru* Copyright (C) 1997-2008, 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"
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cmemory.h"
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// class Formattable
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// *****************************************************************************
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(Formattable)
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// NOTE: As of 3.0, there are limitations to the UObject API.  It does
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// not (yet) support cloning, operator=, nor operator==.  RTTI is also
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// restricted in that subtype testing is not (yet) implemented.  To
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// work around this, I implement some simple inlines here.  Later
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// these can be modified or removed.  [alan]
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// NOTE: These inlines assume that all fObjects are in fact instances
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// of the Measure class, which is true as of 3.0.  [alan]
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Return TRUE if *a == *b.
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UBool objectEquals(const UObject* a, const UObject* b) {
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // LATER: return *a == *b;
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *((const Measure*) a) == *((const Measure*) b);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Return a clone of *a.
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UObject* objectClone(const UObject* a) {
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // LATER: return a->clone();
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return ((const Measure*) a)->clone();
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Return TRUE if *a is an instance of Measure.
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline UBool instanceOfMeasure(const UObject* a) {
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // LATER: return a->instanceof(Measure::getStaticClassID());
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return a->getDynamicClassID() ==
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        CurrencyAmount::getStaticClassID();
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Creates a new Formattable array and copies the values from the specified
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * original.
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param array the original array
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @param count the original array count
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * @return the new Formattable array.
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline Formattable* createArrayCopy(const Formattable* array, int32_t count) {
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    Formattable *result = new Formattable[count];
73c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (result != NULL) {
74c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        for (int32_t i=0; i<count; ++i)
75c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            result[i] = array[i]; // Don't memcpy!
76c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Set 'ec' to 'err' only if 'ec' is not already set to a failing UErrorCode.
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic inline void setError(UErrorCode& ec, UErrorCode err) {
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_SUCCESS(ec)) {
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ec = err;
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// default constructor.
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a long value 0.
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable()
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kLong)
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = 0;
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a Date instance.
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(UDate date, ISDATE /*isDate*/)
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kDate)
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDate = date;
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a double value.
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(double value)
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kDouble)
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDouble = value;
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a long value.
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(int32_t value)
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kLong)
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = value;
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a long value.
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(int64_t value)
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kInt64)
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = value;
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a UnicodeString instance.
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(const UnicodeString& stringToCopy)
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kString)
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = new UnicodeString(stringToCopy);
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Creates a formattable object with a UnicodeString* value.
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// (adopting symantics)
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(UnicodeString* stringToAdopt)
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kString)
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = stringToAdopt;
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(UObject* objectToAdopt)
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kObject)
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fObject = objectToAdopt;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(const Formattable* arrayToCopy, int32_t count)
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(), fType(kArray)
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fArray = createArrayCopy(arrayToCopy, count);
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fCount = count;
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// copy constructor
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Formattable(const Formattable &source)
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    :   UObject(source), fType(kLong)
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fBogus.setToBogus();
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    *this = source;
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// assignment operator
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable&
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::operator=(const Formattable& source)
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (this != &source)
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Disposes the current formattable value/setting.
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        dispose();
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Sets the correct data type for this value.
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        fType = source.fType;
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        switch (fType)
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kArray:
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets each element in the array one by one and records the array count.
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fArrayAndCount.fCount = source.fValue.fArrayAndCount.fCount;
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fArrayAndCount.fArray = createArrayCopy(source.fValue.fArrayAndCount.fArray,
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                           source.fValue.fArrayAndCount.fCount);
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kString:
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the string value.
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fString = new UnicodeString(*source.fValue.fString);
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kDouble:
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the double value.
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fDouble = source.fValue.fDouble;
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kLong:
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kInt64:
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the long value.
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fInt64 = source.fValue.fInt64;
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kDate:
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Sets the Date value.
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fDate = source.fValue.fDate;
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case kObject:
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            fValue.fObject = objectClone(source.fValue.fObject);
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *this;
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::operator==(const Formattable& that) const
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (this == &that) return TRUE;
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Returns FALSE if the data types are different.
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != that.fType) return FALSE;
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Compares the actual data values.
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool equal = TRUE;
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kDate:
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (fValue.fDate == that.fValue.fDate);
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kDouble:
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (fValue.fDouble == that.fValue.fDouble);
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kLong:
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kInt64:
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (fValue.fInt64 == that.fValue.fInt64);
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kString:
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        equal = (*(fValue.fString) == *(that.fValue.fString));
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kArray:
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fValue.fArrayAndCount.fCount != that.fValue.fArrayAndCount.fCount) {
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            equal = FALSE;
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // Checks each element for equality.
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for (i=0; i<fValue.fArrayAndCount.fCount; ++i) {
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (fValue.fArrayAndCount.fArray[i] != that.fValue.fArrayAndCount.fArray[i]) {
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                equal = FALSE;
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kObject:
278c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL || that.fValue.fObject == NULL) {
279c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            equal = FALSE;
280c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
281c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            equal = objectEquals(fValue.fObject, that.fValue.fObject);
282c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return equal;
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::~Formattable()
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid Formattable::dispose()
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // Deletes the data value if necessary.
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kString:
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fValue.fString;
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kArray:
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete[] fValue.fArrayAndCount.fArray;
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kObject:
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delete fValue.fObject;
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable *
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::clone() const {
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return new Formattable(*this);
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the data type of this Formattable object.
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::Type
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getType() const
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fType;
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUBool
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::isNumeric() const {
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kDouble:
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kLong:
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case kInt64:
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint32_t
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//Formattable::getLong(UErrorCode* status) const
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getLong(UErrorCode& status) const
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (int32_t)fValue.fInt64;
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64:
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fValue.fInt64 > INT32_MAX) {
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MAX;
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (fValue.fInt64 < INT32_MIN) {
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MIN;
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return (int32_t)fValue.fInt64;
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fValue.fDouble > INT32_MAX) {
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MAX;
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (fValue.fDouble < INT32_MIN) {
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return INT32_MIN;
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return (int32_t)fValue.fDouble; // loses fraction
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kObject:
374c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL) {
375c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_MEMORY_ALLOCATION_ERROR;
376c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return 0;
377c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO Later replace this with instanceof call
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (instanceOfMeasure(fValue.fObject)) {
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return ((const Measure*) fValue.fObject)->
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                getNumber().getLong(status);
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_INVALID_FORMAT_ERROR;
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruint64_t
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getInt64(UErrorCode& status) const
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64:
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fValue.fInt64;
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (fValue.fDouble > U_INT64_MAX) {
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return U_INT64_MAX;
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else if (fValue.fDouble < U_INT64_MIN) {
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status = U_INVALID_FORMAT_ERROR;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return U_INT64_MIN;
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return (int64_t)fValue.fDouble;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kObject:
412c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL) {
413c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_MEMORY_ALLOCATION_ERROR;
414c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return 0;
415c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO Later replace this with instanceof call
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (instanceOfMeasure(fValue.fObject)) {
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return ((const Measure*) fValue.fObject)->
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                getNumber().getInt64(status);
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_INVALID_FORMAT_ERROR;
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querudouble
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getDouble(UErrorCode& status) const
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (fType) {
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kLong:
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kInt64: // loses precision
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (double)fValue.fInt64;
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kDouble:
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return fValue.fDouble;
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case Formattable::kObject:
442c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fObject == NULL) {
443c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            status = U_MEMORY_ALLOCATION_ERROR;
444c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            return 0;
445c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        // TODO Later replace this with instanceof call
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (instanceOfMeasure(fValue.fObject)) {
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return ((const Measure*) fValue.fObject)->
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                getNumber().getDouble(status);
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        status = U_INVALID_FORMAT_ERROR;
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return 0;
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UObject*
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getObject() const {
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (fType == kObject) ? fValue.fObject : NULL;
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a double value d.
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setDouble(double d)
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kDouble;
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDouble = d;
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a long value l.
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setLong(int32_t l)
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kLong;
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = l;
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to an int64 value ll.
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setInt64(int64_t ll)
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kInt64;
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fInt64 = ll;
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a Date instance d.
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setDate(UDate d)
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kDate;
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fDate = d;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to a string value stringToCopy.
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setString(const UnicodeString& stringToCopy)
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kString;
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = new UnicodeString(stringToCopy);
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Sets the value to an array of Formattable objects.
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::setArray(const Formattable* array, int32_t count)
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kArray;
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fArray = createArrayCopy(array, count);
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fCount = count;
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Adopts the stringToAdopt value.
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::adoptString(UnicodeString* stringToAdopt)
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kString;
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fString = stringToAdopt;
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Adopts the array value and its count.
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::adoptArray(Formattable* array, int32_t count)
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kArray;
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fArray = array;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fArrayAndCount.fCount = count;
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::adoptObject(UObject* objectToAdopt) {
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    dispose();
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fType = kObject;
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fValue.fObject = objectToAdopt;
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getString(UnicodeString& result, UErrorCode& status) const
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kString) {
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result.setToBogus();
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
567c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        if (fValue.fString == NULL) {
568c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            setError(status, U_MEMORY_ALLOCATION_ERROR);
569c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        } else {
570c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru            result = *fValue.fString;
571c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        }
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return result;
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst UnicodeString&
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getString(UErrorCode& status) const
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kString) {
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return *getBogus();
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
584c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fValue.fString == NULL) {
585c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        setError(status, U_MEMORY_ALLOCATION_ERROR);
586c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru        return *getBogus();
587c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *fValue.fString;
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString&
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getString(UErrorCode& status)
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kString) {
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return *getBogus();
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
599c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    if (fValue.fString == NULL) {
600c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	setError(status, U_MEMORY_ALLOCATION_ERROR);
601c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    	return *getBogus();
602c69afcec261fc345fda8daf46f0ea6b4351dc777Jean-Baptiste Queru    }
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return *fValue.fString;
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruconst Formattable*
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getArray(int32_t& count, UErrorCode& status) const
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (fType != kArray) {
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        setError(status, U_INVALID_FORMAT_ERROR);
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        count = 0;
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return NULL;
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count = fValue.fArrayAndCount.fCount;
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return fValue.fArrayAndCount.fArray;
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// -------------------------------------
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// Gets the bogus string, ensures mondo bogosity.
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruUnicodeString*
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattable::getBogus() const
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (UnicodeString*)&fBogus; /* cast away const :-( */
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if 0
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------
630b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// console I/O
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//----------------------------------------------------
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifdef _DEBUG
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if U_IOSTREAM_SOURCE >= 199711
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <iostream>
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruusing namespace std;
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#elif U_IOSTREAM_SOURCE >= 198506
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <iostream.h>
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/datefmt.h"
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unistrm.h"
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass FormattableStreamer /* not : public UObject because all methods are static */ {
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static void streamOut(ostream& stream, const Formattable& obj);
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FormattableStreamer() {} // private - forbid instantiation
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This is for debugging purposes only.  This will send a displayable
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// form of the Formattable object to the output stream.
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruFormattableStreamer::streamOut(ostream& stream, const Formattable& obj)
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static DateFormat *defDateFormat = 0;
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UnicodeString buffer;
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch(obj.getType()) {
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kDate :
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Creates a DateFormat instance for formatting the
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Date instance.
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if (defDateFormat == 0) {
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                defDateFormat = DateFormat::createInstance();
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            defDateFormat->format(obj.getDate(), buffer);
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << buffer;
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kDouble :
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Output the double as is.
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << obj.getDouble() << 'D';
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kLong :
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Output the double as is.
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << obj.getLong() << 'L';
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kString:
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Output the double as is.  Please see UnicodeString console
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // I/O routine for more details.
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << '"' << obj.getString(buffer) << '"';
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        case Formattable::kArray:
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            int32_t i, count;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            const Formattable* array;
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            array = obj.getArray(count);
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << '[';
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Recursively calling the console I/O routine for each element in the array.
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            for (i=0; i<count; ++i) {
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                FormattableStreamer::streamOut(stream, array[i]);
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                stream << ( (i==(count-1)) ? "" : ", " );
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << ']';
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            break;
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        default:
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            // Not a recognizable Formattable object.
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            stream << "INVALID_Formattable";
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    stream.flush();
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_FORMATTING */
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru//eof
711