1f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/*
2f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*******************************************************************************
3f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Copyright (C) 2007-2010, International Business Machines Corporation and
4f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* others. All Rights Reserved.
5f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*******************************************************************************
6f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
7f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
8f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* File PLURFMT.H
9f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
10f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)* Modification History:*
11f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*   Date        Name        Description
12f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*
13f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)********************************************************************************
14f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)*/
15f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
16f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#ifndef PLURFMT
17f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#define PLURFMT
18f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
19f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/utypes.h"
20f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
21f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
22f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \file
23f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \brief C++ API: PluralFormat object
24f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
25f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
26f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#if !UCONFIG_NO_FORMATTING
27f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
28f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/numfmt.h"
29f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#include "unicode/plurrule.h"
30f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
31f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_BEGIN
32f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
33f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class Hashtable;
34f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
35f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)/**
36f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>
37f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>PluralFormat</code> supports the creation of internationalized
38f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * messages with plural inflection. It is based on <i>plural
39f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * selection</i>, i.e. the caller specifies messages for each
40f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * plural case that can appear in the users language and the
41f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>PluralFormat</code> selects the appropriate message based on
42f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the number.
43f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p>
44f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <h4>The Problem of Plural Forms in Internationalized Messages</h4>
45f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>
46f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Different languages have different ways to inflect
47f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * plurals. Creating internationalized messages that include plural
48f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * forms is only feasible when the framework is able to handle plural
49f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * forms of <i>all</i> languages correctly. <code>ChoiceFormat</code>
50f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * doesn't handle this well, because it attaches a number interval to
51f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * each message and selects the message whose interval contains a
52f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * given number. This can only handle a finite number of
53f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * intervals. But in some languages, like Polish, one plural case
54f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * applies to infinitely many intervals (e.g., paucal applies to
55f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * numbers ending with 2, 3, or 4 except those ending with 12, 13, or
56f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 14). Thus <code>ChoiceFormat</code> is not adequate.
57f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p><p>
58f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>PluralFormat</code> deals with this by breaking the problem
59f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * into two parts:
60f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <ul>
61f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>It uses <code>PluralRules</code> that can define more complex
62f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     conditions for a plural case than just a single interval. These plural
63f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     rules define both what plural cases exist in a language, and to
64f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     which numbers these cases apply.
65f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <li>It provides predefined plural rules for many locales. Thus, the programmer
66f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     need not worry about the plural cases of a language. On the flip side,
67f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     the localizer does not have to specify the plural cases; he can simply
68f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     use the predefined keywords. The whole plural formatting of messages can
69f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     be done using localized patterns from resource bundles. For predefined plural
70f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     rules, see CLDR <i>Language Plural Rules</i> page at
71f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *    http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
72f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </ul>
73f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p>
74f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <h4>Usage of <code>PluralFormat</code></h4>
75f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>
76f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * This discussion assumes that you use <code>PluralFormat</code> with
77f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * a predefined set of plural rules. You can create one using one of
78f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * the constructors that takes a <code>locale</code> object. To
79f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * specify the message pattern, you can either pass it to the
80f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * constructor or set it explicitly using the
81f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>applyPattern()</code> method. The <code>format()</code>
82f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * method takes a number object and selects the message of the
83f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * matching plural case. This message will be returned.
84f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p>
85f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <h5>Patterns and Their Interpretation</h5>
86f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>
87f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The pattern text defines the message output for each plural case of the
88f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * used locale. The pattern is a sequence of
89f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code><i>caseKeyword</i>{<i>message</i>}</code> clauses, separated by white
90f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * space characters. Each clause assigns the message <code><i>message</i></code>
91f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * to the plural case identified by <code><i>caseKeyword</i></code>.
92f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p><p>
93f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * There are 6 predefined casekeyword in ICU - 'zero', 'one', 'two', 'few', 'many' and
94f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * 'other'. You always have to define a message text for the default plural case
95f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * "<code>other</code>" which is contained in every rule set. If the plural
96f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * rules of the <code>PluralFormat</code> object do not contain a plural case
97f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * identified by <code><i>caseKeyword</i></code>, U_DEFAULT_KEYWORD_MISSING
98f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * will be set to status.
99f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * If you do not specify a message text for a particular plural case, the
100f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * message text of the plural case "<code>other</code>" gets assigned to this
101f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * plural case. If you specify more than one message for the same plural case,
102f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * U_DUPLICATE_KEYWORD will be set to status.
103f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <br>
104f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Spaces between <code><i>caseKeyword</i></code> and
105f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code><i>message</i></code>  will be ignored; spaces within
106f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code><i>message</i></code> will be preserved.
107f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p><p>
108f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The message text for a particular plural case may contain other message
109f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * format patterns. <code>PluralFormat</code> preserves these so that you
110f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * can use the strings produced by <code>PluralFormat</code> with other
111f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * formatters. If you are using <code>PluralFormat</code> inside a
112f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>MessageFormat</code> pattern, <code>MessageFormat</code> will
113f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * automatically evaluate the resulting format pattern.<br>
114f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Thus, curly braces (<code>{</code>, <code>}</code>) are <i>only</i> allowed
115f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * in message texts to define a nested format pattern.<br>
116f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * The pound sign (<code>#</code>) will be interpreted as the number placeholder
117f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * in the message text, if it is not contained in curly braces (to preserve
118f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>NumberFormat</code> patterns). <code>PluralFormat</code> will
119f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * replace each of those pound signs by the number passed to the
120f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>format()</code> method. It will be formatted using a
121f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>NumberFormat</code> for the <code>PluralFormat</code>'s locale. If you
122f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * need special number formatting, you have to explicitly specify a
123f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>NumberFormat</code> for the <code>PluralFormat</code> to use.
124f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p>
125f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Example
126f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <pre>
127f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \code
128f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * UErrorCode status = U_ZERO_ERROR;
129f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * MessageFormat* msgFmt = new MessageFormat(UnicodeString("{0, plural,
130f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   one{{0, number, C''est #,##0.0#  fichier}} other {Ce sont # fichiers}} dans la liste."),
131f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   Locale("fr"), status);
132f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * if (U_FAILURE(status)) {
133f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *     return;
134f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * }
135f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Formattable args1[] = {(int32_t)0};
136f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Formattable args2[] = {(int32_t)3};
137f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * FieldPosition ignore(FieldPosition::DONT_CARE);
138f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * UnicodeString result;
139f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * msgFmt->format(args1, 1, result, ignore, status);
140f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * cout << result << endl;
141f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * result.remove();
142f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * msgFmt->format(args2, 1, result, ignore, status);
143f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * cout << result << endl;
144f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * \endcode
145f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </pre>
146f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * Produces the output:<br>
147f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>C'est 0,0 fichier dans la liste.</code><br>
148f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>Ce sont 3 fichiers dans la liste.</code>
149f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>
150f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <strong>Note:</strong><br>
151f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   Currently <code>PluralFormat</code>
152f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   does not make use of quotes like <code>MessageFormat</code>.
153f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   If you use plural format strings with <code>MessageFormat</code> and want
154f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   to use a quote sign <code>'</code>, you have to write <code>''</code>.
155f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   <code>MessageFormat</code> unquotes this pattern and  passes the unquoted
156f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   pattern to <code>PluralFormat</code>. It's a bit trickier if you use
157f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   nested formats that do quoting. In the example above, we wanted to insert
158f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   <code>'</code> in the number format pattern. Since
159f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   <code>NumberFormat</code> supports quotes, we had to insert
160f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   <code>''</code>. But since <code>MessageFormat</code> unquotes the
161f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   pattern before it gets passed to <code>PluralFormat</code>, we have to
162f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *   double these quotes, i.e. write <code>''''</code>.
163f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p>
164f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <h4>Defining Custom Plural Rules</h4>
165f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <p>If you need to use <code>PluralFormat</code> with custom rules, you can
166f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * create a <code>PluralRules</code> object and pass it to
167f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * <code>PluralFormat</code>'s constructor. If you also specify a locale in this
168f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * constructor, this locale will be used to format the number in the message
169f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * texts.
170f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p><p>
171f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * For more information about <code>PluralRules</code>, see
172f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * {@link PluralRules}.
173f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * </p>
174f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) *
175f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * ported from Java
176f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) * @stable ICU 4.0
177f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles) */
178f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
179f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)class U_I18N_API PluralFormat : public Format {
180f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)public:
181f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
182f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
183f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for the default locale.
184f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * This locale will be used to get the set of plural rules and for standard
185f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * number formatting.
186f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success/failure code on exit, which
187f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
188f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
189f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
190f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(UErrorCode& status);
191f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
192f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
193f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for a given locale.
194f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param locale the <code>PluralFormat</code> will be configured with
195f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *               rules for this locale. This locale will also be used for
196f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *               standard number formatting.
197f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status output param set to success/failure code on exit, which
198f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *               must not indicate a failure before the function call.
199f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
200f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
201f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const Locale& locale, UErrorCode& status);
202f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
203f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
204f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for a given set of rules.
205f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The standard number formatting will be done using the default locale.
206f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param rules   defines the behavior of the <code>PluralFormat</code>
207f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                object.
208f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success/failure code on exit, which
209f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
210f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
211f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
212f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const PluralRules& rules, UErrorCode& status);
213f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
214f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
215f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for a given set of rules.
216f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The standard number formatting will be done using the given locale.
217f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param locale  the default number formatting will be done using this
218f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                locale.
219f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param rules   defines the behavior of the <code>PluralFormat</code>
220f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                object.
221f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success/failure code on exit, which
222f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
223f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
224f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
225f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const Locale& locale, const PluralRules& rules, UErrorCode& status);
226f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
227f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
228f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for a given pattern string.
229f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The default locale will be used to get the set of plural rules and for
230f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * standard number formatting.
231f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param  pattern the pattern for this <code>PluralFormat</code>.
232f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 errors are returned to status if the pattern is invalid.
233f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status   output param set to success/failure code on exit, which
234f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 must not indicate a failure before the function call.
235f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
236f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
237f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const UnicodeString& pattern, UErrorCode& status);
238f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
239f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
240f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for a given pattern string and
241f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * locale.
242f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The locale will be used to get the set of plural rules and for
243f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * standard number formatting.
244f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param locale   the <code>PluralFormat</code> will be configured with
245f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 rules for this locale. This locale will also be used for
246f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 standard number formatting.
247f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param pattern  the pattern for this <code>PluralFormat</code>.
248f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 errors are returned to status if the pattern is invalid.
249f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status   output param set to success/failure code on exit, which
250f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 must not indicate a failure before the function call.
251f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
252f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
253f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const Locale& locale, const UnicodeString& pattern, UErrorCode& status);
254f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
255f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
256f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for a given set of rules, a
257f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * pattern and a locale.
258f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param rules    defines the behavior of the <code>PluralFormat</code>
259f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 object.
260f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param pattern  the pattern for this <code>PluralFormat</code>.
261f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 errors are returned to status if the pattern is invalid.
262f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status   output param set to success/failure code on exit, which
263f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 must not indicate a failure before the function call.
264f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
265f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
266f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const PluralRules& rules,
267f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 const UnicodeString& pattern,
268f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 UErrorCode& status);
269f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
270f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
271f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Creates a new <code>PluralFormat</code> for a given set of rules, a
272f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * pattern and a locale.
273f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param locale  the <code>PluralFormat</code> will be configured with
274f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                rules for this locale. This locale will also be used for
275f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                standard number formatting.
276f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param rules   defines the behavior of the <code>PluralFormat</code>
277f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                object.
278f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param pattern the pattern for this <code>PluralFormat</code>.
279f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                errors are returned to status if the pattern is invalid.
280f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success/failure code on exit, which
281f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
282f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
283f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
284f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const Locale& locale,
285f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 const PluralRules& rules,
286f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 const UnicodeString& pattern,
287f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                 UErrorCode& status);
288f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
289f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
290f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * copy constructor.
291f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * @stable ICU 4.0
292f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      */
293f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat(const PluralFormat& other);
294f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
295f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
296f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Destructor.
297f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
298f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
299f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual ~PluralFormat();
300f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
301f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
302f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the pattern used by this plural format.
303f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * The method parses the pattern and creates a map of format strings
304f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * for the plural rules.
305f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Patterns and their interpretation are specified in the class description.
306f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
307f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param pattern the pattern for this plural format
308f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                errors are returned to status if the pattern is invalid.
309f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success/failure code on exit, which
310f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
311f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
312f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
313f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void applyPattern(const UnicodeString& pattern, UErrorCode& status);
314f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
315f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
316f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    using Format::format;
317f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
318f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
319f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Formats a plural message for a given number.
320f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
321f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param number  a number for which the plural message should be formatted
322f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                for. If no pattern has been applied to this
323f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                <code>PluralFormat</code> object yet, the formatted number
324f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                will be returned.
325f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success/failure code on exit, which
326f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
327f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return        the string containing the formatted plural message.
328f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
329f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
330f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString format(int32_t number, UErrorCode& status) const;
331f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
332f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
333f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Formats a plural message for a given number.
334f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
335f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param number  a number for which the plural message should be formatted
336f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                for. If no pattern has been applied to this
337f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                PluralFormat object yet, the formatted number
338f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                will be returned.
339f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success or failure code on exit, which
340f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
341f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return        the string containing the formatted plural message.
342f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
343f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
344f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString format(double number, UErrorCode& status) const;
345f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
346f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
347f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Formats a plural message for a given number.
348f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
349f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param number   a number for which the plural message should be formatted
350f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 for. If no pattern has been applied to this
351f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 <code>PluralFormat</code> object yet, the formatted number
352f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 will be returned.
353f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param appendTo output parameter to receive result.
354f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 result is appended to existing contents.
355f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param pos      On input: an alignment field, if desired.
356f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 On output: the offsets of the alignment field.
357f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status   output param set to success/failure code on exit, which
358f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 must not indicate a failure before the function call.
359f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return         the string containing the formatted plural message.
360f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
361f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
362f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString& format(int32_t number,
363f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          UnicodeString& appendTo,
364f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          FieldPosition& pos,
365f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          UErrorCode& status) const;
366f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
367f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
368f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Formats a plural message for a given number.
369f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
370f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param number   a number for which the plural message should be formatted
371f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 for. If no pattern has been applied to this
372f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 PluralFormat object yet, the formatted number
373f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 will be returned.
374f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param appendTo output parameter to receive result.
375f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 result is appended to existing contents.
376f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param pos      On input: an alignment field, if desired.
377f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 On output: the offsets of the alignment field.
378f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status   output param set to success/failure code on exit, which
379f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                 must not indicate a failure before the function call.
380f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return         the string containing the formatted plural message.
381f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
382f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
383f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString& format(double number,
384f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          UnicodeString& appendTo,
385f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          FieldPosition& pos,
386f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                          UErrorCode& status) const;
387f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
388f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
389f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Sets the locale used by this <code>PluraFormat</code> object.
390f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Note: Calling this method resets this <code>PluraFormat</code> object,
391f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *     i.e., a pattern that was applied previously will be removed,
392f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *     and the NumberFormat is set to the default number format for
393f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *     the locale.  The resulting format behaves the same as one
394f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *     constructed from {@link #PluralFormat(const Locale& locale, UErrorCode& status)}.
395f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param locale  the <code>locale</code> to use to configure the formatter.
396f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param status  output param set to success/failure code on exit, which
397f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                must not indicate a failure before the function call.
398f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
399f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
400f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void setLocale(const Locale& locale, UErrorCode& status);
401f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
402f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
403f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * Sets the number format used by this formatter.  You only need to
404f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * call this if you want a different number format than the default
405f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * formatter for the locale.
406f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * @param format  the number format to use.
407f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * @param status  output param set to success/failure code on exit, which
408f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      *                must not indicate a failure before the function call.
409f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * @stable ICU 4.0
410f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      */
411f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void setNumberFormat(const NumberFormat* format, UErrorCode& status);
412f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
413f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
414f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)       * Assignment operator
415f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)       *
416f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)       * @param other    the PluralFormat object to copy from.
417f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)       * @stable ICU 4.0
418f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)       */
419f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat& operator=(const PluralFormat& other);
420f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
421f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
422f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * Return true if another object is semantically equal to this one.
423f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      *
424f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * @param other    the PluralFormat object to be compared with.
425f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * @return         true if other is semantically equal to this.
426f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      * @stable ICU 4.0
427f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)      */
428f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool operator==(const Format& other) const;
429f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
430f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
431f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Return true if another object is semantically unequal to this one.
432f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
433f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @param other    the PluralFormat object to be compared with.
434f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @return         true if other is semantically unequal to this.
435f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
436f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
437f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual UBool operator!=(const Format& other) const;
438f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
439f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
440f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * Clones this Format object polymorphically.  The caller owns the
441f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * result and should delete it when done.
442f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
443f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
444f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    virtual Format* clone(void) const;
445f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
446f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
447f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * Redeclared Format method.
448f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *
449f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param obj       The object to be formatted into a string.
450f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param appendTo  output parameter to receive result.
451f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *                  Result is appended to existing contents.
452f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param pos       On input: an alignment field, if desired.
453f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *                  On output: the offsets of the alignment field.
454f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param status    output param filled with success/failure status.
455f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @return          Reference to 'appendTo' parameter.
456f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @stable ICU 4.0
457f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    */
458f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   UnicodeString& format(const Formattable& obj,
459f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         UnicodeString& appendTo,
460f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         FieldPosition& pos,
461f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                         UErrorCode& status) const;
462f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
463f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   /**
464f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * Returns the pattern from applyPattern() or constructor().
465f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *
466f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param  appendTo  output parameter to receive result.
467f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *                  Result is appended to existing contents.
468f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @return the UnicodeString with inserted pattern.
469f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @stable ICU 4.0
470f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    */
471f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   UnicodeString& toPattern(UnicodeString& appendTo);
472f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
473f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   /**
474f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * This method is not yet supported by <code>PluralFormat</code>.
475f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * <P>
476f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * Before calling, set parse_pos.index to the offset you want to start
477f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * parsing at in the source. After calling, parse_pos.index is the end of
478f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * the text you parsed. If error occurs, index is unchanged.
479f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * <P>
480f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * When parsing, leading whitespace is discarded (with a successful parse),
481f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * while trailing whitespace is left as is.
482f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * <P>
483f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * See Format::parseObject() for more.
484f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *
485f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param source    The string to be parsed into an object.
486f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param result    Formattable to be set to the parse result.
487f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *                  If parse fails, return contents are undefined.
488f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @param parse_pos The position to start parsing at. Upon return
489f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *                  this param is set to the position after the
490f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *                  last character successfully parsed. If the
491f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *                  source is not parsed successfully, this param
492f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    *                  will remain unchanged.
493f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    * @stable ICU 4.0
494f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    */
495f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)   virtual void parseObject(const UnicodeString& source,
496f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            Formattable& result,
497f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                            ParsePosition& parse_pos) const;
498f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
499f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
500f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * ICU "poor man's RTTI", returns a UClassID for this class.
501f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
502f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
503f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
504f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
505f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    static UClassID U_EXPORT2 getStaticClassID(void);
506f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
507f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    /**
508f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * ICU "poor man's RTTI", returns a UClassID for the actual class.
509f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     *
510f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     * @stable ICU 4.0
511f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     */
512f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)     virtual UClassID getDynamicClassID() const;
513f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
514f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)private:
515f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    typedef enum fmtToken {
516f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        none,
517f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        tLetter,
518f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        tNumber,
519f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        tSpace,
520f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        tNumberSign,
521f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        tLeftBrace,
522f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)        tRightBrace
523f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    }fmtToken;
524f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
525f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Locale  locale;
526f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralRules* pluralRules;
527f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString pattern;
528f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    Hashtable  *fParsedValuesHash;
529f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NumberFormat*  numberFormat;
530f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    NumberFormat*  replacedNumberFormat;
531f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
532f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    PluralFormat();   // default constructor not implemented
533f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void init(const PluralRules* rules, const Locale& curlocale, UErrorCode& status);
534f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool inRange(UChar ch, fmtToken& type);
535f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UBool checkSufficientDefinition();
536f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void parsingFailure();
537f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    UnicodeString insertFormattedNumber(double number,
538f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        UnicodeString& message,
539f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        UnicodeString& appendTo,
540f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)                                        FieldPosition& pos) const;
541f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)    void copyHashtable(Hashtable *other, UErrorCode& status);
542f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)};
543f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
544f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)U_NAMESPACE_END
545f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
546f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif /* #if !UCONFIG_NO_FORMATTING */
547f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)
548f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)#endif // _PLURFMT
549f4ed1cf5d184064c4cf0e4359c6d5d8aadb50afaTorne (Richard Coles)//eof
550