ICU 78.3  78.3
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 
162  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&;
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 
330  LocalPointer<Derived> clone() const &;
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:
396  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
397 
407  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
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:
487  U_I18N_API FormattedNumberRange formatFormattableRange(
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:
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 
655  UNumberRangeIdentityResult getIdentityResult(UErrorCode& status) const;
656 
662  : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
663 
668 
672  FormattedNumberRange& operator=(const FormattedNumberRange&) = delete;
673 
680 
686  FormattedNumberRange& operator=(FormattedNumberRange&& src) noexcept;
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:
749  static UnlocalizedNumberRangeFormatter with();
750 
760  static LocalizedNumberRangeFormatter withLocale(const Locale &locale);
761 
765  NumberRangeFormatter() = delete;
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 
fpositer.h
C++ API: FieldPosition Iterator.
U_I18N_API_CLASS
#define U_I18N_API_CLASS
Definition: utypes.h:457
utypes.h
Basic definitions for ICU, for both C and C++ APIs.
U_I18N_API
#define U_I18N_API
Definition: utypes.h:316
UBool
int8_t UBool
The ICU boolean type, a signed-byte integer.
Definition: umachine.h:269
icu::Formattable
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:63
icu::number::UnlocalizedNumberRangeFormatter
A NumberRangeFormatter that does not yet have a locale.
Definition: numberrangeformatter.h:383
icu::FormattedValue
An abstract formatted value: a string with associated field attributes.
Definition: formattedvalue.h:241
icu::number::impl::RangeMacroProps::locale
Locale locale
Definition: numberrangeformatter.h:94
icu::LocalPointer
"Smart pointer" class, deletes objects via the standard C++ delete operator.
Definition: localpointer.h:189
icu::number::NumberFormatterSettings::copyErrorTo
UBool copyErrorTo(UErrorCode &outErrorCode) const
Sets the UErrorCode if an error occurred in the fluent chain.
Definition: numberformatter.h:2393
icu::number::impl::RangeMacroProps
Definition: numberrangeformatter.h:77
fieldpos.h
C++ API: FieldPosition identifies the fields in a formatted output.
icu::UnicodeString
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:302
U_FAILURE
#define U_FAILURE(x)
Does the error code indicate a failure?
Definition: utypes.h:827
UErrorCode
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
Definition: utypes.h:509
icu::number::FormattedNumberRange
The result of a number range formatting operation.
Definition: numberrangeformatter.h:594
icu::number::UnlocalizedNumberFormatter
A NumberFormatter that does not yet have a locale.
Definition: numberformatter.h:2433
icu::UMemory
UMemory is the common ICU base class.
Definition: uobject.h:115
icu::number::NumberRangeFormatterSettings
An abstract base class for specifying settings related to number formatting.
Definition: numberrangeformatter.h:115
U_ZERO_ERROR
@ U_ZERO_ERROR
No error, no warning.
Definition: utypes.h:544
appendable.h
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
icu::number::impl::RangeMacroProps::formatter2
UnlocalizedNumberFormatter formatter2
Definition: numberrangeformatter.h:82
formattedvalue.h
C++ API: Abstract operations for localized strings.
UNumberRangeCollapse
UNumberRangeCollapse
Defines how to merge fields that are identical across the range sign.
Definition: unumberrangeformatter.h:83
icu::Appendable
Base class for objects to which Unicode characters and strings can be appended.
Definition: appendable.h:54
icu::number::NumberRangeFormatterSettings::copyErrorTo
UBool copyErrorTo(UErrorCode &outErrorCode) const
Sets the UErrorCode if an error occurred in the fluent chain.
Definition: numberrangeformatter.h:347
UNUM_RANGE_COLLAPSE_AUTO
@ UNUM_RANGE_COLLAPSE_AUTO
Use locale data and heuristics to determine how much of the string to collapse.
Definition: unumberrangeformatter.h:92
numberformatter.h
C++ API: All-in-one formatter for localized numbers, currencies, and units.
icu::number::NumberRangeFormatter
See the main description in numberrangeformatter.h for documentation and examples.
Definition: numberrangeformatter.h:740
icu::number::LocalizedNumberRangeFormatter
A NumberRangeFormatter that has a locale associated with it; this means .formatRange() methods are av...
Definition: numberrangeformatter.h:471
icu::StringByteSink
Implementation of ByteSink that writes to a "string".
Definition: bytestream.h:291
UNumberRangeIdentityFallback
UNumberRangeIdentityFallback
Defines the behavior when the two numbers in the range are identical after rounding.
Definition: unumberrangeformatter.h:125
icu::number::impl::RangeMacroProps::formatter1
UnlocalizedNumberFormatter formatter1
Definition: numberrangeformatter.h:79
unumberrangeformatter.h
C API: Localized number range formatting.
UNumberRangeIdentityResult
UNumberRangeIdentityResult
Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted i...
Definition: unumberrangeformatter.h:165
U_INVALID_STATE_ERROR
@ U_INVALID_STATE_ERROR
Requested operation can not be completed with ICU in its current state.
Definition: utypes.h:573
UNUM_IDENTITY_FALLBACK_APPROXIMATELY
@ UNUM_IDENTITY_FALLBACK_APPROXIMATELY
Show the number using a locale-sensitive approximation pattern.
Definition: unumberrangeformatter.h:147
icu::Locale
A Locale object represents a specific geographical, political, or cultural region.
Definition: locid.h:198
icu::number::impl::RangeMacroProps::copyErrorTo
bool copyErrorTo(UErrorCode &status) const
Check all members for errors.
Definition: numberrangeformatter.h:102
icu::number::FormattedNumberRange::FormattedNumberRange
FormattedNumberRange()
Default constructor; makes an empty FormattedNumberRange.
Definition: numberrangeformatter.h:661
icu::ConstrainedFieldPosition
Represents a span of a string containing a given field.
Definition: formattedvalue.h:41