| // © 2024 and later: Unicode, Inc. and others. |
| // License & terms of use: http://www.unicode.org/copyright.html |
| |
| #include "unicode/utypes.h" |
| |
| #ifndef MESSAGEFORMAT2_FORMATTABLE_H |
| #define MESSAGEFORMAT2_FORMATTABLE_H |
| |
| #if U_SHOW_CPLUSPLUS_API |
| |
| #if !UCONFIG_NO_FORMATTING |
| |
| #if !UCONFIG_NO_MF2 |
| |
| #include "unicode/chariter.h" |
| #include "unicode/numberformatter.h" |
| #include "unicode/messageformat2_data_model_names.h" |
| |
| #ifndef U_HIDE_DEPRECATED_API |
| |
| #include <map> |
| #include <variant> |
| |
| U_NAMESPACE_BEGIN |
| |
| class Hashtable; |
| class UVector; |
| |
| namespace message2 { |
| |
| class Formatter; |
| class MessageContext; |
| class Selector; |
| |
| // Formattable |
| // ---------- |
| |
| /** |
| * `FormattableObject` is an abstract class that can be implemented in order to define |
| * an arbitrary class that can be passed to a custom formatter or selector function. |
| * To be passed in such a way, it must be wrapped in a `Formattable` object. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| class U_I18N_API FormattableObject : public UObject { |
| public: |
| /** |
| * Returns an arbitrary string representing the type of this object. |
| * It's up to the implementor of this class, as well as the implementors |
| * of any custom functions that rely on particular values of this tag |
| * corresponding to particular classes that the object contents can be |
| * downcast to, to ensure that the type tags are used soundly. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| virtual const UnicodeString& tag() const = 0; |
| /** |
| * Destructor. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| virtual ~FormattableObject(); |
| }; // class FormattableObject |
| |
| class Formattable; |
| } // namespace message2 |
| |
| U_NAMESPACE_END |
| |
| /// @cond DOXYGEN_IGNORE |
| // Export an explicit template instantiation of the std::variant that is used |
| // to represent the message2::Formattable class. |
| // (When building DLLs for Windows this is required.) |
| // (See measunit_impl.h, datefmt.h, collationiterator.h, erarules.h and others |
| // for similar examples.) |
| #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN |
| #if defined(U_REAL_MSVC) && defined(_MSVC_STL_VERSION) |
| template class U_I18N_API std::_Variant_storage_<false, |
| double, |
| int64_t, |
| icu::UnicodeString, |
| icu::Formattable, |
| const icu::message2::FormattableObject *, |
| std::pair<const icu::message2::Formattable *,int32_t>>; |
| #endif |
| typedef std::pair<const icu::message2::Formattable*, int32_t> P; |
| template class U_I18N_API std::variant<double, |
| int64_t, |
| icu::UnicodeString, |
| icu::Formattable, |
| const icu::message2::FormattableObject*, |
| P>; |
| #endif |
| /// @endcond |
| |
| U_NAMESPACE_BEGIN |
| |
| namespace message2 { |
| /** |
| * The `Formattable` class represents a typed value that can be formatted, |
| * originating either from a message argument or a literal in the code. |
| * ICU's Formattable class is not used in MessageFormat 2 because it's unsafe to copy an |
| * icu::Formattable value that contains an object. (See ICU-20275). |
| * |
| * `Formattable` is immutable (not deeply immutable) and |
| * is movable and copyable. |
| * (Copying does not do a deep copy when the wrapped value is an array or |
| * object. Likewise, while a pointer to a wrapped array or object is `const`, |
| * the referents of the pointers may be mutated by other code.) |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| class U_I18N_API Formattable : public UObject { |
| public: |
| |
| /** |
| * Gets the data type of this Formattable object. |
| * @return the data type of this Formattable object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| UFormattableType getType() const; |
| |
| /** |
| * Gets the double value of this object. If this object is not of type |
| * UFMT_DOUBLE, then the result is undefined and the error code is set. |
| * |
| * @param status Input/output error code. |
| * @return the double value of this object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| double getDouble(UErrorCode& status) const { |
| if (U_SUCCESS(status)) { |
| if (isDecimal() && getType() == UFMT_DOUBLE) { |
| return (std::get_if<icu::Formattable>(&contents))->getDouble(); |
| } |
| if (std::holds_alternative<double>(contents)) { |
| return *(std::get_if<double>(&contents)); |
| } |
| status = U_ILLEGAL_ARGUMENT_ERROR; |
| } |
| return 0; |
| } |
| |
| /** |
| * Gets the long value of this object. If this object is not of type |
| * UFMT_LONG then the result is undefined and the error code is set. |
| * |
| * @param status Input/output error code. |
| * @return the long value of this object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| int32_t getLong(UErrorCode& status) const { |
| if (U_SUCCESS(status)) { |
| if (isDecimal() && getType() == UFMT_LONG) { |
| return std::get_if<icu::Formattable>(&contents)->getLong(); |
| } |
| if (std::holds_alternative<int64_t>(contents)) { |
| return static_cast<int32_t>(*(std::get_if<int64_t>(&contents))); |
| } |
| status = U_ILLEGAL_ARGUMENT_ERROR; |
| } |
| return 0; |
| } |
| |
| /** |
| * Gets the int64 value of this object. If this object is not of type |
| * kInt64 then the result is undefined and the error code is set. |
| * If conversion to int64 is desired, call getInt64() |
| * |
| * @param status Input/output error code. |
| * @return the int64 value of this object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| int64_t getInt64Value(UErrorCode& status) const { |
| if (U_SUCCESS(status)) { |
| if (isDecimal() && getType() == UFMT_INT64) { |
| return std::get_if<icu::Formattable>(&contents)->getInt64(); |
| } |
| if (std::holds_alternative<int64_t>(contents)) { |
| return *(std::get_if<int64_t>(&contents)); |
| } |
| status = U_ILLEGAL_ARGUMENT_ERROR; |
| } |
| return 0; |
| } |
| |
| /** |
| * Gets the int64 value of this object. If this object is of a numeric |
| * type and the magnitude is too large to fit in an int64, then |
| * the maximum or minimum int64 value, as appropriate, is returned |
| * and the status is set to U_INVALID_FORMAT_ERROR. If the |
| * magnitude fits in an int64, then a casting conversion is |
| * performed, with truncation of any fractional part. If this object is |
| * not a numeric type, then 0 is returned and |
| * the status is set to U_INVALID_FORMAT_ERROR. |
| * @param status the error code |
| * @return the int64 value of this object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| int64_t getInt64(UErrorCode& status) const; |
| /** |
| * Gets the string value of this object. If this object is not of type |
| * kString then the result is undefined and the error code is set. |
| * |
| * @param status Input/output error code. |
| * @return A reference to the string value of this object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const UnicodeString& getString(UErrorCode& status) const { |
| if (U_SUCCESS(status)) { |
| if (std::holds_alternative<UnicodeString>(contents)) { |
| return *std::get_if<UnicodeString>(&contents); |
| } |
| status = U_ILLEGAL_ARGUMENT_ERROR; |
| } |
| return bogusString; |
| } |
| |
| /** |
| * Gets the Date value of this object. If this object is not of type |
| * kDate then the result is undefined and the error code is set. |
| * |
| * @param status Input/output error code. |
| * @return the Date value of this object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| UDate getDate(UErrorCode& status) const { |
| if (U_SUCCESS(status)) { |
| if (isDate()) { |
| return *std::get_if<double>(&contents); |
| } |
| status = U_ILLEGAL_ARGUMENT_ERROR; |
| } |
| return 0; |
| } |
| |
| /** |
| * Returns true if the data type of this Formattable object |
| * is kDouble |
| * @return true if this is a pure numeric object |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| UBool isNumeric() const { return (getType() == UFMT_DOUBLE || getType() == UFMT_LONG || getType() == UFMT_INT64); } |
| |
| /** |
| * Gets the array value and count of this object. If this object |
| * is not of type kArray then the result is undefined and the error code is set. |
| * |
| * @param count fill-in with the count of this object. |
| * @param status Input/output error code. |
| * @return the array value of this object. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const Formattable* getArray(int32_t& count, UErrorCode& status) const; |
| |
| /** |
| * Returns a pointer to the FormattableObject contained within this |
| * formattable, or if this object does not contain a FormattableObject, |
| * returns nullptr and sets the error code. |
| * |
| * @param status Input/output error code. |
| * @return a FormattableObject pointer, or nullptr |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const FormattableObject* getObject(UErrorCode& status) const { |
| if (U_SUCCESS(status)) { |
| // Can't return a reference since FormattableObject |
| // is an abstract class |
| if (getType() == UFMT_OBJECT) { |
| return *std::get_if<const FormattableObject*>(&contents); |
| // TODO: should assert that if type is object, object is non-null |
| } |
| status = U_ILLEGAL_ARGUMENT_ERROR; |
| } |
| return nullptr; |
| } |
| /** |
| * Non-member swap function. |
| * @param f1 will get f2's contents |
| * @param f2 will get f1's contents |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| friend inline void swap(Formattable& f1, Formattable& f2) noexcept { |
| using std::swap; |
| |
| swap(f1.contents, f2.contents); |
| swap(f1.holdsDate, f2.holdsDate); |
| } |
| /** |
| * Copy constructor. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable(const Formattable&); |
| /** |
| * Assignment operator |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable& operator=(Formattable) noexcept; |
| /** |
| * Default constructor. Leaves the Formattable in a |
| * valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable() : contents(0.0) {} |
| /** |
| * String constructor. |
| * |
| * @param s A string to wrap as a Formattable. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable(const UnicodeString& s) : contents(s) {} |
| /** |
| * Double constructor. |
| * |
| * @param d A double value to wrap as a Formattable. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable(double d) : contents(d) {} |
| /** |
| * Int64 constructor. |
| * |
| * @param i An int64 value to wrap as a Formattable. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable(int64_t i) : contents(i) {} |
| /** |
| * Date factory method. |
| * |
| * @param d A UDate value to wrap as a Formattable. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| static Formattable forDate(UDate d) { |
| Formattable f; |
| f.contents = d; |
| f.holdsDate = true; |
| return f; |
| } |
| /** |
| * Creates a Formattable object of an appropriate numeric type from a |
| * a decimal number in string form. The Formattable will retain the |
| * full precision of the input in decimal format, even when it exceeds |
| * what can be represented by a double or int64_t. |
| * |
| * @param number the unformatted (not localized) string representation |
| * of the Decimal number. |
| * @param status the error code. Possible errors include U_INVALID_FORMAT_ERROR |
| * if the format of the string does not conform to that of a |
| * decimal number. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| static Formattable forDecimal(std::string_view number, UErrorCode& status); |
| /** |
| * Array constructor. |
| * |
| * @param arr An array of Formattables, which is adopted. |
| * @param len The length of the array. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable(const Formattable* arr, int32_t len) : contents(std::pair(arr, len)) {} |
| /** |
| * Object constructor. |
| * |
| * @param obj A FormattableObject (not adopted). |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| Formattable(const FormattableObject* obj) : contents(obj) {} |
| /** |
| * Destructor. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| virtual ~Formattable(); |
| /** |
| * Converts the Formattable object to an ICU Formattable object. |
| * If this has type UFMT_OBJECT or kArray, then `status` is set to |
| * U_ILLEGAL_ARGUMENT_ERROR. |
| * |
| * @param status Input/output error code. |
| * @return An icu::Formattable value with the same value as this. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| icu::Formattable asICUFormattable(UErrorCode& status) const; |
| private: |
| |
| std::variant<double, |
| int64_t, |
| UnicodeString, |
| icu::Formattable, // represents a Decimal |
| const FormattableObject*, |
| std::pair<const Formattable*, int32_t>> contents; |
| bool holdsDate = false; // otherwise, we get type errors about UDate being a duplicate type |
| UnicodeString bogusString; // :(((( |
| |
| UBool isDecimal() const { |
| return std::holds_alternative<icu::Formattable>(contents); |
| } |
| UBool isDate() const { |
| return std::holds_alternative<double>(contents) && holdsDate; |
| } |
| }; // class Formattable |
| |
| /** |
| * Internal use only, but has to be included here as part of the implementation |
| * of the header-only `FunctionOptions::getOptions()` method |
| * |
| * A `ResolvedFunctionOption` represents the result of evaluating |
| * a single named function option. It pairs the given name with the `Formattable` |
| * value resulting from evaluating the option's value. |
| * |
| * `ResolvedFunctionOption` is immutable and is not copyable or movable. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| #ifndef U_IN_DOXYGEN |
| class U_I18N_API ResolvedFunctionOption : public UObject { |
| private: |
| |
| /* const */ UnicodeString name; |
| /* const */ Formattable value; |
| |
| public: |
| const UnicodeString& getName() const { return name; } |
| const Formattable& getValue() const { return value; } |
| ResolvedFunctionOption(const UnicodeString& n, const Formattable& f) : name(n), value(f) {} |
| ResolvedFunctionOption() {} |
| ResolvedFunctionOption(ResolvedFunctionOption&&); |
| ResolvedFunctionOption& operator=(ResolvedFunctionOption&& other) noexcept { |
| name = std::move(other.name); |
| value = std::move(other.value); |
| return *this; |
| } |
| virtual ~ResolvedFunctionOption(); |
| }; // class ResolvedFunctionOption |
| #endif |
| |
| /** |
| * Mapping from option names to `message2::Formattable` objects, obtained |
| * by calling `getOptions()` on a `FunctionOptions` object. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| using FunctionOptionsMap = std::map<UnicodeString, message2::Formattable>; |
| |
| /** |
| * Structure encapsulating named options passed to a custom selector or formatter. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| class U_I18N_API FunctionOptions : public UObject { |
| public: |
| /** |
| * Returns a map of all name-value pairs provided as options to this function. |
| * The syntactic order of options is not guaranteed to |
| * be preserved. |
| * |
| * This class is immutable and movable but not copyable. |
| * |
| * @return A map from strings to `message2::Formattable` objects representing |
| * the results of resolving each option value. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FunctionOptionsMap getOptions() const { |
| int32_t len; |
| const ResolvedFunctionOption* resolvedOptions = getResolvedFunctionOptions(len); |
| FunctionOptionsMap result; |
| for (int32_t i = 0; i < len; i++) { |
| const ResolvedFunctionOption& opt = resolvedOptions[i]; |
| result[opt.getName()] = opt.getValue(); |
| } |
| return result; |
| } |
| /** |
| * Default constructor. |
| * Returns an empty mapping. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FunctionOptions() { options = nullptr; } |
| /** |
| * Destructor. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| virtual ~FunctionOptions(); |
| /** |
| * Move assignment operator: |
| * The source FunctionOptions will be left in a valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FunctionOptions& operator=(FunctionOptions&&) noexcept; |
| /** |
| * Move constructor: |
| * The source FunctionOptions will be left in a valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FunctionOptions(FunctionOptions&&); |
| /** |
| * Copy constructor. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FunctionOptions& operator=(const FunctionOptions&) = delete; |
| private: |
| friend class MessageFormatter; |
| friend class StandardFunctions; |
| |
| explicit FunctionOptions(UVector&&, UErrorCode&); |
| |
| const ResolvedFunctionOption* getResolvedFunctionOptions(int32_t& len) const; |
| UBool getFunctionOption(const UnicodeString&, Formattable&) const; |
| // Returns empty string if option doesn't exist |
| UnicodeString getStringFunctionOption(const UnicodeString&) const; |
| int32_t optionsCount() const { return functionOptionsLen; } |
| |
| // Named options passed to functions |
| // This is not a Hashtable in order to make it possible for code in a public header file |
| // to construct a std::map from it, on-the-fly. Otherwise, it would be impossible to put |
| // that code in the header because it would have to call internal Hashtable methods. |
| ResolvedFunctionOption* options; |
| int32_t functionOptionsLen = 0; |
| }; // class FunctionOptions |
| |
| |
| // TODO doc comments |
| // Encapsulates either a formatted string or formatted number; |
| // more output types could be added in the future. |
| |
| /** |
| * A `FormattedValue` represents the result of formatting a `message2::Formattable`. |
| * It contains either a string or a formatted number. (More types could be added |
| * in the future.) |
| * |
| * `FormattedValue` is immutable and movable. It is not copyable. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| class U_I18N_API FormattedValue : public UObject { |
| public: |
| /** |
| * Formatted string constructor. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| explicit FormattedValue(const UnicodeString&); |
| /** |
| * Formatted number constructor. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| explicit FormattedValue(number::FormattedNumber&&); |
| /** |
| * Default constructor. Leaves the FormattedValue in |
| * a valid but undefined state. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedValue() : type(kString) {} |
| /** |
| * Returns true iff this is a formatted string. |
| * |
| * @return True if and only if this value is a formatted string. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| bool isString() const { return type == kString; } |
| /** |
| * Returns true iff this is a formatted number. |
| * |
| * @return True if and only if this value is a formatted number. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| bool isNumber() const { return type == kNumber; } |
| /** |
| * Gets the string contents of this value. If !isString(), then |
| * the result is undefined. |
| * @return A reference to a formatted string. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const UnicodeString& getString() const { return stringOutput; } |
| /** |
| * Gets the number contents of this value. If !isNumber(), then |
| * the result is undefined. |
| * @return A reference to a formatted number. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const number::FormattedNumber& getNumber() const { return numberOutput; } |
| /** |
| * Move assignment operator: |
| * The source FormattedValue will be left in a valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedValue& operator=(FormattedValue&&) noexcept; |
| /** |
| * Move constructor: |
| * The source FormattedValue will be left in a valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedValue(FormattedValue&& other) { *this = std::move(other); } |
| /** |
| * Destructor. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| virtual ~FormattedValue(); |
| private: |
| enum Type { |
| kString, |
| kNumber |
| }; |
| Type type; |
| UnicodeString stringOutput; |
| number::FormattedNumber numberOutput; |
| }; // class FormattedValue |
| |
| /** |
| * A `FormattablePlaceholder` encapsulates an input value (a `message2::Formattable`) |
| * together with an optional output value (a `message2::FormattedValue`). |
| * More information, such as source line/column numbers, could be added to the class |
| * in the future. |
| * |
| * `FormattablePlaceholder` is immutable (not deeply immutable) and movable. |
| * It is not copyable. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| class U_I18N_API FormattedPlaceholder : public UObject { |
| public: |
| /** |
| * Fallback constructor. Constructs a value that represents a formatting error, |
| * without recording an input `Formattable` as the source. |
| * |
| * @param s An error string. (See the MessageFormat specification for details |
| * on fallback strings.) |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| explicit FormattedPlaceholder(const UnicodeString& s) : fallback(s), type(kFallback) {} |
| /** |
| * Constructor for fully formatted placeholders. |
| * |
| * @param input A `FormattedPlaceholder` containing the fallback string and source |
| * `Formattable` used to construct the formatted value. |
| * @param output A `FormattedValue` representing the formatted output of `input`. |
| * Passed by move. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedPlaceholder(const FormattedPlaceholder& input, FormattedValue&& output) |
| : fallback(input.fallback), source(input.source), |
| formatted(std::move(output)), previousOptions(FunctionOptions()), type(kEvaluated) {} |
| /** |
| * Constructor for fully formatted placeholders with options. |
| * |
| * @param input A `FormattedPlaceholder` containing the fallback string and source |
| * `Formattable` used to construct the formatted value. |
| * @param opts Function options that were used to construct `output`. May be the empty map. |
| * @param output A `FormattedValue` representing the formatted output of `input`. |
| * Passed by move. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedPlaceholder(const FormattedPlaceholder& input, FunctionOptions&& opts, FormattedValue&& output) |
| : fallback(input.fallback), source(input.source), |
| formatted(std::move(output)), previousOptions(std::move(opts)), type(kEvaluated) {} |
| /** |
| * Constructor for unformatted placeholders. |
| * |
| * @param input A `Formattable` object. |
| * @param fb Fallback string to use if an error occurs while formatting the input. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedPlaceholder(const Formattable& input, const UnicodeString& fb) |
| : fallback(fb), source(input), type(kUnevaluated) {} |
| /** |
| * Default constructor. Leaves the FormattedPlaceholder in a |
| * valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedPlaceholder() : type(kNull) {} |
| /** |
| * Returns the source `Formattable` value for this placeholder. |
| * The result is undefined if this is a null operand. |
| * |
| * @return A message2::Formattable value. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const message2::Formattable& asFormattable() const; |
| /** |
| * Returns true iff this is a fallback placeholder. |
| * |
| * @return True if and only if this placeholder was constructed from a fallback string, |
| * with no `Formattable` source or formatting output. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| bool isFallback() const { return type == kFallback; } |
| /** |
| * Returns true iff this is a null placeholder. |
| * |
| * @return True if and only if this placeholder represents the absent argument to a formatter |
| * that was invoked without an argument. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| bool isNullOperand() const { return type == kNull; } |
| /** |
| * Returns true iff this has formatting output. |
| * |
| * @return True if and only if this was constructed from both an input `Formattable` and |
| * output `FormattedValue`. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| bool isEvaluated() const { return (type == kEvaluated); } |
| /** |
| * Returns true iff this represents a valid argument to the formatter. |
| * |
| * @return True if and only if this is neither the null argument nor a fallback placeholder. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| bool canFormat() const { return !(isFallback() || isNullOperand()); } |
| /** |
| * Gets the fallback value of this placeholder, to be used in its place if an error occurs while |
| * formatting it. |
| * @return A reference to this placeholder's fallback string. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const UnicodeString& getFallback() const { return fallback; } |
| /** |
| * Returns the options of this placeholder. The result is the empty map if !isEvaluated(). |
| * @return A reference to an option map, capturing the options that were used |
| * in producing the output of this `FormattedPlaceholder` |
| * (or empty if there is no output) |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const FunctionOptions& options() const { return previousOptions; } |
| |
| /** |
| * Returns the formatted output of this placeholder. The result is undefined if !isEvaluated(). |
| * @return A fully formatted `FormattedPlaceholder`. |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| const FormattedValue& output() const { return formatted; } |
| /** |
| * Move assignment operator: |
| * The source FormattedPlaceholder will be left in a valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedPlaceholder& operator=(FormattedPlaceholder&&) noexcept; |
| /** |
| * Move constructor: |
| * The source FormattedPlaceholder will be left in a valid but undefined state. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| FormattedPlaceholder(FormattedPlaceholder&& other) { *this = std::move(other); } |
| /** |
| * Formats this as a string, using defaults. If this is |
| * either the null operand or is a fallback value, the return value is the result of formatting the |
| * fallback value (which is the default fallback string if this is the null operand). |
| * If there is no formatted output and the input is object- or array-typed, |
| * then the argument is treated as a fallback value, since there is no default formatter |
| * for objects or arrays. |
| * |
| * @param locale The locale to use for formatting numbers or dates |
| * @param status Input/output error code |
| * @return The result of formatting this placeholder. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| UnicodeString formatToString(const Locale& locale, |
| UErrorCode& status) const; |
| |
| private: |
| friend class MessageFormatter; |
| |
| enum Type { |
| kFallback, // Represents the result of formatting that encountered an error |
| kNull, // Represents the absence of both an output and an input (not necessarily an error) |
| kUnevaluated, // `source` should be valid, but there's no result yet |
| kEvaluated, // `formatted` exists |
| }; |
| UnicodeString fallback; |
| Formattable source; |
| FormattedValue formatted; |
| FunctionOptions previousOptions; // Ignored unless type is kEvaluated |
| Type type; |
| }; // class FormattedPlaceholder |
| |
| /** |
| * Not yet implemented: The result of a message formatting operation. Based on |
| * ICU4J's FormattedMessage.java. |
| * |
| * The class will contain information allowing the result to be viewed as a string, |
| * iterator, etc. (TBD) |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for technology preview only. |
| */ |
| class U_I18N_API FormattedMessage : public icu::FormattedValue { |
| public: |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| FormattedMessage(UErrorCode& status) { |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| int32_t length(UErrorCode& status) const { |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return -1; |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| char16_t charAt(int32_t index, UErrorCode& status) const { |
| (void) index; |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return 0; |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| StringPiece subSequence(int32_t start, int32_t end, UErrorCode& status) const { |
| (void) start; |
| (void) end; |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return ""; |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| UnicodeString toString(UErrorCode& status) const override { |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return {}; |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| UnicodeString toTempString(UErrorCode& status) const override { |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return {}; |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| Appendable& appendTo(Appendable& appendable, UErrorCode& status) const override { |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return appendable; |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override { |
| (void) cfpos; |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return false; |
| } |
| /** |
| * Not yet implemented. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| CharacterIterator* toCharacterIterator(UErrorCode& status) { |
| if (U_SUCCESS(status)) { |
| status = U_UNSUPPORTED_ERROR; |
| } |
| return nullptr; |
| } |
| /** |
| * Destructor. |
| * |
| * @internal ICU 75 technology preview |
| * @deprecated This API is for ICU internal use only. |
| */ |
| virtual ~FormattedMessage(); |
| }; // class FormattedMessage |
| |
| } // namespace message2 |
| |
| U_NAMESPACE_END |
| |
| #endif // U_HIDE_DEPRECATED_API |
| |
| #endif /* #if !UCONFIG_NO_MF2 */ |
| |
| #endif /* #if !UCONFIG_NO_FORMATTING */ |
| |
| #endif /* U_SHOW_CPLUSPLUS_API */ |
| |
| #endif // MESSAGEFORMAT2_FORMATTABLE_H |
| |
| // eof |