ICU 77.1  77.1
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
fmtable.h
Go to the documentation of this file.
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /*
4 ********************************************************************************
5 * Copyright (C) 1997-2014, International Business Machines
6 * Corporation and others. All Rights Reserved.
7 ********************************************************************************
8 *
9 * File FMTABLE.H
10 *
11 * Modification History:
12 *
13 * Date Name Description
14 * 02/29/97 aliu Creation.
15 ********************************************************************************
16 */
17 #ifndef FMTABLE_H
18 #define FMTABLE_H
19 
20 #include "unicode/utypes.h"
21 
22 #if U_SHOW_CPLUSPLUS_API
23 
29 #if !UCONFIG_NO_FORMATTING
30 
31 #include "unicode/unistr.h"
32 #include "unicode/stringpiece.h"
33 #include "unicode/uformattable.h"
34 
35 U_NAMESPACE_BEGIN
36 
37 class CharString;
38 
39 namespace number::impl {
40 class DecimalQuantity;
41 }
42 
63 class U_I18N_API Formattable : public UObject {
64 public:
74  enum ISDATE { kIsDate };
75 
80  Formattable(); // Type kLong, value 0
81 
89 
95  Formattable(double d);
96 
102  Formattable(int32_t l);
103 
109  Formattable(int64_t ll);
110 
111 #if !UCONFIG_NO_CONVERSION
118  Formattable(const char* strToCopy);
119 #endif
120 
135 
141  Formattable(const UnicodeString& strToCopy);
142 
149 
156  Formattable(const Formattable* arrayToCopy, int32_t count);
157 
163  Formattable(UObject* objectToAdopt);
164 
170 
177 
184  bool operator==(const Formattable &other) const;
185 
192  bool operator!=(const Formattable& other) const
193  { return !operator==(other); }
194 
199  virtual ~Formattable();
200 
212  Formattable *clone() const;
213 
220  enum Type {
227 
234 
241 
248 
255 
262 
268  kObject
269  };
270 
276  Type getType() const;
277 
284  UBool isNumeric() const;
285 
292  double getDouble() const { return fValue.fDouble; }
293 
306  double getDouble(UErrorCode& status) const;
307 
314  int32_t getLong() const { return static_cast<int32_t>(fValue.fInt64); }
315 
332  int32_t getLong(UErrorCode& status) const;
333 
340  int64_t getInt64() const { return fValue.fInt64; }
341 
357  int64_t getInt64(UErrorCode& status) const;
358 
365  UDate getDate() const { return fValue.fDate; }
366 
375  UDate getDate(UErrorCode& status) const;
376 
385  { result=*fValue.fString; return result; }
386 
397 
405  inline const UnicodeString& getString() const;
406 
415  const UnicodeString& getString(UErrorCode& status) const;
416 
423  inline UnicodeString& getString();
424 
434 
442  const Formattable* getArray(int32_t& count) const
443  { count=fValue.fArrayAndCount.fCount; return fValue.fArrayAndCount.fArray; }
444 
454  const Formattable* getArray(int32_t& count, UErrorCode& status) const;
455 
464  Formattable& operator[](int32_t index) { return fValue.fArrayAndCount.fArray[index]; }
465 
472  const UObject* getObject() const;
473 
493 
500  void setDouble(double d);
501 
508  void setLong(int32_t l);
509 
516  void setInt64(int64_t ll);
517 
524  void setDate(UDate d);
525 
532  void setString(const UnicodeString& stringToCopy);
533 
541  void setArray(const Formattable* array, int32_t count);
542 
549  void adoptString(UnicodeString* stringToAdopt);
550 
556  void adoptArray(Formattable* array, int32_t count);
557 
565  void adoptObject(UObject* objectToAdopt);
566 
581  void setDecimalNumber(StringPiece numberString,
582  UErrorCode &status);
583 
589  virtual UClassID getDynamicClassID() const override;
590 
596  static UClassID U_EXPORT2 getStaticClassID();
597 
605  static inline Formattable *fromUFormattable(UFormattable *fmt);
606 
614  static inline const Formattable *fromUFormattable(const UFormattable *fmt);
615 
622  inline UFormattable *toUFormattable();
623 
630  inline const UFormattable *toUFormattable() const;
631 
632 #ifndef U_HIDE_DEPRECATED_API
639  inline int32_t getLong(UErrorCode* status) const;
640 #endif /* U_HIDE_DEPRECATED_API */
641 
642 #ifndef U_HIDE_INTERNAL_API
651  number::impl::DecimalQuantity *getDecimalQuantity() const { return fDecimalQuantity;}
652 
657  void populateDecimalQuantity(number::impl::DecimalQuantity& output, UErrorCode& status) const;
658 
665  void adoptDecimalQuantity(number::impl::DecimalQuantity *dq);
666 
673  CharString *internalGetCharString(UErrorCode &status);
674 
675 #endif /* U_HIDE_INTERNAL_API */
676 
677 private:
682  void dispose();
683 
687  void init();
688 
689  UnicodeString* getBogus() const;
690 
691  union {
692  UObject* fObject;
693  UnicodeString* fString;
694  double fDouble;
695  int64_t fInt64;
696  UDate fDate;
697  struct {
698  Formattable* fArray;
699  int32_t fCount;
700  } fArrayAndCount;
701  } fValue;
702 
703  CharString *fDecimalStr;
704 
705  number::impl::DecimalQuantity *fDecimalQuantity;
706 
707  Type fType;
708  UnicodeString fBogus; // Bogus string when it's needed.
709 };
710 
711 inline UDate Formattable::getDate(UErrorCode& status) const {
712  if (fType != kDate) {
713  if (U_SUCCESS(status)) {
714  status = U_INVALID_FORMAT_ERROR;
715  }
716  return 0;
717  }
718  return fValue.fDate;
719 }
720 
721 inline const UnicodeString& Formattable::getString() const {
722  return *fValue.fString;
723 }
724 
725 inline UnicodeString& Formattable::getString() {
726  return *fValue.fString;
727 }
728 
729 #ifndef U_HIDE_DEPRECATED_API
730 inline int32_t Formattable::getLong(UErrorCode* status) const {
731  return getLong(*status);
732 }
733 #endif /* U_HIDE_DEPRECATED_API */
734 
735 inline UFormattable* Formattable::toUFormattable() {
736  return reinterpret_cast<UFormattable*>(this);
737 }
738 
739 inline const UFormattable* Formattable::toUFormattable() const {
740  return reinterpret_cast<const UFormattable*>(this);
741 }
742 
743 inline Formattable* Formattable::fromUFormattable(UFormattable *fmt) {
744  return reinterpret_cast<Formattable *>(fmt);
745 }
746 
747 inline const Formattable* Formattable::fromUFormattable(const UFormattable *fmt) {
748  return reinterpret_cast<const Formattable *>(fmt);
749 }
750 
751 U_NAMESPACE_END
752 
753 #endif /* #if !UCONFIG_NO_FORMATTING */
754 
755 #endif /* U_SHOW_CPLUSPLUS_API */
756 
757 #endif //_FMTABLE
758 //eof
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:63
void setDecimalNumber(StringPiece numberString, UErrorCode &status)
Sets the the numeric value from a decimal number string, and changes the type to to a numeric type ap...
Formattable(StringPiece number, UErrorCode &status)
Creates a Formattable object of an appropriate numeric type from a a decimal number in string form.
Formattable & operator=(const Formattable &rhs)
Assignment operator.
Formattable(UnicodeString *strToAdopt)
Creates a Formattable object with a UnicodeString object to adopt from.
Formattable * clone() const
Clone this object.
Type getType() const
Gets the data type of this Formattable object.
Formattable & operator[](int32_t index)
Accesses the specified element in the array value of this Formattable object.
Definition: fmtable.h:464
static UClassID getStaticClassID()
ICU "poor man's RTTI", returns a UClassID for this class.
void setArray(const Formattable *array, int32_t count)
Sets the array value and count of this object and changes the type to kArray.
void setString(const UnicodeString &stringToCopy)
Sets the string value of this object and changes the type to kString.
UBool isNumeric() const
Returns true if the data type of this Formattable object is kDouble, kLong, or kInt64.
UnicodeString & getString(UErrorCode &status)
Gets a reference to the string value of this object.
void adoptString(UnicodeString *stringToAdopt)
Sets and adopts the string value and count of this object and changes the type to kArray.
Formattable(UObject *objectToAdopt)
Creates a Formattable object that adopts the given UObject.
const UObject * getObject() const
Returns a pointer to the UObject contained within this formattable, or nullptr if this object does no...
void setInt64(int64_t ll)
Sets the int64 value of this object and changes the type to kInt64.
Formattable(double d)
Creates a Formattable object with a double number.
number::impl::DecimalQuantity * getDecimalQuantity() const
Internal function, do not use.
Definition: fmtable.h:651
Formattable()
Default constructor.
void setDouble(double d)
Sets the double value of this object and changes the type to kDouble.
int32_t getLong() const
Gets the long value of this object.
Definition: fmtable.h:314
Formattable(const UnicodeString &strToCopy)
Creates a Formattable object with a UnicodeString object to copy from.
void adoptDecimalQuantity(number::impl::DecimalQuantity *dq)
Adopt, and set value from, a DecimalQuantity Internal Function, do not use.
void setLong(int32_t l)
Sets the long value of this object and changes the type to kLong.
Type
Selector for flavor of data type contained within a Formattable object.
Definition: fmtable.h:220
@ kDouble
Selector indicating a double value.
Definition: fmtable.h:233
@ kArray
Selector indicating an array of Formattables.
Definition: fmtable.h:254
@ kLong
Selector indicating a 32-bit integer value.
Definition: fmtable.h:240
@ kInt64
Selector indicating a 64-bit integer value.
Definition: fmtable.h:261
@ kString
Selector indicating a UnicodeString value.
Definition: fmtable.h:247
@ kDate
Selector indicating a UDate value.
Definition: fmtable.h:226
void setDate(UDate d)
Sets the Date value of this object and changes the type to kDate.
const Formattable * getArray(int32_t &count) const
Gets the array value and count of this object.
Definition: fmtable.h:442
double getDouble(UErrorCode &status) const
Gets the double value of this object.
CharString * internalGetCharString(UErrorCode &status)
Internal function to return the CharString pointer.
Formattable(const char *strToCopy)
Creates a Formattable object with a char string pointer.
Formattable(UDate d, ISDATE flag)
Creates a Formattable object with a UDate instance.
void adoptArray(Formattable *array, int32_t count)
Sets and adopts the array value and count of this object and changes the type to kArray.
void adoptObject(UObject *objectToAdopt)
Sets and adopts the UObject value of this object and changes the type to kObject.
bool operator==(const Formattable &other) const
Equality comparison.
const UnicodeString & getString(UErrorCode &status) const
Gets a const reference to the string value of this object.
double getDouble() const
Gets the double value of this object.
Definition: fmtable.h:292
UnicodeString & getString(UnicodeString &result, UErrorCode &status) const
Gets the string value of this object.
Formattable(const Formattable *arrayToCopy, int32_t count)
Creates a Formattable object with an array of Formattable objects.
int64_t getInt64() const
Gets the int64 value of this object.
Definition: fmtable.h:340
Formattable(const Formattable &)
Copy constructor.
Formattable(int32_t l)
Creates a Formattable object with a long number.
StringPiece getDecimalNumber(UErrorCode &status)
Returns a numeric string representation of the number contained within this formattable,...
UnicodeString & getString(UnicodeString &result) const
Gets the string value of this object.
Definition: fmtable.h:384
virtual ~Formattable()
Destructor.
ISDATE
This enum is only used to let callers distinguish between the Formattable(UDate) constructor and the ...
Definition: fmtable.h:74
bool operator!=(const Formattable &other) const
Equality operator.
Definition: fmtable.h:192
void populateDecimalQuantity(number::impl::DecimalQuantity &output, UErrorCode &status) const
Export the value of this Formattable to a DecimalQuantity.
UDate getDate() const
Gets the Date value of this object.
Definition: fmtable.h:365
int32_t getLong(UErrorCode &status) const
Gets the long value of this object.
const Formattable * getArray(int32_t &count, UErrorCode &status) const
Gets the array value and count of this object.
Formattable(int64_t ll)
Creates a Formattable object with an int64_t number.
int64_t getInt64(UErrorCode &status) const
Gets the int64 value of this object.
virtual UClassID getDynamicClassID() const override
ICU "poor man's RTTI", returns a UClassID for the actual class.
A string-like object that points to a sized piece of memory.
Definition: stringpiece.h:61
UObject is the common ICU "boilerplate" class.
Definition: uobject.h:223
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:296
U_EXPORT UBool operator==(const StringPiece &x, const StringPiece &y)
Global operator == for StringPiece.
C++ API: StringPiece: Read-only byte string wrapper class.
C API: UFormattable is a thin wrapper for primitive types used for formatting and parsing.
void * UFormattable
Opaque type representing various types of data which may be used for formatting and parsing operation...
Definition: uformattable.h:72
int8_t UBool
The ICU boolean type, a signed-byte integer.
Definition: umachine.h:247
C++ API: Unicode String.
void * UClassID
UClassID is used to identify classes without using the compiler's RTTI.
Definition: uobject.h:96
Basic definitions for ICU, for both C and C++ APIs.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
Definition: utypes.h:430
@ U_INVALID_FORMAT_ERROR
Data format is not what is expected.
Definition: utypes.h:469
#define U_SUCCESS(x)
Does the error code indicate success?
Definition: utypes.h:743
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside.
Definition: utypes.h:316
double UDate
Date and Time data type.
Definition: utypes.h:218