ICU 78.1  78.1
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"
16 #include "unicode/formattedvalue.h"
17 #include "unicode/fpositer.h"
20 
48 U_NAMESPACE_BEGIN
49 
50 // Forward declarations:
51 class PluralRules;
52 
53 namespace number { // icu::number
54 
55 // Forward declarations:
56 class UnlocalizedNumberRangeFormatter;
57 class LocalizedNumberRangeFormatter;
58 class FormattedNumberRange;
59 
60 namespace impl {
61 
62 // Forward declarations:
63 struct RangeMacroProps;
64 class DecimalQuantity;
65 class UFormattedNumberRangeData;
66 class NumberRangeFormatterImpl;
67 struct UFormattedNumberRangeImpl;
68 
69 } // namespace impl
70 
71 // Other helper classes would go here, but there are none.
72 
73 namespace impl { // icu::number::impl
74 
75 // Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
77 struct 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 
114 template<typename Derived>
116  public:
129  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
130 
140  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&;
141 
151  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &;
152 
163 
175  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
176 
186  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
187 
197  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
198 
208  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&;
209 
221  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
222 
232  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
233 
243  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
244 
254  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&;
255 
273  Derived collapse(UNumberRangeCollapse collapse) const &;
274 
284  Derived collapse(UNumberRangeCollapse collapse) &&;
285 
306  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &;
307 
317  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&;
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.
362  NumberRangeFormatterSettings() = default;
363 
364  friend class LocalizedNumberRangeFormatter;
365  friend class UnlocalizedNumberRangeFormatter;
366 };
367 
368 // Explicit instantiations in source/i18n/numrange_fluent.cpp.
369 // (MSVC treats imports/exports of explicit instantiations differently.)
370 #ifndef _MSC_VER
371 extern template class NumberRangeFormatterSettings<UnlocalizedNumberRangeFormatter>;
372 extern template class NumberRangeFormatterSettings<LocalizedNumberRangeFormatter>;
373 #endif
374 
385 
386  public:
397 
408 
415 
421 
428 
434 
441 
442  private:
445 
448 
450 
452 
453  // To give the fluent setters access to this class's constructor:
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 
473  public:
488  const Formattable& first, const Formattable& second, UErrorCode& status) const;
489 
497 
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:
583  friend class UnlocalizedNumberRangeFormatter;
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
725 template<typename StringClass>
726 std::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 
741  public:
750 
761 
766 };
767 
768 } // namespace number
769 U_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).
Base class for objects to which Unicode characters and strings can be appended.
Definition: appendable.h:54
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.
Definition: localpointer.h:189
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:269
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.
FormattedNumberRange & operator=(const FormattedNumberRange &)=delete
Copying not supported; use move assignment instead.
~FormattedNumberRange()
Destruct an instance of FormattedNumberRange, cleaning up any memory it might own.
FormattedNumberRange & operator=(FormattedNumberRange &&src) noexcept
Move assignment: Leaves the source FormattedNumberRange in an undefined state.
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.
UBool copyErrorTo(UErrorCode &outErrorCode) const
Sets the UErrorCode if an error occurred in the fluent chain.
An abstract base class for specifying settings related to number formatting.
Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&
Overload of numberFormatterSecond() for use on an rvalue reference.
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.
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.
LocalPointer< Derived > clone() const &
Returns the current (Un)LocalizedNumberRangeFormatter as a LocalPointer wrapping a heap-allocated cop...
See the main description in numberrangeformatter.h for documentation and examples.
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.
UnlocalizedNumberRangeFormatter & operator=(UnlocalizedNumberRangeFormatter &&src) noexcept
Move assignment operator: The source UnlocalizedNumberRangeFormatter will be left in a valid but unde...
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &
Associate the given locale with the number range formatter.
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&
Overload of locale() for use on an rvalue reference.
UnlocalizedNumberRangeFormatter & operator=(const UnlocalizedNumberRangeFormatter &other)
Copy assignment operator.
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.
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.
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