ICU 72.1  72.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 
76 #if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN) && !defined(U_STATIC_IMPLEMENTATION)
77 } // namespace icu::number
78 U_NAMESPACE_END
79 
80 template struct U_I18N_API std::atomic< U_NAMESPACE_QUALIFIER number::impl::NumberRangeFormatterImpl*>;
81 
82 U_NAMESPACE_BEGIN
83 namespace number { // icu::number
84 #endif
85 
87 // Other helper classes would go here, but there are none.
88 
89 namespace impl { // icu::number::impl
90 
91 // Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
95  UnlocalizedNumberFormatter formatter1; // = NumberFormatter::with();
96 
98  UnlocalizedNumberFormatter formatter2; // = NumberFormatter::with();
99 
101  bool singleFormatter = true;
102 
105 
108 
111 
112  // NOTE: Uses default copy and move constructors.
113 
118  bool copyErrorTo(UErrorCode &status) const {
119  return formatter1.copyErrorTo(status) || formatter2.copyErrorTo(status);
120  }
121 };
122 
123 } // namespace impl
124 
130 template<typename Derived>
132  public:
145  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
146 
156  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&;
157 
167  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &;
168 
178  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&;
179 
191  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
192 
202  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
203 
213  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
214 
224  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&;
225 
237  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
238 
248  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
249 
259  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
260 
270  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&;
271 
289  Derived collapse(UNumberRangeCollapse collapse) const &;
290 
300  Derived collapse(UNumberRangeCollapse collapse) &&;
301 
322  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &;
323 
333  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&;
334 
346  LocalPointer<Derived> clone() const &;
347 
355  LocalPointer<Derived> clone() &&;
356 
363  UBool copyErrorTo(UErrorCode &outErrorCode) const {
364  if (U_FAILURE(outErrorCode)) {
365  // Do not overwrite the older error code
366  return true;
367  }
368  fMacros.copyErrorTo(outErrorCode);
369  return U_FAILURE(outErrorCode);
370  }
371 
372  // NOTE: Uses default copy and move constructors.
373 
374  private:
375  impl::RangeMacroProps fMacros;
376 
377  // Don't construct me directly! Use (Un)LocalizedNumberFormatter.
378  NumberRangeFormatterSettings() = default;
379 
380  friend class LocalizedNumberRangeFormatter;
381  friend class UnlocalizedNumberRangeFormatter;
382 };
383 
394 
395  public:
405  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
406 
416  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
417 
424 
430 
437 
443 
450 
451  private:
454 
457 
458  // To give the fluent setters access to this class's constructor:
460 
461  // To give NumberRangeFormatter::with() access to this class's constructor:
462  friend class NumberRangeFormatter;
463 };
464 
475  public:
489  FormattedNumberRange formatFormattableRange(
490  const Formattable& first, const Formattable& second, UErrorCode& status) const;
491 
497  LocalizedNumberRangeFormatter() = default;
498 
504 
511 
517 
524 
525 #ifndef U_HIDE_INTERNAL_API
526 
537  void formatImpl(impl::UFormattedNumberRangeData& results, bool equalBeforeRounding,
538  UErrorCode& status) const;
539 
540 #endif /* U_HIDE_INTERNAL_API */
541 
547 
548  private:
549  std::atomic<impl::NumberRangeFormatterImpl*> fAtomicFormatter = {};
550 
551  const impl::NumberRangeFormatterImpl* getFormatter(UErrorCode& stauts) const;
552 
555 
558 
559  LocalizedNumberRangeFormatter(const impl::RangeMacroProps &macros, const Locale &locale);
560 
562 
563  // To give the fluent setters access to this class's constructor:
566 
567  // To give UnlocalizedNumberRangeFormatter::locale() access to this class's constructor:
568  friend class UnlocalizedNumberRangeFormatter;
569 };
570 
580  public:
581  // Copybrief: this method is older than the parent method
589  UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
590 
591  // Copydoc: this method is new in ICU 64
593  UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
594 
595  // Copybrief: this method is older than the parent method
603  Appendable &appendTo(Appendable &appendable, UErrorCode& status) const U_OVERRIDE;
604 
605  // Copydoc: this method is new in ICU 64
607  UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
608 
628  template<typename StringClass>
629  inline std::pair<StringClass, StringClass> getDecimalNumbers(UErrorCode& status) const;
630 
640  UNumberRangeIdentityResult getIdentityResult(UErrorCode& status) const;
641 
647  : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
648 
653 
657  FormattedNumberRange& operator=(const FormattedNumberRange&) = delete;
658 
665 
672 
678 
679  private:
680  // Can't use LocalPointer because UFormattedNumberRangeData is forward-declared
681  const impl::UFormattedNumberRangeData *fData;
682 
683  // Error code for the terminal methods
684  UErrorCode fErrorCode;
685 
689  explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results)
690  : fData(results), fErrorCode(U_ZERO_ERROR) {}
691 
692  explicit FormattedNumberRange(UErrorCode errorCode)
693  : fData(nullptr), fErrorCode(errorCode) {}
694 
695  void getDecimalNumbers(ByteSink& sink1, ByteSink& sink2, UErrorCode& status) const;
696 
697  const impl::UFormattedNumberRangeData* getData(UErrorCode& status) const;
698 
699  // To allow PluralRules to access the underlying data
700  friend class ::icu::PluralRules;
701 
702  // To give LocalizedNumberRangeFormatter format methods access to this class's constructor:
703  friend class LocalizedNumberRangeFormatter;
704 
705  // To give C API access to internals
706  friend struct impl::UFormattedNumberRangeImpl;
707 };
708 
709 // inline impl of @stable ICU 68 method
710 template<typename StringClass>
711 std::pair<StringClass, StringClass> FormattedNumberRange::getDecimalNumbers(UErrorCode& status) const {
712  StringClass str1;
713  StringClass str2;
714  StringByteSink<StringClass> sink1(&str1);
715  StringByteSink<StringClass> sink2(&str2);
716  getDecimalNumbers(sink1, sink2, status);
717  return std::make_pair(str1, str2);
718 }
719 
726  public:
734  static UnlocalizedNumberRangeFormatter with();
735 
745  static LocalizedNumberRangeFormatter withLocale(const Locale &locale);
746 
750  NumberRangeFormatter() = delete;
751 };
752 
753 } // namespace number
754 U_NAMESPACE_END
755 
756 #endif /* #if !UCONFIG_NO_FORMATTING */
757 
758 #endif /* U_SHOW_CPLUSPLUS_API */
759 
760 #endif // __NUMBERRANGEFORMATTER_H__
761 
C++ API: Abstract operations for localized strings.
#define U_OVERRIDE
Defined to the C++11 "override" keyword if available.
Definition: umachine.h:130
#define U_FAILURE(x)
Does the error code indicate a failure?
Definition: utypes.h:717
The result of a number range formatting operation.
C++ API: FieldPosition Iterator.
"Smart pointer" class, deletes objects via the standard C++ delete operator.
Definition: localpointer.h:191
See the main description in numberrangeformatter.h for documentation and examples.
A NumberRangeFormatter that has a locale associated with it; this means .formatRange() methods are av...
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
No error, no warning.
Definition: utypes.h:449
An abstract base class for specifying settings related to number formatting.
An abstract formatted value: a string with associated field attributes.
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside...
Definition: utypes.h:301
C++ API: FieldPosition identifies the fields in a formatted output.
C API: Localized number range formatting.
UNumberRangeIdentityResult
Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted i...
UBool copyErrorTo(UErrorCode &outErrorCode) const
Sets the UErrorCode if an error occurred in the fluent chain.
UBool copyErrorTo(UErrorCode &outErrorCode) const
Sets the UErrorCode if an error occurred in the fluent chain.
A NumberRangeFormatter that does not yet have a locale.
Represents a span of a string containing a given field.
#define U_NOEXCEPT
"noexcept" if supported, otherwise empty.
Definition: platform.h:529
A NumberFormatter that does not yet have a locale.
UnlocalizedNumberFormatter formatter2
Use locale data and heuristics to determine how much of the string to collapse.
UNumberRangeCollapse
Defines how to merge fields that are identical across the range sign.
FormattedNumberRange()
Default constructor; makes an empty FormattedNumberRange.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
Definition: utypes.h:415
UnlocalizedNumberFormatter formatter1
Basic definitions for ICU, for both C and C++ APIs.
Implementation of ByteSink that writes to a "string".
Definition: bytestream.h:267
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:295
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:64
Show the number using a locale-sensitive approximation pattern.
UNumberRangeIdentityFallback
Defines the behavior when the two numbers in the range are identical after rounding.
UMemory is the common ICU base class.
Definition: uobject.h:115
C++ API: All-in-one formatter for localized numbers, currencies, and units.
Requested operation can not be completed with ICU in its current state.
Definition: utypes.h:478
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
Base class for objects to which Unicode characters and strings can be appended.
Definition: appendable.h:54
A Locale object represents a specific geographical, political, or cultural region.
Definition: locid.h:195