ICU 67.1  67.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"
19 
52 typedef enum UNumberRangeCollapse {
62 
69 
77 
86 
101 
109 
117 
126 
142 
150 
158 
159 #ifndef U_HIDE_INTERNAL_API
160 
165 #endif
166 
168 
169 U_NAMESPACE_BEGIN
170 
171 namespace number { // icu::number
172 
173 // Forward declarations:
174 class UnlocalizedNumberRangeFormatter;
175 class LocalizedNumberRangeFormatter;
176 class FormattedNumberRange;
177 
178 namespace impl {
179 
180 // Forward declarations:
181 struct RangeMacroProps;
182 class DecimalQuantity;
183 class UFormattedNumberRangeData;
184 class NumberRangeFormatterImpl;
185 
186 } // namespace impl
187 
193 #if U_PLATFORM == U_PF_WINDOWS && !defined(U_IN_DOXYGEN)
194 } // namespace icu::number
195 U_NAMESPACE_END
196 
197 template struct U_I18N_API std::atomic< U_NAMESPACE_QUALIFIER number::impl::NumberRangeFormatterImpl*>;
198 
199 U_NAMESPACE_BEGIN
200 namespace number { // icu::number
201 #endif
202 
204 // Other helper classes would go here, but there are none.
205 
206 namespace impl { // icu::number::impl
207 
208 // Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
212  UnlocalizedNumberFormatter formatter1; // = NumberFormatter::with();
213 
215  UnlocalizedNumberFormatter formatter2; // = NumberFormatter::with();
216 
218  bool singleFormatter = true;
219 
222 
225 
228 
229  // NOTE: Uses default copy and move constructors.
230 
235  bool copyErrorTo(UErrorCode &status) const {
236  return formatter1.copyErrorTo(status) || formatter2.copyErrorTo(status);
237  }
238 };
239 
240 } // namespace impl
241 
247 template<typename Derived>
249  public:
262  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
263 
273  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&;
274 
284  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &;
285 
295  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&;
296 
308  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
309 
319  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
320 
330  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
331 
341  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&;
342 
354  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
355 
365  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
366 
376  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
377 
387  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&;
388 
406  Derived collapse(UNumberRangeCollapse collapse) const &;
407 
417  Derived collapse(UNumberRangeCollapse collapse) &&;
418 
439  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &;
440 
450  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&;
451 
463  LocalPointer<Derived> clone() const &;
464 
472  LocalPointer<Derived> clone() &&;
473 
480  UBool copyErrorTo(UErrorCode &outErrorCode) const {
481  if (U_FAILURE(outErrorCode)) {
482  // Do not overwrite the older error code
483  return TRUE;
484  }
485  fMacros.copyErrorTo(outErrorCode);
486  return U_FAILURE(outErrorCode);
487  }
488 
489  // NOTE: Uses default copy and move constructors.
490 
491  private:
492  impl::RangeMacroProps fMacros;
493 
494  // Don't construct me directly! Use (Un)LocalizedNumberFormatter.
495  NumberRangeFormatterSettings() = default;
496 
497  friend class LocalizedNumberRangeFormatter;
498  friend class UnlocalizedNumberRangeFormatter;
499 };
500 
511 
512  public:
522  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
523 
533  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
534 
541 
547 
554 
560 
567 
568  private:
571 
574 
575  // To give the fluent setters access to this class's constructor:
577 
578  // To give NumberRangeFormatter::with() access to this class's constructor:
579  friend class NumberRangeFormatter;
580 };
581 
592  public:
606  FormattedNumberRange formatFormattableRange(
607  const Formattable& first, const Formattable& second, UErrorCode& status) const;
608 
614  LocalizedNumberRangeFormatter() = default;
615 
621 
628 
634 
641 
642 #ifndef U_HIDE_INTERNAL_API
643 
654  void formatImpl(impl::UFormattedNumberRangeData& results, bool equalBeforeRounding,
655  UErrorCode& status) const;
656 
657 #endif /* U_HIDE_INTERNAL_API */
658 
664 
665  private:
666  std::atomic<impl::NumberRangeFormatterImpl*> fAtomicFormatter = {};
667 
668  const impl::NumberRangeFormatterImpl* getFormatter(UErrorCode& stauts) const;
669 
672 
675 
676  LocalizedNumberRangeFormatter(const impl::RangeMacroProps &macros, const Locale &locale);
677 
679 
680  void clear();
681 
682  // To give the fluent setters access to this class's constructor:
685 
686  // To give UnlocalizedNumberRangeFormatter::locale() access to this class's constructor:
687  friend class UnlocalizedNumberRangeFormatter;
688 };
689 
699  public:
700  // Copybrief: this method is older than the parent method
708  UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
709 
710  // Copydoc: this method is new in ICU 64
712  UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
713 
714  // Copybrief: this method is older than the parent method
722  Appendable &appendTo(Appendable &appendable, UErrorCode& status) const U_OVERRIDE;
723 
724  // Copydoc: this method is new in ICU 64
726  UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
727 
728 #ifndef U_HIDE_DRAFT_API
729 
743  UnicodeString getFirstDecimal(UErrorCode& status) const;
744 
759  UnicodeString getSecondDecimal(UErrorCode& status) const;
760 #endif // U_HIDE_DRAFT_API
761 
771  UNumberRangeIdentityResult getIdentityResult(UErrorCode& status) const;
772 
777 
781  FormattedNumberRange& operator=(const FormattedNumberRange&) = delete;
782 
789 
796 
802 
803  private:
804  // Can't use LocalPointer because UFormattedNumberRangeData is forward-declared
805  const impl::UFormattedNumberRangeData *fData;
806 
807  // Error code for the terminal methods
808  UErrorCode fErrorCode;
809 
813  explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results)
814  : fData(results), fErrorCode(U_ZERO_ERROR) {}
815 
816  explicit FormattedNumberRange(UErrorCode errorCode)
817  : fData(nullptr), fErrorCode(errorCode) {}
818 
819  void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
820 
821  // To give LocalizedNumberRangeFormatter format methods access to this class's constructor:
822  friend class LocalizedNumberRangeFormatter;
823 };
824 
831  public:
839  static UnlocalizedNumberRangeFormatter with();
840 
850  static LocalizedNumberRangeFormatter withLocale(const Locale &locale);
851 
855  NumberRangeFormatter() = delete;
856 };
857 
858 } // namespace number
859 U_NAMESPACE_END
860 
861 #endif /* #if !UCONFIG_NO_FORMATTING */
862 
863 #endif /* U_SHOW_CPLUSPLUS_API */
864 
865 #endif // __NUMBERRANGEFORMATTER_H__
866 
C++ API: Abstract operations for localized strings.
Collapse the unit part of the number, but not the notation, if present.
#define U_OVERRIDE
Defined to the C++11 "override" keyword if available.
Definition: umachine.h:129
#define U_FAILURE(x)
Does the error code indicate a failure?
Definition: utypes.h:709
The result of a number range formatting operation.
C++ API: FieldPosition Iterator.
Used to indicate that the two numbers in the range were equal, even before any rounding rules were ap...
"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...
Show the number using a locale-sensitive approximation pattern.
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
UNumberRangeIdentityResult
Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted i...
No error, no warning.
Definition: utypes.h:449
Used to indicate that the two numbers in the range were equal, but only after rounding rules were app...
An abstract base class for specifying settings related to number formatting.
An abstract formatted value: a string with associated field attributes.
Used to indicate that the two numbers in the range were not equal, even after rounding rules were app...
#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.
Show the number using a locale-sensitive approximation pattern.
UNumberRangeCollapse
Defines how to merge fields that are identical across the range sign.
Show the number as the range of two equal values.
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.
Use locale data and heuristics to determine how much of the string to collapse.
A NumberRangeFormatter that does not yet have a locale.
Do not collapse any part of the number.
#define TRUE
The TRUE value of a UBool.
Definition: umachine.h:265
Show the number as a single value rather than a range.
Represents a span of a string containing a given field.
#define U_NOEXCEPT
"noexcept" if supported, otherwise empty.
Definition: platform.h:529
The number of entries in this enum.
A NumberFormatter that does not yet have a locale.
UnlocalizedNumberFormatter formatter2
UNumberRangeIdentityFallback
Defines the behavior when the two numbers in the range are identical after rounding.
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.
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:294
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:64
UMemory is the common ICU base class.
Definition: uobject.h:115
C++ API: Library for localized number formatting introduced in ICU 60.
Collapse any field that is equal across the range sign.
bool copyErrorTo(UErrorCode &status) const
Check all members for errors.
int8_t UBool
The ICU boolean type.
Definition: umachine.h:261
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