xref: /aosp_15_r20/external/icu/libicu/cts_headers/unicode/msgfmt.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 * Copyright (C) 2007-2013, International Business Machines Corporation and
5*0e209d39SAndroid Build Coastguard Worker * others. All Rights Reserved.
6*0e209d39SAndroid Build Coastguard Worker ********************************************************************************
7*0e209d39SAndroid Build Coastguard Worker *
8*0e209d39SAndroid Build Coastguard Worker * File MSGFMT.H
9*0e209d39SAndroid Build Coastguard Worker *
10*0e209d39SAndroid Build Coastguard Worker * Modification History:
11*0e209d39SAndroid Build Coastguard Worker *
12*0e209d39SAndroid Build Coastguard Worker *   Date        Name        Description
13*0e209d39SAndroid Build Coastguard Worker *   02/19/97    aliu        Converted from java.
14*0e209d39SAndroid Build Coastguard Worker *   03/20/97    helena      Finished first cut of implementation.
15*0e209d39SAndroid Build Coastguard Worker *   07/22/98    stephen     Removed operator!= (defined in Format)
16*0e209d39SAndroid Build Coastguard Worker *   08/19/2002  srl         Removing Javaisms
17*0e209d39SAndroid Build Coastguard Worker *******************************************************************************/
18*0e209d39SAndroid Build Coastguard Worker 
19*0e209d39SAndroid Build Coastguard Worker #ifndef MSGFMT_H
20*0e209d39SAndroid Build Coastguard Worker #define MSGFMT_H
21*0e209d39SAndroid Build Coastguard Worker 
22*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
23*0e209d39SAndroid Build Coastguard Worker 
24*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API
25*0e209d39SAndroid Build Coastguard Worker 
26*0e209d39SAndroid Build Coastguard Worker /**
27*0e209d39SAndroid Build Coastguard Worker  * \file
28*0e209d39SAndroid Build Coastguard Worker  * \brief C++ API: Formats messages in a language-neutral way.
29*0e209d39SAndroid Build Coastguard Worker  */
30*0e209d39SAndroid Build Coastguard Worker 
31*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING
32*0e209d39SAndroid Build Coastguard Worker 
33*0e209d39SAndroid Build Coastguard Worker #include "unicode/format.h"
34*0e209d39SAndroid Build Coastguard Worker #include "unicode/locid.h"
35*0e209d39SAndroid Build Coastguard Worker #include "unicode/messagepattern.h"
36*0e209d39SAndroid Build Coastguard Worker #include "unicode/parseerr.h"
37*0e209d39SAndroid Build Coastguard Worker #include "unicode/plurfmt.h"
38*0e209d39SAndroid Build Coastguard Worker #include "unicode/plurrule.h"
39*0e209d39SAndroid Build Coastguard Worker 
40*0e209d39SAndroid Build Coastguard Worker U_CDECL_BEGIN
41*0e209d39SAndroid Build Coastguard Worker // Forward declaration.
42*0e209d39SAndroid Build Coastguard Worker struct UHashtable;
43*0e209d39SAndroid Build Coastguard Worker typedef struct UHashtable UHashtable; /**< @internal */
44*0e209d39SAndroid Build Coastguard Worker U_CDECL_END
45*0e209d39SAndroid Build Coastguard Worker 
46*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
47*0e209d39SAndroid Build Coastguard Worker 
48*0e209d39SAndroid Build Coastguard Worker class AppendableWrapper;
49*0e209d39SAndroid Build Coastguard Worker class DateFormat;
50*0e209d39SAndroid Build Coastguard Worker class NumberFormat;
51*0e209d39SAndroid Build Coastguard Worker 
52*0e209d39SAndroid Build Coastguard Worker /**
53*0e209d39SAndroid Build Coastguard Worker  * <p>MessageFormat prepares strings for display to users,
54*0e209d39SAndroid Build Coastguard Worker  * with optional arguments (variables/placeholders).
55*0e209d39SAndroid Build Coastguard Worker  * The arguments can occur in any order, which is necessary for translation
56*0e209d39SAndroid Build Coastguard Worker  * into languages with different grammars.
57*0e209d39SAndroid Build Coastguard Worker  *
58*0e209d39SAndroid Build Coastguard Worker  * <p>A MessageFormat is constructed from a <em>pattern</em> string
59*0e209d39SAndroid Build Coastguard Worker  * with arguments in {curly braces} which will be replaced by formatted values.
60*0e209d39SAndroid Build Coastguard Worker  *
61*0e209d39SAndroid Build Coastguard Worker  * <p><code>MessageFormat</code> differs from the other <code>Format</code>
62*0e209d39SAndroid Build Coastguard Worker  * classes in that you create a <code>MessageFormat</code> object with one
63*0e209d39SAndroid Build Coastguard Worker  * of its constructors (not with a <code>createInstance</code> style factory
64*0e209d39SAndroid Build Coastguard Worker  * method). Factory methods aren't necessary because <code>MessageFormat</code>
65*0e209d39SAndroid Build Coastguard Worker  * itself doesn't implement locale-specific behavior. Any locale-specific
66*0e209d39SAndroid Build Coastguard Worker  * behavior is defined by the pattern that you provide and the
67*0e209d39SAndroid Build Coastguard Worker  * subformats used for inserted arguments.
68*0e209d39SAndroid Build Coastguard Worker  *
69*0e209d39SAndroid Build Coastguard Worker  * <p>Arguments can be named (using identifiers) or numbered (using small ASCII-digit integers).
70*0e209d39SAndroid Build Coastguard Worker  * Some of the API methods work only with argument numbers and throw an exception
71*0e209d39SAndroid Build Coastguard Worker  * if the pattern has named arguments (see {@link #usesNamedArguments()}).
72*0e209d39SAndroid Build Coastguard Worker  *
73*0e209d39SAndroid Build Coastguard Worker  * <p>An argument might not specify any format type. In this case,
74*0e209d39SAndroid Build Coastguard Worker  * a numeric value is formatted with a default (for the locale) NumberFormat,
75*0e209d39SAndroid Build Coastguard Worker  * and a date/time value is formatted with a default (for the locale) DateFormat.
76*0e209d39SAndroid Build Coastguard Worker  *
77*0e209d39SAndroid Build Coastguard Worker  * <p>An argument might specify a "simple" type for which the specified
78*0e209d39SAndroid Build Coastguard Worker  * Format object is created, cached and used.
79*0e209d39SAndroid Build Coastguard Worker  *
80*0e209d39SAndroid Build Coastguard Worker  * <p>An argument might have a "complex" type with nested MessageFormat sub-patterns.
81*0e209d39SAndroid Build Coastguard Worker  * During formatting, one of these sub-messages is selected according to the argument value
82*0e209d39SAndroid Build Coastguard Worker  * and recursively formatted.
83*0e209d39SAndroid Build Coastguard Worker  *
84*0e209d39SAndroid Build Coastguard Worker  * <p>After construction, a custom Format object can be set for
85*0e209d39SAndroid Build Coastguard Worker  * a top-level argument, overriding the default formatting and parsing behavior
86*0e209d39SAndroid Build Coastguard Worker  * for that argument.
87*0e209d39SAndroid Build Coastguard Worker  * However, custom formatting can be achieved more simply by writing
88*0e209d39SAndroid Build Coastguard Worker  * a typeless argument in the pattern string
89*0e209d39SAndroid Build Coastguard Worker  * and supplying it with a preformatted string value.
90*0e209d39SAndroid Build Coastguard Worker  *
91*0e209d39SAndroid Build Coastguard Worker  * <p>When formatting, MessageFormat takes a collection of argument values
92*0e209d39SAndroid Build Coastguard Worker  * and writes an output string.
93*0e209d39SAndroid Build Coastguard Worker  * The argument values may be passed as an array
94*0e209d39SAndroid Build Coastguard Worker  * (when the pattern contains only numbered arguments)
95*0e209d39SAndroid Build Coastguard Worker  * or as an array of names and and an array of arguments (which works for both named
96*0e209d39SAndroid Build Coastguard Worker  * and numbered arguments).
97*0e209d39SAndroid Build Coastguard Worker  *
98*0e209d39SAndroid Build Coastguard Worker  * <p>Each argument is matched with one of the input values by array index or argument name
99*0e209d39SAndroid Build Coastguard Worker  * and formatted according to its pattern specification
100*0e209d39SAndroid Build Coastguard Worker  * (or using a custom Format object if one was set).
101*0e209d39SAndroid Build Coastguard Worker  * A numbered pattern argument is matched with an argument name that contains that number
102*0e209d39SAndroid Build Coastguard Worker  * as an ASCII-decimal-digit string (without leading zero).
103*0e209d39SAndroid Build Coastguard Worker  *
104*0e209d39SAndroid Build Coastguard Worker  * <h4><a name="patterns">Patterns and Their Interpretation</a></h4>
105*0e209d39SAndroid Build Coastguard Worker  *
106*0e209d39SAndroid Build Coastguard Worker  * <code>MessageFormat</code> uses patterns of the following form:
107*0e209d39SAndroid Build Coastguard Worker  * <pre>
108*0e209d39SAndroid Build Coastguard Worker  * message = messageText (argument messageText)*
109*0e209d39SAndroid Build Coastguard Worker  * argument = noneArg | simpleArg | complexArg
110*0e209d39SAndroid Build Coastguard Worker  * complexArg = choiceArg | pluralArg | selectArg | selectordinalArg
111*0e209d39SAndroid Build Coastguard Worker  *
112*0e209d39SAndroid Build Coastguard Worker  * noneArg = '{' argNameOrNumber '}'
113*0e209d39SAndroid Build Coastguard Worker  * simpleArg = '{' argNameOrNumber ',' argType [',' argStyle] '}'
114*0e209d39SAndroid Build Coastguard Worker  * choiceArg = '{' argNameOrNumber ',' "choice" ',' choiceStyle '}'
115*0e209d39SAndroid Build Coastguard Worker  * pluralArg = '{' argNameOrNumber ',' "plural" ',' pluralStyle '}'
116*0e209d39SAndroid Build Coastguard Worker  * selectArg = '{' argNameOrNumber ',' "select" ',' selectStyle '}'
117*0e209d39SAndroid Build Coastguard Worker  * selectordinalArg = '{' argNameOrNumber ',' "selectordinal" ',' pluralStyle '}'
118*0e209d39SAndroid Build Coastguard Worker  *
119*0e209d39SAndroid Build Coastguard Worker  * choiceStyle: see {@link ChoiceFormat}
120*0e209d39SAndroid Build Coastguard Worker  * pluralStyle: see {@link PluralFormat}
121*0e209d39SAndroid Build Coastguard Worker  * selectStyle: see {@link SelectFormat}
122*0e209d39SAndroid Build Coastguard Worker  *
123*0e209d39SAndroid Build Coastguard Worker  * argNameOrNumber = argName | argNumber
124*0e209d39SAndroid Build Coastguard Worker  * argName = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+
125*0e209d39SAndroid Build Coastguard Worker  * argNumber = '0' | ('1'..'9' ('0'..'9')*)
126*0e209d39SAndroid Build Coastguard Worker  *
127*0e209d39SAndroid Build Coastguard Worker  * argType = "number" | "date" | "time" | "spellout" | "ordinal" | "duration"
128*0e209d39SAndroid Build Coastguard Worker  * argStyle = "short" | "medium" | "long" | "full" | "integer" | "currency" | "percent" | argStyleText | "::" argSkeletonText
129*0e209d39SAndroid Build Coastguard Worker  * </pre>
130*0e209d39SAndroid Build Coastguard Worker  *
131*0e209d39SAndroid Build Coastguard Worker  * <ul>
132*0e209d39SAndroid Build Coastguard Worker  *   <li>messageText can contain quoted literal strings including syntax characters.
133*0e209d39SAndroid Build Coastguard Worker  *       A quoted literal string begins with an ASCII apostrophe and a syntax character
134*0e209d39SAndroid Build Coastguard Worker  *       (usually a {curly brace}) and continues until the next single apostrophe.
135*0e209d39SAndroid Build Coastguard Worker  *       A double ASCII apostrophe inside or outside of a quoted string represents
136*0e209d39SAndroid Build Coastguard Worker  *       one literal apostrophe.
137*0e209d39SAndroid Build Coastguard Worker  *   <li>Quotable syntax characters are the {curly braces} in all messageText parts,
138*0e209d39SAndroid Build Coastguard Worker  *       plus the '#' sign in a messageText immediately inside a pluralStyle,
139*0e209d39SAndroid Build Coastguard Worker  *       and the '|' symbol in a messageText immediately inside a choiceStyle.
140*0e209d39SAndroid Build Coastguard Worker  *   <li>See also {@link #UMessagePatternApostropheMode}
141*0e209d39SAndroid Build Coastguard Worker  *   <li>In argStyleText, every single ASCII apostrophe begins and ends quoted literal text,
142*0e209d39SAndroid Build Coastguard Worker  *       and unquoted {curly braces} must occur in matched pairs.
143*0e209d39SAndroid Build Coastguard Worker  * </ul>
144*0e209d39SAndroid Build Coastguard Worker  *
145*0e209d39SAndroid Build Coastguard Worker  * <p>Recommendation: Use the real apostrophe (single quote) character
146*0e209d39SAndroid Build Coastguard Worker  * \htmlonly&#x2019;\endhtmlonly (U+2019) for
147*0e209d39SAndroid Build Coastguard Worker  * human-readable text, and use the ASCII apostrophe ' (U+0027)
148*0e209d39SAndroid Build Coastguard Worker  * only in program syntax, like quoting in MessageFormat.
149*0e209d39SAndroid Build Coastguard Worker  * See the annotations for U+0027 Apostrophe in The Unicode Standard.
150*0e209d39SAndroid Build Coastguard Worker  *
151*0e209d39SAndroid Build Coastguard Worker  * <p>The <code>choice</code> argument type is deprecated.
152*0e209d39SAndroid Build Coastguard Worker  * Use <code>plural</code> arguments for proper plural selection,
153*0e209d39SAndroid Build Coastguard Worker  * and <code>select</code> arguments for simple selection among a fixed set of choices.
154*0e209d39SAndroid Build Coastguard Worker  *
155*0e209d39SAndroid Build Coastguard Worker  * <p>The <code>argType</code> and <code>argStyle</code> values are used to create
156*0e209d39SAndroid Build Coastguard Worker  * a <code>Format</code> instance for the format element. The following
157*0e209d39SAndroid Build Coastguard Worker  * table shows how the values map to Format instances. Combinations not
158*0e209d39SAndroid Build Coastguard Worker  * shown in the table are illegal. Any <code>argStyleText</code> must
159*0e209d39SAndroid Build Coastguard Worker  * be a valid pattern string for the Format subclass used.
160*0e209d39SAndroid Build Coastguard Worker  *
161*0e209d39SAndroid Build Coastguard Worker  * <p><table border=1>
162*0e209d39SAndroid Build Coastguard Worker  *    <tr>
163*0e209d39SAndroid Build Coastguard Worker  *       <th>argType
164*0e209d39SAndroid Build Coastguard Worker  *       <th>argStyle
165*0e209d39SAndroid Build Coastguard Worker  *       <th>resulting Format object
166*0e209d39SAndroid Build Coastguard Worker  *    <tr>
167*0e209d39SAndroid Build Coastguard Worker  *       <td colspan=2><i>(none)</i>
168*0e209d39SAndroid Build Coastguard Worker  *       <td><code>null</code>
169*0e209d39SAndroid Build Coastguard Worker  *    <tr>
170*0e209d39SAndroid Build Coastguard Worker  *       <td rowspan=6><code>number</code>
171*0e209d39SAndroid Build Coastguard Worker  *       <td><i>(none)</i>
172*0e209d39SAndroid Build Coastguard Worker  *       <td><code>NumberFormat.createInstance(getLocale(), status)</code>
173*0e209d39SAndroid Build Coastguard Worker  *    <tr>
174*0e209d39SAndroid Build Coastguard Worker  *       <td><code>integer</code>
175*0e209d39SAndroid Build Coastguard Worker  *       <td><code>NumberFormat.createInstance(getLocale(), kNumberStyle, status)</code>
176*0e209d39SAndroid Build Coastguard Worker  *    <tr>
177*0e209d39SAndroid Build Coastguard Worker  *       <td><code>currency</code>
178*0e209d39SAndroid Build Coastguard Worker  *       <td><code>NumberFormat.createCurrencyInstance(getLocale(), status)</code>
179*0e209d39SAndroid Build Coastguard Worker  *    <tr>
180*0e209d39SAndroid Build Coastguard Worker  *       <td><code>percent</code>
181*0e209d39SAndroid Build Coastguard Worker  *       <td><code>NumberFormat.createPercentInstance(getLocale(), status)</code>
182*0e209d39SAndroid Build Coastguard Worker  *    <tr>
183*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argStyleText</i>
184*0e209d39SAndroid Build Coastguard Worker  *       <td><code>new DecimalFormat(argStyleText, new DecimalFormatSymbols(getLocale(), status), status)</code>
185*0e209d39SAndroid Build Coastguard Worker  *    <tr>
186*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argSkeletonText</i>
187*0e209d39SAndroid Build Coastguard Worker  *       <td><code>NumberFormatter::forSkeleton(argSkeletonText, status).locale(getLocale()).toFormat(status)</code>
188*0e209d39SAndroid Build Coastguard Worker  *    <tr>
189*0e209d39SAndroid Build Coastguard Worker  *       <td rowspan=7><code>date</code>
190*0e209d39SAndroid Build Coastguard Worker  *       <td><i>(none)</i>
191*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code>
192*0e209d39SAndroid Build Coastguard Worker  *    <tr>
193*0e209d39SAndroid Build Coastguard Worker  *       <td><code>short</code>
194*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createDateInstance(kShort, getLocale(), status)</code>
195*0e209d39SAndroid Build Coastguard Worker  *    <tr>
196*0e209d39SAndroid Build Coastguard Worker  *       <td><code>medium</code>
197*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createDateInstance(kDefault, getLocale(), status)</code>
198*0e209d39SAndroid Build Coastguard Worker  *    <tr>
199*0e209d39SAndroid Build Coastguard Worker  *       <td><code>long</code>
200*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createDateInstance(kLong, getLocale(), status)</code>
201*0e209d39SAndroid Build Coastguard Worker  *    <tr>
202*0e209d39SAndroid Build Coastguard Worker  *       <td><code>full</code>
203*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createDateInstance(kFull, getLocale(), status)</code>
204*0e209d39SAndroid Build Coastguard Worker  *    <tr>
205*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argStyleText</i>
206*0e209d39SAndroid Build Coastguard Worker  *       <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)</code>
207*0e209d39SAndroid Build Coastguard Worker  *    <tr>
208*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argSkeletonText</i>
209*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat::createInstanceForSkeleton(argSkeletonText, getLocale(), status)</code>
210*0e209d39SAndroid Build Coastguard Worker  *    <tr>
211*0e209d39SAndroid Build Coastguard Worker  *       <td rowspan=6><code>time</code>
212*0e209d39SAndroid Build Coastguard Worker  *       <td><i>(none)</i>
213*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createTimeInstance(kDefault, getLocale(), status)</code>
214*0e209d39SAndroid Build Coastguard Worker  *    <tr>
215*0e209d39SAndroid Build Coastguard Worker  *       <td><code>short</code>
216*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createTimeInstance(kShort, getLocale(), status)</code>
217*0e209d39SAndroid Build Coastguard Worker  *    <tr>
218*0e209d39SAndroid Build Coastguard Worker  *       <td><code>medium</code>
219*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createTimeInstance(kDefault, getLocale(), status)</code>
220*0e209d39SAndroid Build Coastguard Worker  *    <tr>
221*0e209d39SAndroid Build Coastguard Worker  *       <td><code>long</code>
222*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createTimeInstance(kLong, getLocale(), status)</code>
223*0e209d39SAndroid Build Coastguard Worker  *    <tr>
224*0e209d39SAndroid Build Coastguard Worker  *       <td><code>full</code>
225*0e209d39SAndroid Build Coastguard Worker  *       <td><code>DateFormat.createTimeInstance(kFull, getLocale(), status)</code>
226*0e209d39SAndroid Build Coastguard Worker  *    <tr>
227*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argStyleText</i>
228*0e209d39SAndroid Build Coastguard Worker  *       <td><code>new SimpleDateFormat(argStyleText, getLocale(), status)</code>
229*0e209d39SAndroid Build Coastguard Worker  *    <tr>
230*0e209d39SAndroid Build Coastguard Worker  *       <td><code>spellout</code>
231*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argStyleText (optional)</i>
232*0e209d39SAndroid Build Coastguard Worker  *       <td><code>new RuleBasedNumberFormat(URBNF_SPELLOUT, getLocale(), status)
233*0e209d39SAndroid Build Coastguard Worker  *           <br/>&nbsp;&nbsp;&nbsp;&nbsp;.setDefaultRuleset(argStyleText, status);</code>
234*0e209d39SAndroid Build Coastguard Worker  *    <tr>
235*0e209d39SAndroid Build Coastguard Worker  *       <td><code>ordinal</code>
236*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argStyleText (optional)</i>
237*0e209d39SAndroid Build Coastguard Worker  *       <td><code>new RuleBasedNumberFormat(URBNF_ORDINAL, getLocale(), status)
238*0e209d39SAndroid Build Coastguard Worker  *           <br/>&nbsp;&nbsp;&nbsp;&nbsp;.setDefaultRuleset(argStyleText, status);</code>
239*0e209d39SAndroid Build Coastguard Worker  *    <tr>
240*0e209d39SAndroid Build Coastguard Worker  *       <td><code>duration</code>
241*0e209d39SAndroid Build Coastguard Worker  *       <td><i>argStyleText (optional)</i>
242*0e209d39SAndroid Build Coastguard Worker  *       <td><code>new RuleBasedNumberFormat(URBNF_DURATION, getLocale(), status)
243*0e209d39SAndroid Build Coastguard Worker  *           <br/>&nbsp;&nbsp;&nbsp;&nbsp;.setDefaultRuleset(argStyleText, status);</code>
244*0e209d39SAndroid Build Coastguard Worker  * </table>
245*0e209d39SAndroid Build Coastguard Worker  * <p>
246*0e209d39SAndroid Build Coastguard Worker  *
247*0e209d39SAndroid Build Coastguard Worker  * <h4>Argument formatting</h4>
248*0e209d39SAndroid Build Coastguard Worker  *
249*0e209d39SAndroid Build Coastguard Worker  * <p>Arguments are formatted according to their type, using the default
250*0e209d39SAndroid Build Coastguard Worker  * ICU formatters for those types, unless otherwise specified.</p>
251*0e209d39SAndroid Build Coastguard Worker  *
252*0e209d39SAndroid Build Coastguard Worker  * <p>There are also several ways to control the formatting.</p>
253*0e209d39SAndroid Build Coastguard Worker  *
254*0e209d39SAndroid Build Coastguard Worker  * <p>We recommend you use default styles, predefined style values, skeletons,
255*0e209d39SAndroid Build Coastguard Worker  * or preformatted values, but not pattern strings or custom format objects.</p>
256*0e209d39SAndroid Build Coastguard Worker  *
257*0e209d39SAndroid Build Coastguard Worker  * <p>For more details, see the
258*0e209d39SAndroid Build Coastguard Worker  * <a href="https://unicode-org.github.io/icu/userguide/format_parse/messages">ICU User Guide</a>.</p>
259*0e209d39SAndroid Build Coastguard Worker  *
260*0e209d39SAndroid Build Coastguard Worker  * <h4>Usage Information</h4>
261*0e209d39SAndroid Build Coastguard Worker  *
262*0e209d39SAndroid Build Coastguard Worker  * <p>Here are some examples of usage:
263*0e209d39SAndroid Build Coastguard Worker  * Example 1:
264*0e209d39SAndroid Build Coastguard Worker  *
265*0e209d39SAndroid Build Coastguard Worker  * <pre>
266*0e209d39SAndroid Build Coastguard Worker  * \code
267*0e209d39SAndroid Build Coastguard Worker  *     UErrorCode success = U_ZERO_ERROR;
268*0e209d39SAndroid Build Coastguard Worker  *     GregorianCalendar cal(success);
269*0e209d39SAndroid Build Coastguard Worker  *     Formattable arguments[] = {
270*0e209d39SAndroid Build Coastguard Worker  *         7L,
271*0e209d39SAndroid Build Coastguard Worker  *         Formattable( (Date) cal.getTime(success), Formattable::kIsDate),
272*0e209d39SAndroid Build Coastguard Worker  *         "a disturbance in the Force"
273*0e209d39SAndroid Build Coastguard Worker  *     };
274*0e209d39SAndroid Build Coastguard Worker  *
275*0e209d39SAndroid Build Coastguard Worker  *     UnicodeString result;
276*0e209d39SAndroid Build Coastguard Worker  *     MessageFormat::format(
277*0e209d39SAndroid Build Coastguard Worker  *          "At {1,time,::jmm} on {1,date,::dMMMM}, there was {2} on planet {0,number}.",
278*0e209d39SAndroid Build Coastguard Worker  *          arguments, 3, result, success );
279*0e209d39SAndroid Build Coastguard Worker  *
280*0e209d39SAndroid Build Coastguard Worker  *     cout << "result: " << result << endl;
281*0e209d39SAndroid Build Coastguard Worker  *     //<output>: At 4:34 PM on March 23, there was a disturbance
282*0e209d39SAndroid Build Coastguard Worker  *     //             in the Force on planet 7.
283*0e209d39SAndroid Build Coastguard Worker  * \endcode
284*0e209d39SAndroid Build Coastguard Worker  * </pre>
285*0e209d39SAndroid Build Coastguard Worker  *
286*0e209d39SAndroid Build Coastguard Worker  * Typically, the message format will come from resources, and the
287*0e209d39SAndroid Build Coastguard Worker  * arguments will be dynamically set at runtime.
288*0e209d39SAndroid Build Coastguard Worker  *
289*0e209d39SAndroid Build Coastguard Worker  * <p>Example 2:
290*0e209d39SAndroid Build Coastguard Worker  *
291*0e209d39SAndroid Build Coastguard Worker  * <pre>
292*0e209d39SAndroid Build Coastguard Worker  *  \code
293*0e209d39SAndroid Build Coastguard Worker  *     success = U_ZERO_ERROR;
294*0e209d39SAndroid Build Coastguard Worker  *     Formattable testArgs[] = {3L, "MyDisk"};
295*0e209d39SAndroid Build Coastguard Worker  *
296*0e209d39SAndroid Build Coastguard Worker  *     MessageFormat form(
297*0e209d39SAndroid Build Coastguard Worker  *         "The disk \"{1}\" contains {0} file(s).", success );
298*0e209d39SAndroid Build Coastguard Worker  *
299*0e209d39SAndroid Build Coastguard Worker  *     UnicodeString string;
300*0e209d39SAndroid Build Coastguard Worker  *     FieldPosition fpos = 0;
301*0e209d39SAndroid Build Coastguard Worker  *     cout << "format: " << form.format(testArgs, 2, string, fpos, success ) << endl;
302*0e209d39SAndroid Build Coastguard Worker  *
303*0e209d39SAndroid Build Coastguard Worker  *     // output, with different testArgs:
304*0e209d39SAndroid Build Coastguard Worker  *     // output: The disk "MyDisk" contains 0 file(s).
305*0e209d39SAndroid Build Coastguard Worker  *     // output: The disk "MyDisk" contains 1 file(s).
306*0e209d39SAndroid Build Coastguard Worker  *     // output: The disk "MyDisk" contains 1,273 file(s).
307*0e209d39SAndroid Build Coastguard Worker  *  \endcode
308*0e209d39SAndroid Build Coastguard Worker  *  </pre>
309*0e209d39SAndroid Build Coastguard Worker  *
310*0e209d39SAndroid Build Coastguard Worker  *
311*0e209d39SAndroid Build Coastguard Worker  * <p>For messages that include plural forms, you can use a plural argument:
312*0e209d39SAndroid Build Coastguard Worker  * <pre>
313*0e209d39SAndroid Build Coastguard Worker  * \code
314*0e209d39SAndroid Build Coastguard Worker  *  success = U_ZERO_ERROR;
315*0e209d39SAndroid Build Coastguard Worker  *  MessageFormat msgFmt(
316*0e209d39SAndroid Build Coastguard Worker  *       "{num_files, plural, "
317*0e209d39SAndroid Build Coastguard Worker  *       "=0{There are no files on disk \"{disk_name}\".}"
318*0e209d39SAndroid Build Coastguard Worker  *       "=1{There is one file on disk \"{disk_name}\".}"
319*0e209d39SAndroid Build Coastguard Worker  *       "other{There are # files on disk \"{disk_name}\".}}",
320*0e209d39SAndroid Build Coastguard Worker  *      Locale("en"),
321*0e209d39SAndroid Build Coastguard Worker  *      success);
322*0e209d39SAndroid Build Coastguard Worker  *  FieldPosition fpos = 0;
323*0e209d39SAndroid Build Coastguard Worker  *  Formattable testArgs[] = {0L, "MyDisk"};
324*0e209d39SAndroid Build Coastguard Worker  *  UnicodeString testArgsNames[] = {"num_files", "disk_name"};
325*0e209d39SAndroid Build Coastguard Worker  *  UnicodeString result;
326*0e209d39SAndroid Build Coastguard Worker  *  cout << msgFmt.format(testArgs, testArgsNames, 2, result, fpos, 0, success);
327*0e209d39SAndroid Build Coastguard Worker  *  testArgs[0] = 3L;
328*0e209d39SAndroid Build Coastguard Worker  *  cout << msgFmt.format(testArgs, testArgsNames, 2, result, fpos, 0, success);
329*0e209d39SAndroid Build Coastguard Worker  * \endcode
330*0e209d39SAndroid Build Coastguard Worker  * <em>output</em>:
331*0e209d39SAndroid Build Coastguard Worker  * There are no files on disk "MyDisk".
332*0e209d39SAndroid Build Coastguard Worker  * There are 3 files on "MyDisk".
333*0e209d39SAndroid Build Coastguard Worker  * </pre>
334*0e209d39SAndroid Build Coastguard Worker  * See {@link PluralFormat} and {@link PluralRules} for details.
335*0e209d39SAndroid Build Coastguard Worker  *
336*0e209d39SAndroid Build Coastguard Worker  * <h4><a name="synchronization">Synchronization</a></h4>
337*0e209d39SAndroid Build Coastguard Worker  *
338*0e209d39SAndroid Build Coastguard Worker  * <p>MessageFormats are not synchronized.
339*0e209d39SAndroid Build Coastguard Worker  * It is recommended to create separate format instances for each thread.
340*0e209d39SAndroid Build Coastguard Worker  * If multiple threads access a format concurrently, it must be synchronized
341*0e209d39SAndroid Build Coastguard Worker  * externally.
342*0e209d39SAndroid Build Coastguard Worker  *
343*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 2.0
344*0e209d39SAndroid Build Coastguard Worker  */
345*0e209d39SAndroid Build Coastguard Worker class U_I18N_API MessageFormat : public Format {
346*0e209d39SAndroid Build Coastguard Worker public:
347*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_OBSOLETE_API
348*0e209d39SAndroid Build Coastguard Worker     /**
349*0e209d39SAndroid Build Coastguard Worker      * Enum type for kMaxFormat.
350*0e209d39SAndroid Build Coastguard Worker      * @obsolete ICU 3.0.  The 10-argument limit was removed as of ICU 2.6,
351*0e209d39SAndroid Build Coastguard Worker      * rendering this enum type obsolete.
352*0e209d39SAndroid Build Coastguard Worker      */
353*0e209d39SAndroid Build Coastguard Worker     enum EFormatNumber {
354*0e209d39SAndroid Build Coastguard Worker         /**
355*0e209d39SAndroid Build Coastguard Worker          * The maximum number of arguments.
356*0e209d39SAndroid Build Coastguard Worker          * @obsolete ICU 3.0.  The 10-argument limit was removed as of ICU 2.6,
357*0e209d39SAndroid Build Coastguard Worker          * rendering this constant obsolete.
358*0e209d39SAndroid Build Coastguard Worker          */
359*0e209d39SAndroid Build Coastguard Worker         kMaxFormat = 10
360*0e209d39SAndroid Build Coastguard Worker     };
361*0e209d39SAndroid Build Coastguard Worker #endif  /* U_HIDE_OBSOLETE_API */
362*0e209d39SAndroid Build Coastguard Worker 
363*0e209d39SAndroid Build Coastguard Worker     /**
364*0e209d39SAndroid Build Coastguard Worker      * Constructs a new MessageFormat using the given pattern and the
365*0e209d39SAndroid Build Coastguard Worker      * default locale.
366*0e209d39SAndroid Build Coastguard Worker      *
367*0e209d39SAndroid Build Coastguard Worker      * @param pattern   Pattern used to construct object.
368*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
369*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
370*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
371*0e209d39SAndroid Build Coastguard Worker      */
372*0e209d39SAndroid Build Coastguard Worker     MessageFormat(const UnicodeString& pattern,
373*0e209d39SAndroid Build Coastguard Worker                   UErrorCode &status);
374*0e209d39SAndroid Build Coastguard Worker 
375*0e209d39SAndroid Build Coastguard Worker     /**
376*0e209d39SAndroid Build Coastguard Worker      * Constructs a new MessageFormat using the given pattern and locale.
377*0e209d39SAndroid Build Coastguard Worker      * @param pattern   Pattern used to construct object.
378*0e209d39SAndroid Build Coastguard Worker      * @param newLocale The locale to use for formatting dates and numbers.
379*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
380*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
381*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
382*0e209d39SAndroid Build Coastguard Worker      */
383*0e209d39SAndroid Build Coastguard Worker     MessageFormat(const UnicodeString& pattern,
384*0e209d39SAndroid Build Coastguard Worker                   const Locale& newLocale,
385*0e209d39SAndroid Build Coastguard Worker                         UErrorCode& status);
386*0e209d39SAndroid Build Coastguard Worker     /**
387*0e209d39SAndroid Build Coastguard Worker      * Constructs a new MessageFormat using the given pattern and locale.
388*0e209d39SAndroid Build Coastguard Worker      * @param pattern   Pattern used to construct object.
389*0e209d39SAndroid Build Coastguard Worker      * @param newLocale The locale to use for formatting dates and numbers.
390*0e209d39SAndroid Build Coastguard Worker      * @param parseError Struct to receive information on the position
391*0e209d39SAndroid Build Coastguard Worker      *                   of an error within the pattern.
392*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
393*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
394*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
395*0e209d39SAndroid Build Coastguard Worker      */
396*0e209d39SAndroid Build Coastguard Worker     MessageFormat(const UnicodeString& pattern,
397*0e209d39SAndroid Build Coastguard Worker                   const Locale& newLocale,
398*0e209d39SAndroid Build Coastguard Worker                   UParseError& parseError,
399*0e209d39SAndroid Build Coastguard Worker                   UErrorCode& status);
400*0e209d39SAndroid Build Coastguard Worker     /**
401*0e209d39SAndroid Build Coastguard Worker      * Constructs a new MessageFormat from an existing one.
402*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
403*0e209d39SAndroid Build Coastguard Worker      */
404*0e209d39SAndroid Build Coastguard Worker     MessageFormat(const MessageFormat&);
405*0e209d39SAndroid Build Coastguard Worker 
406*0e209d39SAndroid Build Coastguard Worker     /**
407*0e209d39SAndroid Build Coastguard Worker      * Assignment operator.
408*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
409*0e209d39SAndroid Build Coastguard Worker      */
410*0e209d39SAndroid Build Coastguard Worker     const MessageFormat& operator=(const MessageFormat&);
411*0e209d39SAndroid Build Coastguard Worker 
412*0e209d39SAndroid Build Coastguard Worker     /**
413*0e209d39SAndroid Build Coastguard Worker      * Destructor.
414*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
415*0e209d39SAndroid Build Coastguard Worker      */
416*0e209d39SAndroid Build Coastguard Worker     virtual ~MessageFormat();
417*0e209d39SAndroid Build Coastguard Worker 
418*0e209d39SAndroid Build Coastguard Worker     /**
419*0e209d39SAndroid Build Coastguard Worker      * Clones this Format object polymorphically.  The caller owns the
420*0e209d39SAndroid Build Coastguard Worker      * result and should delete it when done.
421*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
422*0e209d39SAndroid Build Coastguard Worker      */
423*0e209d39SAndroid Build Coastguard Worker     virtual MessageFormat* clone() const override;
424*0e209d39SAndroid Build Coastguard Worker 
425*0e209d39SAndroid Build Coastguard Worker     /**
426*0e209d39SAndroid Build Coastguard Worker      * Returns true if the given Format objects are semantically equal.
427*0e209d39SAndroid Build Coastguard Worker      * Objects of different subclasses are considered unequal.
428*0e209d39SAndroid Build Coastguard Worker      * @param other  the object to be compared with.
429*0e209d39SAndroid Build Coastguard Worker      * @return       true if the given Format objects are semantically equal.
430*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
431*0e209d39SAndroid Build Coastguard Worker      */
432*0e209d39SAndroid Build Coastguard Worker     virtual bool operator==(const Format& other) const override;
433*0e209d39SAndroid Build Coastguard Worker 
434*0e209d39SAndroid Build Coastguard Worker     /**
435*0e209d39SAndroid Build Coastguard Worker      * Sets the locale to be used for creating argument Format objects.
436*0e209d39SAndroid Build Coastguard Worker      * @param theLocale    the new locale value to be set.
437*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
438*0e209d39SAndroid Build Coastguard Worker      */
439*0e209d39SAndroid Build Coastguard Worker     virtual void setLocale(const Locale& theLocale);
440*0e209d39SAndroid Build Coastguard Worker 
441*0e209d39SAndroid Build Coastguard Worker     /**
442*0e209d39SAndroid Build Coastguard Worker      * Gets the locale used for creating argument Format objects.
443*0e209d39SAndroid Build Coastguard Worker      * format information.
444*0e209d39SAndroid Build Coastguard Worker      * @return    the locale of the object.
445*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
446*0e209d39SAndroid Build Coastguard Worker      */
447*0e209d39SAndroid Build Coastguard Worker     virtual const Locale& getLocale() const;
448*0e209d39SAndroid Build Coastguard Worker 
449*0e209d39SAndroid Build Coastguard Worker     /**
450*0e209d39SAndroid Build Coastguard Worker      * Applies the given pattern string to this message format.
451*0e209d39SAndroid Build Coastguard Worker      *
452*0e209d39SAndroid Build Coastguard Worker      * @param pattern   The pattern to be applied.
453*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
454*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
455*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
456*0e209d39SAndroid Build Coastguard Worker      */
457*0e209d39SAndroid Build Coastguard Worker     virtual void applyPattern(const UnicodeString& pattern,
458*0e209d39SAndroid Build Coastguard Worker                               UErrorCode& status);
459*0e209d39SAndroid Build Coastguard Worker     /**
460*0e209d39SAndroid Build Coastguard Worker      * Applies the given pattern string to this message format.
461*0e209d39SAndroid Build Coastguard Worker      *
462*0e209d39SAndroid Build Coastguard Worker      * @param pattern    The pattern to be applied.
463*0e209d39SAndroid Build Coastguard Worker      * @param parseError Struct to receive information on the position
464*0e209d39SAndroid Build Coastguard Worker      *                   of an error within the pattern.
465*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
466*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
467*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
468*0e209d39SAndroid Build Coastguard Worker      */
469*0e209d39SAndroid Build Coastguard Worker     virtual void applyPattern(const UnicodeString& pattern,
470*0e209d39SAndroid Build Coastguard Worker                              UParseError& parseError,
471*0e209d39SAndroid Build Coastguard Worker                              UErrorCode& status);
472*0e209d39SAndroid Build Coastguard Worker 
473*0e209d39SAndroid Build Coastguard Worker     /**
474*0e209d39SAndroid Build Coastguard Worker      * Sets the UMessagePatternApostropheMode and the pattern used by this message format.
475*0e209d39SAndroid Build Coastguard Worker      * Parses the pattern and caches Format objects for simple argument types.
476*0e209d39SAndroid Build Coastguard Worker      * Patterns and their interpretation are specified in the
477*0e209d39SAndroid Build Coastguard Worker      * <a href="#patterns">class description</a>.
478*0e209d39SAndroid Build Coastguard Worker      * <p>
479*0e209d39SAndroid Build Coastguard Worker      * This method is best used only once on a given object to avoid confusion about the mode,
480*0e209d39SAndroid Build Coastguard Worker      * and after constructing the object with an empty pattern string to minimize overhead.
481*0e209d39SAndroid Build Coastguard Worker      *
482*0e209d39SAndroid Build Coastguard Worker      * @param pattern    The pattern to be applied.
483*0e209d39SAndroid Build Coastguard Worker      * @param aposMode   The new apostrophe mode.
484*0e209d39SAndroid Build Coastguard Worker      * @param parseError Struct to receive information on the position
485*0e209d39SAndroid Build Coastguard Worker      *                   of an error within the pattern.
486*0e209d39SAndroid Build Coastguard Worker      *                   Can be nullptr.
487*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
488*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
489*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
490*0e209d39SAndroid Build Coastguard Worker      */
491*0e209d39SAndroid Build Coastguard Worker     virtual void applyPattern(const UnicodeString& pattern,
492*0e209d39SAndroid Build Coastguard Worker                               UMessagePatternApostropheMode aposMode,
493*0e209d39SAndroid Build Coastguard Worker                               UParseError* parseError,
494*0e209d39SAndroid Build Coastguard Worker                               UErrorCode& status);
495*0e209d39SAndroid Build Coastguard Worker 
496*0e209d39SAndroid Build Coastguard Worker     /**
497*0e209d39SAndroid Build Coastguard Worker      * @return this instance's UMessagePatternApostropheMode.
498*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
499*0e209d39SAndroid Build Coastguard Worker      */
getApostropheMode()500*0e209d39SAndroid Build Coastguard Worker     UMessagePatternApostropheMode getApostropheMode() const {
501*0e209d39SAndroid Build Coastguard Worker         return msgPattern.getApostropheMode();
502*0e209d39SAndroid Build Coastguard Worker     }
503*0e209d39SAndroid Build Coastguard Worker 
504*0e209d39SAndroid Build Coastguard Worker     /**
505*0e209d39SAndroid Build Coastguard Worker      * Returns a pattern that can be used to recreate this object.
506*0e209d39SAndroid Build Coastguard Worker      *
507*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive the pattern.
508*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
509*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
510*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
511*0e209d39SAndroid Build Coastguard Worker      */
512*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& toPattern(UnicodeString& appendTo) const;
513*0e209d39SAndroid Build Coastguard Worker 
514*0e209d39SAndroid Build Coastguard Worker     /**
515*0e209d39SAndroid Build Coastguard Worker      * Sets subformats.
516*0e209d39SAndroid Build Coastguard Worker      * See the class description about format numbering.
517*0e209d39SAndroid Build Coastguard Worker      * The caller should not delete the Format objects after this call.
518*0e209d39SAndroid Build Coastguard Worker      * <EM>The array formatsToAdopt is not itself adopted.</EM> Its
519*0e209d39SAndroid Build Coastguard Worker      * ownership is retained by the caller. If the call fails because
520*0e209d39SAndroid Build Coastguard Worker      * memory cannot be allocated, then the formats will be deleted
521*0e209d39SAndroid Build Coastguard Worker      * by this method, and this object will remain unchanged.
522*0e209d39SAndroid Build Coastguard Worker      *
523*0e209d39SAndroid Build Coastguard Worker      * <p>If this format uses named arguments, the new formats are discarded
524*0e209d39SAndroid Build Coastguard Worker      * and this format remains unchanged.
525*0e209d39SAndroid Build Coastguard Worker      *
526*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
527*0e209d39SAndroid Build Coastguard Worker      * @param formatsToAdopt    the format to be adopted.
528*0e209d39SAndroid Build Coastguard Worker      * @param count             the size of the array.
529*0e209d39SAndroid Build Coastguard Worker      */
530*0e209d39SAndroid Build Coastguard Worker     virtual void adoptFormats(Format** formatsToAdopt, int32_t count);
531*0e209d39SAndroid Build Coastguard Worker 
532*0e209d39SAndroid Build Coastguard Worker     /**
533*0e209d39SAndroid Build Coastguard Worker      * Sets subformats.
534*0e209d39SAndroid Build Coastguard Worker      * See the class description about format numbering.
535*0e209d39SAndroid Build Coastguard Worker      * Each item in the array is cloned into the internal array.
536*0e209d39SAndroid Build Coastguard Worker      * If the call fails because memory cannot be allocated, then this
537*0e209d39SAndroid Build Coastguard Worker      * object will remain unchanged.
538*0e209d39SAndroid Build Coastguard Worker      *
539*0e209d39SAndroid Build Coastguard Worker      * <p>If this format uses named arguments, the new formats are discarded
540*0e209d39SAndroid Build Coastguard Worker      * and this format remains unchanged.
541*0e209d39SAndroid Build Coastguard Worker      *
542*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
543*0e209d39SAndroid Build Coastguard Worker      * @param newFormats the new format to be set.
544*0e209d39SAndroid Build Coastguard Worker      * @param cnt        the size of the array.
545*0e209d39SAndroid Build Coastguard Worker      */
546*0e209d39SAndroid Build Coastguard Worker     virtual void setFormats(const Format** newFormats, int32_t cnt);
547*0e209d39SAndroid Build Coastguard Worker 
548*0e209d39SAndroid Build Coastguard Worker 
549*0e209d39SAndroid Build Coastguard Worker     /**
550*0e209d39SAndroid Build Coastguard Worker      * Sets one subformat.
551*0e209d39SAndroid Build Coastguard Worker      * See the class description about format numbering.
552*0e209d39SAndroid Build Coastguard Worker      * The caller should not delete the Format object after this call.
553*0e209d39SAndroid Build Coastguard Worker      * If the number is over the number of formats already set,
554*0e209d39SAndroid Build Coastguard Worker      * the item will be deleted and ignored.
555*0e209d39SAndroid Build Coastguard Worker      *
556*0e209d39SAndroid Build Coastguard Worker      * <p>If this format uses named arguments, the new format is discarded
557*0e209d39SAndroid Build Coastguard Worker      * and this format remains unchanged.
558*0e209d39SAndroid Build Coastguard Worker      *
559*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
560*0e209d39SAndroid Build Coastguard Worker      * @param formatNumber     index of the subformat.
561*0e209d39SAndroid Build Coastguard Worker      * @param formatToAdopt    the format to be adopted.
562*0e209d39SAndroid Build Coastguard Worker      */
563*0e209d39SAndroid Build Coastguard Worker     virtual void adoptFormat(int32_t formatNumber, Format* formatToAdopt);
564*0e209d39SAndroid Build Coastguard Worker 
565*0e209d39SAndroid Build Coastguard Worker     /**
566*0e209d39SAndroid Build Coastguard Worker      * Sets one subformat.
567*0e209d39SAndroid Build Coastguard Worker      * See the class description about format numbering.
568*0e209d39SAndroid Build Coastguard Worker      * If the number is over the number of formats already set,
569*0e209d39SAndroid Build Coastguard Worker      * the item will be ignored.
570*0e209d39SAndroid Build Coastguard Worker      * @param formatNumber     index of the subformat.
571*0e209d39SAndroid Build Coastguard Worker      * @param format    the format to be set.
572*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
573*0e209d39SAndroid Build Coastguard Worker      */
574*0e209d39SAndroid Build Coastguard Worker     virtual void setFormat(int32_t formatNumber, const Format& format);
575*0e209d39SAndroid Build Coastguard Worker 
576*0e209d39SAndroid Build Coastguard Worker     /**
577*0e209d39SAndroid Build Coastguard Worker      * Gets format names. This function returns formatNames in StringEnumerations
578*0e209d39SAndroid Build Coastguard Worker      * which can be used with getFormat() and setFormat() to export formattable
579*0e209d39SAndroid Build Coastguard Worker      * array from current MessageFormat to another.  It is the caller's responsibility
580*0e209d39SAndroid Build Coastguard Worker      * to delete the returned formatNames.
581*0e209d39SAndroid Build Coastguard Worker      * @param status  output param set to success/failure code.
582*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
583*0e209d39SAndroid Build Coastguard Worker      */
584*0e209d39SAndroid Build Coastguard Worker     virtual StringEnumeration* getFormatNames(UErrorCode& status);
585*0e209d39SAndroid Build Coastguard Worker 
586*0e209d39SAndroid Build Coastguard Worker     /**
587*0e209d39SAndroid Build Coastguard Worker      * Gets subformat pointer for given format name.
588*0e209d39SAndroid Build Coastguard Worker      * This function supports both named and numbered
589*0e209d39SAndroid Build Coastguard Worker      * arguments. If numbered, the formatName is the
590*0e209d39SAndroid Build Coastguard Worker      * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
591*0e209d39SAndroid Build Coastguard Worker      * The returned Format object should not be deleted by the caller,
592*0e209d39SAndroid Build Coastguard Worker      * nor should the pointer of other object .  The pointer and its
593*0e209d39SAndroid Build Coastguard Worker      * contents remain valid only until the next call to any method
594*0e209d39SAndroid Build Coastguard Worker      * of this class is made with this object.
595*0e209d39SAndroid Build Coastguard Worker      * @param formatName the name or number specifying a format
596*0e209d39SAndroid Build Coastguard Worker      * @param status  output param set to success/failure code.
597*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
598*0e209d39SAndroid Build Coastguard Worker      */
599*0e209d39SAndroid Build Coastguard Worker     virtual Format* getFormat(const UnicodeString& formatName, UErrorCode& status);
600*0e209d39SAndroid Build Coastguard Worker 
601*0e209d39SAndroid Build Coastguard Worker     /**
602*0e209d39SAndroid Build Coastguard Worker      * Sets one subformat for given format name.
603*0e209d39SAndroid Build Coastguard Worker      * See the class description about format name.
604*0e209d39SAndroid Build Coastguard Worker      * This function supports both named and numbered
605*0e209d39SAndroid Build Coastguard Worker      * arguments-- if numbered, the formatName is the
606*0e209d39SAndroid Build Coastguard Worker      * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
607*0e209d39SAndroid Build Coastguard Worker      * If there is no matched formatName or wrong type,
608*0e209d39SAndroid Build Coastguard Worker      * the item will be ignored.
609*0e209d39SAndroid Build Coastguard Worker      * @param formatName  Name of the subformat.
610*0e209d39SAndroid Build Coastguard Worker      * @param format      the format to be set.
611*0e209d39SAndroid Build Coastguard Worker      * @param status  output param set to success/failure code.
612*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
613*0e209d39SAndroid Build Coastguard Worker      */
614*0e209d39SAndroid Build Coastguard Worker     virtual void setFormat(const UnicodeString& formatName, const Format& format, UErrorCode& status);
615*0e209d39SAndroid Build Coastguard Worker 
616*0e209d39SAndroid Build Coastguard Worker     /**
617*0e209d39SAndroid Build Coastguard Worker      * Sets one subformat for given format name.
618*0e209d39SAndroid Build Coastguard Worker      * See the class description about format name.
619*0e209d39SAndroid Build Coastguard Worker      * This function supports both named and numbered
620*0e209d39SAndroid Build Coastguard Worker      * arguments-- if numbered, the formatName is the
621*0e209d39SAndroid Build Coastguard Worker      * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
622*0e209d39SAndroid Build Coastguard Worker      * If there is no matched formatName or wrong type,
623*0e209d39SAndroid Build Coastguard Worker      * the item will be ignored.
624*0e209d39SAndroid Build Coastguard Worker      * The caller should not delete the Format object after this call.
625*0e209d39SAndroid Build Coastguard Worker      * @param formatName  Name of the subformat.
626*0e209d39SAndroid Build Coastguard Worker      * @param formatToAdopt  Format to be adopted.
627*0e209d39SAndroid Build Coastguard Worker      * @param status      output param set to success/failure code.
628*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
629*0e209d39SAndroid Build Coastguard Worker      */
630*0e209d39SAndroid Build Coastguard Worker     virtual void adoptFormat(const UnicodeString& formatName, Format* formatToAdopt, UErrorCode& status);
631*0e209d39SAndroid Build Coastguard Worker 
632*0e209d39SAndroid Build Coastguard Worker     /**
633*0e209d39SAndroid Build Coastguard Worker      * Gets an array of subformats of this object.  The returned array
634*0e209d39SAndroid Build Coastguard Worker      * should not be deleted by the caller, nor should the pointers
635*0e209d39SAndroid Build Coastguard Worker      * within the array.  The array and its contents remain valid only
636*0e209d39SAndroid Build Coastguard Worker      * until the next call to this format. See the class description
637*0e209d39SAndroid Build Coastguard Worker      * about format numbering.
638*0e209d39SAndroid Build Coastguard Worker      *
639*0e209d39SAndroid Build Coastguard Worker      * @param count output parameter to receive the size of the array
640*0e209d39SAndroid Build Coastguard Worker      * @return an array of count Format* objects, or nullptr if out of
641*0e209d39SAndroid Build Coastguard Worker      * memory.  Any or all of the array elements may be nullptr.
642*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
643*0e209d39SAndroid Build Coastguard Worker      */
644*0e209d39SAndroid Build Coastguard Worker     virtual const Format** getFormats(int32_t& count) const;
645*0e209d39SAndroid Build Coastguard Worker 
646*0e209d39SAndroid Build Coastguard Worker 
647*0e209d39SAndroid Build Coastguard Worker     using Format::format;
648*0e209d39SAndroid Build Coastguard Worker 
649*0e209d39SAndroid Build Coastguard Worker     /**
650*0e209d39SAndroid Build Coastguard Worker      * Formats the given array of arguments into a user-readable string.
651*0e209d39SAndroid Build Coastguard Worker      * Does not take ownership of the Formattable* array or its contents.
652*0e209d39SAndroid Build Coastguard Worker      *
653*0e209d39SAndroid Build Coastguard Worker      * <p>If this format uses named arguments, appendTo is unchanged and
654*0e209d39SAndroid Build Coastguard Worker      * status is set to U_ILLEGAL_ARGUMENT_ERROR.
655*0e209d39SAndroid Build Coastguard Worker      *
656*0e209d39SAndroid Build Coastguard Worker      * @param source    An array of objects to be formatted.
657*0e209d39SAndroid Build Coastguard Worker      * @param count     The number of elements of 'source'.
658*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
659*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
660*0e209d39SAndroid Build Coastguard Worker      * @param ignore    Not used; inherited from base class API.
661*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
662*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
663*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
664*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
665*0e209d39SAndroid Build Coastguard Worker      */
666*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(const Formattable* source,
667*0e209d39SAndroid Build Coastguard Worker                           int32_t count,
668*0e209d39SAndroid Build Coastguard Worker                           UnicodeString& appendTo,
669*0e209d39SAndroid Build Coastguard Worker                           FieldPosition& ignore,
670*0e209d39SAndroid Build Coastguard Worker                           UErrorCode& status) const;
671*0e209d39SAndroid Build Coastguard Worker 
672*0e209d39SAndroid Build Coastguard Worker     /**
673*0e209d39SAndroid Build Coastguard Worker      * Formats the given array of arguments into a user-readable string
674*0e209d39SAndroid Build Coastguard Worker      * using the given pattern.
675*0e209d39SAndroid Build Coastguard Worker      *
676*0e209d39SAndroid Build Coastguard Worker      * <p>If this format uses named arguments, appendTo is unchanged and
677*0e209d39SAndroid Build Coastguard Worker      * status is set to U_ILLEGAL_ARGUMENT_ERROR.
678*0e209d39SAndroid Build Coastguard Worker      *
679*0e209d39SAndroid Build Coastguard Worker      * @param pattern   The pattern.
680*0e209d39SAndroid Build Coastguard Worker      * @param arguments An array of objects to be formatted.
681*0e209d39SAndroid Build Coastguard Worker      * @param count     The number of elements of 'source'.
682*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
683*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
684*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
685*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
686*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
687*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
688*0e209d39SAndroid Build Coastguard Worker      */
689*0e209d39SAndroid Build Coastguard Worker     static UnicodeString& format(const UnicodeString& pattern,
690*0e209d39SAndroid Build Coastguard Worker                                  const Formattable* arguments,
691*0e209d39SAndroid Build Coastguard Worker                                  int32_t count,
692*0e209d39SAndroid Build Coastguard Worker                                  UnicodeString& appendTo,
693*0e209d39SAndroid Build Coastguard Worker                                  UErrorCode& status);
694*0e209d39SAndroid Build Coastguard Worker 
695*0e209d39SAndroid Build Coastguard Worker     /**
696*0e209d39SAndroid Build Coastguard Worker      * Formats the given array of arguments into a user-readable
697*0e209d39SAndroid Build Coastguard Worker      * string.  The array must be stored within a single Formattable
698*0e209d39SAndroid Build Coastguard Worker      * object of type kArray. If the Formattable object type is not of
699*0e209d39SAndroid Build Coastguard Worker      * type kArray, then returns a failing UErrorCode.
700*0e209d39SAndroid Build Coastguard Worker      *
701*0e209d39SAndroid Build Coastguard Worker      * <p>If this format uses named arguments, appendTo is unchanged and
702*0e209d39SAndroid Build Coastguard Worker      * status is set to U_ILLEGAL_ARGUMENT_ERROR.
703*0e209d39SAndroid Build Coastguard Worker      *
704*0e209d39SAndroid Build Coastguard Worker      * @param obj       A Formattable of type kArray containing
705*0e209d39SAndroid Build Coastguard Worker      *                  arguments to be formatted.
706*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
707*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
708*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input: an alignment field, if desired.
709*0e209d39SAndroid Build Coastguard Worker      *                  On output: the offsets of the alignment field.
710*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
711*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
712*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
713*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
714*0e209d39SAndroid Build Coastguard Worker      */
715*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(const Formattable& obj,
716*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
717*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& pos,
718*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const override;
719*0e209d39SAndroid Build Coastguard Worker 
720*0e209d39SAndroid Build Coastguard Worker     /**
721*0e209d39SAndroid Build Coastguard Worker      * Formats the given array of arguments into a user-defined argument name
722*0e209d39SAndroid Build Coastguard Worker      * array. This function supports both named and numbered
723*0e209d39SAndroid Build Coastguard Worker      * arguments-- if numbered, the formatName is the
724*0e209d39SAndroid Build Coastguard Worker      * corresponding UnicodeStrings (e.g. "0", "1", "2"...).
725*0e209d39SAndroid Build Coastguard Worker      *
726*0e209d39SAndroid Build Coastguard Worker      * @param argumentNames argument name array
727*0e209d39SAndroid Build Coastguard Worker      * @param arguments An array of objects to be formatted.
728*0e209d39SAndroid Build Coastguard Worker      * @param count     The number of elements of 'argumentNames' and
729*0e209d39SAndroid Build Coastguard Worker      *                  arguments.  The number of argumentNames and arguments
730*0e209d39SAndroid Build Coastguard Worker      *                  must be the same.
731*0e209d39SAndroid Build Coastguard Worker      * @param appendTo  Output parameter to receive result.
732*0e209d39SAndroid Build Coastguard Worker      *                  Result is appended to existing contents.
733*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
734*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
735*0e209d39SAndroid Build Coastguard Worker      * @return          Reference to 'appendTo' parameter.
736*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
737*0e209d39SAndroid Build Coastguard Worker      */
738*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(const UnicodeString* argumentNames,
739*0e209d39SAndroid Build Coastguard Worker                           const Formattable* arguments,
740*0e209d39SAndroid Build Coastguard Worker                           int32_t count,
741*0e209d39SAndroid Build Coastguard Worker                           UnicodeString& appendTo,
742*0e209d39SAndroid Build Coastguard Worker                           UErrorCode& status) const;
743*0e209d39SAndroid Build Coastguard Worker     /**
744*0e209d39SAndroid Build Coastguard Worker      * Parses the given string into an array of output arguments.
745*0e209d39SAndroid Build Coastguard Worker      *
746*0e209d39SAndroid Build Coastguard Worker      * @param source    String to be parsed.
747*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input, starting position for parse. On output,
748*0e209d39SAndroid Build Coastguard Worker      *                  final position after parse.  Unchanged if parse
749*0e209d39SAndroid Build Coastguard Worker      *                  fails.
750*0e209d39SAndroid Build Coastguard Worker      * @param count     Output parameter to receive the number of arguments
751*0e209d39SAndroid Build Coastguard Worker      *                  parsed.
752*0e209d39SAndroid Build Coastguard Worker      * @return an array of parsed arguments.  The caller owns both
753*0e209d39SAndroid Build Coastguard Worker      * the array and its contents.
754*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
755*0e209d39SAndroid Build Coastguard Worker      */
756*0e209d39SAndroid Build Coastguard Worker     virtual Formattable* parse(const UnicodeString& source,
757*0e209d39SAndroid Build Coastguard Worker                                ParsePosition& pos,
758*0e209d39SAndroid Build Coastguard Worker                                int32_t& count) const;
759*0e209d39SAndroid Build Coastguard Worker 
760*0e209d39SAndroid Build Coastguard Worker     /**
761*0e209d39SAndroid Build Coastguard Worker      * Parses the given string into an array of output arguments.
762*0e209d39SAndroid Build Coastguard Worker      *
763*0e209d39SAndroid Build Coastguard Worker      * <p>If this format uses named arguments, status is set to
764*0e209d39SAndroid Build Coastguard Worker      * U_ARGUMENT_TYPE_MISMATCH.
765*0e209d39SAndroid Build Coastguard Worker      *
766*0e209d39SAndroid Build Coastguard Worker      * @param source    String to be parsed.
767*0e209d39SAndroid Build Coastguard Worker      * @param count     Output param to receive size of returned array.
768*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the
769*0e209d39SAndroid Build Coastguard Worker      *                  pattern cannot be parsed, set to failure code.
770*0e209d39SAndroid Build Coastguard Worker      * @return an array of parsed arguments.  The caller owns both
771*0e209d39SAndroid Build Coastguard Worker      * the array and its contents. Returns nullptr if status is not U_ZERO_ERROR.
772*0e209d39SAndroid Build Coastguard Worker      *
773*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
774*0e209d39SAndroid Build Coastguard Worker      */
775*0e209d39SAndroid Build Coastguard Worker     virtual Formattable* parse(const UnicodeString& source,
776*0e209d39SAndroid Build Coastguard Worker                                int32_t& count,
777*0e209d39SAndroid Build Coastguard Worker                                UErrorCode& status) const;
778*0e209d39SAndroid Build Coastguard Worker 
779*0e209d39SAndroid Build Coastguard Worker     /**
780*0e209d39SAndroid Build Coastguard Worker      * Parses the given string into an array of output arguments
781*0e209d39SAndroid Build Coastguard Worker      * stored within a single Formattable of type kArray.
782*0e209d39SAndroid Build Coastguard Worker      *
783*0e209d39SAndroid Build Coastguard Worker      * @param source    The string to be parsed into an object.
784*0e209d39SAndroid Build Coastguard Worker      * @param result    Formattable to be set to the parse result.
785*0e209d39SAndroid Build Coastguard Worker      *                  If parse fails, return contents are undefined.
786*0e209d39SAndroid Build Coastguard Worker      * @param pos       On input, starting position for parse. On output,
787*0e209d39SAndroid Build Coastguard Worker      *                  final position after parse.  Unchanged if parse
788*0e209d39SAndroid Build Coastguard Worker      *                  fails.
789*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
790*0e209d39SAndroid Build Coastguard Worker      */
791*0e209d39SAndroid Build Coastguard Worker     virtual void parseObject(const UnicodeString& source,
792*0e209d39SAndroid Build Coastguard Worker                              Formattable& result,
793*0e209d39SAndroid Build Coastguard Worker                              ParsePosition& pos) const override;
794*0e209d39SAndroid Build Coastguard Worker 
795*0e209d39SAndroid Build Coastguard Worker     /**
796*0e209d39SAndroid Build Coastguard Worker      * Convert an 'apostrophe-friendly' pattern into a standard
797*0e209d39SAndroid Build Coastguard Worker      * pattern.  Standard patterns treat all apostrophes as
798*0e209d39SAndroid Build Coastguard Worker      * quotes, which is problematic in some languages, e.g.
799*0e209d39SAndroid Build Coastguard Worker      * French, where apostrophe is commonly used.  This utility
800*0e209d39SAndroid Build Coastguard Worker      * assumes that only an unpaired apostrophe immediately before
801*0e209d39SAndroid Build Coastguard Worker      * a brace is a true quote.  Other unpaired apostrophes are paired,
802*0e209d39SAndroid Build Coastguard Worker      * and the resulting standard pattern string is returned.
803*0e209d39SAndroid Build Coastguard Worker      *
804*0e209d39SAndroid Build Coastguard Worker      * <p><b>Note</b> it is not guaranteed that the returned pattern
805*0e209d39SAndroid Build Coastguard Worker      * is indeed a valid pattern.  The only effect is to convert
806*0e209d39SAndroid Build Coastguard Worker      * between patterns having different quoting semantics.
807*0e209d39SAndroid Build Coastguard Worker      *
808*0e209d39SAndroid Build Coastguard Worker      * @param pattern the 'apostrophe-friendly' patttern to convert
809*0e209d39SAndroid Build Coastguard Worker      * @param status    Input/output error code.  If the pattern
810*0e209d39SAndroid Build Coastguard Worker      *                  cannot be parsed, the failure code is set.
811*0e209d39SAndroid Build Coastguard Worker      * @return the standard equivalent of the original pattern
812*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 3.4
813*0e209d39SAndroid Build Coastguard Worker      */
814*0e209d39SAndroid Build Coastguard Worker     static UnicodeString autoQuoteApostrophe(const UnicodeString& pattern,
815*0e209d39SAndroid Build Coastguard Worker         UErrorCode& status);
816*0e209d39SAndroid Build Coastguard Worker 
817*0e209d39SAndroid Build Coastguard Worker 
818*0e209d39SAndroid Build Coastguard Worker     /**
819*0e209d39SAndroid Build Coastguard Worker      * Returns true if this MessageFormat uses named arguments,
820*0e209d39SAndroid Build Coastguard Worker      * and false otherwise.  See class description.
821*0e209d39SAndroid Build Coastguard Worker      *
822*0e209d39SAndroid Build Coastguard Worker      * @return true if named arguments are used.
823*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
824*0e209d39SAndroid Build Coastguard Worker      */
825*0e209d39SAndroid Build Coastguard Worker     UBool usesNamedArguments() const;
826*0e209d39SAndroid Build Coastguard Worker 
827*0e209d39SAndroid Build Coastguard Worker 
828*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API
829*0e209d39SAndroid Build Coastguard Worker     /**
830*0e209d39SAndroid Build Coastguard Worker      * This API is for ICU internal use only.
831*0e209d39SAndroid Build Coastguard Worker      * Please do not use it.
832*0e209d39SAndroid Build Coastguard Worker      *
833*0e209d39SAndroid Build Coastguard Worker      * Returns argument types count in the parsed pattern.
834*0e209d39SAndroid Build Coastguard Worker      * Used to distinguish pattern "{0} d" and "d".
835*0e209d39SAndroid Build Coastguard Worker      *
836*0e209d39SAndroid Build Coastguard Worker      * @return           The number of formattable types in the pattern
837*0e209d39SAndroid Build Coastguard Worker      * @internal
838*0e209d39SAndroid Build Coastguard Worker      */
839*0e209d39SAndroid Build Coastguard Worker     int32_t getArgTypeCount() const;
840*0e209d39SAndroid Build Coastguard Worker #endif  /* U_HIDE_INTERNAL_API */
841*0e209d39SAndroid Build Coastguard Worker 
842*0e209d39SAndroid Build Coastguard Worker     /**
843*0e209d39SAndroid Build Coastguard Worker      * Returns a unique class ID POLYMORPHICALLY.  Pure virtual override.
844*0e209d39SAndroid Build Coastguard Worker      * This method is to implement a simple version of RTTI, since not all
845*0e209d39SAndroid Build Coastguard Worker      * C++ compilers support genuine RTTI.  Polymorphic operator==() and
846*0e209d39SAndroid Build Coastguard Worker      * clone() methods call this method.
847*0e209d39SAndroid Build Coastguard Worker      *
848*0e209d39SAndroid Build Coastguard Worker      * @return          The class ID for this object. All objects of a
849*0e209d39SAndroid Build Coastguard Worker      *                  given class have the same class ID.  Objects of
850*0e209d39SAndroid Build Coastguard Worker      *                  other classes have different class IDs.
851*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
852*0e209d39SAndroid Build Coastguard Worker      */
853*0e209d39SAndroid Build Coastguard Worker     virtual UClassID getDynamicClassID() const override;
854*0e209d39SAndroid Build Coastguard Worker 
855*0e209d39SAndroid Build Coastguard Worker     /**
856*0e209d39SAndroid Build Coastguard Worker      * Return the class ID for this class.  This is useful only for
857*0e209d39SAndroid Build Coastguard Worker      * comparing to a return value from getDynamicClassID().  For example:
858*0e209d39SAndroid Build Coastguard Worker      * <pre>
859*0e209d39SAndroid Build Coastguard Worker      * .   Base* polymorphic_pointer = createPolymorphicObject();
860*0e209d39SAndroid Build Coastguard Worker      * .   if (polymorphic_pointer->getDynamicClassID() ==
861*0e209d39SAndroid Build Coastguard Worker      * .      Derived::getStaticClassID()) ...
862*0e209d39SAndroid Build Coastguard Worker      * </pre>
863*0e209d39SAndroid Build Coastguard Worker      * @return          The class ID for all objects of this class.
864*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 2.0
865*0e209d39SAndroid Build Coastguard Worker      */
866*0e209d39SAndroid Build Coastguard Worker     static UClassID U_EXPORT2 getStaticClassID();
867*0e209d39SAndroid Build Coastguard Worker 
868*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API
869*0e209d39SAndroid Build Coastguard Worker     /**
870*0e209d39SAndroid Build Coastguard Worker      * Compares two Format objects. This is used for constructing the hash
871*0e209d39SAndroid Build Coastguard Worker      * tables.
872*0e209d39SAndroid Build Coastguard Worker      *
873*0e209d39SAndroid Build Coastguard Worker      * @param left pointer to a Format object. Must not be nullptr.
874*0e209d39SAndroid Build Coastguard Worker      * @param right pointer to a Format object. Must not be nullptr.
875*0e209d39SAndroid Build Coastguard Worker      *
876*0e209d39SAndroid Build Coastguard Worker      * @return whether the two objects are the same
877*0e209d39SAndroid Build Coastguard Worker      * @internal
878*0e209d39SAndroid Build Coastguard Worker      */
879*0e209d39SAndroid Build Coastguard Worker     static UBool equalFormats(const void* left, const void* right);
880*0e209d39SAndroid Build Coastguard Worker #endif  /* U_HIDE_INTERNAL_API */
881*0e209d39SAndroid Build Coastguard Worker 
882*0e209d39SAndroid Build Coastguard Worker private:
883*0e209d39SAndroid Build Coastguard Worker 
884*0e209d39SAndroid Build Coastguard Worker     Locale              fLocale;
885*0e209d39SAndroid Build Coastguard Worker     MessagePattern      msgPattern;
886*0e209d39SAndroid Build Coastguard Worker     Format**            formatAliases; // see getFormats
887*0e209d39SAndroid Build Coastguard Worker     int32_t             formatAliasesCapacity;
888*0e209d39SAndroid Build Coastguard Worker 
889*0e209d39SAndroid Build Coastguard Worker     MessageFormat() = delete; // default constructor not implemented
890*0e209d39SAndroid Build Coastguard Worker 
891*0e209d39SAndroid Build Coastguard Worker      /**
892*0e209d39SAndroid Build Coastguard Worker       * This provider helps defer instantiation of a PluralRules object
893*0e209d39SAndroid Build Coastguard Worker       * until we actually need to select a keyword.
894*0e209d39SAndroid Build Coastguard Worker       * For example, if the number matches an explicit-value selector like "=1"
895*0e209d39SAndroid Build Coastguard Worker       * we do not need any PluralRules.
896*0e209d39SAndroid Build Coastguard Worker       */
897*0e209d39SAndroid Build Coastguard Worker     class U_I18N_API PluralSelectorProvider : public PluralFormat::PluralSelector {
898*0e209d39SAndroid Build Coastguard Worker     public:
899*0e209d39SAndroid Build Coastguard Worker         PluralSelectorProvider(const MessageFormat &mf, UPluralType type);
900*0e209d39SAndroid Build Coastguard Worker         virtual ~PluralSelectorProvider();
901*0e209d39SAndroid Build Coastguard Worker         virtual UnicodeString select(void *ctx, double number, UErrorCode& ec) const override;
902*0e209d39SAndroid Build Coastguard Worker 
903*0e209d39SAndroid Build Coastguard Worker         void reset();
904*0e209d39SAndroid Build Coastguard Worker     private:
905*0e209d39SAndroid Build Coastguard Worker         const MessageFormat &msgFormat;
906*0e209d39SAndroid Build Coastguard Worker         PluralRules* rules;
907*0e209d39SAndroid Build Coastguard Worker         UPluralType type;
908*0e209d39SAndroid Build Coastguard Worker     };
909*0e209d39SAndroid Build Coastguard Worker 
910*0e209d39SAndroid Build Coastguard Worker     /**
911*0e209d39SAndroid Build Coastguard Worker      * A MessageFormat formats an array of arguments.  Each argument
912*0e209d39SAndroid Build Coastguard Worker      * has an expected type, based on the pattern.  For example, if
913*0e209d39SAndroid Build Coastguard Worker      * the pattern contains the subformat "{3,number,integer}", then
914*0e209d39SAndroid Build Coastguard Worker      * we expect argument 3 to have type Formattable::kLong.  This
915*0e209d39SAndroid Build Coastguard Worker      * array needs to grow dynamically if the MessageFormat is
916*0e209d39SAndroid Build Coastguard Worker      * modified.
917*0e209d39SAndroid Build Coastguard Worker      */
918*0e209d39SAndroid Build Coastguard Worker     Formattable::Type* argTypes;
919*0e209d39SAndroid Build Coastguard Worker     int32_t            argTypeCount;
920*0e209d39SAndroid Build Coastguard Worker     int32_t            argTypeCapacity;
921*0e209d39SAndroid Build Coastguard Worker 
922*0e209d39SAndroid Build Coastguard Worker     /**
923*0e209d39SAndroid Build Coastguard Worker      * true if there are different argTypes for the same argument.
924*0e209d39SAndroid Build Coastguard Worker      * This only matters when the MessageFormat is used in the plain C (umsg_xxx) API
925*0e209d39SAndroid Build Coastguard Worker      * where the pattern argTypes determine how the va_arg list is read.
926*0e209d39SAndroid Build Coastguard Worker      */
927*0e209d39SAndroid Build Coastguard Worker     UBool hasArgTypeConflicts;
928*0e209d39SAndroid Build Coastguard Worker 
929*0e209d39SAndroid Build Coastguard Worker     // Variable-size array management
930*0e209d39SAndroid Build Coastguard Worker     UBool allocateArgTypes(int32_t capacity, UErrorCode& status);
931*0e209d39SAndroid Build Coastguard Worker 
932*0e209d39SAndroid Build Coastguard Worker     /**
933*0e209d39SAndroid Build Coastguard Worker      * Default Format objects used when no format is specified and a
934*0e209d39SAndroid Build Coastguard Worker      * numeric or date argument is formatted.  These are volatile
935*0e209d39SAndroid Build Coastguard Worker      * cache objects maintained only for performance.  They do not
936*0e209d39SAndroid Build Coastguard Worker      * participate in operator=(), copy constructor(), nor
937*0e209d39SAndroid Build Coastguard Worker      * operator==().
938*0e209d39SAndroid Build Coastguard Worker      */
939*0e209d39SAndroid Build Coastguard Worker     NumberFormat* defaultNumberFormat;
940*0e209d39SAndroid Build Coastguard Worker     DateFormat*   defaultDateFormat;
941*0e209d39SAndroid Build Coastguard Worker 
942*0e209d39SAndroid Build Coastguard Worker     UHashtable* cachedFormatters;
943*0e209d39SAndroid Build Coastguard Worker     UHashtable* customFormatArgStarts;
944*0e209d39SAndroid Build Coastguard Worker 
945*0e209d39SAndroid Build Coastguard Worker     PluralSelectorProvider pluralProvider;
946*0e209d39SAndroid Build Coastguard Worker     PluralSelectorProvider ordinalProvider;
947*0e209d39SAndroid Build Coastguard Worker 
948*0e209d39SAndroid Build Coastguard Worker     /**
949*0e209d39SAndroid Build Coastguard Worker      * Method to retrieve default formats (or nullptr on failure).
950*0e209d39SAndroid Build Coastguard Worker      * These are semantically const, but may modify *this.
951*0e209d39SAndroid Build Coastguard Worker      */
952*0e209d39SAndroid Build Coastguard Worker     const NumberFormat* getDefaultNumberFormat(UErrorCode&) const;
953*0e209d39SAndroid Build Coastguard Worker     const DateFormat*   getDefaultDateFormat(UErrorCode&) const;
954*0e209d39SAndroid Build Coastguard Worker 
955*0e209d39SAndroid Build Coastguard Worker     /**
956*0e209d39SAndroid Build Coastguard Worker      * Finds the word s, in the keyword list and returns the located index.
957*0e209d39SAndroid Build Coastguard Worker      * @param s the keyword to be searched for.
958*0e209d39SAndroid Build Coastguard Worker      * @param list the list of keywords to be searched with.
959*0e209d39SAndroid Build Coastguard Worker      * @return the index of the list which matches the keyword s.
960*0e209d39SAndroid Build Coastguard Worker      */
961*0e209d39SAndroid Build Coastguard Worker     static int32_t findKeyword( const UnicodeString& s,
962*0e209d39SAndroid Build Coastguard Worker                                 const char16_t * const *list);
963*0e209d39SAndroid Build Coastguard Worker 
964*0e209d39SAndroid Build Coastguard Worker     /**
965*0e209d39SAndroid Build Coastguard Worker      * Thin wrapper around the format(... AppendableWrapper ...) variant.
966*0e209d39SAndroid Build Coastguard Worker      * Wraps the destination UnicodeString into an AppendableWrapper and
967*0e209d39SAndroid Build Coastguard Worker      * supplies default values for some other parameters.
968*0e209d39SAndroid Build Coastguard Worker      */
969*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(const Formattable* arguments,
970*0e209d39SAndroid Build Coastguard Worker                           const UnicodeString *argumentNames,
971*0e209d39SAndroid Build Coastguard Worker                           int32_t cnt,
972*0e209d39SAndroid Build Coastguard Worker                           UnicodeString& appendTo,
973*0e209d39SAndroid Build Coastguard Worker                           FieldPosition* pos,
974*0e209d39SAndroid Build Coastguard Worker                           UErrorCode& status) const;
975*0e209d39SAndroid Build Coastguard Worker 
976*0e209d39SAndroid Build Coastguard Worker     /**
977*0e209d39SAndroid Build Coastguard Worker      * Formats the arguments and writes the result into the
978*0e209d39SAndroid Build Coastguard Worker      * AppendableWrapper, updates the field position.
979*0e209d39SAndroid Build Coastguard Worker      *
980*0e209d39SAndroid Build Coastguard Worker      * @param msgStart      Index to msgPattern part to start formatting from.
981*0e209d39SAndroid Build Coastguard Worker      * @param plNumber      nullptr except when formatting a plural argument sub-message
982*0e209d39SAndroid Build Coastguard Worker      *                      where a '#' is replaced by the format string for this number.
983*0e209d39SAndroid Build Coastguard Worker      * @param arguments     The formattable objects array. (Must not be nullptr.)
984*0e209d39SAndroid Build Coastguard Worker      * @param argumentNames nullptr if numbered values are used. Otherwise the same
985*0e209d39SAndroid Build Coastguard Worker      *                      length as "arguments", and each entry is the name of the
986*0e209d39SAndroid Build Coastguard Worker      *                      corresponding argument in "arguments".
987*0e209d39SAndroid Build Coastguard Worker      * @param cnt           The length of arguments (and of argumentNames if that is not nullptr).
988*0e209d39SAndroid Build Coastguard Worker      * @param appendTo      Output parameter to receive the result.
989*0e209d39SAndroid Build Coastguard Worker      *                      The result string is appended to existing contents.
990*0e209d39SAndroid Build Coastguard Worker      * @param pos           Field position status.
991*0e209d39SAndroid Build Coastguard Worker      * @param success       The error code status.
992*0e209d39SAndroid Build Coastguard Worker      */
993*0e209d39SAndroid Build Coastguard Worker     void format(int32_t msgStart,
994*0e209d39SAndroid Build Coastguard Worker                 const void *plNumber,
995*0e209d39SAndroid Build Coastguard Worker                 const Formattable* arguments,
996*0e209d39SAndroid Build Coastguard Worker                 const UnicodeString *argumentNames,
997*0e209d39SAndroid Build Coastguard Worker                 int32_t cnt,
998*0e209d39SAndroid Build Coastguard Worker                 AppendableWrapper& appendTo,
999*0e209d39SAndroid Build Coastguard Worker                 FieldPosition* pos,
1000*0e209d39SAndroid Build Coastguard Worker                 UErrorCode& success) const;
1001*0e209d39SAndroid Build Coastguard Worker 
1002*0e209d39SAndroid Build Coastguard Worker     UnicodeString getArgName(int32_t partIndex);
1003*0e209d39SAndroid Build Coastguard Worker 
1004*0e209d39SAndroid Build Coastguard Worker     void setArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
1005*0e209d39SAndroid Build Coastguard Worker 
1006*0e209d39SAndroid Build Coastguard Worker     void setCustomArgStartFormat(int32_t argStart, Format* formatter, UErrorCode& status);
1007*0e209d39SAndroid Build Coastguard Worker 
1008*0e209d39SAndroid Build Coastguard Worker     int32_t nextTopLevelArgStart(int32_t partIndex) const;
1009*0e209d39SAndroid Build Coastguard Worker 
1010*0e209d39SAndroid Build Coastguard Worker     UBool argNameMatches(int32_t partIndex, const UnicodeString& argName, int32_t argNumber);
1011*0e209d39SAndroid Build Coastguard Worker 
1012*0e209d39SAndroid Build Coastguard Worker     void cacheExplicitFormats(UErrorCode& status);
1013*0e209d39SAndroid Build Coastguard Worker 
1014*0e209d39SAndroid Build Coastguard Worker     Format* createAppropriateFormat(UnicodeString& type,
1015*0e209d39SAndroid Build Coastguard Worker                                     UnicodeString& style,
1016*0e209d39SAndroid Build Coastguard Worker                                     Formattable::Type& formattableType,
1017*0e209d39SAndroid Build Coastguard Worker                                     UParseError& parseError,
1018*0e209d39SAndroid Build Coastguard Worker                                     UErrorCode& ec);
1019*0e209d39SAndroid Build Coastguard Worker 
1020*0e209d39SAndroid Build Coastguard Worker     const Formattable* getArgFromListByName(const Formattable* arguments,
1021*0e209d39SAndroid Build Coastguard Worker                                             const UnicodeString *argumentNames,
1022*0e209d39SAndroid Build Coastguard Worker                                             int32_t cnt, UnicodeString& name) const;
1023*0e209d39SAndroid Build Coastguard Worker 
1024*0e209d39SAndroid Build Coastguard Worker     Formattable* parse(int32_t msgStart,
1025*0e209d39SAndroid Build Coastguard Worker                        const UnicodeString& source,
1026*0e209d39SAndroid Build Coastguard Worker                        ParsePosition& pos,
1027*0e209d39SAndroid Build Coastguard Worker                        int32_t& count,
1028*0e209d39SAndroid Build Coastguard Worker                        UErrorCode& ec) const;
1029*0e209d39SAndroid Build Coastguard Worker 
1030*0e209d39SAndroid Build Coastguard Worker     FieldPosition* updateMetaData(AppendableWrapper& dest, int32_t prevLength,
1031*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition* fp, const Formattable* argId) const;
1032*0e209d39SAndroid Build Coastguard Worker 
1033*0e209d39SAndroid Build Coastguard Worker     /**
1034*0e209d39SAndroid Build Coastguard Worker      * Finds the "other" sub-message.
1035*0e209d39SAndroid Build Coastguard Worker      * @param partIndex the index of the first PluralFormat argument style part.
1036*0e209d39SAndroid Build Coastguard Worker      * @return the "other" sub-message start part index.
1037*0e209d39SAndroid Build Coastguard Worker      */
1038*0e209d39SAndroid Build Coastguard Worker     int32_t findOtherSubMessage(int32_t partIndex) const;
1039*0e209d39SAndroid Build Coastguard Worker 
1040*0e209d39SAndroid Build Coastguard Worker     /**
1041*0e209d39SAndroid Build Coastguard Worker      * Returns the ARG_START index of the first occurrence of the plural number in a sub-message.
1042*0e209d39SAndroid Build Coastguard Worker      * Returns -1 if it is a REPLACE_NUMBER.
1043*0e209d39SAndroid Build Coastguard Worker      * Returns 0 if there is neither.
1044*0e209d39SAndroid Build Coastguard Worker      */
1045*0e209d39SAndroid Build Coastguard Worker     int32_t findFirstPluralNumberArg(int32_t msgStart, const UnicodeString &argName) const;
1046*0e209d39SAndroid Build Coastguard Worker 
1047*0e209d39SAndroid Build Coastguard Worker     Format* getCachedFormatter(int32_t argumentNumber) const;
1048*0e209d39SAndroid Build Coastguard Worker 
1049*0e209d39SAndroid Build Coastguard Worker     UnicodeString getLiteralStringUntilNextArgument(int32_t from) const;
1050*0e209d39SAndroid Build Coastguard Worker 
1051*0e209d39SAndroid Build Coastguard Worker     void copyObjects(const MessageFormat& that, UErrorCode& ec);
1052*0e209d39SAndroid Build Coastguard Worker 
1053*0e209d39SAndroid Build Coastguard Worker     void formatComplexSubMessage(int32_t msgStart,
1054*0e209d39SAndroid Build Coastguard Worker                                  const void *plNumber,
1055*0e209d39SAndroid Build Coastguard Worker                                  const Formattable* arguments,
1056*0e209d39SAndroid Build Coastguard Worker                                  const UnicodeString *argumentNames,
1057*0e209d39SAndroid Build Coastguard Worker                                  int32_t cnt,
1058*0e209d39SAndroid Build Coastguard Worker                                  AppendableWrapper& appendTo,
1059*0e209d39SAndroid Build Coastguard Worker                                  UErrorCode& success) const;
1060*0e209d39SAndroid Build Coastguard Worker 
1061*0e209d39SAndroid Build Coastguard Worker     /**
1062*0e209d39SAndroid Build Coastguard Worker      * Convenience method that ought to be in NumberFormat
1063*0e209d39SAndroid Build Coastguard Worker      */
1064*0e209d39SAndroid Build Coastguard Worker     NumberFormat* createIntegerFormat(const Locale& locale, UErrorCode& status) const;
1065*0e209d39SAndroid Build Coastguard Worker 
1066*0e209d39SAndroid Build Coastguard Worker     /**
1067*0e209d39SAndroid Build Coastguard Worker      * Returns array of argument types in the parsed pattern
1068*0e209d39SAndroid Build Coastguard Worker      * for use in C API.  Only for the use of umsg_vformat().  Not
1069*0e209d39SAndroid Build Coastguard Worker      * for public consumption.
1070*0e209d39SAndroid Build Coastguard Worker      * @param listCount  Output parameter to receive the size of array
1071*0e209d39SAndroid Build Coastguard Worker      * @return           The array of formattable types in the pattern
1072*0e209d39SAndroid Build Coastguard Worker      */
getArgTypeList(int32_t & listCount)1073*0e209d39SAndroid Build Coastguard Worker     const Formattable::Type* getArgTypeList(int32_t& listCount) const {
1074*0e209d39SAndroid Build Coastguard Worker         listCount = argTypeCount;
1075*0e209d39SAndroid Build Coastguard Worker         return argTypes;
1076*0e209d39SAndroid Build Coastguard Worker     }
1077*0e209d39SAndroid Build Coastguard Worker 
1078*0e209d39SAndroid Build Coastguard Worker     /**
1079*0e209d39SAndroid Build Coastguard Worker      * Resets the internal MessagePattern, and other associated caches.
1080*0e209d39SAndroid Build Coastguard Worker      */
1081*0e209d39SAndroid Build Coastguard Worker     void resetPattern();
1082*0e209d39SAndroid Build Coastguard Worker 
1083*0e209d39SAndroid Build Coastguard Worker     /**
1084*0e209d39SAndroid Build Coastguard Worker      * A DummyFormatter that we use solely to store a nullptr value. UHash does
1085*0e209d39SAndroid Build Coastguard Worker      * not support storing nullptr values.
1086*0e209d39SAndroid Build Coastguard Worker      */
1087*0e209d39SAndroid Build Coastguard Worker     class U_I18N_API DummyFormat : public Format {
1088*0e209d39SAndroid Build Coastguard Worker     public:
1089*0e209d39SAndroid Build Coastguard Worker         virtual bool operator==(const Format&) const override;
1090*0e209d39SAndroid Build Coastguard Worker         virtual DummyFormat* clone() const override;
1091*0e209d39SAndroid Build Coastguard Worker         virtual UnicodeString& format(const Formattable& obj,
1092*0e209d39SAndroid Build Coastguard Worker                               UnicodeString& appendTo,
1093*0e209d39SAndroid Build Coastguard Worker                               UErrorCode& status) const;
1094*0e209d39SAndroid Build Coastguard Worker         virtual UnicodeString& format(const Formattable&,
1095*0e209d39SAndroid Build Coastguard Worker                                       UnicodeString& appendTo,
1096*0e209d39SAndroid Build Coastguard Worker                                       FieldPosition&,
1097*0e209d39SAndroid Build Coastguard Worker                                       UErrorCode& status) const override;
1098*0e209d39SAndroid Build Coastguard Worker         virtual UnicodeString& format(const Formattable& obj,
1099*0e209d39SAndroid Build Coastguard Worker                                       UnicodeString& appendTo,
1100*0e209d39SAndroid Build Coastguard Worker                                       FieldPositionIterator* posIter,
1101*0e209d39SAndroid Build Coastguard Worker                                       UErrorCode& status) const override;
1102*0e209d39SAndroid Build Coastguard Worker         virtual void parseObject(const UnicodeString&,
1103*0e209d39SAndroid Build Coastguard Worker                                  Formattable&,
1104*0e209d39SAndroid Build Coastguard Worker                                  ParsePosition&) const override;
1105*0e209d39SAndroid Build Coastguard Worker     };
1106*0e209d39SAndroid Build Coastguard Worker 
1107*0e209d39SAndroid Build Coastguard Worker     friend class MessageFormatAdapter; // getFormatTypeList() access
1108*0e209d39SAndroid Build Coastguard Worker };
1109*0e209d39SAndroid Build Coastguard Worker 
1110*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
1111*0e209d39SAndroid Build Coastguard Worker 
1112*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */
1113*0e209d39SAndroid Build Coastguard Worker 
1114*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */
1115*0e209d39SAndroid Build Coastguard Worker 
1116*0e209d39SAndroid Build Coastguard Worker #endif // _MSGFMT
1117*0e209d39SAndroid Build Coastguard Worker //eof
1118