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