1 | /* |
2 | ******************************************************************************** |
3 | * Copyright (C) 2013-2014, International Business Machines Corporation and others. |
4 | * All Rights Reserved. |
5 | ******************************************************************************** |
6 | * |
7 | * File UFORMATTABLE.H |
8 | * |
9 | * Modification History: |
10 | * |
11 | * Date Name Description |
12 | * 2013 Jun 7 srl New |
13 | ******************************************************************************** |
14 | */ |
15 | |
16 | /** |
17 | * \file |
18 | * \brief C API: UFormattable is a thin wrapper for primitive types used for formatting and parsing. |
19 | * |
20 | * This is a C interface to the icu::Formattable class. Static functions on this class convert |
21 | * to and from this interface (via reinterpret_cast). Note that Formattables (and thus UFormattables) |
22 | * are mutable, and many operations (even getters) may actually modify the internal state. For this |
23 | * reason, UFormattables are not thread safe, and should not be shared between threads. |
24 | * |
25 | * See {@link unum_parseToUFormattable} for example code. |
26 | */ |
27 | |
28 | #ifndef UFORMATTABLE_H |
29 | #define UFORMATTABLE_H |
30 | |
31 | #include "unicode/utypes.h" |
32 | |
33 | #if !UCONFIG_NO_FORMATTING |
34 | |
35 | #include "unicode/localpointer.h" |
36 | |
37 | /** |
38 | * Enum designating the type of a UFormattable instance. |
39 | * Practically, this indicates which of the getters would return without conversion |
40 | * or error. |
41 | * @see icu::Formattable::Type |
42 | * @stable ICU 52 |
43 | */ |
44 | typedef enum UFormattableType { |
45 | UFMT_DATE = 0, /**< ufmt_getDate() will return without conversion. @see ufmt_getDate*/ |
46 | UFMT_DOUBLE, /**< ufmt_getDouble() will return without conversion. @see ufmt_getDouble*/ |
47 | UFMT_LONG, /**< ufmt_getLong() will return without conversion. @see ufmt_getLong */ |
48 | UFMT_STRING, /**< ufmt_getUChars() will return without conversion. @see ufmt_getUChars*/ |
49 | UFMT_ARRAY, /**< ufmt_countArray() and ufmt_getArray() will return the value. @see ufmt_getArrayItemByIndex */ |
50 | UFMT_INT64, /**< ufmt_getInt64() will return without conversion. @see ufmt_getInt64 */ |
51 | UFMT_OBJECT, /**< ufmt_getObject() will return without conversion. @see ufmt_getObject*/ |
52 | UFMT_COUNT /**< Count of defined UFormattableType values */ |
53 | } UFormattableType; |
54 | |
55 | |
56 | /** |
57 | * Opaque type representing various types of data which may be used for formatting |
58 | * and parsing operations. |
59 | * @see icu::Formattable |
60 | * @stable ICU 52 |
61 | */ |
62 | typedef void *UFormattable; |
63 | |
64 | /** |
65 | * Initialize a UFormattable, to type UNUM_LONG, value 0 |
66 | * may return error if memory allocation failed. |
67 | * parameter status error code. |
68 | * See {@link unum_parseToUFormattable} for example code. |
69 | * @stable ICU 52 |
70 | * @return the new UFormattable |
71 | * @see ufmt_close |
72 | * @see icu::Formattable::Formattable() |
73 | */ |
74 | U_STABLE UFormattable* U_EXPORT2 |
75 | ufmt_open(UErrorCode* status); |
76 | |
77 | /** |
78 | * Cleanup any additional memory allocated by this UFormattable. |
79 | * @param fmt the formatter |
80 | * @stable ICU 52 |
81 | * @see ufmt_open |
82 | */ |
83 | U_STABLE void U_EXPORT2 |
84 | ufmt_close(UFormattable* fmt); |
85 | |
86 | #if U_SHOW_CPLUSPLUS_API |
87 | |
88 | U_NAMESPACE_BEGIN |
89 | |
90 | /** |
91 | * \class LocalUFormattablePointer |
92 | * "Smart pointer" class, closes a UFormattable via ufmt_close(). |
93 | * For most methods see the LocalPointerBase base class. |
94 | * |
95 | * @see LocalPointerBase |
96 | * @see LocalPointer |
97 | * @stable ICU 52 |
98 | */ |
99 | U_DEFINE_LOCAL_OPEN_POINTER(LocalUFormattablePointer, UFormattable, ufmt_close); |
100 | |
101 | U_NAMESPACE_END |
102 | |
103 | #endif |
104 | |
105 | /** |
106 | * Return the type of this object |
107 | * @param fmt the UFormattable object |
108 | * @param status status code - U_ILLEGAL_ARGUMENT_ERROR is returned if the UFormattable contains data not supported by |
109 | * the API |
110 | * @return the value as a UFormattableType |
111 | * @see ufmt_isNumeric |
112 | * @see icu::Formattable::getType() const |
113 | * @stable ICU 52 |
114 | */ |
115 | U_STABLE UFormattableType U_EXPORT2 |
116 | ufmt_getType(const UFormattable* fmt, UErrorCode *status); |
117 | |
118 | /** |
119 | * Return whether the object is numeric. |
120 | * @param fmt the UFormattable object |
121 | * @return true if the object is a double, long, or int64 value, else false. |
122 | * @see ufmt_getType |
123 | * @see icu::Formattable::isNumeric() const |
124 | * @stable ICU 52 |
125 | */ |
126 | U_STABLE UBool U_EXPORT2 |
127 | ufmt_isNumeric(const UFormattable* fmt); |
128 | |
129 | /** |
130 | * Gets the UDate value of this object. If the type is not of type UFMT_DATE, |
131 | * status is set to U_INVALID_FORMAT_ERROR and the return value is |
132 | * undefined. |
133 | * @param fmt the UFormattable object |
134 | * @param status the error code - any conversion or format errors |
135 | * @return the value |
136 | * @stable ICU 52 |
137 | * @see icu::Formattable::getDate(UErrorCode&) const |
138 | */ |
139 | U_STABLE UDate U_EXPORT2 |
140 | ufmt_getDate(const UFormattable* fmt, UErrorCode *status); |
141 | |
142 | /** |
143 | * Gets the double value of this object. If the type is not a UFMT_DOUBLE, or |
144 | * if there are additional significant digits than fit in a double type, |
145 | * a conversion is performed with possible loss of precision. |
146 | * If the type is UFMT_OBJECT and the |
147 | * object is a Measure, then the result of |
148 | * getNumber().getDouble(status) is returned. If this object is |
149 | * neither a numeric type nor a Measure, then 0 is returned and |
150 | * the status is set to U_INVALID_FORMAT_ERROR. |
151 | * @param fmt the UFormattable object |
152 | * @param status the error code - any conversion or format errors |
153 | * @return the value |
154 | * @stable ICU 52 |
155 | * @see icu::Formattable::getDouble(UErrorCode&) const |
156 | */ |
157 | U_STABLE double U_EXPORT2 |
158 | ufmt_getDouble(UFormattable* fmt, UErrorCode *status); |
159 | |
160 | /** |
161 | * Gets the long (int32_t) value of this object. If the magnitude is too |
162 | * large to fit in a long, then the maximum or minimum long value, |
163 | * as appropriate, is returned and the status is set to |
164 | * U_INVALID_FORMAT_ERROR. If this object is of type UFMT_INT64 and |
165 | * it fits within a long, then no precision is lost. If it is of |
166 | * type kDouble or kDecimalNumber, then a conversion is peformed, with |
167 | * truncation of any fractional part. If the type is UFMT_OBJECT and |
168 | * the object is a Measure, then the result of |
169 | * getNumber().getLong(status) is returned. If this object is |
170 | * neither a numeric type nor a Measure, then 0 is returned and |
171 | * the status is set to U_INVALID_FORMAT_ERROR. |
172 | * @param fmt the UFormattable object |
173 | * @param status the error code - any conversion or format errors |
174 | * @return the value |
175 | * @stable ICU 52 |
176 | * @see icu::Formattable::getLong(UErrorCode&) const |
177 | */ |
178 | U_STABLE int32_t U_EXPORT2 |
179 | ufmt_getLong(UFormattable* fmt, UErrorCode *status); |
180 | |
181 | |
182 | /** |
183 | * Gets the int64_t value of this object. If this object is of a numeric |
184 | * type and the magnitude is too large to fit in an int64, then |
185 | * the maximum or minimum int64 value, as appropriate, is returned |
186 | * and the status is set to U_INVALID_FORMAT_ERROR. If the |
187 | * magnitude fits in an int64, then a casting conversion is |
188 | * peformed, with truncation of any fractional part. If the type |
189 | * is UFMT_OBJECT and the object is a Measure, then the result of |
190 | * getNumber().getDouble(status) is returned. If this object is |
191 | * neither a numeric type nor a Measure, then 0 is returned and |
192 | * the status is set to U_INVALID_FORMAT_ERROR. |
193 | * @param fmt the UFormattable object |
194 | * @param status the error code - any conversion or format errors |
195 | * @return the value |
196 | * @stable ICU 52 |
197 | * @see icu::Formattable::getInt64(UErrorCode&) const |
198 | */ |
199 | U_STABLE int64_t U_EXPORT2 |
200 | ufmt_getInt64(UFormattable* fmt, UErrorCode *status); |
201 | |
202 | /** |
203 | * Returns a pointer to the UObject contained within this |
204 | * formattable (as a const void*), or NULL if this object |
205 | * is not of type UFMT_OBJECT. |
206 | * @param fmt the UFormattable object |
207 | * @param status the error code - any conversion or format errors |
208 | * @return the value as a const void*. It is a polymorphic C++ object. |
209 | * @stable ICU 52 |
210 | * @see icu::Formattable::getObject() const |
211 | */ |
212 | U_STABLE const void *U_EXPORT2 |
213 | ufmt_getObject(const UFormattable* fmt, UErrorCode *status); |
214 | |
215 | /** |
216 | * Gets the string value of this object as a UChar string. If the type is not a |
217 | * string, status is set to U_INVALID_FORMAT_ERROR and a NULL pointer is returned. |
218 | * This function is not thread safe and may modify the UFormattable if need be to terminate the string. |
219 | * The returned pointer is not valid if any other functions are called on this UFormattable, or if the UFormattable is closed. |
220 | * @param fmt the UFormattable object |
221 | * @param status the error code - any conversion or format errors |
222 | * @param len if non null, contains the string length on return |
223 | * @return the null terminated string value - must not be referenced after any other functions are called on this UFormattable. |
224 | * @stable ICU 52 |
225 | * @see icu::Formattable::getString(UnicodeString&)const |
226 | */ |
227 | U_STABLE const UChar* U_EXPORT2 |
228 | ufmt_getUChars(UFormattable* fmt, int32_t *len, UErrorCode *status); |
229 | |
230 | /** |
231 | * Get the number of array objects contained, if an array type UFMT_ARRAY |
232 | * @param fmt the UFormattable object |
233 | * @param status the error code - any conversion or format errors. U_ILLEGAL_ARGUMENT_ERROR if not an array type. |
234 | * @return the number of array objects or undefined if not an array type |
235 | * @stable ICU 52 |
236 | * @see ufmt_getArrayItemByIndex |
237 | */ |
238 | U_STABLE int32_t U_EXPORT2 |
239 | ufmt_getArrayLength(const UFormattable* fmt, UErrorCode *status); |
240 | |
241 | /** |
242 | * Get the specified value from the array of UFormattables. Invalid if the object is not an array type UFMT_ARRAY |
243 | * @param fmt the UFormattable object |
244 | * @param n the number of the array to return (0 based). |
245 | * @param status the error code - any conversion or format errors. Returns an error if n is out of bounds. |
246 | * @return the nth array value, only valid while the containing UFormattable is valid. NULL if not an array. |
247 | * @stable ICU 52 |
248 | * @see icu::Formattable::getArray(int32_t&, UErrorCode&) const |
249 | */ |
250 | U_STABLE UFormattable * U_EXPORT2 |
251 | ufmt_getArrayItemByIndex(UFormattable* fmt, int32_t n, UErrorCode *status); |
252 | |
253 | /** |
254 | * Returns a numeric string representation of the number contained within this |
255 | * formattable, or NULL if this object does not contain numeric type. |
256 | * For values obtained by parsing, the returned decimal number retains |
257 | * the full precision and range of the original input, unconstrained by |
258 | * the limits of a double floating point or a 64 bit int. |
259 | * |
260 | * This function is not thread safe, and therfore is not declared const, |
261 | * even though it is logically const. |
262 | * The resulting buffer is owned by the UFormattable and is invalid if any other functions are |
263 | * called on the UFormattable. |
264 | * |
265 | * Possible errors include U_MEMORY_ALLOCATION_ERROR, and |
266 | * U_INVALID_STATE if the formattable object has not been set to |
267 | * a numeric type. |
268 | * @param fmt the UFormattable object |
269 | * @param len if non-null, on exit contains the string length (not including the terminating null) |
270 | * @param status the error code |
271 | * @return the character buffer as a NULL terminated string, which is owned by the object and must not be accessed if any other functions are called on this object. |
272 | * @stable ICU 52 |
273 | * @see icu::Formattable::getDecimalNumber(UErrorCode&) |
274 | */ |
275 | U_STABLE const char * U_EXPORT2 |
276 | ufmt_getDecNumChars(UFormattable *fmt, int32_t *len, UErrorCode *status); |
277 | |
278 | #endif |
279 | |
280 | #endif |
281 | |