150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/********************************************************************
250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * COPYRIGHT:
3b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho * Copyright (c) 1997-2011, International Business Machines Corporation and
450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * others. All Rights Reserved.
550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (C) 2010 , Yahoo! Inc.
650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ********************************************************************
750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * File SELFMT.H
950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Modification History:
1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *
1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *   Date        Name        Description
1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *   11/11/09    kirtig      Finished first cut of implementation.
1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho ********************************************************************/
1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#ifndef SELFMT
1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define SELFMT
1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
19b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/messagepattern.h"
2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/numfmt.h"
21b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho#include "unicode/utypes.h"
2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * \file
2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * \brief C++ API: SelectFormat object
2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */
2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#if !UCONFIG_NO_FORMATTING
2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_BEGIN
3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
32b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoclass MessageFormat;
3350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
3450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/**
3550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <p><code>SelectFormat</code> supports the creation of  internationalized
3650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * messages by selecting phrases based on keywords. The pattern  specifies
3750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * how to map keywords to phrases and provides a default phrase. The
3850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * object provided to the format method is a string that's matched
3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * against the keywords. If there is a match, the corresponding phrase
4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * is selected; otherwise, the default phrase is used.</p>
4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <h4>Using <code>SelectFormat</code> for Gender Agreement</h4>
4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
44b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * <p>Note: Typically, select formatting is done via <code>MessageFormat</code>
45b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * with a <code>select</code> argument type,
46b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * rather than using a stand-alone <code>SelectFormat</code>.</p>
47b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  *
4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <p>The main use case for the select format is gender based  inflection.
4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * When names or nouns are inserted into sentences, their gender can  affect pronouns,
5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * verb forms, articles, and adjectives. Special care needs to be
5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * taken for the case where the gender cannot be determined.
5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * The impact varies between languages:</p>
5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \htmlonly
5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <ul>
5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <li>English has three genders, and unknown gender is handled as a  special
5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * case. Names use the gender of the named person (if known), nouns  referring
5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * to people use natural gender, and inanimate objects are usually  neutral.
5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * The gender only affects pronouns: "he", "she", "it", "they".
5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <li>German differs from English in that the gender of nouns is  rather
6150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * arbitrary, even for nouns referring to people ("M&#x00E4;dchen", girl, is  neutral).
6250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * The gender affects pronouns ("er", "sie", "es"), articles ("der",  "die",
6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * "das"), and adjective forms ("guter Mann", "gute Frau", "gutes  M&#x00E4;dchen").
6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <li>French has only two genders; as in German the gender of nouns
6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * is rather arbitrary - for sun and moon, the genders
6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * are the opposite of those in German. The gender affects
6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * pronouns ("il", "elle"), articles ("le", "la"),
6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * adjective forms ("bon", "bonne"), and sometimes
7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * verb forms ("all&#x00E9;", "all&#x00E9;e").
7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <li>Polish distinguishes five genders (or noun classes),
7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * human masculine, animate non-human masculine, inanimate masculine,
7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * feminine, and neuter.
7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * </ul>
7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \endhtmlonly
7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <p>Some other languages have noun classes that are not related to  gender,
7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * but similar in grammatical use.
7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * Some African languages have around 20 noun classes.</p>
8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
81b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * <p><b>Note:</b>For the gender of a <i>person</i> in a given sentence,
82b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * we usually need to distinguish only between female, male and other/unknown.</p>
83b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  *
8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <p>To enable localizers to create sentence patterns that take their
8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * language's gender dependencies into consideration, software has to  provide
8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * information about the gender associated with a noun or name to
8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <code>MessageFormat</code>.
8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * Two main cases can be distinguished:</p>
8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <ul>
9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <li>For people, natural gender information should be maintained  for each person.
92b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * Keywords like "male", "female", "mixed" (for groups of people)
93b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * and "unknown" could be used.
9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
9550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <li>For nouns, grammatical gender information should be maintained  for
9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * each noun and per language, e.g., in resource bundles.
9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * The keywords "masculine", "feminine", and "neuter" are commonly  used,
9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * but some languages may require other keywords.
9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * </ul>
10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <p>The resulting keyword is provided to <code>MessageFormat</code>  as a
10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * parameter separate from the name or noun it's associated with. For  example,
10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * to generate a message such as "Jean went to Paris", three separate  arguments
10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * would be provided: The name of the person as argument 0, the  gender of
10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * the person as argument 1, and the name of the city as argument 2.
10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * The sentence pattern for English, where the gender of the person has
10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * no impact on this simple sentence, would not refer to argument 1  at all:</p>
10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <pre>{0} went to {2}.</pre>
11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
111b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * <p><b>Note:</b> The entire sentence should be included (and partially repeated)
112b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * inside each phrase. Otherwise translators would have to be trained on how to
113b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * move bits of the sentence in and out of the select argument of a message.
114b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * (The examples below do not follow this recommendation!)</p>
115b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  *
11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <p>The sentence pattern for French, where the gender of the person affects
11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * the form of the participle, uses a select format based on argument 1:</p>
11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \htmlonly<pre>{0} est {1, select, female {all&#x00E9;e} other {all&#x00E9;}} &#x00E0; {2}.</pre>\endhtmlonly
12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <p>Patterns can be nested, so that it's possible to handle  interactions of
12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * number and gender where necessary. For example, if the above  sentence should
12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * allow for the names of several people to be inserted, the  following sentence
12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * pattern can be used (with argument 0 the list of people's names,
12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * argument 1 the number of people, argument 2 their combined gender, and
12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * argument 3 the city name):</p>
12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \htmlonly
12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <pre>{0} {1, plural,
13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *                 one {est {2, select, female {all&#x00E9;e} other  {all&#x00E9;}}}
13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *                 other {sont {2, select, female {all&#x00E9;es} other {all&#x00E9;s}}}
13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *          }&#x00E0; {3}.</pre>
13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \endhtmlonly
13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <h4>Patterns and Their Interpretation</h4>
13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
137b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * <p>The <code>SelectFormat</code> pattern string defines the phrase output
13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * for each user-defined keyword.
139b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * The pattern is a sequence of (keyword, message) pairs.
140b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * A keyword is a "pattern identifier": [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+</p>
141b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  *
142b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * <p>Each message is a MessageFormat pattern string enclosed in {curly braces}.</p>
14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
144b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * <p>You always have to define a phrase for the default keyword
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <code>other</code>; this phrase is returned when the keyword
14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * provided to
14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * the <code>format</code> method matches no other keyword.
14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * If a pattern does not provide a phrase for <code>other</code>, the  method
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * it's provided to returns the error  <code>U_DEFAULT_KEYWORD_MISSING</code>.
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <br>
151b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * Pattern_White_Space between keywords and messages is ignored.
152b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * Pattern_White_Space within a message is preserved and output.</p>
15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
154b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * <p><pre>Example:
15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \htmlonly
15650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * UErrorCode status = U_ZERO_ERROR;
15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * MessageFormat *msgFmt = new MessageFormat(UnicodeString("{0} est  {1, select, female {all&#x00E9;e} other {all&#x00E9;}} &#x00E0; Paris."), Locale("fr"),  status);
15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * if (U_FAILURE(status)) {
16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *       return;
16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * }
16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * FieldPosition ignore(FieldPosition::DONT_CARE);
16350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * UnicodeString result;
16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * char* str1= "Kirti,female";
16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * Formattable args1[] = {"Kirti","female"};
16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * msgFmt->format(args1, 2, result, ignore, status);
16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * cout << "Input is " << str1 << " and result is: " << result << endl;
16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * delete msgFmt;
17050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \endhtmlonly
172b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho  * </pre>
17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * </p>
17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * Produces the output:<br>
17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \htmlonly
17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * <code>Kirti est all&#x00E9;e &#x00E0; Paris.</code>
17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  * \endhtmlonly
17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  *
18027f654740f2a26ad62a5c155af9199af9e69b889claireho  * @stable ICU 4.4
18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho  */
18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoclass U_I18N_API SelectFormat : public Format {
18450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehopublic:
18550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Creates a new <code>SelectFormat</code> for a given pattern string.
18850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param  pattern the pattern for this <code>SelectFormat</code>.
18950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                 errors are returned to status if the pattern is invalid.
19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param status   output param set to success/failure code on exit, which
19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                 must not indicate a failure before the function call.
19227f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    SelectFormat(const UnicodeString& pattern, UErrorCode& status);
19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * copy constructor.
19827f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    SelectFormat(const SelectFormat& other);
20150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
20350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Destructor.
20427f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
20550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
20650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual ~SelectFormat();
20750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
20850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
20950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Sets the pattern used by this select format.
21050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * for the keyword rules.
21150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Patterns and their interpretation are specified in the class description.
21250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
21350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param pattern the pattern for this select format
21450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                errors are returned to status if the pattern is invalid.
21550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param status  output param set to success/failure code on exit, which
21650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                must not indicate a failure before the function call.
21727f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
21850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
21950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    void applyPattern(const UnicodeString& pattern, UErrorCode& status);
22050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
22150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
22250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    using Format::format;
22350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
22450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
22550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Selects the phrase for  the given keyword
22650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
22750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param keyword  The keyword that is used to select an alternative.
22850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param appendTo output parameter to receive result.
22950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                 result is appended to existing contents.
23050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param pos      On input: an alignment field, if desired.
23150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                 On output: the offsets of the alignment field.
23250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param status  output param set to success/failure code on exit, which
23350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                 must not indicate a failure before the function call.
23450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return         Reference to 'appendTo' parameter.
23527f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
23650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
23750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString& format(const UnicodeString& keyword,
23850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            UnicodeString& appendTo,
23950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            FieldPosition& pos,
24050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            UErrorCode& status) const;
24150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
24250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
24350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Assignment operator
24450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
24550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param other    the SelectFormat object to copy from.
24627f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
24750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
24850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    SelectFormat& operator=(const SelectFormat& other);
24950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
25050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
25150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Return true if another object is semantically equal to this one.
25250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
25350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param other    the SelectFormat object to be compared with.
25450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return         true if other is semantically equal to this.
25527f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
25650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual UBool operator==(const Format& other) const;
25850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
25950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
26050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Return true if another object is semantically unequal to this one.
26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
26250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param other    the SelectFormat object to be compared with.
26350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return         true if other is semantically unequal to this.
26427f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
26550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
26650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual UBool operator!=(const Format& other) const;
26750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
26850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
26950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Clones this Format object polymorphically.  The caller owns the
27050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * result and should delete it when done.
27127f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
27250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
27350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual Format* clone(void) const;
27450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
27550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
27650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Format an object to produce a string.
27750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * This method handles keyword strings.
27850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * If the Formattable object is not a <code>UnicodeString</code>,
27950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * then it returns a failing UErrorCode.
28050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
28150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param obj       A keyword string that is used to select an alternative.
28250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param appendTo  output parameter to receive result.
28350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                  Result is appended to existing contents.
28450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param pos       On input: an alignment field, if desired.
28550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                  On output: the offsets of the alignment field.
28650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param status    output param filled with success/failure status.
28750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return          Reference to 'appendTo' parameter.
28827f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
28950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
29050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString& format(const Formattable& obj,
29150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                         UnicodeString& appendTo,
29250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                         FieldPosition& pos,
29350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                         UErrorCode& status) const;
29450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
29550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
29650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Returns the pattern from applyPattern() or constructor.
29750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
29850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param  appendTo  output parameter to receive result.
29950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *                  Result is appended to existing contents.
30050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @return the UnicodeString with inserted pattern.
30127f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
30250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
30350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    UnicodeString& toPattern(UnicodeString& appendTo);
30450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
30550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
30650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * This method is not yet supported by <code>SelectFormat</code>.
30750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * <P>
30850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * Before calling, set parse_pos.index to the offset you want to start
30950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * parsing at in the source. After calling, parse_pos.index is the end of
31050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * the text you parsed. If error occurs, index is unchanged.
31150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * <P>
31250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * When parsing, leading whitespace is discarded (with a successful parse),
31350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * while trailing whitespace is left as is.
31450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * <P>
31550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * See Format::parseObject() for more.
31650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *
31750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param source     The string to be parsed into an object.
31850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param result     Formattable to be set to the parse result.
31950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *     If parse fails, return contents are undefined.
32050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * @param parse_pos The position to start parsing at. Upon return
32150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *     this param is set to the position after the
32250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *     last character successfully parsed. If the
32350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *     source is not parsed successfully, this param
32450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     *     will remain unchanged.
32527f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
32650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
32750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual void parseObject(const UnicodeString& source,
32850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            Formattable& result,
32950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho                            ParsePosition& parse_pos) const;
33050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
33150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
33250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * ICU "poor man's RTTI", returns a UClassID for this class.
33327f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
33450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
33550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    static UClassID U_EXPORT2 getStaticClassID(void);
33650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
33750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    /**
33850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     * ICU "poor man's RTTI", returns a UClassID for the actual class.
33927f654740f2a26ad62a5c155af9199af9e69b889claireho     * @stable ICU 4.4
34050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho     */
34150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    virtual UClassID getDynamicClassID() const;
34250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
34350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoprivate:
344b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    friend class MessageFormat;
34550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
34650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    SelectFormat();   // default constructor not implemented.
34727f654740f2a26ad62a5c155af9199af9e69b889claireho
348b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /**
349b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Finds the SelectFormat sub-message for the given keyword, or the "other" sub-message.
350b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param pattern A MessagePattern.
351b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param partIndex the index of the first SelectFormat argument style part.
352b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param keyword a keyword to be matched to one of the SelectFormat argument's keywords.
353b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @param ec Error code.
354b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * @return the sub-message start part index.
355b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
356b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static int32_t findSubMessage(const MessagePattern& pattern, int32_t partIndex,
357b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho                                  const UnicodeString& keyword, UErrorCode& ec);
358b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
359b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    MessagePattern msgPattern;
36050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho};
36150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
36250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_NAMESPACE_END
36350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
36450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif /* #if !UCONFIG_NO_FORMATTING */
36550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho
36650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#endif // _SELFMT
36750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho//eof
368