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 
C++ API: Abstract operations for localized strings.
#define U_FAILURE(x)
Does the error code indicate a failure?
Definition: utypes.h:827
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:189
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:544
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:316
C++ API: FieldPosition identifies the fields in a formatted output.
#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
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.
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:509
UnlocalizedNumberFormatter formatter1
Basic definitions for ICU, for both C and C++ APIs.
Implementation of ByteSink that writes to a "string".
Definition: bytestream.h:291
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:302
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:63
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:573
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:198