123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017 |
- // © 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
|