1 // © 2018 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 4 #ifndef __UFORMATTEDVALUE_H__ 5 #define __UFORMATTEDVALUE_H__ 6 7 #include "unicode/utypes.h" 8 9 #if !UCONFIG_NO_FORMATTING 10 11 #include "unicode/ufieldpositer.h" 12 13 /** 14 * \file 15 * \brief C API: Abstract operations for localized strings. 16 * 17 * This file contains declarations for classes that deal with formatted strings. A number 18 * of APIs throughout ICU use these classes for expressing their localized output. 19 */ 20 21 22 /** 23 * All possible field categories in ICU. Every entry in this enum corresponds 24 * to another enum that exists in ICU. 25 * 26 * In the APIs that take a UFieldCategory, an int32_t type is used. Field 27 * categories having any of the top four bits turned on are reserved as 28 * private-use for external APIs implementing FormattedValue. This means that 29 * categories 2^28 and higher or below zero (with the highest bit turned on) 30 * are private-use and will not be used by ICU in the future. 31 * 32 * @stable ICU 64 33 */ 34 typedef enum UFieldCategory { 35 /** 36 * For an undefined field category. 37 * 38 * @stable ICU 64 39 */ 40 UFIELD_CATEGORY_UNDEFINED = 0, 41 42 /** 43 * For fields in UDateFormatField (udat.h), from ICU 3.0. 44 * 45 * @stable ICU 64 46 */ 47 UFIELD_CATEGORY_DATE, 48 49 /** 50 * For fields in UNumberFormatFields (unum.h), from ICU 49. 51 * 52 * @stable ICU 64 53 */ 54 UFIELD_CATEGORY_NUMBER, 55 56 /** 57 * For fields in UListFormatterField (ulistformatter.h), from ICU 63. 58 * 59 * @stable ICU 64 60 */ 61 UFIELD_CATEGORY_LIST, 62 63 /** 64 * For fields in URelativeDateTimeFormatterField (ureldatefmt.h), from ICU 64. 65 * 66 * @stable ICU 64 67 */ 68 UFIELD_CATEGORY_RELATIVE_DATETIME, 69 70 /** 71 * Reserved for possible future fields in UDateIntervalFormatField. 72 * 73 * @internal 74 */ 75 UFIELD_CATEGORY_DATE_INTERVAL, 76 77 #ifndef U_HIDE_INTERNAL_API 78 /** @internal */ 79 UFIELD_CATEGORY_COUNT, 80 #endif /* U_HIDE_INTERNAL_API */ 81 82 /** 83 * Category for spans in a list. 84 * 85 * @stable ICU 64 86 */ 87 UFIELD_CATEGORY_LIST_SPAN = 0x1000 + UFIELD_CATEGORY_LIST, 88 89 /** 90 * Category for spans in a date interval. 91 * 92 * @stable ICU 64 93 */ 94 UFIELD_CATEGORY_DATE_INTERVAL_SPAN = 0x1000 + UFIELD_CATEGORY_DATE_INTERVAL, 95 96 /** 97 * Category for spans in a number range. 98 * 99 * @stable ICU 69 100 */ 101 UFIELD_CATEGORY_NUMBER_RANGE_SPAN = 0x1000 + UFIELD_CATEGORY_NUMBER, 102 103 } UFieldCategory; 104 105 106 struct UConstrainedFieldPosition; 107 /** 108 * Represents a span of a string containing a given field. 109 * 110 * This struct differs from UFieldPosition in the following ways: 111 * 112 * 1. It has information on the field category. 113 * 2. It allows you to set constraints to use when iterating over field positions. 114 * 3. It is used for the newer FormattedValue APIs. 115 * 116 * @stable ICU 64 117 */ 118 typedef struct UConstrainedFieldPosition UConstrainedFieldPosition; 119 120 121 /** 122 * Creates a new UConstrainedFieldPosition. 123 * 124 * By default, the UConstrainedFieldPosition has no iteration constraints. 125 * 126 * @param ec Set if an error occurs. 127 * @return The new object, or NULL if an error occurs. 128 * @stable ICU 64 129 */ 130 U_CAPI UConstrainedFieldPosition* U_EXPORT2 131 ucfpos_open(UErrorCode* ec); 132 133 134 /** 135 * Resets a UConstrainedFieldPosition to its initial state, as if it were newly created. 136 * 137 * Removes any constraints that may have been set on the instance. 138 * 139 * @param ucfpos The instance of UConstrainedFieldPosition. 140 * @param ec Set if an error occurs. 141 * @stable ICU 64 142 */ 143 U_CAPI void U_EXPORT2 144 ucfpos_reset( 145 UConstrainedFieldPosition* ucfpos, 146 UErrorCode* ec); 147 148 149 /** 150 * Destroys a UConstrainedFieldPosition and releases its memory. 151 * 152 * @param ucfpos The instance of UConstrainedFieldPosition. 153 * @stable ICU 64 154 */ 155 U_CAPI void U_EXPORT2 156 ucfpos_close(UConstrainedFieldPosition* ucfpos); 157 158 159 /** 160 * Sets a constraint on the field category. 161 * 162 * When this instance of UConstrainedFieldPosition is passed to ufmtval_nextPosition, 163 * positions are skipped unless they have the given category. 164 * 165 * Any previously set constraints are cleared. 166 * 167 * For example, to loop over only the number-related fields: 168 * 169 * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec); 170 * ucfpos_constrainCategory(ucfpos, UFIELDCATEGORY_NUMBER_FORMAT, ec); 171 * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) { 172 * // handle the number-related field position 173 * } 174 * ucfpos_close(ucfpos); 175 * 176 * Changing the constraint while in the middle of iterating over a FormattedValue 177 * does not generally have well-defined behavior. 178 * 179 * @param ucfpos The instance of UConstrainedFieldPosition. 180 * @param category The field category to fix when iterating. 181 * @param ec Set if an error occurs. 182 * @stable ICU 64 183 */ 184 U_CAPI void U_EXPORT2 185 ucfpos_constrainCategory( 186 UConstrainedFieldPosition* ucfpos, 187 int32_t category, 188 UErrorCode* ec); 189 190 191 /** 192 * Sets a constraint on the category and field. 193 * 194 * When this instance of UConstrainedFieldPosition is passed to ufmtval_nextPosition, 195 * positions are skipped unless they have the given category and field. 196 * 197 * Any previously set constraints are cleared. 198 * 199 * For example, to loop over all grouping separators: 200 * 201 * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec); 202 * ucfpos_constrainField(ucfpos, UFIELDCATEGORY_NUMBER_FORMAT, UNUM_GROUPING_SEPARATOR_FIELD, ec); 203 * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) { 204 * // handle the grouping separator position 205 * } 206 * ucfpos_close(ucfpos); 207 * 208 * Changing the constraint while in the middle of iterating over a FormattedValue 209 * does not generally have well-defined behavior. 210 * 211 * @param ucfpos The instance of UConstrainedFieldPosition. 212 * @param category The field category to fix when iterating. 213 * @param field The field to fix when iterating. 214 * @param ec Set if an error occurs. 215 * @stable ICU 64 216 */ 217 U_CAPI void U_EXPORT2 218 ucfpos_constrainField( 219 UConstrainedFieldPosition* ucfpos, 220 int32_t category, 221 int32_t field, 222 UErrorCode* ec); 223 224 225 /** 226 * Gets the field category for the current position. 227 * 228 * If a category or field constraint was set, this function returns the constrained 229 * category. Otherwise, the return value is well-defined only after 230 * ufmtval_nextPosition returns true. 231 * 232 * @param ucfpos The instance of UConstrainedFieldPosition. 233 * @param ec Set if an error occurs. 234 * @return The field category saved in the instance. 235 * @stable ICU 64 236 */ 237 U_CAPI int32_t U_EXPORT2 238 ucfpos_getCategory( 239 const UConstrainedFieldPosition* ucfpos, 240 UErrorCode* ec); 241 242 243 /** 244 * Gets the field for the current position. 245 * 246 * If a field constraint was set, this function returns the constrained 247 * field. Otherwise, the return value is well-defined only after 248 * ufmtval_nextPosition returns true. 249 * 250 * @param ucfpos The instance of UConstrainedFieldPosition. 251 * @param ec Set if an error occurs. 252 * @return The field saved in the instance. 253 * @stable ICU 64 254 */ 255 U_CAPI int32_t U_EXPORT2 256 ucfpos_getField( 257 const UConstrainedFieldPosition* ucfpos, 258 UErrorCode* ec); 259 260 261 /** 262 * Gets the INCLUSIVE start and EXCLUSIVE end index stored for the current position. 263 * 264 * The output values are well-defined only after ufmtval_nextPosition returns true. 265 * 266 * @param ucfpos The instance of UConstrainedFieldPosition. 267 * @param pStart Set to the start index saved in the instance. Ignored if nullptr. 268 * @param pLimit Set to the end index saved in the instance. Ignored if nullptr. 269 * @param ec Set if an error occurs. 270 * @stable ICU 64 271 */ 272 U_CAPI void U_EXPORT2 273 ucfpos_getIndexes( 274 const UConstrainedFieldPosition* ucfpos, 275 int32_t* pStart, 276 int32_t* pLimit, 277 UErrorCode* ec); 278 279 280 /** 281 * Gets an int64 that FormattedValue implementations may use for storage. 282 * 283 * The initial value is zero. 284 * 285 * Users of FormattedValue should not need to call this method. 286 * 287 * @param ucfpos The instance of UConstrainedFieldPosition. 288 * @param ec Set if an error occurs. 289 * @return The current iteration context from ucfpos_setInt64IterationContext. 290 * @stable ICU 64 291 */ 292 U_CAPI int64_t U_EXPORT2 293 ucfpos_getInt64IterationContext( 294 const UConstrainedFieldPosition* ucfpos, 295 UErrorCode* ec); 296 297 298 /** 299 * Sets an int64 that FormattedValue implementations may use for storage. 300 * 301 * Intended to be used by FormattedValue implementations. 302 * 303 * @param ucfpos The instance of UConstrainedFieldPosition. 304 * @param context The new iteration context. 305 * @param ec Set if an error occurs. 306 * @stable ICU 64 307 */ 308 U_CAPI void U_EXPORT2 309 ucfpos_setInt64IterationContext( 310 UConstrainedFieldPosition* ucfpos, 311 int64_t context, 312 UErrorCode* ec); 313 314 315 /** 316 * Determines whether a given field should be included given the 317 * constraints. 318 * 319 * Intended to be used by FormattedValue implementations. 320 * 321 * @param ucfpos The instance of UConstrainedFieldPosition. 322 * @param category The category to test. 323 * @param field The field to test. 324 * @param ec Set if an error occurs. 325 * @stable ICU 64 326 */ 327 U_CAPI UBool U_EXPORT2 328 ucfpos_matchesField( 329 const UConstrainedFieldPosition* ucfpos, 330 int32_t category, 331 int32_t field, 332 UErrorCode* ec); 333 334 335 /** 336 * Sets new values for the primary public getters. 337 * 338 * Intended to be used by FormattedValue implementations. 339 * 340 * It is up to the implementation to ensure that the user-requested 341 * constraints are satisfied. This method does not check! 342 * 343 * @param ucfpos The instance of UConstrainedFieldPosition. 344 * @param category The new field category. 345 * @param field The new field. 346 * @param start The new inclusive start index. 347 * @param limit The new exclusive end index. 348 * @param ec Set if an error occurs. 349 * @stable ICU 64 350 */ 351 U_CAPI void U_EXPORT2 352 ucfpos_setState( 353 UConstrainedFieldPosition* ucfpos, 354 int32_t category, 355 int32_t field, 356 int32_t start, 357 int32_t limit, 358 UErrorCode* ec); 359 360 361 struct UFormattedValue; 362 /** 363 * An abstract formatted value: a string with associated field attributes. 364 * Many formatters format to types compatible with UFormattedValue. 365 * 366 * @stable ICU 64 367 */ 368 typedef struct UFormattedValue UFormattedValue; 369 370 371 /** 372 * Returns a pointer to the formatted string. The pointer is owned by the UFormattedValue. The 373 * return value is valid only as long as the UFormattedValue is present and unchanged in memory. 374 * 375 * The return value is NUL-terminated but could contain internal NULs. 376 * 377 * @param ufmtval 378 * The object containing the formatted string and attributes. 379 * @param pLength Output variable for the length of the string. Ignored if NULL. 380 * @param ec Set if an error occurs. 381 * @return A NUL-terminated char16 string owned by the UFormattedValue. 382 * @stable ICU 64 383 */ 384 U_CAPI const UChar* U_EXPORT2 385 ufmtval_getString( 386 const UFormattedValue* ufmtval, 387 int32_t* pLength, 388 UErrorCode* ec); 389 390 391 /** 392 * Iterates over field positions in the UFormattedValue. This lets you determine the position 393 * of specific types of substrings, like a month or a decimal separator. 394 * 395 * To loop over all field positions: 396 * 397 * UConstrainedFieldPosition* ucfpos = ucfpos_open(ec); 398 * while (ufmtval_nextPosition(ufmtval, ucfpos, ec)) { 399 * // handle the field position; get information from ucfpos 400 * } 401 * ucfpos_close(ucfpos); 402 * 403 * @param ufmtval 404 * The object containing the formatted string and attributes. 405 * @param ucfpos 406 * The object used for iteration state; can provide constraints to iterate over only 407 * one specific category or field; 408 * see ucfpos_constrainCategory 409 * and ucfpos_constrainField. 410 * @param ec Set if an error occurs. 411 * @return true if another position was found; false otherwise. 412 * @stable ICU 64 413 */ 414 U_CAPI UBool U_EXPORT2 415 ufmtval_nextPosition( 416 const UFormattedValue* ufmtval, 417 UConstrainedFieldPosition* ucfpos, 418 UErrorCode* ec); 419 420 421 #if U_SHOW_CPLUSPLUS_API 422 U_NAMESPACE_BEGIN 423 424 /** 425 * \class LocalUConstrainedFieldPositionPointer 426 * "Smart pointer" class; closes a UConstrainedFieldPosition via ucfpos_close(). 427 * For most methods see the LocalPointerBase base class. 428 * 429 * Usage: 430 * 431 * LocalUConstrainedFieldPositionPointer ucfpos(ucfpos_open(ec)); 432 * // no need to explicitly call ucfpos_close() 433 * 434 * @stable ICU 64 435 */ 436 U_DEFINE_LOCAL_OPEN_POINTER(LocalUConstrainedFieldPositionPointer, 437 UConstrainedFieldPosition, 438 ucfpos_close); 439 440 U_NAMESPACE_END 441 #endif // U_SHOW_CPLUSPLUS_API 442 443 444 #endif /* #if !UCONFIG_NO_FORMATTING */ 445 #endif // __UFORMATTEDVALUE_H__ 446