ICU 65.1  65.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 
452 #ifndef U_HIDE_DRAFT_API
453 
464  LocalPointer<Derived> clone() const &;
465 
473  LocalPointer<Derived> clone() &&;
474 #endif /* U_HIDE_DRAFT_API */
475 
482  UBool copyErrorTo(UErrorCode &outErrorCode) const {
483  if (U_FAILURE(outErrorCode)) {
484  // Do not overwrite the older error code
485  return TRUE;
486  }
487  fMacros.copyErrorTo(outErrorCode);
488  return U_FAILURE(outErrorCode);
489  }
490 
491  // NOTE: Uses default copy and move constructors.
492 
493  private:
494  impl::RangeMacroProps fMacros;
495 
496  // Don't construct me directly! Use (Un)LocalizedNumberFormatter.
497  NumberRangeFormatterSettings() = default;
498 
499  friend class LocalizedNumberRangeFormatter;
500  friend class UnlocalizedNumberRangeFormatter;
501 };
502 
513 
514  public:
524  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
525 
535  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
536 
543 
549 
556 
562 
569 
570  private:
573 
576 
577  // To give the fluent setters access to this class's constructor:
579 
580  // To give NumberRangeFormatter::with() access to this class's constructor:
581  friend class NumberRangeFormatter;
582 };
583 
594  public:
608  FormattedNumberRange formatFormattableRange(
609  const Formattable& first, const Formattable& second, UErrorCode& status) const;
610 
616  LocalizedNumberRangeFormatter() = default;
617 
623 
630 
636 
643 
644 #ifndef U_HIDE_INTERNAL_API
645 
656  void formatImpl(impl::UFormattedNumberRangeData& results, bool equalBeforeRounding,
657  UErrorCode& status) const;
658 
659 #endif /* U_HIDE_INTERNAL_API */
660 
666 
667  private:
668  std::atomic<impl::NumberRangeFormatterImpl*> fAtomicFormatter = {};
669 
670  const impl::NumberRangeFormatterImpl* getFormatter(UErrorCode& stauts) const;
671 
674 
677 
678  LocalizedNumberRangeFormatter(const impl::RangeMacroProps &macros, const Locale &locale);
679 
681 
682  void clear();
683 
684  // To give the fluent setters access to this class's constructor:
687 
688  // To give UnlocalizedNumberRangeFormatter::locale() access to this class's constructor:
689  friend class UnlocalizedNumberRangeFormatter;
690 };
691 
701  public:
702  // Copybrief: this method is older than the parent method
710  UnicodeString toString(UErrorCode& status) const U_OVERRIDE;
711 
712  // Copydoc: this method is new in ICU 64
714  UnicodeString toTempString(UErrorCode& status) const U_OVERRIDE;
715 
716  // Copybrief: this method is older than the parent method
724  Appendable &appendTo(Appendable &appendable, UErrorCode& status) const U_OVERRIDE;
725 
726  // Copydoc: this method is new in ICU 64
728  UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const U_OVERRIDE;
729 
730 #ifndef U_HIDE_DRAFT_API
731 
760  UBool nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const;
761 
775  void getAllFieldPositions(FieldPositionIterator &iterator, UErrorCode &status) const;
776 
791  UnicodeString getFirstDecimal(UErrorCode& status) const;
792 
807  UnicodeString getSecondDecimal(UErrorCode& status) const;
808 #endif // U_HIDE_DRAFT_API
809 
819  UNumberRangeIdentityResult getIdentityResult(UErrorCode& status) const;
820 
825 
829  FormattedNumberRange& operator=(const FormattedNumberRange&) = delete;
830 
837 
844 
850 
851  private:
852  // Can't use LocalPointer because UFormattedNumberRangeData is forward-declared
853  const impl::UFormattedNumberRangeData *fData;
854 
855  // Error code for the terminal methods
856  UErrorCode fErrorCode;
857 
861  explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results)
862  : fData(results), fErrorCode(U_ZERO_ERROR) {}
863 
864  explicit FormattedNumberRange(UErrorCode errorCode)
865  : fData(nullptr), fErrorCode(errorCode) {}
866 
867  void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
868 
869  // To give LocalizedNumberRangeFormatter format methods access to this class's constructor:
870  friend class LocalizedNumberRangeFormatter;
871 };
872 
879  public:
887  static UnlocalizedNumberRangeFormatter with();
888 
898  static LocalizedNumberRangeFormatter withLocale(const Locale &locale);
899 
903  NumberRangeFormatter() = delete;
904 };
905 
906 } // namespace number
907 U_NAMESPACE_END
908 
909 #endif /* #if !UCONFIG_NO_FORMATTING */
910 
911 #endif /* U_SHOW_CPLUSPLUS_API */
912 
913 #endif // __NUMBERRANGEFORMATTER_H__
914 
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.
FieldPositionIterator returns the field ids and their start/limit positions generated by a call to Fo...
Definition: fpositer.h:58
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
FieldPosition is a simple class used by Format and its subclasses to identify fields in formatted out...
Definition: fieldpos.h:110
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