xref: /aosp_15_r20/external/icu/libicu/cts_headers/unicode/fmtable.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
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