1 /* 2 ******************************************************************************** 3 * Copyright (C) 1997-2006, International Business Machines 4 * Corporation and others. All Rights Reserved. 5 ******************************************************************************** 6 * 7 * File FMTABLE.H 8 * 9 * Modification History: 10 * 11 * Date Name Description 12 * 02/29/97 aliu Creation. 13 ******************************************************************************** 14 */ 15 #ifndef FMTABLE_H 16 #define FMTABLE_H 17 18 #include "unicode/utypes.h" 19 #include "unicode/unistr.h" 20 /** 21 * \file 22 * \brief C++ API: Formattable is a thin wrapper for primitive numeric types. 23 */ 24 25 #if !UCONFIG_NO_FORMATTING 26 27 U_NAMESPACE_BEGIN 28 29 /** 30 * Formattable objects can be passed to the Format class or 31 * its subclasses for formatting. Formattable is a thin wrapper 32 * class which interconverts between the primitive numeric types 33 * (double, long, etc.) as well as UDate and UnicodeString. 34 * 35 * <p>Internally, a Formattable object is a union of primitive types. 36 * As such, it can only store one flavor of data at a time. To 37 * determine what flavor of data it contains, use the getType method. 38 * 39 * <p>As of ICU 3.0, Formattable may also wrap a UObject pointer, 40 * which it owns. This allows an instance of any ICU class to be 41 * encapsulated in a Formattable. For legacy reasons and for 42 * efficiency, primitive numeric types are still stored directly 43 * within a Formattable. 44 * 45 * <p>The Formattable class is not suitable for subclassing. 46 */ 47 class U_I18N_API Formattable : public UObject { 48 public: 49 /** 50 * This enum is only used to let callers distinguish between 51 * the Formattable(UDate) constructor and the Formattable(double) 52 * constructor; the compiler cannot distinguish the signatures, 53 * since UDate is currently typedefed to be either double or long. 54 * If UDate is changed later to be a bonafide class 55 * or struct, then we no longer need this enum. 56 * @stable ICU 2.4 57 */ 58 enum ISDATE { kIsDate }; 59 60 /** 61 * Default constructor 62 * @stable ICU 2.4 63 */ 64 Formattable(); // Type kLong, value 0 65 66 /** 67 * Creates a Formattable object with a UDate instance. 68 * @param d the UDate instance. 69 * @param flag the flag to indicate this is a date. Always set it to kIsDate 70 * @stable ICU 2.0 71 */ 72 Formattable(UDate d, ISDATE flag); 73 74 /** 75 * Creates a Formattable object with a double number. 76 * @param d the double number. 77 * @stable ICU 2.0 78 */ 79 Formattable(double d); 80 81 /** 82 * Creates a Formattable object with a long number. 83 * @param l the long number. 84 * @stable ICU 2.0 85 */ 86 Formattable(int32_t l); 87 88 /** 89 * Creates a Formattable object with an int64_t number 90 * @param ll the int64_t number. 91 * @stable ICU 2.8 92 */ 93 Formattable(int64_t ll); 94 95 #if !UCONFIG_NO_CONVERSION 96 /** 97 * Creates a Formattable object with a char string pointer. 98 * Assumes that the char string is null terminated. 99 * @param strToCopy the char string. 100 * @stable ICU 2.0 101 */ 102 Formattable(const char* strToCopy); 103 #endif 104 105 /** 106 * Creates a Formattable object with a UnicodeString object to copy from. 107 * @param strToCopy the UnicodeString string. 108 * @stable ICU 2.0 109 */ 110 Formattable(const UnicodeString& strToCopy); 111 112 /** 113 * Creates a Formattable object with a UnicodeString object to adopt from. 114 * @param strToAdopt the UnicodeString string. 115 * @stable ICU 2.0 116 */ 117 Formattable(UnicodeString* strToAdopt); 118 119 /** 120 * Creates a Formattable object with an array of Formattable objects. 121 * @param arrayToCopy the Formattable object array. 122 * @param count the array count. 123 * @stable ICU 2.0 124 */ 125 Formattable(const Formattable* arrayToCopy, int32_t count); 126 127 /** 128 * Creates a Formattable object that adopts the given UObject. 129 * @param objectToAdopt the UObject to set this object to 130 * @stable ICU 3.0 131 */ 132 Formattable(UObject* objectToAdopt); 133 134 /** 135 * Copy constructor. 136 * @stable ICU 2.0 137 */ 138 Formattable(const Formattable&); 139 140 /** 141 * Assignment operator. 142 * @param rhs The Formattable object to copy into this object. 143 * @stable ICU 2.0 144 */ 145 Formattable& operator=(const Formattable &rhs); 146 147 /** 148 * Equality comparison. 149 * @param other the object to be compared with. 150 * @return TRUE if other are equal to this, FALSE otherwise. 151 * @stable ICU 2.0 152 */ 153 UBool operator==(const Formattable &other) const; 154 155 /** 156 * Equality operator. 157 * @param other the object to be compared with. 158 * @return TRUE if other are unequal to this, FALSE otherwise. 159 * @stable ICU 2.0 160 */ 161 UBool operator!=(const Formattable& other) const 162 { return !operator==(other); } 163 164 /** 165 * Destructor. 166 * @stable ICU 2.0 167 */ 168 virtual ~Formattable(); 169 170 /** 171 * Clone this object. 172 * Clones can be used concurrently in multiple threads. 173 * If an error occurs, then NULL is returned. 174 * The caller must delete the clone. 175 * 176 * @return a clone of this object 177 * 178 * @see getDynamicClassID 179 * @stable ICU 2.8 180 */ 181 Formattable *clone() const; 182 183 /** 184 * Selector for flavor of data type contained within a 185 * Formattable object. Formattable is a union of several 186 * different types, and at any time contains exactly one type. 187 * @stable ICU 2.4 188 */ 189 enum Type { 190 /** 191 * Selector indicating a UDate value. Use getDate to retrieve 192 * the value. 193 * @stable ICU 2.4 194 */ 195 kDate, 196 197 /** 198 * Selector indicating a double value. Use getDouble to 199 * retrieve the value. 200 * @stable ICU 2.4 201 */ 202 kDouble, 203 204 /** 205 * Selector indicating a 32-bit integer value. Use getLong to 206 * retrieve the value. 207 * @stable ICU 2.4 208 */ 209 kLong, 210 211 /** 212 * Selector indicating a UnicodeString value. Use getString 213 * to retrieve the value. 214 * @stable ICU 2.4 215 */ 216 kString, 217 218 /** 219 * Selector indicating an array of Formattables. Use getArray 220 * to retrieve the value. 221 * @stable ICU 2.4 222 */ 223 kArray, 224 225 /** 226 * Selector indicating a 64-bit integer value. Use getInt64 227 * to retrieve the value. 228 * @stable ICU 2.8 229 */ 230 kInt64, 231 232 /** 233 * Selector indicating a UObject value. Use getObject to 234 * retrieve the value. 235 * @stable ICU 3.0 236 */ 237 kObject 238 }; 239 240 /** 241 * Gets the data type of this Formattable object. 242 * @return the data type of this Formattable object. 243 * @stable ICU 2.0 244 */ 245 Type getType(void) const; 246 247 /** 248 * Returns TRUE if the data type of this Formattable object 249 * is kDouble, kLong, or kInt64. 250 * @return TRUE if this is a pure numeric object 251 * @stable ICU 3.0 252 */ 253 UBool isNumeric() const; 254 255 /** 256 * Gets the double value of this object. If this object is not of type 257 * kDouble then the result is undefined. 258 * @return the double value of this object. 259 * @stable ICU 2.0 260 */ 261 double getDouble(void) const { return fValue.fDouble; } 262 263 /** 264 * Gets the double value of this object. If this object is of type 265 * long or int64 then a casting conversion is peformed, with 266 * possible loss of precision. If the type is kObject and the 267 * object is a Measure, then the result of 268 * getNumber().getDouble(status) is returned. If this object is 269 * neither a numeric type nor a Measure, then 0 is returned and 270 * the status is set to U_INVALID_FORMAT_ERROR. 271 * @param status the error code 272 * @return the double value of this object. 273 * @stable ICU 3.0 274 */ 275 double getDouble(UErrorCode& status) const; 276 277 /** 278 * Gets the long value of this object. If this object is not of type 279 * kLong then the result is undefined. 280 * @return the long value of this object. 281 * @stable ICU 2.0 282 */ 283 int32_t getLong(void) const { return (int32_t)fValue.fInt64; } 284 285 /** 286 * Gets the long value of this object. If the magnitude is too 287 * large to fit in a long, then the maximum or minimum long value, 288 * as appropriate, is returned and the status is set to 289 * U_INVALID_FORMAT_ERROR. If this object is of type kInt64 and 290 * it fits within a long, then no precision is lost. If it is of 291 * type kDouble, then a casting conversion is peformed, with 292 * truncation of any fractional part. If the type is kObject and 293 * the object is a Measure, then the result of 294 * getNumber().getLong(status) is returned. If this object is 295 * neither a numeric type nor a Measure, then 0 is returned and 296 * the status is set to U_INVALID_FORMAT_ERROR. 297 * @param status the error code 298 * @return the long value of this object. 299 * @stable ICU 3.0 300 */ 301 int32_t getLong(UErrorCode& status) const; 302 303 /** 304 * Gets the int64 value of this object. If this object is not of type 305 * kInt64 then the result is undefined. 306 * @return the int64 value of this object. 307 * @stable ICU 2.8 308 */ 309 int64_t getInt64(void) const { return fValue.fInt64; } 310 311 /** 312 * Gets the int64 value of this object. If this object is of type 313 * kDouble and the magnitude is too large to fit in an int64, then 314 * the maximum or minimum int64 value, as appropriate, is returned 315 * and the status is set to U_INVALID_FORMAT_ERROR. If the 316 * magnitude fits in an int64, then a casting conversion is 317 * peformed, with truncation of any fractional part. If the type 318 * is kObject and the object is a Measure, then the result of 319 * getNumber().getDouble(status) is returned. If this object is 320 * neither a numeric type nor a Measure, then 0 is returned and 321 * the status is set to U_INVALID_FORMAT_ERROR. 322 * @param status the error code 323 * @return the int64 value of this object. 324 * @stable ICU 3.0 325 */ 326 int64_t getInt64(UErrorCode& status) const; 327 328 /** 329 * Gets the Date value of this object. If this object is not of type 330 * kDate then the result is undefined. 331 * @return the Date value of this object. 332 * @stable ICU 2.0 333 */ 334 UDate getDate() const { return fValue.fDate; } 335 336 /** 337 * Gets the Date value of this object. If the type is not a date, 338 * status is set to U_INVALID_FORMAT_ERROR and the return value is 339 * undefined. 340 * @param status the error code. 341 * @return the Date value of this object. 342 * @stable ICU 3.0 343 */ 344 UDate getDate(UErrorCode& status) const; 345 346 /** 347 * Gets the string value of this object. If this object is not of type 348 * kString then the result is undefined. 349 * @param result Output param to receive the Date value of this object. 350 * @return A reference to 'result'. 351 * @stable ICU 2.0 352 */ 353 UnicodeString& getString(UnicodeString& result) const 354 { result=*fValue.fString; return result; } 355 356 /** 357 * Gets the string value of this object. If the type is not a 358 * string, status is set to U_INVALID_FORMAT_ERROR and a bogus 359 * string is returned. 360 * @param result Output param to receive the Date value of this object. 361 * @param status the error code. 362 * @return A reference to 'result'. 363 * @stable ICU 3.0 364 */ 365 UnicodeString& getString(UnicodeString& result, UErrorCode& status) const; 366 367 /** 368 * Gets a const reference to the string value of this object. If 369 * this object is not of type kString then the result is 370 * undefined. 371 * @return a const reference to the string value of this object. 372 * @stable ICU 2.0 373 */ 374 inline const UnicodeString& getString(void) const; 375 376 /** 377 * Gets a const reference to the string value of this object. If 378 * the type is not a string, status is set to 379 * U_INVALID_FORMAT_ERROR and the result is a bogus string. 380 * @param status the error code. 381 * @return a const reference to the string value of this object. 382 * @stable ICU 3.0 383 */ 384 const UnicodeString& getString(UErrorCode& status) const; 385 386 /** 387 * Gets a reference to the string value of this object. If this 388 * object is not of type kString then the result is undefined. 389 * @return a reference to the string value of this object. 390 * @stable ICU 2.0 391 */ 392 inline UnicodeString& getString(void); 393 394 /** 395 * Gets a reference to the string value of this object. If the 396 * type is not a string, status is set to U_INVALID_FORMAT_ERROR 397 * and the result is a bogus string. 398 * @param status the error code. 399 * @return a reference to the string value of this object. 400 * @stable ICU 3.0 401 */ 402 UnicodeString& getString(UErrorCode& status); 403 404 /** 405 * Gets the array value and count of this object. If this object 406 * is not of type kArray then the result is undefined. 407 * @param count fill-in with the count of this object. 408 * @return the array value of this object. 409 * @stable ICU 2.0 410 */ 411 const Formattable* getArray(int32_t& count) const 412 { count=fValue.fArrayAndCount.fCount; return fValue.fArrayAndCount.fArray; } 413 414 /** 415 * Gets the array value and count of this object. If the type is 416 * not an array, status is set to U_INVALID_FORMAT_ERROR, count is 417 * set to 0, and the result is NULL. 418 * @param count fill-in with the count of this object. 419 * @param status the error code. 420 * @return the array value of this object. 421 * @stable ICU 3.0 422 */ 423 const Formattable* getArray(int32_t& count, UErrorCode& status) const; 424 425 /** 426 * Accesses the specified element in the array value of this 427 * Formattable object. If this object is not of type kArray then 428 * the result is undefined. 429 * @param index the specified index. 430 * @return the accessed element in the array. 431 * @stable ICU 2.0 432 */ 433 Formattable& operator[](int32_t index) { return fValue.fArrayAndCount.fArray[index]; } 434 435 /** 436 * Returns a pointer to the UObject contained within this 437 * formattable, or NULL if this object does not contain a UObject. 438 * @return a UObject pointer, or NULL 439 * @stable ICU 3.0 440 */ 441 const UObject* getObject() const; 442 443 /** 444 * Sets the double value of this object and changes the type to 445 * kDouble. 446 * @param d the new double value to be set. 447 * @stable ICU 2.0 448 */ 449 void setDouble(double d); 450 451 /** 452 * Sets the long value of this object and changes the type to 453 * kLong. 454 * @param l the new long value to be set. 455 * @stable ICU 2.0 456 */ 457 void setLong(int32_t l); 458 459 /** 460 * Sets the int64 value of this object and changes the type to 461 * kInt64. 462 * @param ll the new int64 value to be set. 463 * @stable ICU 2.8 464 */ 465 void setInt64(int64_t ll); 466 467 /** 468 * Sets the Date value of this object and changes the type to 469 * kDate. 470 * @param d the new Date value to be set. 471 * @stable ICU 2.0 472 */ 473 void setDate(UDate d); 474 475 /** 476 * Sets the string value of this object and changes the type to 477 * kString. 478 * @param stringToCopy the new string value to be set. 479 * @stable ICU 2.0 480 */ 481 void setString(const UnicodeString& stringToCopy); 482 483 /** 484 * Sets the array value and count of this object and changes the 485 * type to kArray. 486 * @param array the array value. 487 * @param count the number of array elements to be copied. 488 * @stable ICU 2.0 489 */ 490 void setArray(const Formattable* array, int32_t count); 491 492 /** 493 * Sets and adopts the string value and count of this object and 494 * changes the type to kArray. 495 * @param stringToAdopt the new string value to be adopted. 496 * @stable ICU 2.0 497 */ 498 void adoptString(UnicodeString* stringToAdopt); 499 500 /** 501 * Sets and adopts the array value and count of this object and 502 * changes the type to kArray. 503 * @stable ICU 2.0 504 */ 505 void adoptArray(Formattable* array, int32_t count); 506 507 /** 508 * Sets and adopts the UObject value of this object and changes 509 * the type to kObject. After this call, the caller must not 510 * delete the given object. 511 * @param objectToAdopt the UObject value to be adopted 512 * @stable ICU 3.0 513 */ 514 void adoptObject(UObject* objectToAdopt); 515 516 /** 517 * ICU "poor man's RTTI", returns a UClassID for the actual class. 518 * 519 * @stable ICU 2.2 520 */ 521 virtual UClassID getDynamicClassID() const; 522 523 /** 524 * ICU "poor man's RTTI", returns a UClassID for this class. 525 * 526 * @stable ICU 2.2 527 */ 528 static UClassID U_EXPORT2 getStaticClassID(); 529 530 /** 531 * Deprecated variant of getLong(UErrorCode&). 532 * @param status the error code 533 * @return the long value of this object. 534 * @deprecated ICU 3.0 use getLong(UErrorCode&) instead 535 */ 536 inline int32_t getLong(UErrorCode* status) const; 537 538 private: 539 /** 540 * Cleans up the memory for unwanted values. For example, the adopted 541 * string or array objects. 542 */ 543 void dispose(void); 544 545 UnicodeString* getBogus() const; 546 547 union { 548 UObject* fObject; 549 UnicodeString* fString; 550 double fDouble; 551 int64_t fInt64; 552 UDate fDate; 553 struct { 554 Formattable* fArray; 555 int32_t fCount; 556 } fArrayAndCount; 557 } fValue; 558 559 Type fType; 560 UnicodeString fBogus; // Bogus string when it's needed. 561 }; 562 563 inline UDate Formattable::getDate(UErrorCode& status) const { 564 if (fType != kDate) { 565 if (U_SUCCESS(status)) { 566 status = U_INVALID_FORMAT_ERROR; 567 } 568 return 0; 569 } 570 return fValue.fDate; 571 } 572 573 inline const UnicodeString& Formattable::getString(void) const { 574 return *fValue.fString; 575 } 576 577 inline UnicodeString& Formattable::getString(void) { 578 return *fValue.fString; 579 } 580 581 inline int32_t Formattable::getLong(UErrorCode* status) const { 582 return getLong(*status); 583 } 584 585 U_NAMESPACE_END 586 587 #endif /* #if !UCONFIG_NO_FORMATTING */ 588 589 #endif //_FMTABLE 590 //eof 591 592