123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794 |
- // © 2018 and later: Unicode, Inc. and others.
- // License & terms of use: http://www.unicode.org/copyright.html
- #ifndef __NUMBERRANGEFORMATTER_H__
- #define __NUMBERRANGEFORMATTER_H__
- #include "unicode/utypes.h"
- #if U_SHOW_CPLUSPLUS_API
- #if !UCONFIG_NO_FORMATTING
- #include <atomic>
- #include "unicode/appendable.h"
- #include "unicode/fieldpos.h"
- #include "unicode/formattedvalue.h"
- #include "unicode/fpositer.h"
- #include "unicode/numberformatter.h"
- #include "unicode/unumberrangeformatter.h"
- /**
- * \file
- * \brief C++ API: Library for localized formatting of number, currency, and unit ranges.
- *
- * The main entrypoint to the formatting of ranges of numbers, including currencies and other units of measurement.
- * <p>
- * Usage example:
- * <p>
- * <pre>
- * NumberRangeFormatter::with()
- * .identityFallback(UNUM_IDENTITY_FALLBACK_APPROXIMATELY_OR_SINGLE_VALUE)
- * .numberFormatterFirst(NumberFormatter::with().adoptUnit(MeasureUnit::createMeter()))
- * .numberFormatterSecond(NumberFormatter::with().adoptUnit(MeasureUnit::createKilometer()))
- * .locale("en-GB")
- * .formatFormattableRange(750, 1.2, status)
- * .toString(status);
- * // => "750 m - 1.2 km"
- * </pre>
- * <p>
- * Like NumberFormatter, NumberRangeFormatter instances (i.e., LocalizedNumberRangeFormatter
- * and UnlocalizedNumberRangeFormatter) are immutable and thread-safe. This API is based on the
- * <em>fluent</em> design pattern popularized by libraries such as Google's Guava.
- *
- * @author Shane Carr
- */
- U_NAMESPACE_BEGIN
- // Forward declarations:
- class PluralRules;
- namespace number { // icu::number
- // Forward declarations:
- class UnlocalizedNumberRangeFormatter;
- class LocalizedNumberRangeFormatter;
- class FormattedNumberRange;
- namespace impl {
- // Forward declarations:
- struct RangeMacroProps;
- class DecimalQuantity;
- class UFormattedNumberRangeData;
- class NumberRangeFormatterImpl;
- struct UFormattedNumberRangeImpl;
- } // namespace impl
- /**
- * \cond
- * Export an explicit template instantiation. See datefmt.h
- * (When building DLLs for Windows this is required.)
- */
- #if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN) && !defined(U_STATIC_IMPLEMENTATION)
- } // namespace icu::number
- U_NAMESPACE_END
- template struct U_I18N_API std::atomic< U_NAMESPACE_QUALIFIER number::impl::NumberRangeFormatterImpl*>;
- U_NAMESPACE_BEGIN
- namespace number { // icu::number
- #endif
- /** \endcond */
- // Other helper classes would go here, but there are none.
- namespace impl { // icu::number::impl
- // Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
- /** @internal */
- struct U_I18N_API RangeMacroProps : public UMemory {
- /** @internal */
- UnlocalizedNumberFormatter formatter1; // = NumberFormatter::with();
- /** @internal */
- UnlocalizedNumberFormatter formatter2; // = NumberFormatter::with();
- /** @internal */
- bool singleFormatter = true;
- /** @internal */
- UNumberRangeCollapse collapse = UNUM_RANGE_COLLAPSE_AUTO;
- /** @internal */
- UNumberRangeIdentityFallback identityFallback = UNUM_IDENTITY_FALLBACK_APPROXIMATELY;
- /** @internal */
- Locale locale;
- // NOTE: Uses default copy and move constructors.
- /**
- * Check all members for errors.
- * @internal
- */
- bool copyErrorTo(UErrorCode &status) const {
- return formatter1.copyErrorTo(status) || formatter2.copyErrorTo(status);
- }
- };
- } // namespace impl
- /**
- * An abstract base class for specifying settings related to number formatting. This class is implemented by
- * {@link UnlocalizedNumberRangeFormatter} and {@link LocalizedNumberRangeFormatter}. This class is not intended for
- * public subclassing.
- */
- template<typename Derived>
- class U_I18N_API NumberRangeFormatterSettings {
- public:
- /**
- * Sets the NumberFormatter instance to use for the numbers in the range. The same formatter is applied to both
- * sides of the range.
- * <p>
- * The NumberFormatter instances must not have a locale applied yet; the locale specified on the
- * NumberRangeFormatter will be used.
- *
- * @param formatter
- * The formatter to use for both numbers in the range.
- * @return The fluent chain.
- * @stable ICU 63
- */
- Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
- /**
- * Overload of numberFormatterBoth() for use on an rvalue reference.
- *
- * @param formatter
- * The formatter to use for both numbers in the range.
- * @return The fluent chain.
- * @see #numberFormatterBoth
- * @stable ICU 63
- */
- Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&;
- /**
- * Overload of numberFormatterBoth() for use on an rvalue reference.
- *
- * @param formatter
- * The formatter to use for both numbers in the range.
- * @return The fluent chain.
- * @see #numberFormatterBoth
- * @stable ICU 63
- */
- Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &;
- /**
- * Overload of numberFormatterBoth() for use on an rvalue reference.
- *
- * @param formatter
- * The formatter to use for both numbers in the range.
- * @return The fluent chain.
- * @see #numberFormatterBoth
- * @stable ICU 63
- */
- Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&;
- /**
- * Sets the NumberFormatter instance to use for the first number in the range.
- * <p>
- * The NumberFormatter instances must not have a locale applied yet; the locale specified on the
- * NumberRangeFormatter will be used.
- *
- * @param formatterFirst
- * The formatter to use for the first number in the range.
- * @return The fluent chain.
- * @stable ICU 63
- */
- Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
- /**
- * Overload of numberFormatterFirst() for use on an rvalue reference.
- *
- * @param formatterFirst
- * The formatter to use for the first number in the range.
- * @return The fluent chain.
- * @see #numberFormatterFirst
- * @stable ICU 63
- */
- Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
- /**
- * Overload of numberFormatterFirst() for use on an rvalue reference.
- *
- * @param formatterFirst
- * The formatter to use for the first number in the range.
- * @return The fluent chain.
- * @see #numberFormatterFirst
- * @stable ICU 63
- */
- Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
- /**
- * Overload of numberFormatterFirst() for use on an rvalue reference.
- *
- * @param formatterFirst
- * The formatter to use for the first number in the range.
- * @return The fluent chain.
- * @see #numberFormatterFirst
- * @stable ICU 63
- */
- Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&;
- /**
- * Sets the NumberFormatter instance to use for the second number in the range.
- * <p>
- * The NumberFormatter instances must not have a locale applied yet; the locale specified on the
- * NumberRangeFormatter will be used.
- *
- * @param formatterSecond
- * The formatter to use for the second number in the range.
- * @return The fluent chain.
- * @stable ICU 63
- */
- Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
- /**
- * Overload of numberFormatterSecond() for use on an rvalue reference.
- *
- * @param formatterSecond
- * The formatter to use for the second number in the range.
- * @return The fluent chain.
- * @see #numberFormatterSecond
- * @stable ICU 63
- */
- Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
- /**
- * Overload of numberFormatterSecond() for use on an rvalue reference.
- *
- * @param formatterSecond
- * The formatter to use for the second number in the range.
- * @return The fluent chain.
- * @see #numberFormatterSecond
- * @stable ICU 63
- */
- Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
- /**
- * Overload of numberFormatterSecond() for use on an rvalue reference.
- *
- * @param formatterSecond
- * The formatter to use for the second number in the range.
- * @return The fluent chain.
- * @see #numberFormatterSecond
- * @stable ICU 63
- */
- Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&;
- /**
- * Sets the aggressiveness of "collapsing" fields across the range separator. Possible values:
- * <p>
- * <ul>
- * <li>ALL: "3-5K miles"</li>
- * <li>UNIT: "3K - 5K miles"</li>
- * <li>NONE: "3K miles - 5K miles"</li>
- * <li>AUTO: usually UNIT or NONE, depending on the locale and formatter settings</li>
- * </ul>
- * <p>
- * The default value is AUTO.
- *
- * @param collapse
- * The collapsing strategy to use for this range.
- * @return The fluent chain.
- * @stable ICU 63
- */
- Derived collapse(UNumberRangeCollapse collapse) const &;
- /**
- * Overload of collapse() for use on an rvalue reference.
- *
- * @param collapse
- * The collapsing strategy to use for this range.
- * @return The fluent chain.
- * @see #collapse
- * @stable ICU 63
- */
- Derived collapse(UNumberRangeCollapse collapse) &&;
- /**
- * Sets the behavior when the two sides of the range are the same. This could happen if the same two numbers are
- * passed to the formatFormattableRange function, or if different numbers are passed to the function but they
- * become the same after rounding rules are applied. Possible values:
- * <p>
- * <ul>
- * <li>SINGLE_VALUE: "5 miles"</li>
- * <li>APPROXIMATELY_OR_SINGLE_VALUE: "~5 miles" or "5 miles", depending on whether the number was the same before
- * rounding was applied</li>
- * <li>APPROXIMATELY: "~5 miles"</li>
- * <li>RANGE: "5-5 miles" (with collapse=UNIT)</li>
- * </ul>
- * <p>
- * The default value is APPROXIMATELY.
- *
- * @param identityFallback
- * The strategy to use when formatting two numbers that end up being the same.
- * @return The fluent chain.
- * @stable ICU 63
- */
- Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &;
- /**
- * Overload of identityFallback() for use on an rvalue reference.
- *
- * @param identityFallback
- * The strategy to use when formatting two numbers that end up being the same.
- * @return The fluent chain.
- * @see #identityFallback
- * @stable ICU 63
- */
- Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&;
- /**
- * Returns the current (Un)LocalizedNumberRangeFormatter as a LocalPointer
- * wrapping a heap-allocated copy of the current object.
- *
- * This is equivalent to new-ing the move constructor with a value object
- * as the argument.
- *
- * @return A wrapped (Un)LocalizedNumberRangeFormatter pointer, or a wrapped
- * nullptr on failure.
- * @stable ICU 64
- */
- LocalPointer<Derived> clone() const &;
- /**
- * Overload of clone for use on an rvalue reference.
- *
- * @return A wrapped (Un)LocalizedNumberRangeFormatter pointer, or a wrapped
- * nullptr on failure.
- * @stable ICU 64
- */
- LocalPointer<Derived> clone() &&;
- /**
- * Sets the UErrorCode if an error occurred in the fluent chain.
- * Preserves older error codes in the outErrorCode.
- * @return true if U_FAILURE(outErrorCode)
- * @stable ICU 63
- */
- UBool copyErrorTo(UErrorCode &outErrorCode) const {
- if (U_FAILURE(outErrorCode)) {
- // Do not overwrite the older error code
- return true;
- }
- fMacros.copyErrorTo(outErrorCode);
- return U_FAILURE(outErrorCode);
- }
- // NOTE: Uses default copy and move constructors.
- private:
- impl::RangeMacroProps fMacros;
- // Don't construct me directly! Use (Un)LocalizedNumberFormatter.
- NumberRangeFormatterSettings() = default;
- friend class LocalizedNumberRangeFormatter;
- friend class UnlocalizedNumberRangeFormatter;
- };
- // Explicit instantiations in source/i18n/numrange_fluent.cpp.
- // (MSVC treats imports/exports of explicit instantiations differently.)
- #ifndef _MSC_VER
- extern template class NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>;
- extern template class NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>;
- #endif
- /**
- * A NumberRangeFormatter that does not yet have a locale. In order to format, a locale must be specified.
- *
- * Instances of this class are immutable and thread-safe.
- *
- * @see NumberRangeFormatter
- * @stable ICU 63
- */
- class U_I18N_API UnlocalizedNumberRangeFormatter
- : public NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>, public UMemory {
- public:
- /**
- * Associate the given locale with the number range formatter. The locale is used for picking the
- * appropriate symbols, formats, and other data for number display.
- *
- * @param locale
- * The locale to use when loading data for number formatting.
- * @return The fluent chain.
- * @stable ICU 63
- */
- LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
- /**
- * Overload of locale() for use on an rvalue reference.
- *
- * @param locale
- * The locale to use when loading data for number formatting.
- * @return The fluent chain.
- * @see #locale
- * @stable ICU 63
- */
- LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
- /**
- * Default constructor: puts the formatter into a valid but undefined state.
- *
- * @stable ICU 63
- */
- UnlocalizedNumberRangeFormatter() = default;
- /**
- * Returns a copy of this UnlocalizedNumberRangeFormatter.
- * @stable ICU 63
- */
- UnlocalizedNumberRangeFormatter(const UnlocalizedNumberRangeFormatter &other);
- /**
- * Move constructor:
- * The source UnlocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @stable ICU 63
- */
- UnlocalizedNumberRangeFormatter(UnlocalizedNumberRangeFormatter&& src) noexcept;
- /**
- * Copy assignment operator.
- * @stable ICU 63
- */
- UnlocalizedNumberRangeFormatter& operator=(const UnlocalizedNumberRangeFormatter& other);
- /**
- * Move assignment operator:
- * The source UnlocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @stable ICU 63
- */
- UnlocalizedNumberRangeFormatter& operator=(UnlocalizedNumberRangeFormatter&& src) noexcept;
- private:
- explicit UnlocalizedNumberRangeFormatter(
- const NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>& other);
- explicit UnlocalizedNumberRangeFormatter(
- NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>&& src) noexcept;
- explicit UnlocalizedNumberRangeFormatter(const impl::RangeMacroProps ¯os);
- explicit UnlocalizedNumberRangeFormatter(impl::RangeMacroProps &¯os);
- // To give the fluent setters access to this class's constructor:
- friend class NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>;
- // To give NumberRangeFormatter::with() access to this class's constructor:
- friend class NumberRangeFormatter;
- // To give LNRF::withoutLocale() access to this class's constructor:
- friend class LocalizedNumberRangeFormatter;
- };
- /**
- * A NumberRangeFormatter that has a locale associated with it; this means .formatRange() methods are available.
- *
- * Instances of this class are immutable and thread-safe.
- *
- * @see NumberFormatter
- * @stable ICU 63
- */
- class U_I18N_API LocalizedNumberRangeFormatter
- : public NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>, public UMemory {
- public:
- /**
- * Format the given Formattables to a string using the settings specified in the NumberRangeFormatter fluent setting
- * chain.
- *
- * @param first
- * The first number in the range, usually to the left in LTR locales.
- * @param second
- * The second number in the range, usually to the right in LTR locales.
- * @param status
- * Set if an error occurs while formatting.
- * @return A FormattedNumberRange object; call .toString() to get the string.
- * @stable ICU 63
- */
- FormattedNumberRange formatFormattableRange(
- const Formattable& first, const Formattable& second, UErrorCode& status) const;
- #ifndef U_HIDE_DRAFT_API
- /**
- * Disassociate the locale from this formatter.
- *
- * @return The fluent chain.
- * @draft ICU 75
- */
- UnlocalizedNumberRangeFormatter withoutLocale() const &;
- /**
- * Overload of withoutLocale() for use on an rvalue reference.
- *
- * @return The fluent chain.
- * @see #withoutLocale
- * @draft ICU 75
- */
- UnlocalizedNumberRangeFormatter withoutLocale() &&;
- #endif // U_HIDE_DRAFT_API
- /**
- * Default constructor: puts the formatter into a valid but undefined state.
- *
- * @stable ICU 63
- */
- LocalizedNumberRangeFormatter() = default;
- /**
- * Returns a copy of this LocalizedNumberRangeFormatter.
- * @stable ICU 63
- */
- LocalizedNumberRangeFormatter(const LocalizedNumberRangeFormatter &other);
- /**
- * Move constructor:
- * The source LocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @stable ICU 63
- */
- LocalizedNumberRangeFormatter(LocalizedNumberRangeFormatter&& src) noexcept;
- /**
- * Copy assignment operator.
- * @stable ICU 63
- */
- LocalizedNumberRangeFormatter& operator=(const LocalizedNumberRangeFormatter& other);
- /**
- * Move assignment operator:
- * The source LocalizedNumberRangeFormatter will be left in a valid but undefined state.
- * @stable ICU 63
- */
- LocalizedNumberRangeFormatter& operator=(LocalizedNumberRangeFormatter&& src) noexcept;
- #ifndef U_HIDE_INTERNAL_API
- /**
- * @param results
- * The results object. This method will mutate it to save the results.
- * @param equalBeforeRounding
- * Whether the number was equal before copying it into a DecimalQuantity.
- * Used for determining the identity fallback behavior.
- * @param status
- * Set if an error occurs while formatting.
- * @internal
- */
- void formatImpl(impl::UFormattedNumberRangeData& results, bool equalBeforeRounding,
- UErrorCode& status) const;
- #endif /* U_HIDE_INTERNAL_API */
- /**
- * Destruct this LocalizedNumberRangeFormatter, cleaning up any memory it might own.
- * @stable ICU 63
- */
- ~LocalizedNumberRangeFormatter();
- private:
- std::atomic<impl::NumberRangeFormatterImpl*> fAtomicFormatter = {};
- const impl::NumberRangeFormatterImpl* getFormatter(UErrorCode& stauts) const;
- explicit LocalizedNumberRangeFormatter(
- const NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>& other);
- explicit LocalizedNumberRangeFormatter(
- NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>&& src) noexcept;
- LocalizedNumberRangeFormatter(const impl::RangeMacroProps ¯os, const Locale &locale);
- LocalizedNumberRangeFormatter(impl::RangeMacroProps &¯os, const Locale &locale);
- // To give the fluent setters access to this class's constructor:
- friend class NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>;
- friend class NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>;
- // To give UnlocalizedNumberRangeFormatter::locale() access to this class's constructor:
- friend class UnlocalizedNumberRangeFormatter;
- };
- /**
- * The result of a number range formatting operation. This class allows the result to be exported in several data types,
- * including a UnicodeString and a FieldPositionIterator.
- *
- * Instances of this class are immutable and thread-safe.
- *
- * @stable ICU 63
- */
- class U_I18N_API FormattedNumberRange : public UMemory, public FormattedValue {
- public:
- // Copybrief: this method is older than the parent method
- /**
- * @copybrief FormattedValue::toString()
- *
- * For more information, see FormattedValue::toString()
- *
- * @stable ICU 63
- */
- UnicodeString toString(UErrorCode& status) const override;
- // Copydoc: this method is new in ICU 64
- /** @copydoc FormattedValue::toTempString() */
- UnicodeString toTempString(UErrorCode& status) const override;
- // Copybrief: this method is older than the parent method
- /**
- * @copybrief FormattedValue::appendTo()
- *
- * For more information, see FormattedValue::appendTo()
- *
- * @stable ICU 63
- */
- Appendable &appendTo(Appendable &appendable, UErrorCode& status) const override;
- // Copydoc: this method is new in ICU 64
- /** @copydoc FormattedValue::nextPosition() */
- UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override;
- /**
- * Extracts the formatted range as a pair of decimal numbers. This endpoint
- * is useful for obtaining the exact number being printed after scaling
- * and rounding have been applied by the number range formatting pipeline.
- *
- * The syntax of the unformatted numbers is a "numeric string"
- * as defined in the Decimal Arithmetic Specification, available at
- * http://speleotrove.com/decimal
- *
- * Example C++17 call site:
- *
- * auto [ first, second ] = range.getDecimalNumbers<std::string>(status);
- *
- * @tparam StringClass A string class compatible with StringByteSink;
- * for example, std::string.
- * @param status Set if an error occurs.
- * @return A pair of StringClasses containing the numeric strings.
- * @stable ICU 68
- */
- template<typename StringClass>
- inline std::pair<StringClass, StringClass> getDecimalNumbers(UErrorCode& status) const;
- /**
- * Returns whether the pair of numbers was successfully formatted as a range or whether an identity fallback was
- * used. For example, if the first and second number were the same either before or after rounding occurred, an
- * identity fallback was used.
- *
- * @return An indication the resulting identity situation in the formatted number range.
- * @stable ICU 63
- * @see UNumberRangeIdentityFallback
- */
- UNumberRangeIdentityResult getIdentityResult(UErrorCode& status) const;
- /**
- * Default constructor; makes an empty FormattedNumberRange.
- * @stable ICU 70
- */
- FormattedNumberRange()
- : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
- /**
- * Copying not supported; use move constructor instead.
- */
- FormattedNumberRange(const FormattedNumberRange&) = delete;
- /**
- * Copying not supported; use move assignment instead.
- */
- FormattedNumberRange& operator=(const FormattedNumberRange&) = delete;
- /**
- * Move constructor:
- * Leaves the source FormattedNumberRange in an undefined state.
- * @stable ICU 63
- */
- FormattedNumberRange(FormattedNumberRange&& src) noexcept;
- /**
- * Move assignment:
- * Leaves the source FormattedNumberRange in an undefined state.
- * @stable ICU 63
- */
- FormattedNumberRange& operator=(FormattedNumberRange&& src) noexcept;
- /**
- * Destruct an instance of FormattedNumberRange, cleaning up any memory it might own.
- * @stable ICU 63
- */
- ~FormattedNumberRange();
- private:
- // Can't use LocalPointer because UFormattedNumberRangeData is forward-declared
- const impl::UFormattedNumberRangeData *fData;
- // Error code for the terminal methods
- UErrorCode fErrorCode;
- /**
- * Internal constructor from data type. Adopts the data pointer.
- */
- explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results)
- : fData(results), fErrorCode(U_ZERO_ERROR) {}
- explicit FormattedNumberRange(UErrorCode errorCode)
- : fData(nullptr), fErrorCode(errorCode) {}
- void getDecimalNumbers(ByteSink& sink1, ByteSink& sink2, UErrorCode& status) const;
- const impl::UFormattedNumberRangeData* getData(UErrorCode& status) const;
- // To allow PluralRules to access the underlying data
- friend class ::icu::PluralRules;
- // To give LocalizedNumberRangeFormatter format methods access to this class's constructor:
- friend class LocalizedNumberRangeFormatter;
- // To give C API access to internals
- friend struct impl::UFormattedNumberRangeImpl;
- };
- // inline impl of @stable ICU 68 method
- template<typename StringClass>
- std::pair<StringClass, StringClass> FormattedNumberRange::getDecimalNumbers(UErrorCode& status) const {
- StringClass str1;
- StringClass str2;
- StringByteSink<StringClass> sink1(&str1);
- StringByteSink<StringClass> sink2(&str2);
- getDecimalNumbers(sink1, sink2, status);
- return std::make_pair(str1, str2);
- }
- /**
- * See the main description in numberrangeformatter.h for documentation and examples.
- *
- * @stable ICU 63
- */
- class U_I18N_API NumberRangeFormatter final {
- public:
- /**
- * Call this method at the beginning of a NumberRangeFormatter fluent chain in which the locale is not currently
- * known at the call site.
- *
- * @return An {@link UnlocalizedNumberRangeFormatter}, to be used for chaining.
- * @stable ICU 63
- */
- static UnlocalizedNumberRangeFormatter with();
- /**
- * Call this method at the beginning of a NumberRangeFormatter fluent chain in which the locale is known at the call
- * site.
- *
- * @param locale
- * The locale from which to load formats and symbols for number range formatting.
- * @return A {@link LocalizedNumberRangeFormatter}, to be used for chaining.
- * @stable ICU 63
- */
- static LocalizedNumberRangeFormatter withLocale(const Locale &locale);
- /**
- * Use factory methods instead of the constructor to create a NumberFormatter.
- */
- NumberRangeFormatter() = delete;
- };
- } // namespace number
- U_NAMESPACE_END
- #endif /* #if !UCONFIG_NO_FORMATTING */
- #endif /* U_SHOW_CPLUSPLUS_API */
- #endif // __NUMBERRANGEFORMATTER_H__
|