ICU 78.3 78.3
Loading...
Searching...
No Matches
numberrangeformatter.h
Go to the documentation of this file.
1// © 2018 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3
4#ifndef __NUMBERRANGEFORMATTER_H__
5#define __NUMBERRANGEFORMATTER_H__
6
7#include "unicode/utypes.h"
8
9#if U_SHOW_CPLUSPLUS_API
10
11#if !UCONFIG_NO_FORMATTING
12
13#include <atomic>
14#include "unicode/appendable.h"
15#include "unicode/fieldpos.h"
17#include "unicode/fpositer.h"
20
46
47
48U_NAMESPACE_BEGIN
49
50// Forward declarations:
51class PluralRules;
52
53namespace number { // icu::number
54
55// Forward declarations:
56class UnlocalizedNumberRangeFormatter;
57class LocalizedNumberRangeFormatter;
58class FormattedNumberRange;
59
60namespace impl {
61
62// Forward declarations:
63struct RangeMacroProps;
64class DecimalQuantity;
65class UFormattedNumberRangeData;
66class NumberRangeFormatterImpl;
67struct UFormattedNumberRangeImpl;
68
69} // namespace impl
70
71// Other helper classes would go here, but there are none.
72
73namespace impl { // icu::number::impl
74
75// Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
77struct RangeMacroProps : public UMemory {
79 UnlocalizedNumberFormatter formatter1; // = NumberFormatter::with();
80
82 UnlocalizedNumberFormatter formatter2; // = NumberFormatter::with();
83
85 bool singleFormatter = true;
86
89
92
95
96 // NOTE: Uses default copy and move constructors.
97
102 bool copyErrorTo(UErrorCode &status) const {
103 return formatter1.copyErrorTo(status) || formatter2.copyErrorTo(status);
104 }
105};
106
107} // namespace impl
108
114template<typename Derived>
115class U_I18N_API NumberRangeFormatterSettings {
116 public:
129 Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
130
141
152
163
175 Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
176
186 Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
187
197 Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
198
209
221 Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
222
232 Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
233
243 Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
244
255
274
285
307
318
331
339 LocalPointer<Derived> clone() &&;
340
347 UBool copyErrorTo(UErrorCode &outErrorCode) const {
348 if (U_FAILURE(outErrorCode)) {
349 // Do not overwrite the older error code
350 return true;
351 }
352 fMacros.copyErrorTo(outErrorCode);
353 return U_FAILURE(outErrorCode);
354 }
355
356 // NOTE: Uses default copy and move constructors.
357
358 private:
359 impl::RangeMacroProps fMacros;
360
361 // Don't construct me directly! Use (Un)LocalizedNumberFormatter.
363
366};
367
368// Explicit instantiations in source/i18n/numrange_fluent.cpp.
369// (MSVC treats imports/exports of explicit instantiations differently.)
370#ifndef _MSC_VER
371extern template class NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>;
372extern template class NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>;
373#endif
374
384 : public NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>, public UMemory {
385
386 public:
396 LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
397
407 LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
408
415
421
428
434
441
442 private:
444 const NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>& other);
445
447 NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>&& src) noexcept;
448
450
452
453 // To give the fluent setters access to this class's constructor:
454 friend class NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>;
455
456 // To give NumberRangeFormatter::with() access to this class's constructor:
457 friend class NumberRangeFormatter;
458
459 // To give LNRF::withoutLocale() access to this class's constructor:
460 friend class LocalizedNumberRangeFormatter;
461};
462
472 : public NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>, public UMemory {
473 public:
488 const Formattable& first, const Formattable& second, UErrorCode& status) const;
489
496 U_I18N_API UnlocalizedNumberRangeFormatter withoutLocale() const &;
497
505 U_I18N_API UnlocalizedNumberRangeFormatter withoutLocale() &&;
506
513
519
526
532
539
540#ifndef U_HIDE_INTERNAL_API
541
552 U_I18N_API void formatImpl(impl::UFormattedNumberRangeData &results, bool equalBeforeRounding,
553 UErrorCode &status) const;
554
555#endif /* U_HIDE_INTERNAL_API */
556
562
563 private:
564 std::atomic<impl::NumberRangeFormatterImpl*> fAtomicFormatter = {};
565
566 const impl::NumberRangeFormatterImpl* getFormatter(UErrorCode& stauts) const;
567
570
573
574 LocalizedNumberRangeFormatter(const impl::RangeMacroProps &macros, const Locale &locale);
575
577
578 // To give the fluent setters access to this class's constructor:
581
582 // To give UnlocalizedNumberRangeFormatter::locale() access to this class's constructor:
584};
585
595 public:
596 // Copybrief: this method is older than the parent method
604 UnicodeString toString(UErrorCode& status) const override;
605
606 // Copydoc: this method is new in ICU 64
608 UnicodeString toTempString(UErrorCode& status) const override;
609
610 // Copybrief: this method is older than the parent method
618 Appendable &appendTo(Appendable &appendable, UErrorCode& status) const override;
619
620 // Copydoc: this method is new in ICU 64
622 UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override;
623
643 template<typename StringClass>
644 inline std::pair<StringClass, StringClass> getDecimalNumbers(UErrorCode& status) const;
645
656
662 : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
663
668
673
680
687
693
694 private:
695 // Can't use LocalPointer because UFormattedNumberRangeData is forward-declared
696 const impl::UFormattedNumberRangeData *fData;
697
698 // Error code for the terminal methods
699 UErrorCode fErrorCode;
700
704 explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results)
705 : fData(results), fErrorCode(U_ZERO_ERROR) {}
706
707 explicit FormattedNumberRange(UErrorCode errorCode)
708 : fData(nullptr), fErrorCode(errorCode) {}
709
710 void getDecimalNumbers(ByteSink& sink1, ByteSink& sink2, UErrorCode& status) const;
711
712 const impl::UFormattedNumberRangeData* getData(UErrorCode& status) const;
713
714 // To allow PluralRules to access the underlying data
715 friend class ::icu::PluralRules;
716
717 // To give LocalizedNumberRangeFormatter format methods access to this class's constructor:
718 friend class LocalizedNumberRangeFormatter;
719
720 // To give C API access to internals
721 friend struct impl::UFormattedNumberRangeImpl;
722};
723
724// inline impl of @stable ICU 68 method
725template<typename StringClass>
726std::pair<StringClass, StringClass> FormattedNumberRange::getDecimalNumbers(UErrorCode& status) const {
727 StringClass str1;
728 StringClass str2;
729 StringByteSink<StringClass> sink1(&str1);
730 StringByteSink<StringClass> sink2(&str2);
731 getDecimalNumbers(sink1, sink2, status);
732 return std::make_pair(str1, str2);
733}
734
767
768} // namespace number
769U_NAMESPACE_END
770
771#endif /* #if !UCONFIG_NO_FORMATTING */
772
773#endif /* U_SHOW_CPLUSPLUS_API */
774
775#endif // __NUMBERRANGEFORMATTER_H__
776
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
A ByteSink can be filled with bytes.
Definition bytestream.h:55
Represents a span of a string containing a given field.
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition fmtable.h:63
An abstract formatted value: a string with associated field attributes.
"Smart pointer" class, deletes objects via the standard C++ delete operator.
A Locale object represents a specific geographical, political, or cultural region.
Definition locid.h:198
Implementation of ByteSink that writes to a "string".
Definition bytestream.h:291
UMemory is the common ICU base class.
Definition uobject.h:115
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition unistr.h:303
The result of a number range formatting operation.
UnicodeString toTempString(UErrorCode &status) const override
Returns the formatted string as a read-only alias to memory owned by the FormattedValue.
UnicodeString toString(UErrorCode &status) const override
Returns the formatted string as a self-contained UnicodeString.
FormattedNumberRange(const FormattedNumberRange &)=delete
Copying not supported; use move constructor instead.
UBool nextPosition(ConstrainedFieldPosition &cfpos, UErrorCode &status) const override
Iterates over field positions in the FormattedValue.
UNumberRangeIdentityResult getIdentityResult(UErrorCode &status) const
Returns whether the pair of numbers was successfully formatted as a range or whether an identity fall...
Appendable & appendTo(Appendable &appendable, UErrorCode &status) const override
Appends the formatted string to an Appendable.
FormattedNumberRange(FormattedNumberRange &&src) noexcept
Move constructor: Leaves the source FormattedNumberRange in an undefined state.
FormattedNumberRange()
Default constructor; makes an empty FormattedNumberRange.
std::pair< StringClass, StringClass > getDecimalNumbers(UErrorCode &status) const
Extracts the formatted range as a pair of decimal numbers.
FormattedNumberRange & operator=(FormattedNumberRange &&src) noexcept
Move assignment: Leaves the source FormattedNumberRange in an undefined state.
~FormattedNumberRange()
Destruct an instance of FormattedNumberRange, cleaning up any memory it might own.
FormattedNumberRange & operator=(const FormattedNumberRange &)=delete
Copying not supported; use move assignment instead.
A NumberRangeFormatter that has a locale associated with it; this means .formatRange() methods are av...
U_I18N_API FormattedNumberRange formatFormattableRange(const Formattable &first, const Formattable &second, UErrorCode &status) const
Format the given Formattables to a string using the settings specified in the NumberRangeFormatter fl...
U_I18N_API ~LocalizedNumberRangeFormatter()
Destruct this LocalizedNumberRangeFormatter, cleaning up any memory it might own.
U_I18N_API void formatImpl(impl::UFormattedNumberRangeData &results, bool equalBeforeRounding, UErrorCode &status) const
U_I18N_API UnlocalizedNumberRangeFormatter withoutLocale() const &
Disassociate the locale from this formatter.
U_I18N_API LocalizedNumberRangeFormatter()=default
Default constructor: puts the formatter into a valid but undefined state.
An abstract base class for specifying settings related to number formatting.
Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&
Overload of numberFormatterSecond() for use on an rvalue reference.
LocalPointer< Derived > clone() const &
Returns the current (Un)LocalizedNumberRangeFormatter as a LocalPointer wrapping a heap-allocated cop...
Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &
Overload of numberFormatterFirst() for use on an rvalue reference.
Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&
Overload of numberFormatterBoth() for use on an rvalue reference.
Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&
Overload of numberFormatterFirst() for use on an rvalue reference.
Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&
Overload of numberFormatterBoth() for use on an rvalue reference.
Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &
Sets the NumberFormatter instance to use for the numbers in the range.
Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &
Overload of numberFormatterBoth() for use on an rvalue reference.
Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&
Overload of numberFormatterFirst() for use on an rvalue reference.
Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &
Sets the behavior when the two sides of the range are the same.
Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &
Sets the NumberFormatter instance to use for the first number in the range.
UBool copyErrorTo(UErrorCode &outErrorCode) const
Sets the UErrorCode if an error occurred in the fluent chain.
Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &
Overload of numberFormatterSecond() for use on an rvalue reference.
Derived collapse(UNumberRangeCollapse collapse) &&
Overload of collapse() for use on an rvalue reference.
Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &
Sets the NumberFormatter instance to use for the second number in the range.
Derived collapse(UNumberRangeCollapse collapse) const &
Sets the aggressiveness of "collapsing" fields across the range separator.
Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&
Overload of identityFallback() for use on an rvalue reference.
Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&
Overload of numberFormatterSecond() for use on an rvalue reference.
static UnlocalizedNumberRangeFormatter with()
Call this method at the beginning of a NumberRangeFormatter fluent chain in which the locale is not c...
NumberRangeFormatter()=delete
Use factory methods instead of the constructor to create a NumberFormatter.
static LocalizedNumberRangeFormatter withLocale(const Locale &locale)
Call this method at the beginning of a NumberRangeFormatter fluent chain in which the locale is known...
A NumberFormatter that does not yet have a locale.
A NumberRangeFormatter that does not yet have a locale.
UnlocalizedNumberRangeFormatter(const UnlocalizedNumberRangeFormatter &other)
Returns a copy of this UnlocalizedNumberRangeFormatter.
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &
Associate the given locale with the number range formatter.
UnlocalizedNumberRangeFormatter & operator=(const UnlocalizedNumberRangeFormatter &other)
Copy assignment operator.
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&
Overload of locale() for use on an rvalue reference.
UnlocalizedNumberRangeFormatter(UnlocalizedNumberRangeFormatter &&src) noexcept
Move constructor: The source UnlocalizedNumberRangeFormatter will be left in a valid but undefined st...
UnlocalizedNumberRangeFormatter()=default
Default constructor: puts the formatter into a valid but undefined state.
UnlocalizedNumberRangeFormatter & operator=(UnlocalizedNumberRangeFormatter &&src) noexcept
Move assignment operator: The source UnlocalizedNumberRangeFormatter will be left in a valid but unde...
C++ API: FieldPosition identifies the fields in a formatted output.
C++ API: Abstract operations for localized strings.
C++ API: FieldPosition Iterator.
C++ API: All-in-one formatter for localized numbers, currencies, and units.
UNumberRangeIdentityFallback identityFallback
UnlocalizedNumberFormatter formatter2
UnlocalizedNumberFormatter formatter1
bool copyErrorTo(UErrorCode &status) const
Check all members for errors.
int8_t UBool
The ICU boolean type, a signed-byte integer.
Definition umachine.h:269
C API: Localized number range formatting.
UNumberRangeIdentityResult
Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted i...
UNumberRangeIdentityFallback
Defines the behavior when the two numbers in the range are identical after rounding.
@ UNUM_IDENTITY_FALLBACK_APPROXIMATELY
Show the number using a locale-sensitive approximation pattern.
UNumberRangeCollapse
Defines how to merge fields that are identical across the range sign.
@ UNUM_RANGE_COLLAPSE_AUTO
Use locale data and heuristics to determine how much of the string to collapse.
Basic definitions for ICU, for both C and C++ APIs.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
Definition utypes.h:509
@ U_INVALID_STATE_ERROR
Requested operation can not be completed with ICU in its current state.
Definition utypes.h:573
@ U_ZERO_ERROR
No error, no warning.
Definition utypes.h:544
#define U_FAILURE(x)
Does the error code indicate a failure?
Definition utypes.h:827
#define U_I18N_API_CLASS
Set to export library symbols from inside the i18n library, and to import them from outside,...
Definition utypes.h:457
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside.
Definition utypes.h:316