xref: /aosp_15_r20/external/icu/libicu/cts_headers/quantityformatter.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /*
4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2014-2016, International Business Machines
6*0e209d39SAndroid Build Coastguard Worker * Corporation and others.  All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************
8*0e209d39SAndroid Build Coastguard Worker * quantityformatter.h
9*0e209d39SAndroid Build Coastguard Worker */
10*0e209d39SAndroid Build Coastguard Worker 
11*0e209d39SAndroid Build Coastguard Worker #ifndef __QUANTITY_FORMATTER_H__
12*0e209d39SAndroid Build Coastguard Worker #define __QUANTITY_FORMATTER_H__
13*0e209d39SAndroid Build Coastguard Worker 
14*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
15*0e209d39SAndroid Build Coastguard Worker #include "unicode/uobject.h"
16*0e209d39SAndroid Build Coastguard Worker 
17*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING
18*0e209d39SAndroid Build Coastguard Worker 
19*0e209d39SAndroid Build Coastguard Worker #include "standardplural.h"
20*0e209d39SAndroid Build Coastguard Worker 
21*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
22*0e209d39SAndroid Build Coastguard Worker 
23*0e209d39SAndroid Build Coastguard Worker class SimpleFormatter;
24*0e209d39SAndroid Build Coastguard Worker class UnicodeString;
25*0e209d39SAndroid Build Coastguard Worker class PluralRules;
26*0e209d39SAndroid Build Coastguard Worker class NumberFormat;
27*0e209d39SAndroid Build Coastguard Worker class Formattable;
28*0e209d39SAndroid Build Coastguard Worker class FieldPosition;
29*0e209d39SAndroid Build Coastguard Worker class FormattedStringBuilder;
30*0e209d39SAndroid Build Coastguard Worker 
31*0e209d39SAndroid Build Coastguard Worker /**
32*0e209d39SAndroid Build Coastguard Worker  * A plural aware formatter that is good for expressing a single quantity and
33*0e209d39SAndroid Build Coastguard Worker  * a unit.
34*0e209d39SAndroid Build Coastguard Worker  * <p>
35*0e209d39SAndroid Build Coastguard Worker  * First use the add() methods to add a pattern for each plural variant.
36*0e209d39SAndroid Build Coastguard Worker  * There must be a pattern for the "other" variant.
37*0e209d39SAndroid Build Coastguard Worker  * Then use the format() method.
38*0e209d39SAndroid Build Coastguard Worker  * <p>
39*0e209d39SAndroid Build Coastguard Worker  * Concurrent calls only to const methods on a QuantityFormatter object are
40*0e209d39SAndroid Build Coastguard Worker  * safe, but concurrent const and non-const method calls on a QuantityFormatter
41*0e209d39SAndroid Build Coastguard Worker  * object are not safe and require synchronization.
42*0e209d39SAndroid Build Coastguard Worker  *
43*0e209d39SAndroid Build Coastguard Worker  */
44*0e209d39SAndroid Build Coastguard Worker class U_I18N_API QuantityFormatter : public UMemory {
45*0e209d39SAndroid Build Coastguard Worker public:
46*0e209d39SAndroid Build Coastguard Worker     /**
47*0e209d39SAndroid Build Coastguard Worker      * Default constructor.
48*0e209d39SAndroid Build Coastguard Worker      */
49*0e209d39SAndroid Build Coastguard Worker     QuantityFormatter();
50*0e209d39SAndroid Build Coastguard Worker 
51*0e209d39SAndroid Build Coastguard Worker     /**
52*0e209d39SAndroid Build Coastguard Worker      * Copy constructor.
53*0e209d39SAndroid Build Coastguard Worker      */
54*0e209d39SAndroid Build Coastguard Worker     QuantityFormatter(const QuantityFormatter& other);
55*0e209d39SAndroid Build Coastguard Worker 
56*0e209d39SAndroid Build Coastguard Worker     /**
57*0e209d39SAndroid Build Coastguard Worker      * Assignment operator
58*0e209d39SAndroid Build Coastguard Worker      */
59*0e209d39SAndroid Build Coastguard Worker     QuantityFormatter &operator=(const QuantityFormatter& other);
60*0e209d39SAndroid Build Coastguard Worker 
61*0e209d39SAndroid Build Coastguard Worker     /**
62*0e209d39SAndroid Build Coastguard Worker      * Destructor.
63*0e209d39SAndroid Build Coastguard Worker      */
64*0e209d39SAndroid Build Coastguard Worker     ~QuantityFormatter();
65*0e209d39SAndroid Build Coastguard Worker 
66*0e209d39SAndroid Build Coastguard Worker     /**
67*0e209d39SAndroid Build Coastguard Worker      * Removes all variants from this object including the "other" variant.
68*0e209d39SAndroid Build Coastguard Worker      */
69*0e209d39SAndroid Build Coastguard Worker     void reset();
70*0e209d39SAndroid Build Coastguard Worker 
71*0e209d39SAndroid Build Coastguard Worker     /**
72*0e209d39SAndroid Build Coastguard Worker      * Adds a plural variant if there is none yet for the plural form.
73*0e209d39SAndroid Build Coastguard Worker      *
74*0e209d39SAndroid Build Coastguard Worker      * @param variant "zero", "one", "two", "few", "many", "other"
75*0e209d39SAndroid Build Coastguard Worker      * @param rawPattern the pattern for the variant e.g "{0} meters"
76*0e209d39SAndroid Build Coastguard Worker      * @param status any error returned here.
77*0e209d39SAndroid Build Coastguard Worker      * @return true on success; false if status was set to a non zero error.
78*0e209d39SAndroid Build Coastguard Worker      */
79*0e209d39SAndroid Build Coastguard Worker     UBool addIfAbsent(const char *variant, const UnicodeString &rawPattern, UErrorCode &status);
80*0e209d39SAndroid Build Coastguard Worker 
81*0e209d39SAndroid Build Coastguard Worker     /**
82*0e209d39SAndroid Build Coastguard Worker      * returns true if this object has at least the "other" variant.
83*0e209d39SAndroid Build Coastguard Worker      */
84*0e209d39SAndroid Build Coastguard Worker     UBool isValid() const;
85*0e209d39SAndroid Build Coastguard Worker 
86*0e209d39SAndroid Build Coastguard Worker     /**
87*0e209d39SAndroid Build Coastguard Worker      * Gets the pattern formatter that would be used for a particular variant.
88*0e209d39SAndroid Build Coastguard Worker      * If isValid() returns true, this method is guaranteed to return a
89*0e209d39SAndroid Build Coastguard Worker      * non-nullptr value.
90*0e209d39SAndroid Build Coastguard Worker      */
91*0e209d39SAndroid Build Coastguard Worker     const SimpleFormatter *getByVariant(const char *variant) const;
92*0e209d39SAndroid Build Coastguard Worker 
93*0e209d39SAndroid Build Coastguard Worker     /**
94*0e209d39SAndroid Build Coastguard Worker      * Formats a number with this object appending the result to appendTo.
95*0e209d39SAndroid Build Coastguard Worker      * At least the "other" variant must be added to this object for this
96*0e209d39SAndroid Build Coastguard Worker      * method to work.
97*0e209d39SAndroid Build Coastguard Worker      *
98*0e209d39SAndroid Build Coastguard Worker      * @param number the single number.
99*0e209d39SAndroid Build Coastguard Worker      * @param fmt formats the number
100*0e209d39SAndroid Build Coastguard Worker      * @param rules computes the plural variant to use.
101*0e209d39SAndroid Build Coastguard Worker      * @param appendTo result appended here.
102*0e209d39SAndroid Build Coastguard Worker      * @param status any error returned here.
103*0e209d39SAndroid Build Coastguard Worker      * @return appendTo
104*0e209d39SAndroid Build Coastguard Worker      */
105*0e209d39SAndroid Build Coastguard Worker     UnicodeString &format(
106*0e209d39SAndroid Build Coastguard Worker             const Formattable &number,
107*0e209d39SAndroid Build Coastguard Worker             const NumberFormat &fmt,
108*0e209d39SAndroid Build Coastguard Worker             const PluralRules &rules,
109*0e209d39SAndroid Build Coastguard Worker             UnicodeString &appendTo,
110*0e209d39SAndroid Build Coastguard Worker             FieldPosition &pos,
111*0e209d39SAndroid Build Coastguard Worker             UErrorCode &status) const;
112*0e209d39SAndroid Build Coastguard Worker 
113*0e209d39SAndroid Build Coastguard Worker     /**
114*0e209d39SAndroid Build Coastguard Worker      * Selects the standard plural form for the number/formatter/rules.
115*0e209d39SAndroid Build Coastguard Worker      * Used in MeasureFormat for backwards compatibility with NumberFormat.
116*0e209d39SAndroid Build Coastguard Worker      */
117*0e209d39SAndroid Build Coastguard Worker     static StandardPlural::Form selectPlural(
118*0e209d39SAndroid Build Coastguard Worker             const Formattable &number,
119*0e209d39SAndroid Build Coastguard Worker             const NumberFormat &fmt,
120*0e209d39SAndroid Build Coastguard Worker             const PluralRules &rules,
121*0e209d39SAndroid Build Coastguard Worker             UnicodeString &formattedNumber,
122*0e209d39SAndroid Build Coastguard Worker             FieldPosition &pos,
123*0e209d39SAndroid Build Coastguard Worker             UErrorCode &status);
124*0e209d39SAndroid Build Coastguard Worker 
125*0e209d39SAndroid Build Coastguard Worker     /**
126*0e209d39SAndroid Build Coastguard Worker      * Formats a quantity and selects its plural form. The output is appended
127*0e209d39SAndroid Build Coastguard Worker      * to a FormattedStringBuilder in order to retain field information.
128*0e209d39SAndroid Build Coastguard Worker      *
129*0e209d39SAndroid Build Coastguard Worker      * @param quantity The number to format.
130*0e209d39SAndroid Build Coastguard Worker      * @param fmt The formatter to use to format the number.
131*0e209d39SAndroid Build Coastguard Worker      * @param rules The rules to use to select the plural form of the
132*0e209d39SAndroid Build Coastguard Worker      *              formatted number.
133*0e209d39SAndroid Build Coastguard Worker      * @param output Where to append the result of the format operation.
134*0e209d39SAndroid Build Coastguard Worker      * @param pluralForm Output variable populated with the plural form of the
135*0e209d39SAndroid Build Coastguard Worker      *                   formatted number.
136*0e209d39SAndroid Build Coastguard Worker      * @param status Set if an error occurs.
137*0e209d39SAndroid Build Coastguard Worker      */
138*0e209d39SAndroid Build Coastguard Worker     static void formatAndSelect(
139*0e209d39SAndroid Build Coastguard Worker             double quantity,
140*0e209d39SAndroid Build Coastguard Worker             const NumberFormat& fmt,
141*0e209d39SAndroid Build Coastguard Worker             const PluralRules& rules,
142*0e209d39SAndroid Build Coastguard Worker             FormattedStringBuilder& output,
143*0e209d39SAndroid Build Coastguard Worker             StandardPlural::Form& pluralForm,
144*0e209d39SAndroid Build Coastguard Worker             UErrorCode& status);
145*0e209d39SAndroid Build Coastguard Worker 
146*0e209d39SAndroid Build Coastguard Worker     /**
147*0e209d39SAndroid Build Coastguard Worker      * Formats the pattern with the value and adjusts the FieldPosition.
148*0e209d39SAndroid Build Coastguard Worker      * TODO: Remove?
149*0e209d39SAndroid Build Coastguard Worker      */
150*0e209d39SAndroid Build Coastguard Worker     static UnicodeString &format(
151*0e209d39SAndroid Build Coastguard Worker             const SimpleFormatter &pattern,
152*0e209d39SAndroid Build Coastguard Worker             const UnicodeString &value,
153*0e209d39SAndroid Build Coastguard Worker             UnicodeString &appendTo,
154*0e209d39SAndroid Build Coastguard Worker             FieldPosition &pos,
155*0e209d39SAndroid Build Coastguard Worker             UErrorCode &status);
156*0e209d39SAndroid Build Coastguard Worker 
157*0e209d39SAndroid Build Coastguard Worker private:
158*0e209d39SAndroid Build Coastguard Worker     SimpleFormatter *formatters[StandardPlural::COUNT];
159*0e209d39SAndroid Build Coastguard Worker };
160*0e209d39SAndroid Build Coastguard Worker 
161*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
162*0e209d39SAndroid Build Coastguard Worker 
163*0e209d39SAndroid Build Coastguard Worker #endif
164*0e209d39SAndroid Build Coastguard Worker 
165*0e209d39SAndroid Build Coastguard Worker #endif
166