1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker ********************************************************************************
5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 1997-2014, International Business Machines
6*0e209d39SAndroid Build Coastguard Worker * Corporation and others. All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker ********************************************************************************
8*0e209d39SAndroid Build Coastguard Worker *
9*0e209d39SAndroid Build Coastguard Worker * File FMTABLE.H
10*0e209d39SAndroid Build Coastguard Worker *
11*0e209d39SAndroid Build Coastguard Worker * Modification History:
12*0e209d39SAndroid Build Coastguard Worker *
13*0e209d39SAndroid Build Coastguard Worker * Date Name Description
14*0e209d39SAndroid Build Coastguard Worker * 02/29/97 aliu Creation.
15*0e209d39SAndroid Build Coastguard Worker ********************************************************************************
16*0e209d39SAndroid Build Coastguard Worker */
17*0e209d39SAndroid Build Coastguard Worker #ifndef FMTABLE_H
18*0e209d39SAndroid Build Coastguard Worker #define FMTABLE_H
19*0e209d39SAndroid Build Coastguard Worker
20*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
21*0e209d39SAndroid Build Coastguard Worker
22*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API
23*0e209d39SAndroid Build Coastguard Worker
24*0e209d39SAndroid Build Coastguard Worker /**
25*0e209d39SAndroid Build Coastguard Worker * \file
26*0e209d39SAndroid Build Coastguard Worker * \brief C++ API: Formattable is a thin wrapper for primitive types used for formatting and parsing
27*0e209d39SAndroid Build Coastguard Worker */
28*0e209d39SAndroid Build Coastguard Worker
29*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING
30*0e209d39SAndroid Build Coastguard Worker
31*0e209d39SAndroid Build Coastguard Worker #include "unicode/unistr.h"
32*0e209d39SAndroid Build Coastguard Worker #include "unicode/stringpiece.h"
33*0e209d39SAndroid Build Coastguard Worker #include "unicode/uformattable.h"
34*0e209d39SAndroid Build Coastguard Worker
35*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
36*0e209d39SAndroid Build Coastguard Worker
37*0e209d39SAndroid Build Coastguard Worker class CharString;
38*0e209d39SAndroid Build Coastguard Worker
39*0e209d39SAndroid Build Coastguard Worker namespace number::impl {
40*0e209d39SAndroid Build Coastguard Worker class DecimalQuantity;
41*0e209d39SAndroid Build Coastguard Worker }
42*0e209d39SAndroid Build Coastguard Worker
43*0e209d39SAndroid Build Coastguard Worker /**
44*0e209d39SAndroid Build Coastguard Worker * Formattable objects can be passed to the Format class or
45*0e209d39SAndroid Build Coastguard Worker * its subclasses for formatting. Formattable is a thin wrapper
46*0e209d39SAndroid Build Coastguard Worker * class which interconverts between the primitive numeric types
47*0e209d39SAndroid Build Coastguard Worker * (double, long, etc.) as well as UDate and UnicodeString.
48*0e209d39SAndroid Build Coastguard Worker *
49*0e209d39SAndroid Build Coastguard Worker * <p>Internally, a Formattable object is a union of primitive types.
50*0e209d39SAndroid Build Coastguard Worker * As such, it can only store one flavor of data at a time. To
51*0e209d39SAndroid Build Coastguard Worker * determine what flavor of data it contains, use the getType method.
52*0e209d39SAndroid Build Coastguard Worker *
53*0e209d39SAndroid Build Coastguard Worker * <p>As of ICU 3.0, Formattable may also wrap a UObject pointer,
54*0e209d39SAndroid Build Coastguard Worker * which it owns. This allows an instance of any ICU class to be
55*0e209d39SAndroid Build Coastguard Worker * encapsulated in a Formattable. For legacy reasons and for
56*0e209d39SAndroid Build Coastguard Worker * efficiency, primitive numeric types are still stored directly
57*0e209d39SAndroid Build Coastguard Worker * within a Formattable.
58*0e209d39SAndroid Build Coastguard Worker *
59*0e209d39SAndroid Build Coastguard Worker * <p>The Formattable class is not suitable for subclassing.
60*0e209d39SAndroid Build Coastguard Worker *
61*0e209d39SAndroid Build Coastguard Worker * <p>See UFormattable for a C wrapper.
62*0e209d39SAndroid Build Coastguard Worker */
63*0e209d39SAndroid Build Coastguard Worker class U_I18N_API Formattable : public UObject {
64*0e209d39SAndroid Build Coastguard Worker public:
65*0e209d39SAndroid Build Coastguard Worker /**
66*0e209d39SAndroid Build Coastguard Worker * This enum is only used to let callers distinguish between
67*0e209d39SAndroid Build Coastguard Worker * the Formattable(UDate) constructor and the Formattable(double)
68*0e209d39SAndroid Build Coastguard Worker * constructor; the compiler cannot distinguish the signatures,
69*0e209d39SAndroid Build Coastguard Worker * since UDate is currently typedefed to be either double or long.
70*0e209d39SAndroid Build Coastguard Worker * If UDate is changed later to be a bonafide class
71*0e209d39SAndroid Build Coastguard Worker * or struct, then we no longer need this enum.
72*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
73*0e209d39SAndroid Build Coastguard Worker */
74*0e209d39SAndroid Build Coastguard Worker enum ISDATE { kIsDate };
75*0e209d39SAndroid Build Coastguard Worker
76*0e209d39SAndroid Build Coastguard Worker /**
77*0e209d39SAndroid Build Coastguard Worker * Default constructor
78*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
79*0e209d39SAndroid Build Coastguard Worker */
80*0e209d39SAndroid Build Coastguard Worker Formattable(); // Type kLong, value 0
81*0e209d39SAndroid Build Coastguard Worker
82*0e209d39SAndroid Build Coastguard Worker /**
83*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with a UDate instance.
84*0e209d39SAndroid Build Coastguard Worker * @param d the UDate instance.
85*0e209d39SAndroid Build Coastguard Worker * @param flag the flag to indicate this is a date. Always set it to kIsDate
86*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
87*0e209d39SAndroid Build Coastguard Worker */
88*0e209d39SAndroid Build Coastguard Worker Formattable(UDate d, ISDATE flag);
89*0e209d39SAndroid Build Coastguard Worker
90*0e209d39SAndroid Build Coastguard Worker /**
91*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with a double number.
92*0e209d39SAndroid Build Coastguard Worker * @param d the double number.
93*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
94*0e209d39SAndroid Build Coastguard Worker */
95*0e209d39SAndroid Build Coastguard Worker Formattable(double d);
96*0e209d39SAndroid Build Coastguard Worker
97*0e209d39SAndroid Build Coastguard Worker /**
98*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with a long number.
99*0e209d39SAndroid Build Coastguard Worker * @param l the long number.
100*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
101*0e209d39SAndroid Build Coastguard Worker */
102*0e209d39SAndroid Build Coastguard Worker Formattable(int32_t l);
103*0e209d39SAndroid Build Coastguard Worker
104*0e209d39SAndroid Build Coastguard Worker /**
105*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with an int64_t number
106*0e209d39SAndroid Build Coastguard Worker * @param ll the int64_t number.
107*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.8
108*0e209d39SAndroid Build Coastguard Worker */
109*0e209d39SAndroid Build Coastguard Worker Formattable(int64_t ll);
110*0e209d39SAndroid Build Coastguard Worker
111*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_CONVERSION
112*0e209d39SAndroid Build Coastguard Worker /**
113*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with a char string pointer.
114*0e209d39SAndroid Build Coastguard Worker * Assumes that the char string is null terminated.
115*0e209d39SAndroid Build Coastguard Worker * @param strToCopy the char string.
116*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
117*0e209d39SAndroid Build Coastguard Worker */
118*0e209d39SAndroid Build Coastguard Worker Formattable(const char* strToCopy);
119*0e209d39SAndroid Build Coastguard Worker #endif
120*0e209d39SAndroid Build Coastguard Worker
121*0e209d39SAndroid Build Coastguard Worker /**
122*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object of an appropriate numeric type from a
123*0e209d39SAndroid Build Coastguard Worker * a decimal number in string form. The Formattable will retain the
124*0e209d39SAndroid Build Coastguard Worker * full precision of the input in decimal format, even when it exceeds
125*0e209d39SAndroid Build Coastguard Worker * what can be represented by a double or int64_t.
126*0e209d39SAndroid Build Coastguard Worker *
127*0e209d39SAndroid Build Coastguard Worker * @param number the unformatted (not localized) string representation
128*0e209d39SAndroid Build Coastguard Worker * of the Decimal number.
129*0e209d39SAndroid Build Coastguard Worker * @param status the error code. Possible errors include U_INVALID_FORMAT_ERROR
130*0e209d39SAndroid Build Coastguard Worker * if the format of the string does not conform to that of a
131*0e209d39SAndroid Build Coastguard Worker * decimal number.
132*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.4
133*0e209d39SAndroid Build Coastguard Worker */
134*0e209d39SAndroid Build Coastguard Worker Formattable(StringPiece number, UErrorCode &status);
135*0e209d39SAndroid Build Coastguard Worker
136*0e209d39SAndroid Build Coastguard Worker /**
137*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with a UnicodeString object to copy from.
138*0e209d39SAndroid Build Coastguard Worker * @param strToCopy the UnicodeString string.
139*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
140*0e209d39SAndroid Build Coastguard Worker */
141*0e209d39SAndroid Build Coastguard Worker Formattable(const UnicodeString& strToCopy);
142*0e209d39SAndroid Build Coastguard Worker
143*0e209d39SAndroid Build Coastguard Worker /**
144*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with a UnicodeString object to adopt from.
145*0e209d39SAndroid Build Coastguard Worker * @param strToAdopt the UnicodeString string.
146*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
147*0e209d39SAndroid Build Coastguard Worker */
148*0e209d39SAndroid Build Coastguard Worker Formattable(UnicodeString* strToAdopt);
149*0e209d39SAndroid Build Coastguard Worker
150*0e209d39SAndroid Build Coastguard Worker /**
151*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object with an array of Formattable objects.
152*0e209d39SAndroid Build Coastguard Worker * @param arrayToCopy the Formattable object array.
153*0e209d39SAndroid Build Coastguard Worker * @param count the array count.
154*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
155*0e209d39SAndroid Build Coastguard Worker */
156*0e209d39SAndroid Build Coastguard Worker Formattable(const Formattable* arrayToCopy, int32_t count);
157*0e209d39SAndroid Build Coastguard Worker
158*0e209d39SAndroid Build Coastguard Worker /**
159*0e209d39SAndroid Build Coastguard Worker * Creates a Formattable object that adopts the given UObject.
160*0e209d39SAndroid Build Coastguard Worker * @param objectToAdopt the UObject to set this object to
161*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
162*0e209d39SAndroid Build Coastguard Worker */
163*0e209d39SAndroid Build Coastguard Worker Formattable(UObject* objectToAdopt);
164*0e209d39SAndroid Build Coastguard Worker
165*0e209d39SAndroid Build Coastguard Worker /**
166*0e209d39SAndroid Build Coastguard Worker * Copy constructor.
167*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
168*0e209d39SAndroid Build Coastguard Worker */
169*0e209d39SAndroid Build Coastguard Worker Formattable(const Formattable&);
170*0e209d39SAndroid Build Coastguard Worker
171*0e209d39SAndroid Build Coastguard Worker /**
172*0e209d39SAndroid Build Coastguard Worker * Assignment operator.
173*0e209d39SAndroid Build Coastguard Worker * @param rhs The Formattable object to copy into this object.
174*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
175*0e209d39SAndroid Build Coastguard Worker */
176*0e209d39SAndroid Build Coastguard Worker Formattable& operator=(const Formattable &rhs);
177*0e209d39SAndroid Build Coastguard Worker
178*0e209d39SAndroid Build Coastguard Worker /**
179*0e209d39SAndroid Build Coastguard Worker * Equality comparison.
180*0e209d39SAndroid Build Coastguard Worker * @param other the object to be compared with.
181*0e209d39SAndroid Build Coastguard Worker * @return true if other are equal to this, false otherwise.
182*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
183*0e209d39SAndroid Build Coastguard Worker */
184*0e209d39SAndroid Build Coastguard Worker bool operator==(const Formattable &other) const;
185*0e209d39SAndroid Build Coastguard Worker
186*0e209d39SAndroid Build Coastguard Worker /**
187*0e209d39SAndroid Build Coastguard Worker * Equality operator.
188*0e209d39SAndroid Build Coastguard Worker * @param other the object to be compared with.
189*0e209d39SAndroid Build Coastguard Worker * @return true if other are unequal to this, false otherwise.
190*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
191*0e209d39SAndroid Build Coastguard Worker */
192*0e209d39SAndroid Build Coastguard Worker bool operator!=(const Formattable& other) const
193*0e209d39SAndroid Build Coastguard Worker { return !operator==(other); }
194*0e209d39SAndroid Build Coastguard Worker
195*0e209d39SAndroid Build Coastguard Worker /**
196*0e209d39SAndroid Build Coastguard Worker * Destructor.
197*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
198*0e209d39SAndroid Build Coastguard Worker */
199*0e209d39SAndroid Build Coastguard Worker virtual ~Formattable();
200*0e209d39SAndroid Build Coastguard Worker
201*0e209d39SAndroid Build Coastguard Worker /**
202*0e209d39SAndroid Build Coastguard Worker * Clone this object.
203*0e209d39SAndroid Build Coastguard Worker * Clones can be used concurrently in multiple threads.
204*0e209d39SAndroid Build Coastguard Worker * If an error occurs, then nullptr is returned.
205*0e209d39SAndroid Build Coastguard Worker * The caller must delete the clone.
206*0e209d39SAndroid Build Coastguard Worker *
207*0e209d39SAndroid Build Coastguard Worker * @return a clone of this object
208*0e209d39SAndroid Build Coastguard Worker *
209*0e209d39SAndroid Build Coastguard Worker * @see getDynamicClassID
210*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.8
211*0e209d39SAndroid Build Coastguard Worker */
212*0e209d39SAndroid Build Coastguard Worker Formattable *clone() const;
213*0e209d39SAndroid Build Coastguard Worker
214*0e209d39SAndroid Build Coastguard Worker /**
215*0e209d39SAndroid Build Coastguard Worker * Selector for flavor of data type contained within a
216*0e209d39SAndroid Build Coastguard Worker * Formattable object. Formattable is a union of several
217*0e209d39SAndroid Build Coastguard Worker * different types, and at any time contains exactly one type.
218*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
219*0e209d39SAndroid Build Coastguard Worker */
220*0e209d39SAndroid Build Coastguard Worker enum Type {
221*0e209d39SAndroid Build Coastguard Worker /**
222*0e209d39SAndroid Build Coastguard Worker * Selector indicating a UDate value. Use getDate to retrieve
223*0e209d39SAndroid Build Coastguard Worker * the value.
224*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
225*0e209d39SAndroid Build Coastguard Worker */
226*0e209d39SAndroid Build Coastguard Worker kDate,
227*0e209d39SAndroid Build Coastguard Worker
228*0e209d39SAndroid Build Coastguard Worker /**
229*0e209d39SAndroid Build Coastguard Worker * Selector indicating a double value. Use getDouble to
230*0e209d39SAndroid Build Coastguard Worker * retrieve the value.
231*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
232*0e209d39SAndroid Build Coastguard Worker */
233*0e209d39SAndroid Build Coastguard Worker kDouble,
234*0e209d39SAndroid Build Coastguard Worker
235*0e209d39SAndroid Build Coastguard Worker /**
236*0e209d39SAndroid Build Coastguard Worker * Selector indicating a 32-bit integer value. Use getLong to
237*0e209d39SAndroid Build Coastguard Worker * retrieve the value.
238*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
239*0e209d39SAndroid Build Coastguard Worker */
240*0e209d39SAndroid Build Coastguard Worker kLong,
241*0e209d39SAndroid Build Coastguard Worker
242*0e209d39SAndroid Build Coastguard Worker /**
243*0e209d39SAndroid Build Coastguard Worker * Selector indicating a UnicodeString value. Use getString
244*0e209d39SAndroid Build Coastguard Worker * to retrieve the value.
245*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
246*0e209d39SAndroid Build Coastguard Worker */
247*0e209d39SAndroid Build Coastguard Worker kString,
248*0e209d39SAndroid Build Coastguard Worker
249*0e209d39SAndroid Build Coastguard Worker /**
250*0e209d39SAndroid Build Coastguard Worker * Selector indicating an array of Formattables. Use getArray
251*0e209d39SAndroid Build Coastguard Worker * to retrieve the value.
252*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.4
253*0e209d39SAndroid Build Coastguard Worker */
254*0e209d39SAndroid Build Coastguard Worker kArray,
255*0e209d39SAndroid Build Coastguard Worker
256*0e209d39SAndroid Build Coastguard Worker /**
257*0e209d39SAndroid Build Coastguard Worker * Selector indicating a 64-bit integer value. Use getInt64
258*0e209d39SAndroid Build Coastguard Worker * to retrieve the value.
259*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.8
260*0e209d39SAndroid Build Coastguard Worker */
261*0e209d39SAndroid Build Coastguard Worker kInt64,
262*0e209d39SAndroid Build Coastguard Worker
263*0e209d39SAndroid Build Coastguard Worker /**
264*0e209d39SAndroid Build Coastguard Worker * Selector indicating a UObject value. Use getObject to
265*0e209d39SAndroid Build Coastguard Worker * retrieve the value.
266*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
267*0e209d39SAndroid Build Coastguard Worker */
268*0e209d39SAndroid Build Coastguard Worker kObject
269*0e209d39SAndroid Build Coastguard Worker };
270*0e209d39SAndroid Build Coastguard Worker
271*0e209d39SAndroid Build Coastguard Worker /**
272*0e209d39SAndroid Build Coastguard Worker * Gets the data type of this Formattable object.
273*0e209d39SAndroid Build Coastguard Worker * @return the data type of this Formattable object.
274*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
275*0e209d39SAndroid Build Coastguard Worker */
276*0e209d39SAndroid Build Coastguard Worker Type getType() const;
277*0e209d39SAndroid Build Coastguard Worker
278*0e209d39SAndroid Build Coastguard Worker /**
279*0e209d39SAndroid Build Coastguard Worker * Returns true if the data type of this Formattable object
280*0e209d39SAndroid Build Coastguard Worker * is kDouble, kLong, or kInt64
281*0e209d39SAndroid Build Coastguard Worker * @return true if this is a pure numeric object
282*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
283*0e209d39SAndroid Build Coastguard Worker */
284*0e209d39SAndroid Build Coastguard Worker UBool isNumeric() const;
285*0e209d39SAndroid Build Coastguard Worker
286*0e209d39SAndroid Build Coastguard Worker /**
287*0e209d39SAndroid Build Coastguard Worker * Gets the double value of this object. If this object is not of type
288*0e209d39SAndroid Build Coastguard Worker * kDouble then the result is undefined.
289*0e209d39SAndroid Build Coastguard Worker * @return the double value of this object.
290*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
291*0e209d39SAndroid Build Coastguard Worker */
getDouble()292*0e209d39SAndroid Build Coastguard Worker double getDouble() const { return fValue.fDouble; }
293*0e209d39SAndroid Build Coastguard Worker
294*0e209d39SAndroid Build Coastguard Worker /**
295*0e209d39SAndroid Build Coastguard Worker * Gets the double value of this object. If this object is of type
296*0e209d39SAndroid Build Coastguard Worker * long, int64 or Decimal Number then a conversion is performed, with
297*0e209d39SAndroid Build Coastguard Worker * possible loss of precision. If the type is kObject and the
298*0e209d39SAndroid Build Coastguard Worker * object is a Measure, then the result of
299*0e209d39SAndroid Build Coastguard Worker * getNumber().getDouble(status) is returned. If this object is
300*0e209d39SAndroid Build Coastguard Worker * neither a numeric type nor a Measure, then 0 is returned and
301*0e209d39SAndroid Build Coastguard Worker * the status is set to U_INVALID_FORMAT_ERROR.
302*0e209d39SAndroid Build Coastguard Worker * @param status the error code
303*0e209d39SAndroid Build Coastguard Worker * @return the double value of this object.
304*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
305*0e209d39SAndroid Build Coastguard Worker */
306*0e209d39SAndroid Build Coastguard Worker double getDouble(UErrorCode& status) const;
307*0e209d39SAndroid Build Coastguard Worker
308*0e209d39SAndroid Build Coastguard Worker /**
309*0e209d39SAndroid Build Coastguard Worker * Gets the long value of this object. If this object is not of type
310*0e209d39SAndroid Build Coastguard Worker * kLong then the result is undefined.
311*0e209d39SAndroid Build Coastguard Worker * @return the long value of this object.
312*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
313*0e209d39SAndroid Build Coastguard Worker */
getLong()314*0e209d39SAndroid Build Coastguard Worker int32_t getLong() const { return (int32_t)fValue.fInt64; }
315*0e209d39SAndroid Build Coastguard Worker
316*0e209d39SAndroid Build Coastguard Worker /**
317*0e209d39SAndroid Build Coastguard Worker * Gets the long value of this object. If the magnitude is too
318*0e209d39SAndroid Build Coastguard Worker * large to fit in a long, then the maximum or minimum long value,
319*0e209d39SAndroid Build Coastguard Worker * as appropriate, is returned and the status is set to
320*0e209d39SAndroid Build Coastguard Worker * U_INVALID_FORMAT_ERROR. If this object is of type kInt64 and
321*0e209d39SAndroid Build Coastguard Worker * it fits within a long, then no precision is lost. If it is of
322*0e209d39SAndroid Build Coastguard Worker * type kDouble, then a conversion is performed, with
323*0e209d39SAndroid Build Coastguard Worker * truncation of any fractional part. If the type is kObject and
324*0e209d39SAndroid Build Coastguard Worker * the object is a Measure, then the result of
325*0e209d39SAndroid Build Coastguard Worker * getNumber().getLong(status) is returned. If this object is
326*0e209d39SAndroid Build Coastguard Worker * neither a numeric type nor a Measure, then 0 is returned and
327*0e209d39SAndroid Build Coastguard Worker * the status is set to U_INVALID_FORMAT_ERROR.
328*0e209d39SAndroid Build Coastguard Worker * @param status the error code
329*0e209d39SAndroid Build Coastguard Worker * @return the long value of this object.
330*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
331*0e209d39SAndroid Build Coastguard Worker */
332*0e209d39SAndroid Build Coastguard Worker int32_t getLong(UErrorCode& status) const;
333*0e209d39SAndroid Build Coastguard Worker
334*0e209d39SAndroid Build Coastguard Worker /**
335*0e209d39SAndroid Build Coastguard Worker * Gets the int64 value of this object. If this object is not of type
336*0e209d39SAndroid Build Coastguard Worker * kInt64 then the result is undefined.
337*0e209d39SAndroid Build Coastguard Worker * @return the int64 value of this object.
338*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.8
339*0e209d39SAndroid Build Coastguard Worker */
getInt64()340*0e209d39SAndroid Build Coastguard Worker int64_t getInt64() const { return fValue.fInt64; }
341*0e209d39SAndroid Build Coastguard Worker
342*0e209d39SAndroid Build Coastguard Worker /**
343*0e209d39SAndroid Build Coastguard Worker * Gets the int64 value of this object. If this object is of a numeric
344*0e209d39SAndroid Build Coastguard Worker * type and the magnitude is too large to fit in an int64, then
345*0e209d39SAndroid Build Coastguard Worker * the maximum or minimum int64 value, as appropriate, is returned
346*0e209d39SAndroid Build Coastguard Worker * and the status is set to U_INVALID_FORMAT_ERROR. If the
347*0e209d39SAndroid Build Coastguard Worker * magnitude fits in an int64, then a casting conversion is
348*0e209d39SAndroid Build Coastguard Worker * performed, with truncation of any fractional part. If the type
349*0e209d39SAndroid Build Coastguard Worker * is kObject and the object is a Measure, then the result of
350*0e209d39SAndroid Build Coastguard Worker * getNumber().getDouble(status) is returned. If this object is
351*0e209d39SAndroid Build Coastguard Worker * neither a numeric type nor a Measure, then 0 is returned and
352*0e209d39SAndroid Build Coastguard Worker * the status is set to U_INVALID_FORMAT_ERROR.
353*0e209d39SAndroid Build Coastguard Worker * @param status the error code
354*0e209d39SAndroid Build Coastguard Worker * @return the int64 value of this object.
355*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
356*0e209d39SAndroid Build Coastguard Worker */
357*0e209d39SAndroid Build Coastguard Worker int64_t getInt64(UErrorCode& status) const;
358*0e209d39SAndroid Build Coastguard Worker
359*0e209d39SAndroid Build Coastguard Worker /**
360*0e209d39SAndroid Build Coastguard Worker * Gets the Date value of this object. If this object is not of type
361*0e209d39SAndroid Build Coastguard Worker * kDate then the result is undefined.
362*0e209d39SAndroid Build Coastguard Worker * @return the Date value of this object.
363*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
364*0e209d39SAndroid Build Coastguard Worker */
getDate()365*0e209d39SAndroid Build Coastguard Worker UDate getDate() const { return fValue.fDate; }
366*0e209d39SAndroid Build Coastguard Worker
367*0e209d39SAndroid Build Coastguard Worker /**
368*0e209d39SAndroid Build Coastguard Worker * Gets the Date value of this object. If the type is not a date,
369*0e209d39SAndroid Build Coastguard Worker * status is set to U_INVALID_FORMAT_ERROR and the return value is
370*0e209d39SAndroid Build Coastguard Worker * undefined.
371*0e209d39SAndroid Build Coastguard Worker * @param status the error code.
372*0e209d39SAndroid Build Coastguard Worker * @return the Date value of this object.
373*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
374*0e209d39SAndroid Build Coastguard Worker */
375*0e209d39SAndroid Build Coastguard Worker UDate getDate(UErrorCode& status) const;
376*0e209d39SAndroid Build Coastguard Worker
377*0e209d39SAndroid Build Coastguard Worker /**
378*0e209d39SAndroid Build Coastguard Worker * Gets the string value of this object. If this object is not of type
379*0e209d39SAndroid Build Coastguard Worker * kString then the result is undefined.
380*0e209d39SAndroid Build Coastguard Worker * @param result Output param to receive the Date value of this object.
381*0e209d39SAndroid Build Coastguard Worker * @return A reference to 'result'.
382*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
383*0e209d39SAndroid Build Coastguard Worker */
getString(UnicodeString & result)384*0e209d39SAndroid Build Coastguard Worker UnicodeString& getString(UnicodeString& result) const
385*0e209d39SAndroid Build Coastguard Worker { result=*fValue.fString; return result; }
386*0e209d39SAndroid Build Coastguard Worker
387*0e209d39SAndroid Build Coastguard Worker /**
388*0e209d39SAndroid Build Coastguard Worker * Gets the string value of this object. If the type is not a
389*0e209d39SAndroid Build Coastguard Worker * string, status is set to U_INVALID_FORMAT_ERROR and a bogus
390*0e209d39SAndroid Build Coastguard Worker * string is returned.
391*0e209d39SAndroid Build Coastguard Worker * @param result Output param to receive the Date value of this object.
392*0e209d39SAndroid Build Coastguard Worker * @param status the error code.
393*0e209d39SAndroid Build Coastguard Worker * @return A reference to 'result'.
394*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
395*0e209d39SAndroid Build Coastguard Worker */
396*0e209d39SAndroid Build Coastguard Worker UnicodeString& getString(UnicodeString& result, UErrorCode& status) const;
397*0e209d39SAndroid Build Coastguard Worker
398*0e209d39SAndroid Build Coastguard Worker /**
399*0e209d39SAndroid Build Coastguard Worker * Gets a const reference to the string value of this object. If
400*0e209d39SAndroid Build Coastguard Worker * this object is not of type kString then the result is
401*0e209d39SAndroid Build Coastguard Worker * undefined.
402*0e209d39SAndroid Build Coastguard Worker * @return a const reference to the string value of this object.
403*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
404*0e209d39SAndroid Build Coastguard Worker */
405*0e209d39SAndroid Build Coastguard Worker inline const UnicodeString& getString() const;
406*0e209d39SAndroid Build Coastguard Worker
407*0e209d39SAndroid Build Coastguard Worker /**
408*0e209d39SAndroid Build Coastguard Worker * Gets a const reference to the string value of this object. If
409*0e209d39SAndroid Build Coastguard Worker * the type is not a string, status is set to
410*0e209d39SAndroid Build Coastguard Worker * U_INVALID_FORMAT_ERROR and the result is a bogus string.
411*0e209d39SAndroid Build Coastguard Worker * @param status the error code.
412*0e209d39SAndroid Build Coastguard Worker * @return a const reference to the string value of this object.
413*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
414*0e209d39SAndroid Build Coastguard Worker */
415*0e209d39SAndroid Build Coastguard Worker const UnicodeString& getString(UErrorCode& status) const;
416*0e209d39SAndroid Build Coastguard Worker
417*0e209d39SAndroid Build Coastguard Worker /**
418*0e209d39SAndroid Build Coastguard Worker * Gets a reference to the string value of this object. If this
419*0e209d39SAndroid Build Coastguard Worker * object is not of type kString then the result is undefined.
420*0e209d39SAndroid Build Coastguard Worker * @return a reference to the string value of this object.
421*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
422*0e209d39SAndroid Build Coastguard Worker */
423*0e209d39SAndroid Build Coastguard Worker inline UnicodeString& getString();
424*0e209d39SAndroid Build Coastguard Worker
425*0e209d39SAndroid Build Coastguard Worker /**
426*0e209d39SAndroid Build Coastguard Worker * Gets a reference to the string value of this object. If the
427*0e209d39SAndroid Build Coastguard Worker * type is not a string, status is set to U_INVALID_FORMAT_ERROR
428*0e209d39SAndroid Build Coastguard Worker * and the result is a bogus string.
429*0e209d39SAndroid Build Coastguard Worker * @param status the error code.
430*0e209d39SAndroid Build Coastguard Worker * @return a reference to the string value of this object.
431*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
432*0e209d39SAndroid Build Coastguard Worker */
433*0e209d39SAndroid Build Coastguard Worker UnicodeString& getString(UErrorCode& status);
434*0e209d39SAndroid Build Coastguard Worker
435*0e209d39SAndroid Build Coastguard Worker /**
436*0e209d39SAndroid Build Coastguard Worker * Gets the array value and count of this object. If this object
437*0e209d39SAndroid Build Coastguard Worker * is not of type kArray then the result is undefined.
438*0e209d39SAndroid Build Coastguard Worker * @param count fill-in with the count of this object.
439*0e209d39SAndroid Build Coastguard Worker * @return the array value of this object.
440*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
441*0e209d39SAndroid Build Coastguard Worker */
getArray(int32_t & count)442*0e209d39SAndroid Build Coastguard Worker const Formattable* getArray(int32_t& count) const
443*0e209d39SAndroid Build Coastguard Worker { count=fValue.fArrayAndCount.fCount; return fValue.fArrayAndCount.fArray; }
444*0e209d39SAndroid Build Coastguard Worker
445*0e209d39SAndroid Build Coastguard Worker /**
446*0e209d39SAndroid Build Coastguard Worker * Gets the array value and count of this object. If the type is
447*0e209d39SAndroid Build Coastguard Worker * not an array, status is set to U_INVALID_FORMAT_ERROR, count is
448*0e209d39SAndroid Build Coastguard Worker * set to 0, and the result is nullptr.
449*0e209d39SAndroid Build Coastguard Worker * @param count fill-in with the count of this object.
450*0e209d39SAndroid Build Coastguard Worker * @param status the error code.
451*0e209d39SAndroid Build Coastguard Worker * @return the array value of this object.
452*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
453*0e209d39SAndroid Build Coastguard Worker */
454*0e209d39SAndroid Build Coastguard Worker const Formattable* getArray(int32_t& count, UErrorCode& status) const;
455*0e209d39SAndroid Build Coastguard Worker
456*0e209d39SAndroid Build Coastguard Worker /**
457*0e209d39SAndroid Build Coastguard Worker * Accesses the specified element in the array value of this
458*0e209d39SAndroid Build Coastguard Worker * Formattable object. If this object is not of type kArray then
459*0e209d39SAndroid Build Coastguard Worker * the result is undefined.
460*0e209d39SAndroid Build Coastguard Worker * @param index the specified index.
461*0e209d39SAndroid Build Coastguard Worker * @return the accessed element in the array.
462*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
463*0e209d39SAndroid Build Coastguard Worker */
464*0e209d39SAndroid Build Coastguard Worker Formattable& operator[](int32_t index) { return fValue.fArrayAndCount.fArray[index]; }
465*0e209d39SAndroid Build Coastguard Worker
466*0e209d39SAndroid Build Coastguard Worker /**
467*0e209d39SAndroid Build Coastguard Worker * Returns a pointer to the UObject contained within this
468*0e209d39SAndroid Build Coastguard Worker * formattable, or nullptr if this object does not contain a UObject.
469*0e209d39SAndroid Build Coastguard Worker * @return a UObject pointer, or nullptr
470*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
471*0e209d39SAndroid Build Coastguard Worker */
472*0e209d39SAndroid Build Coastguard Worker const UObject* getObject() const;
473*0e209d39SAndroid Build Coastguard Worker
474*0e209d39SAndroid Build Coastguard Worker /**
475*0e209d39SAndroid Build Coastguard Worker * Returns a numeric string representation of the number contained within this
476*0e209d39SAndroid Build Coastguard Worker * formattable, or nullptr if this object does not contain numeric type.
477*0e209d39SAndroid Build Coastguard Worker * For values obtained by parsing, the returned decimal number retains
478*0e209d39SAndroid Build Coastguard Worker * the full precision and range of the original input, unconstrained by
479*0e209d39SAndroid Build Coastguard Worker * the limits of a double floating point or a 64 bit int.
480*0e209d39SAndroid Build Coastguard Worker *
481*0e209d39SAndroid Build Coastguard Worker * This function is not thread safe, and therefore is not declared const,
482*0e209d39SAndroid Build Coastguard Worker * even though it is logically const.
483*0e209d39SAndroid Build Coastguard Worker *
484*0e209d39SAndroid Build Coastguard Worker * Possible errors include U_MEMORY_ALLOCATION_ERROR, and
485*0e209d39SAndroid Build Coastguard Worker * U_INVALID_STATE if the formattable object has not been set to
486*0e209d39SAndroid Build Coastguard Worker * a numeric type.
487*0e209d39SAndroid Build Coastguard Worker *
488*0e209d39SAndroid Build Coastguard Worker * @param status the error code.
489*0e209d39SAndroid Build Coastguard Worker * @return the unformatted string representation of a number.
490*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.4
491*0e209d39SAndroid Build Coastguard Worker */
492*0e209d39SAndroid Build Coastguard Worker StringPiece getDecimalNumber(UErrorCode &status);
493*0e209d39SAndroid Build Coastguard Worker
494*0e209d39SAndroid Build Coastguard Worker /**
495*0e209d39SAndroid Build Coastguard Worker * Sets the double value of this object and changes the type to
496*0e209d39SAndroid Build Coastguard Worker * kDouble.
497*0e209d39SAndroid Build Coastguard Worker * @param d the new double value to be set.
498*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
499*0e209d39SAndroid Build Coastguard Worker */
500*0e209d39SAndroid Build Coastguard Worker void setDouble(double d);
501*0e209d39SAndroid Build Coastguard Worker
502*0e209d39SAndroid Build Coastguard Worker /**
503*0e209d39SAndroid Build Coastguard Worker * Sets the long value of this object and changes the type to
504*0e209d39SAndroid Build Coastguard Worker * kLong.
505*0e209d39SAndroid Build Coastguard Worker * @param l the new long value to be set.
506*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
507*0e209d39SAndroid Build Coastguard Worker */
508*0e209d39SAndroid Build Coastguard Worker void setLong(int32_t l);
509*0e209d39SAndroid Build Coastguard Worker
510*0e209d39SAndroid Build Coastguard Worker /**
511*0e209d39SAndroid Build Coastguard Worker * Sets the int64 value of this object and changes the type to
512*0e209d39SAndroid Build Coastguard Worker * kInt64.
513*0e209d39SAndroid Build Coastguard Worker * @param ll the new int64 value to be set.
514*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.8
515*0e209d39SAndroid Build Coastguard Worker */
516*0e209d39SAndroid Build Coastguard Worker void setInt64(int64_t ll);
517*0e209d39SAndroid Build Coastguard Worker
518*0e209d39SAndroid Build Coastguard Worker /**
519*0e209d39SAndroid Build Coastguard Worker * Sets the Date value of this object and changes the type to
520*0e209d39SAndroid Build Coastguard Worker * kDate.
521*0e209d39SAndroid Build Coastguard Worker * @param d the new Date value to be set.
522*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
523*0e209d39SAndroid Build Coastguard Worker */
524*0e209d39SAndroid Build Coastguard Worker void setDate(UDate d);
525*0e209d39SAndroid Build Coastguard Worker
526*0e209d39SAndroid Build Coastguard Worker /**
527*0e209d39SAndroid Build Coastguard Worker * Sets the string value of this object and changes the type to
528*0e209d39SAndroid Build Coastguard Worker * kString.
529*0e209d39SAndroid Build Coastguard Worker * @param stringToCopy the new string value to be set.
530*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
531*0e209d39SAndroid Build Coastguard Worker */
532*0e209d39SAndroid Build Coastguard Worker void setString(const UnicodeString& stringToCopy);
533*0e209d39SAndroid Build Coastguard Worker
534*0e209d39SAndroid Build Coastguard Worker /**
535*0e209d39SAndroid Build Coastguard Worker * Sets the array value and count of this object and changes the
536*0e209d39SAndroid Build Coastguard Worker * type to kArray.
537*0e209d39SAndroid Build Coastguard Worker * @param array the array value.
538*0e209d39SAndroid Build Coastguard Worker * @param count the number of array elements to be copied.
539*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
540*0e209d39SAndroid Build Coastguard Worker */
541*0e209d39SAndroid Build Coastguard Worker void setArray(const Formattable* array, int32_t count);
542*0e209d39SAndroid Build Coastguard Worker
543*0e209d39SAndroid Build Coastguard Worker /**
544*0e209d39SAndroid Build Coastguard Worker * Sets and adopts the string value and count of this object and
545*0e209d39SAndroid Build Coastguard Worker * changes the type to kArray.
546*0e209d39SAndroid Build Coastguard Worker * @param stringToAdopt the new string value to be adopted.
547*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
548*0e209d39SAndroid Build Coastguard Worker */
549*0e209d39SAndroid Build Coastguard Worker void adoptString(UnicodeString* stringToAdopt);
550*0e209d39SAndroid Build Coastguard Worker
551*0e209d39SAndroid Build Coastguard Worker /**
552*0e209d39SAndroid Build Coastguard Worker * Sets and adopts the array value and count of this object and
553*0e209d39SAndroid Build Coastguard Worker * changes the type to kArray.
554*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.0
555*0e209d39SAndroid Build Coastguard Worker */
556*0e209d39SAndroid Build Coastguard Worker void adoptArray(Formattable* array, int32_t count);
557*0e209d39SAndroid Build Coastguard Worker
558*0e209d39SAndroid Build Coastguard Worker /**
559*0e209d39SAndroid Build Coastguard Worker * Sets and adopts the UObject value of this object and changes
560*0e209d39SAndroid Build Coastguard Worker * the type to kObject. After this call, the caller must not
561*0e209d39SAndroid Build Coastguard Worker * delete the given object.
562*0e209d39SAndroid Build Coastguard Worker * @param objectToAdopt the UObject value to be adopted
563*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.0
564*0e209d39SAndroid Build Coastguard Worker */
565*0e209d39SAndroid Build Coastguard Worker void adoptObject(UObject* objectToAdopt);
566*0e209d39SAndroid Build Coastguard Worker
567*0e209d39SAndroid Build Coastguard Worker /**
568*0e209d39SAndroid Build Coastguard Worker * Sets the the numeric value from a decimal number string, and changes
569*0e209d39SAndroid Build Coastguard Worker * the type to to a numeric type appropriate for the number.
570*0e209d39SAndroid Build Coastguard Worker * The syntax of the number is a "numeric string"
571*0e209d39SAndroid Build Coastguard Worker * as defined in the Decimal Arithmetic Specification, available at
572*0e209d39SAndroid Build Coastguard Worker * http://speleotrove.com/decimal
573*0e209d39SAndroid Build Coastguard Worker * The full precision and range of the input number will be retained,
574*0e209d39SAndroid Build Coastguard Worker * even when it exceeds what can be represented by a double or an int64.
575*0e209d39SAndroid Build Coastguard Worker *
576*0e209d39SAndroid Build Coastguard Worker * @param numberString a string representation of the unformatted decimal number.
577*0e209d39SAndroid Build Coastguard Worker * @param status the error code. Set to U_INVALID_FORMAT_ERROR if the
578*0e209d39SAndroid Build Coastguard Worker * incoming string is not a valid decimal number.
579*0e209d39SAndroid Build Coastguard Worker * @stable ICU 4.4
580*0e209d39SAndroid Build Coastguard Worker */
581*0e209d39SAndroid Build Coastguard Worker void setDecimalNumber(StringPiece numberString,
582*0e209d39SAndroid Build Coastguard Worker UErrorCode &status);
583*0e209d39SAndroid Build Coastguard Worker
584*0e209d39SAndroid Build Coastguard Worker /**
585*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for the actual class.
586*0e209d39SAndroid Build Coastguard Worker *
587*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.2
588*0e209d39SAndroid Build Coastguard Worker */
589*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override;
590*0e209d39SAndroid Build Coastguard Worker
591*0e209d39SAndroid Build Coastguard Worker /**
592*0e209d39SAndroid Build Coastguard Worker * ICU "poor man's RTTI", returns a UClassID for this class.
593*0e209d39SAndroid Build Coastguard Worker *
594*0e209d39SAndroid Build Coastguard Worker * @stable ICU 2.2
595*0e209d39SAndroid Build Coastguard Worker */
596*0e209d39SAndroid Build Coastguard Worker static UClassID U_EXPORT2 getStaticClassID();
597*0e209d39SAndroid Build Coastguard Worker
598*0e209d39SAndroid Build Coastguard Worker /**
599*0e209d39SAndroid Build Coastguard Worker * Convert the UFormattable to a Formattable. Internally, this is a reinterpret_cast.
600*0e209d39SAndroid Build Coastguard Worker * @param fmt a valid UFormattable
601*0e209d39SAndroid Build Coastguard Worker * @return the UFormattable as a Formattable object pointer. This is an alias to the original
602*0e209d39SAndroid Build Coastguard Worker * UFormattable, and so is only valid while the original argument remains in scope.
603*0e209d39SAndroid Build Coastguard Worker * @stable ICU 52
604*0e209d39SAndroid Build Coastguard Worker */
605*0e209d39SAndroid Build Coastguard Worker static inline Formattable *fromUFormattable(UFormattable *fmt);
606*0e209d39SAndroid Build Coastguard Worker
607*0e209d39SAndroid Build Coastguard Worker /**
608*0e209d39SAndroid Build Coastguard Worker * Convert the const UFormattable to a const Formattable. Internally, this is a reinterpret_cast.
609*0e209d39SAndroid Build Coastguard Worker * @param fmt a valid UFormattable
610*0e209d39SAndroid Build Coastguard Worker * @return the UFormattable as a Formattable object pointer. This is an alias to the original
611*0e209d39SAndroid Build Coastguard Worker * UFormattable, and so is only valid while the original argument remains in scope.
612*0e209d39SAndroid Build Coastguard Worker * @stable ICU 52
613*0e209d39SAndroid Build Coastguard Worker */
614*0e209d39SAndroid Build Coastguard Worker static inline const Formattable *fromUFormattable(const UFormattable *fmt);
615*0e209d39SAndroid Build Coastguard Worker
616*0e209d39SAndroid Build Coastguard Worker /**
617*0e209d39SAndroid Build Coastguard Worker * Convert this object pointer to a UFormattable.
618*0e209d39SAndroid Build Coastguard Worker * @return this object as a UFormattable pointer. This is an alias to this object,
619*0e209d39SAndroid Build Coastguard Worker * and so is only valid while this object remains in scope.
620*0e209d39SAndroid Build Coastguard Worker * @stable ICU 52
621*0e209d39SAndroid Build Coastguard Worker */
622*0e209d39SAndroid Build Coastguard Worker inline UFormattable *toUFormattable();
623*0e209d39SAndroid Build Coastguard Worker
624*0e209d39SAndroid Build Coastguard Worker /**
625*0e209d39SAndroid Build Coastguard Worker * Convert this object pointer to a UFormattable.
626*0e209d39SAndroid Build Coastguard Worker * @return this object as a UFormattable pointer. This is an alias to this object,
627*0e209d39SAndroid Build Coastguard Worker * and so is only valid while this object remains in scope.
628*0e209d39SAndroid Build Coastguard Worker * @stable ICU 52
629*0e209d39SAndroid Build Coastguard Worker */
630*0e209d39SAndroid Build Coastguard Worker inline const UFormattable *toUFormattable() const;
631*0e209d39SAndroid Build Coastguard Worker
632*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_DEPRECATED_API
633*0e209d39SAndroid Build Coastguard Worker /**
634*0e209d39SAndroid Build Coastguard Worker * Deprecated variant of getLong(UErrorCode&).
635*0e209d39SAndroid Build Coastguard Worker * @param status the error code
636*0e209d39SAndroid Build Coastguard Worker * @return the long value of this object.
637*0e209d39SAndroid Build Coastguard Worker * @deprecated ICU 3.0 use getLong(UErrorCode&) instead
638*0e209d39SAndroid Build Coastguard Worker */
639*0e209d39SAndroid Build Coastguard Worker inline int32_t getLong(UErrorCode* status) const;
640*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_DEPRECATED_API */
641*0e209d39SAndroid Build Coastguard Worker
642*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API
643*0e209d39SAndroid Build Coastguard Worker /**
644*0e209d39SAndroid Build Coastguard Worker * Internal function, do not use.
645*0e209d39SAndroid Build Coastguard Worker * TODO: figure out how to make this be non-public.
646*0e209d39SAndroid Build Coastguard Worker * NumberFormat::format(Formattable, ...
647*0e209d39SAndroid Build Coastguard Worker * needs to get at the DecimalQuantity, if it exists, for
648*0e209d39SAndroid Build Coastguard Worker * big decimal formatting.
649*0e209d39SAndroid Build Coastguard Worker * @internal
650*0e209d39SAndroid Build Coastguard Worker */
getDecimalQuantity()651*0e209d39SAndroid Build Coastguard Worker number::impl::DecimalQuantity *getDecimalQuantity() const { return fDecimalQuantity;}
652*0e209d39SAndroid Build Coastguard Worker
653*0e209d39SAndroid Build Coastguard Worker /**
654*0e209d39SAndroid Build Coastguard Worker * Export the value of this Formattable to a DecimalQuantity.
655*0e209d39SAndroid Build Coastguard Worker * @internal
656*0e209d39SAndroid Build Coastguard Worker */
657*0e209d39SAndroid Build Coastguard Worker void populateDecimalQuantity(number::impl::DecimalQuantity& output, UErrorCode& status) const;
658*0e209d39SAndroid Build Coastguard Worker
659*0e209d39SAndroid Build Coastguard Worker /**
660*0e209d39SAndroid Build Coastguard Worker * Adopt, and set value from, a DecimalQuantity
661*0e209d39SAndroid Build Coastguard Worker * Internal Function, do not use.
662*0e209d39SAndroid Build Coastguard Worker * @param dq the DecimalQuantity to be adopted
663*0e209d39SAndroid Build Coastguard Worker * @internal
664*0e209d39SAndroid Build Coastguard Worker */
665*0e209d39SAndroid Build Coastguard Worker void adoptDecimalQuantity(number::impl::DecimalQuantity *dq);
666*0e209d39SAndroid Build Coastguard Worker
667*0e209d39SAndroid Build Coastguard Worker /**
668*0e209d39SAndroid Build Coastguard Worker * Internal function to return the CharString pointer.
669*0e209d39SAndroid Build Coastguard Worker * @param status error code
670*0e209d39SAndroid Build Coastguard Worker * @return pointer to the CharString - may become invalid if the object is modified
671*0e209d39SAndroid Build Coastguard Worker * @internal
672*0e209d39SAndroid Build Coastguard Worker */
673*0e209d39SAndroid Build Coastguard Worker CharString *internalGetCharString(UErrorCode &status);
674*0e209d39SAndroid Build Coastguard Worker
675*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_INTERNAL_API */
676*0e209d39SAndroid Build Coastguard Worker
677*0e209d39SAndroid Build Coastguard Worker private:
678*0e209d39SAndroid Build Coastguard Worker /**
679*0e209d39SAndroid Build Coastguard Worker * Cleans up the memory for unwanted values. For example, the adopted
680*0e209d39SAndroid Build Coastguard Worker * string or array objects.
681*0e209d39SAndroid Build Coastguard Worker */
682*0e209d39SAndroid Build Coastguard Worker void dispose();
683*0e209d39SAndroid Build Coastguard Worker
684*0e209d39SAndroid Build Coastguard Worker /**
685*0e209d39SAndroid Build Coastguard Worker * Common initialization, for use by constructors.
686*0e209d39SAndroid Build Coastguard Worker */
687*0e209d39SAndroid Build Coastguard Worker void init();
688*0e209d39SAndroid Build Coastguard Worker
689*0e209d39SAndroid Build Coastguard Worker UnicodeString* getBogus() const;
690*0e209d39SAndroid Build Coastguard Worker
691*0e209d39SAndroid Build Coastguard Worker union {
692*0e209d39SAndroid Build Coastguard Worker UObject* fObject;
693*0e209d39SAndroid Build Coastguard Worker UnicodeString* fString;
694*0e209d39SAndroid Build Coastguard Worker double fDouble;
695*0e209d39SAndroid Build Coastguard Worker int64_t fInt64;
696*0e209d39SAndroid Build Coastguard Worker UDate fDate;
697*0e209d39SAndroid Build Coastguard Worker struct {
698*0e209d39SAndroid Build Coastguard Worker Formattable* fArray;
699*0e209d39SAndroid Build Coastguard Worker int32_t fCount;
700*0e209d39SAndroid Build Coastguard Worker } fArrayAndCount;
701*0e209d39SAndroid Build Coastguard Worker } fValue;
702*0e209d39SAndroid Build Coastguard Worker
703*0e209d39SAndroid Build Coastguard Worker CharString *fDecimalStr;
704*0e209d39SAndroid Build Coastguard Worker
705*0e209d39SAndroid Build Coastguard Worker number::impl::DecimalQuantity *fDecimalQuantity;
706*0e209d39SAndroid Build Coastguard Worker
707*0e209d39SAndroid Build Coastguard Worker Type fType;
708*0e209d39SAndroid Build Coastguard Worker UnicodeString fBogus; // Bogus string when it's needed.
709*0e209d39SAndroid Build Coastguard Worker };
710*0e209d39SAndroid Build Coastguard Worker
getDate(UErrorCode & status)711*0e209d39SAndroid Build Coastguard Worker inline UDate Formattable::getDate(UErrorCode& status) const {
712*0e209d39SAndroid Build Coastguard Worker if (fType != kDate) {
713*0e209d39SAndroid Build Coastguard Worker if (U_SUCCESS(status)) {
714*0e209d39SAndroid Build Coastguard Worker status = U_INVALID_FORMAT_ERROR;
715*0e209d39SAndroid Build Coastguard Worker }
716*0e209d39SAndroid Build Coastguard Worker return 0;
717*0e209d39SAndroid Build Coastguard Worker }
718*0e209d39SAndroid Build Coastguard Worker return fValue.fDate;
719*0e209d39SAndroid Build Coastguard Worker }
720*0e209d39SAndroid Build Coastguard Worker
getString()721*0e209d39SAndroid Build Coastguard Worker inline const UnicodeString& Formattable::getString() const {
722*0e209d39SAndroid Build Coastguard Worker return *fValue.fString;
723*0e209d39SAndroid Build Coastguard Worker }
724*0e209d39SAndroid Build Coastguard Worker
getString()725*0e209d39SAndroid Build Coastguard Worker inline UnicodeString& Formattable::getString() {
726*0e209d39SAndroid Build Coastguard Worker return *fValue.fString;
727*0e209d39SAndroid Build Coastguard Worker }
728*0e209d39SAndroid Build Coastguard Worker
729*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_DEPRECATED_API
getLong(UErrorCode * status)730*0e209d39SAndroid Build Coastguard Worker inline int32_t Formattable::getLong(UErrorCode* status) const {
731*0e209d39SAndroid Build Coastguard Worker return getLong(*status);
732*0e209d39SAndroid Build Coastguard Worker }
733*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_DEPRECATED_API */
734*0e209d39SAndroid Build Coastguard Worker
toUFormattable()735*0e209d39SAndroid Build Coastguard Worker inline UFormattable* Formattable::toUFormattable() {
736*0e209d39SAndroid Build Coastguard Worker return reinterpret_cast<UFormattable*>(this);
737*0e209d39SAndroid Build Coastguard Worker }
738*0e209d39SAndroid Build Coastguard Worker
toUFormattable()739*0e209d39SAndroid Build Coastguard Worker inline const UFormattable* Formattable::toUFormattable() const {
740*0e209d39SAndroid Build Coastguard Worker return reinterpret_cast<const UFormattable*>(this);
741*0e209d39SAndroid Build Coastguard Worker }
742*0e209d39SAndroid Build Coastguard Worker
fromUFormattable(UFormattable * fmt)743*0e209d39SAndroid Build Coastguard Worker inline Formattable* Formattable::fromUFormattable(UFormattable *fmt) {
744*0e209d39SAndroid Build Coastguard Worker return reinterpret_cast<Formattable *>(fmt);
745*0e209d39SAndroid Build Coastguard Worker }
746*0e209d39SAndroid Build Coastguard Worker
fromUFormattable(const UFormattable * fmt)747*0e209d39SAndroid Build Coastguard Worker inline const Formattable* Formattable::fromUFormattable(const UFormattable *fmt) {
748*0e209d39SAndroid Build Coastguard Worker return reinterpret_cast<const Formattable *>(fmt);
749*0e209d39SAndroid Build Coastguard Worker }
750*0e209d39SAndroid Build Coastguard Worker
751*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
752*0e209d39SAndroid Build Coastguard Worker
753*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */
754*0e209d39SAndroid Build Coastguard Worker
755*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */
756*0e209d39SAndroid Build Coastguard Worker
757*0e209d39SAndroid Build Coastguard Worker #endif //_FMTABLE
758*0e209d39SAndroid Build Coastguard Worker //eof
759