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"
17#include "unicode/fpositer.h"
20
48U_NAMESPACE_BEGIN
49
50// Forward declarations:
51class PluralRules;
52
53namespace number { // icu::number
54
55// Forward declarations:
56class UnlocalizedNumberRangeFormatter;
57class LocalizedNumberRangeFormatter;
58class FormattedNumberRange;
59
60namespace impl {
61
62// Forward declarations:
63struct RangeMacroProps;
64class DecimalQuantity;
65class UFormattedNumberRangeData;
66class NumberRangeFormatterImpl;
67struct 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
78U_NAMESPACE_END
79
80template struct U_I18N_API std::atomic< U_NAMESPACE_QUALIFIER number::impl::NumberRangeFormatterImpl*>;
81
82U_NAMESPACE_BEGIN
83namespace number { // icu::number
84#endif
87// Other helper classes would go here, but there are none.
88
89namespace 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
130template<typename Derived>
132 public:
145 Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &;
146
157
168
179
191 Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &;
192
202 Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&;
203
213 Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &;
214
225
237 Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &;
238
248 Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&;
249
259 Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &;
260
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
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.
379
382};
383
394
395 public:
406
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:
490 const Formattable& first, const Formattable& second, UErrorCode& status) const;
491
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:
569};
570
580 public:
581 // Copybrief: this method is older than the parent method
590
591 // Copydoc: this method is new in ICU 64
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
608
628 template<typename StringClass>
629 inline std::pair<StringClass, StringClass> getDecimalNumbers(UErrorCode& status) const;
630
641
647 : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
648
653
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
710template<typename StringClass>
711std::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:
735
746
751};
752
753} // namespace number
754U_NAMESPACE_END
755
756#endif /* #if !UCONFIG_NO_FORMATTING */
757
758#endif /* U_SHOW_CPLUSPLUS_API */
759
760#endif // __NUMBERRANGEFORMATTER_H__
761
C++ API: Appendable class: Sink for Unicode code points and 16-bit code units (char16_ts).
Base class for objects to which Unicode characters and strings can be appended.
Definition: appendable.h:54
A ByteSink can be filled with bytes.
Definition: bytestream.h:53
Represents a span of a string containing a given field.
Formattable objects can be passed to the Format class or its subclasses for formatting.
Definition: fmtable.h:64
An abstract formatted value: a string with associated field attributes.
"Smart pointer" class, deletes objects via the standard C++ delete operator.
Definition: localpointer.h:191
A Locale object represents a specific geographical, political, or cultural region.
Definition: locid.h:195
Implementation of ByteSink that writes to a "string".
Definition: bytestream.h:267
UMemory is the common ICU base class.
Definition: uobject.h:115
UnicodeString is a string class that stores Unicode characters directly and provides similar function...
Definition: unistr.h:296
The result of a number range formatting operation.
UnicodeString toString(UErrorCode &status) const U_OVERRIDE
Returns the formatted string as a self-contained UnicodeString.
FormattedNumberRange(const FormattedNumberRange &)=delete
Copying not supported; use move constructor instead.
FormattedNumberRange(FormattedNumberRange &&src) U_NOEXCEPT
Move constructor: Leaves the source FormattedNumberRange in an undefined state.
UNumberRangeIdentityResult getIdentityResult(UErrorCode &status) const
Returns whether the pair of numbers was successfully formatted as a range or whether an identity fall...
UnicodeString toTempString(UErrorCode &status) const U_OVERRIDE
Returns the formatted string as a read-only alias to memory owned by the FormattedValue.
Appendable & appendTo(Appendable &appendable, UErrorCode &status) const U_OVERRIDE
Appends the formatted string to an Appendable.
FormattedNumberRange & operator=(FormattedNumberRange &&src) U_NOEXCEPT
Move assignment: Leaves the source FormattedNumberRange in an undefined state.
FormattedNumberRange()
Default constructor; makes an empty FormattedNumberRange.
UBool nextPosition(ConstrainedFieldPosition &cfpos, UErrorCode &status) const U_OVERRIDE
Iterates over field positions in the FormattedValue.
~FormattedNumberRange()
Destruct an instance of FormattedNumberRange, cleaning up any memory it might own.
FormattedNumberRange & operator=(const FormattedNumberRange &)=delete
Copying not supported; use move assignment instead.
A NumberRangeFormatter that has a locale associated with it; this means .formatRange() methods are av...
FormattedNumberRange formatFormattableRange(const Formattable &first, const Formattable &second, UErrorCode &status) const
Format the given Formattables to a string using the settings specified in the NumberRangeFormatter fl...
LocalizedNumberRangeFormatter & operator=(const LocalizedNumberRangeFormatter &other)
Copy assignment operator.
LocalizedNumberRangeFormatter()=default
Default constructor: puts the formatter into a valid but undefined state.
LocalizedNumberRangeFormatter(const LocalizedNumberRangeFormatter &other)
Returns a copy of this LocalizedNumberRangeFormatter.
LocalizedNumberRangeFormatter & operator=(LocalizedNumberRangeFormatter &&src) U_NOEXCEPT
Move assignment operator: The source LocalizedNumberRangeFormatter will be left in a valid but undefi...
void formatImpl(impl::UFormattedNumberRangeData &results, bool equalBeforeRounding, UErrorCode &status) const
LocalizedNumberRangeFormatter(LocalizedNumberRangeFormatter &&src) U_NOEXCEPT
Move constructor: The source LocalizedNumberRangeFormatter will be left in a valid but undefined stat...
~LocalizedNumberRangeFormatter()
Destruct this LocalizedNumberRangeFormatter, cleaning up any memory it might own.
UBool copyErrorTo(UErrorCode &outErrorCode) const
Sets the UErrorCode if an error occurred in the fluent chain.
An abstract base class for specifying settings related to number formatting.
Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) &&
Overload of numberFormatterSecond() for use on an rvalue reference.
LocalPointer< Derived > clone() const &
Returns the current (Un)LocalizedNumberRangeFormatter as a LocalPointer wrapping a heap-allocated cop...
Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) const &
Overload of numberFormatterFirst() for use on an rvalue reference.
Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) &&
Overload of numberFormatterBoth() for use on an rvalue reference.
Derived numberFormatterFirst(UnlocalizedNumberFormatter &&formatterFirst) &&
Overload of numberFormatterFirst() for use on an rvalue reference.
Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) &&
Overload of numberFormatterBoth() for use on an rvalue reference.
Derived numberFormatterBoth(const UnlocalizedNumberFormatter &formatter) const &
Sets the NumberFormatter instance to use for the numbers in the range.
Derived numberFormatterBoth(UnlocalizedNumberFormatter &&formatter) const &
Overload of numberFormatterBoth() for use on an rvalue reference.
Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) &&
Overload of numberFormatterFirst() for use on an rvalue reference.
Derived identityFallback(UNumberRangeIdentityFallback identityFallback) const &
Sets the behavior when the two sides of the range are the same.
Derived numberFormatterFirst(const UnlocalizedNumberFormatter &formatterFirst) const &
Sets the NumberFormatter instance to use for the first number in the range.
Derived numberFormatterSecond(UnlocalizedNumberFormatter &&formatterSecond) const &
Overload of numberFormatterSecond() for use on an rvalue reference.
Derived collapse(UNumberRangeCollapse collapse) &&
Overload of collapse() for use on an rvalue reference.
Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) const &
Sets the NumberFormatter instance to use for the second number in the range.
Derived collapse(UNumberRangeCollapse collapse) const &
Sets the aggressiveness of "collapsing" fields across the range separator.
Derived identityFallback(UNumberRangeIdentityFallback identityFallback) &&
Overload of identityFallback() for use on an rvalue reference.
Derived numberFormatterSecond(const UnlocalizedNumberFormatter &formatterSecond) &&
Overload of numberFormatterSecond() for use on an rvalue reference.
See the main description in numberrangeformatter.h for documentation and examples.
static UnlocalizedNumberRangeFormatter with()
Call this method at the beginning of a NumberRangeFormatter fluent chain in which the locale is not c...
NumberRangeFormatter()=delete
Use factory methods instead of the constructor to create a NumberFormatter.
static LocalizedNumberRangeFormatter withLocale(const Locale &locale)
Call this method at the beginning of a NumberRangeFormatter fluent chain in which the locale is known...
A NumberFormatter that does not yet have a locale.
A NumberRangeFormatter that does not yet have a locale.
UnlocalizedNumberRangeFormatter(UnlocalizedNumberRangeFormatter &&src) U_NOEXCEPT
Move constructor: The source UnlocalizedNumberRangeFormatter will be left in a valid but undefined st...
UnlocalizedNumberRangeFormatter(const UnlocalizedNumberRangeFormatter &other)
Returns a copy of this UnlocalizedNumberRangeFormatter.
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) const &
Associate the given locale with the number range formatter.
UnlocalizedNumberRangeFormatter & operator=(const UnlocalizedNumberRangeFormatter &other)
Copy assignment operator.
LocalizedNumberRangeFormatter locale(const icu::Locale &locale) &&
Overload of locale() for use on an rvalue reference.
UnlocalizedNumberRangeFormatter & operator=(UnlocalizedNumberRangeFormatter &&src) U_NOEXCEPT
Move assignment operator: The source UnlocalizedNumberRangeFormatter will be left in a valid but unde...
UnlocalizedNumberRangeFormatter()=default
Default constructor: puts the formatter into a valid but undefined state.
C++ API: FieldPosition identifies the fields in a formatted output.
C++ API: Abstract operations for localized strings.
C++ API: FieldPosition Iterator.
C++ API: All-in-one formatter for localized numbers, currencies, and units.
#define U_NOEXCEPT
"noexcept" if supported, otherwise empty.
Definition: platform.h:529
UnlocalizedNumberFormatter formatter2
UnlocalizedNumberFormatter formatter1
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
#define U_OVERRIDE
Defined to the C++11 "override" keyword if available.
Definition: umachine.h:130
C API: Localized number range formatting.
UNumberRangeIdentityResult
Used in the result class FormattedNumberRange to indicate to the user whether the numbers formatted i...
UNumberRangeIdentityFallback
Defines the behavior when the two numbers in the range are identical after rounding.
@ UNUM_IDENTITY_FALLBACK_APPROXIMATELY
Show the number using a locale-sensitive approximation pattern.
UNumberRangeCollapse
Defines how to merge fields that are identical across the range sign.
@ UNUM_RANGE_COLLAPSE_AUTO
Use locale data and heuristics to determine how much of the string to collapse.
Basic definitions for ICU, for both C and C++ APIs.
UErrorCode
Standard ICU4C error code type, a substitute for exceptions.
Definition: utypes.h:415
@ U_INVALID_STATE_ERROR
Requested operation can not be completed with ICU in its current state.
Definition: utypes.h:478
@ U_ZERO_ERROR
No error, no warning.
Definition: utypes.h:449
#define U_FAILURE(x)
Does the error code indicate a failure?
Definition: utypes.h:717
#define U_I18N_API
Set to export library symbols from inside the i18n library, and to import them from outside.
Definition: utypes.h:301