ICU 63.1  63.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 #if !UCONFIG_NO_FORMATTING
5 #ifndef __NUMBERRANGEFORMATTER_H__
6 #define __NUMBERRANGEFORMATTER_H__
7 
8 #include <atomic>
9 #include "unicode/appendable.h"
10 #include "unicode/fieldpos.h"
11 #include "unicode/fpositer.h"
13 
14 #ifndef U_HIDE_DRAFT_API
15 
47 typedef enum UNumberRangeCollapse {
57 
64 
72 
81 
96 
104 
112 
121 
137 
145 
153 
154 #ifndef U_HIDE_INTERNAL_API
155 
160 #endif
161 
163 
165 
166 namespace number { // icu::number
167 
168 // Forward declarations:
169 class UnlocalizedNumberRangeFormatter;
170 class LocalizedNumberRangeFormatter;
171 class FormattedNumberRange;
172 
173 namespace impl {
174 
175 // Forward declarations:
176 struct RangeMacroProps;
177 class DecimalQuantity;
178 struct UFormattedNumberRangeData;
179 class NumberRangeFormatterImpl;
180 
181 } // namespace impl
182 
188 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN && !defined(U_IN_DOXYGEN)
189 template struct U_I18N_API std::atomic<impl::NumberRangeFormatterImpl*>;
190 #endif
191 
193 // Other helper classes would go here, but there are none.
194 
195 namespace impl { // icu::number::impl
196 
197 // Do not enclose entire MacroProps with #ifndef U_HIDE_INTERNAL_API, needed for a protected field
201  UnlocalizedNumberFormatter formatter1; // = NumberFormatter::with();
202 
204  UnlocalizedNumberFormatter formatter2; // = NumberFormatter::with();
205 
207  bool singleFormatter = true;
208 
211 
214 
217 
218  // NOTE: Uses default copy and move constructors.
219 
224  bool copyErrorTo(UErrorCode &status) const {
225  return formatter1.copyErrorTo(status) || formatter2.copyErrorTo(status);
226  }
227 };
228 
229 } // namespace impl
230 
236 template<typename Derived>
238  public:
251  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
252 
262  Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&;
263 
273  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &;
274 
284  Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&;
285 
297  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
298 
308  Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
309 
319  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
320 
330  Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&;
331 
343  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
344 
354  Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
355 
365  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
366 
376  Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&;
377 
395  Derived collapse(UNumberRangeCollapse collapse) const &;
396 
406  Derived collapse(UNumberRangeCollapse collapse) &&;
407 
428  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &;
429 
439  Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&;
440 
447  UBool copyErrorTo(UErrorCode &outErrorCode) const {
448  if (U_FAILURE(outErrorCode)) {
449  // Do not overwrite the older error code
450  return TRUE;
451  }
452  fMacros.copyErrorTo(outErrorCode);
453  return U_FAILURE(outErrorCode);
454  };
455 
456  // NOTE: Uses default copy and move constructors.
457 
458  private:
459  impl::RangeMacroProps fMacros;
460 
461  // Don't construct me directly! Use (Un)LocalizedNumberFormatter.
462  NumberRangeFormatterSettings() = default;
463 
464  friend class LocalizedNumberRangeFormatter;
465  friend class UnlocalizedNumberRangeFormatter;
466 };
467 
476 
477  public:
487  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &;
488 
498  LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&;
499 
506 
512 
519 
525 
532 
533  private:
536 
539 
540  // To give the fluent setters access to this class's constructor:
542 
543  // To give NumberRangeFormatter::with() access to this class's constructor:
544  friend class NumberRangeFormatter;
545 };
546 
555  public:
569  FormattedNumberRange formatFormattableRange(
570  const Formattable& first, const Formattable& second, UErrorCode& status) const;
571 
577  LocalizedNumberRangeFormatter() = default;
578 
584 
591 
597 
604 
605 #ifndef U_HIDE_INTERNAL_API
606 
617  void formatImpl(impl::UFormattedNumberRangeData& results, bool equalBeforeRounding,
618  UErrorCode& status) const;
619 
620 #endif
621 
627 
628  private:
629  std::atomic<impl::NumberRangeFormatterImpl*> fAtomicFormatter = {};
630 
631  const impl::NumberRangeFormatterImpl* getFormatter(UErrorCode& stauts) const;
632 
635 
638 
639  LocalizedNumberRangeFormatter(const impl::RangeMacroProps &macros, const Locale &locale);
640 
642 
643  void clear();
644 
645  // To give the fluent setters access to this class's constructor:
648 
649  // To give UnlocalizedNumberRangeFormatter::locale() access to this class's constructor:
650  friend class UnlocalizedNumberRangeFormatter;
651 };
652 
660  public:
669  UnicodeString toString(UErrorCode& status) const;
670 
682  Appendable &appendTo(Appendable &appendable, UErrorCode& status) const;
683 
713  UBool nextFieldPosition(FieldPosition& fieldPosition, UErrorCode& status) const;
714 
728  void getAllFieldPositions(FieldPositionIterator &iterator, UErrorCode &status) const;
729 
744  UnicodeString getFirstDecimal(UErrorCode& status) const;
745 
760  UnicodeString getSecondDecimal(UErrorCode& status) const;
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 *fResults;
806 
807  // Error code for the terminal methods
808  UErrorCode fErrorCode;
809 
814  explicit FormattedNumberRange(impl::UFormattedNumberRangeData *results)
815  : fResults(results), fErrorCode(U_ZERO_ERROR) {};
816 
817  explicit FormattedNumberRange(UErrorCode errorCode)
818  : fResults(nullptr), fErrorCode(errorCode) {};
819 
820  void getAllFieldPositionsImpl(FieldPositionIteratorHandler& fpih, UErrorCode& status) const;
821 
822  // To give LocalizedNumberRangeFormatter format methods access to this class's constructor:
823  friend class LocalizedNumberRangeFormatter;
824 };
825 
832  public:
840  static UnlocalizedNumberRangeFormatter with();
841 
851  static LocalizedNumberRangeFormatter withLocale(const Locale &locale);
852 
856  NumberRangeFormatter() = delete;
857 };
858 
859 } // namespace number
861 
862 #endif // U_HIDE_DRAFT_API
863 
864 #endif // __NUMBERRANGEFORMATTER_H__
865 
866 #endif /* #if !UCONFIG_NO_FORMATTING */
Collapse the unit part of the number, but not the notation, if present.
#define U_FAILURE(x)
Does the error code indicate a failure?
Definition: utypes.h:699
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...
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:435
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.
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.
#define U_NAMESPACE_BEGIN
This is used to begin a declaration of a public ICU C++ API.
Definition: uversion.h:137
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:55
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:229
Show the number as a single value rather than a range.
#define U_NOEXCEPT
"noexcept" if supported, otherwise empty.
Definition: platform.h:503
The number of entries in this enum.
A NumberFormatter that does not yet have a locale.
#define U_NAMESPACE_END
This is used to end a declaration of a public ICU C++ API.
Definition: uversion.h:138
UnlocalizedNumberFormatter formatter2
UNumberRangeIdentityFallback
Defines the behavior when the two numbers in the range are identical after rounding.
UErrorCode
Error code to replace exception handling, so that the code is compatible with all C++ compilers...
Definition: utypes.h:401
FieldPosition is a simple class used by Format and its subclasses to identify fields in formatted out...
Definition: fieldpos.h:108
UnlocalizedNumberFormatter formatter1
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:289
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:62
UMemory is the common ICU base class.
Definition: uobject.h:109
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:225
Base class for objects to which Unicode characters and strings can be appended.
Definition: appendable.h:51
A Locale object represents a specific geographical, political, or cultural region.
Definition: locid.h:192