| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 ******************************************************************************* | |
| 3 * Copyright (C) 2008-2010, International Business Machines Corporation and | |
| 4 * others. All Rights Reserved. | |
| 5 ******************************************************************************* | |
| 6 * | |
| 7 * | |
| 8 * File PLURRULE.H | |
| 9 * | |
| 10 * Modification History:* | |
| 11 * Date Name Description | |
| 12 * | |
| 13 ******************************************************************************** | |
| 14 */ | |
| 15 | |
| 16 #ifndef PLURRULE | |
| 17 #define PLURRULE | |
| 18 | |
| 19 #include "unicode/utypes.h" | |
| 20 | |
| 21 /** | |
| 22 * \file | |
| 23 * \brief C++ API: PluralRules object | |
| 24 */ | |
| 25 | |
| 26 #if !UCONFIG_NO_FORMATTING | |
| 27 | |
| 28 #include "unicode/format.h" | |
| 29 | |
| 30 U_NAMESPACE_BEGIN | |
| 31 | |
| 32 class Hashtable; | |
| 33 class RuleChain; | |
| 34 class RuleParser; | |
| 35 | |
| 36 /** | |
| 37 * Defines rules for mapping positive long values onto a small set of | |
| 38 * keywords. Rules are constructed from a text description, consisting | |
| 39 * of a series of keywords and conditions. The {@link #select} method | |
| 40 * examines each condition in order and returns the keyword for the | |
| 41 * first condition that matches the number. If none match, | |
| 42 * default rule(other) is returned. | |
| 43 * | |
| 44 * Examples:<pre> | |
| 45 * "one: n is 1; few: n in 2..4"</pre> | |
| 46 * This defines two rules, for 'one' and 'few'. The condition for | |
| 47 * 'one' is "n is 1" which means that the number must be equal to | |
| 48 * 1 for this condition to pass. The condition for 'few' is | |
| 49 * "n in 2..4" which means that the number must be between 2 and | |
| 50 * 4 inclusive for this condition to pass. All other numbers | |
| 51 * are assigned the keyword "other" by the default rule. | |
| 52 * </p><pre> | |
| 53 * "zero: n is 0; one: n is 1; zero: n mod 100 in 1..19"</pre> | |
| 54 * This illustrates that the same keyword can be defined multiple times. | |
| 55 * Each rule is examined in order, and the first keyword whose condition | |
| 56 * passes is the one returned. Also notes that a modulus is applied | |
| 57 * to n in the last rule. Thus its condition holds for 119, 219, 319... | |
| 58 * </p><pre> | |
| 59 * "one: n is 1; few: n mod 10 in 2..4 and n mod 100 not in 12..14"</pre> | |
| 60 * This illustrates conjunction and negation. The condition for 'few' | |
| 61 * has two parts, both of which must be met: "n mod 10 in 2..4" and | |
| 62 * "n mod 100 not in 12..14". The first part applies a modulus to n | |
| 63 * before the test as in the previous example. The second part applies | |
| 64 * a different modulus and also uses negation, thus it matches all | |
| 65 * numbers _not_ in 12, 13, 14, 112, 113, 114, 212, 213, 214... | |
| 66 * </p> | |
| 67 * <p> | |
| 68 * Syntax:<pre> | |
| 69 * \code | |
| 70 * rules = rule (';' rule)* | |
| 71 * rule = keyword ':' condition | |
| 72 * keyword = <identifier> | |
| 73 * condition = and_condition ('or' and_condition)* | |
| 74 * and_condition = relation ('and' relation)* | |
| 75 * relation = is_relation | in_relation | within_relation | 'n' <EOL> | |
| 76 * is_relation = expr 'is' ('not')? value | |
| 77 * in_relation = expr ('not')? 'in' range | |
| 78 * within_relation = expr ('not')? 'within' range | |
| 79 * expr = 'n' ('mod' value)? | |
| 80 * value = digit+ | |
| 81 * digit = 0|1|2|3|4|5|6|7|8|9 | |
| 82 * range = value'..'value | |
| 83 * \endcode | |
| 84 * </pre></p> | |
| 85 * <p> | |
| 86 * The difference between 'in' and 'within' is that 'in' only includes | |
| 87 * integers in the specified range, while 'within' includes all values.</p> | |
| 88 * <p> | |
| 89 * Keywords | |
| 90 * could be defined by users or from ICU locale data. There are 6 | |
| 91 * predefined values in ICU - 'zero', 'one', 'two', 'few', 'many' and | |
| 92 * 'other'. Callers need to check the value of keyword returned by | |
| 93 * {@link #select} method. | |
| 94 * </p> | |
| 95 * | |
| 96 * Examples:<pre> | |
| 97 * UnicodeString keyword = pl->select(number); | |
| 98 * if (keyword== UnicodeString("one") { | |
| 99 * ... | |
| 100 * } | |
| 101 * else if ( ... ) | |
| 102 * </pre> | |
| 103 * <strong>Note:</strong><br> | |
| 104 * <p> | |
| 105 * ICU defines plural rules for many locales based on CLDR <i>Language Plural
Rules</i>. | |
| 106 * For these predefined rules, see CLDR page at | |
| 107 * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_
rules.html | |
| 108 * </p> | |
| 109 */ | |
| 110 class U_I18N_API PluralRules : public UObject { | |
| 111 public: | |
| 112 | |
| 113 /** | |
| 114 * Constructor. | |
| 115 * @param status Output param set to success/failure code on exit, which | |
| 116 * must not indicate a failure before the function call. | |
| 117 * | |
| 118 * @stable ICU 4.0 | |
| 119 */ | |
| 120 PluralRules(UErrorCode& status); | |
| 121 | |
| 122 /** | |
| 123 * Copy constructor. | |
| 124 * @stable ICU 4.0 | |
| 125 */ | |
| 126 PluralRules(const PluralRules& other); | |
| 127 | |
| 128 /** | |
| 129 * Destructor. | |
| 130 * @stable ICU 4.0 | |
| 131 */ | |
| 132 virtual ~PluralRules(); | |
| 133 | |
| 134 /** | |
| 135 * Clone | |
| 136 * @stable ICU 4.0 | |
| 137 */ | |
| 138 PluralRules* clone() const; | |
| 139 | |
| 140 /** | |
| 141 * Assignment operator. | |
| 142 * @stable ICU 4.0 | |
| 143 */ | |
| 144 PluralRules& operator=(const PluralRules&); | |
| 145 | |
| 146 /** | |
| 147 * Creates a PluralRules from a description if it is parsable, otherwise | |
| 148 * returns null. | |
| 149 * | |
| 150 * @param description rule description | |
| 151 * @param status Output param set to success/failure code on exit, whic
h | |
| 152 * must not indicate a failure before the function call. | |
| 153 * @return new PluralRules pointer. NULL if there is an error. | |
| 154 * @stable ICU 4.0 | |
| 155 */ | |
| 156 static PluralRules* U_EXPORT2 createRules(const UnicodeString& description, | |
| 157 UErrorCode& status); | |
| 158 | |
| 159 /** | |
| 160 * The default rules that accept any number. | |
| 161 * | |
| 162 * @param status Output param set to success/failure code on exit, which | |
| 163 * must not indicate a failure before the function call. | |
| 164 * @return new PluralRules pointer. NULL if there is an error. | |
| 165 * @stable ICU 4.0 | |
| 166 */ | |
| 167 static PluralRules* U_EXPORT2 createDefaultRules(UErrorCode& status); | |
| 168 | |
| 169 /** | |
| 170 * Provides access to the predefined <code>PluralRules</code> for a given | |
| 171 * locale. | |
| 172 * | |
| 173 * @param locale The locale for which a <code>PluralRules</code> object is | |
| 174 * returned. | |
| 175 * @param status Output param set to success/failure code on exit, which | |
| 176 * must not indicate a failure before the function call. | |
| 177 * @return The predefined <code>PluralRules</code> object pointer for | |
| 178 * this locale. If there's no predefined rules for this local
e, | |
| 179 * the rules for the closest parent in the locale hierarchy | |
| 180 * that has one will be returned. The final fallback always | |
| 181 * returns the default 'other' rules. | |
| 182 * @stable ICU 4.0 | |
| 183 */ | |
| 184 static PluralRules* U_EXPORT2 forLocale(const Locale& locale, UErrorCode& st
atus); | |
| 185 | |
| 186 /** | |
| 187 * Given a number, returns the keyword of the first rule that applies to | |
| 188 * the number. This function can be used with isKeyword* functions to | |
| 189 * determine the keyword for default plural rules. | |
| 190 * | |
| 191 * @param number The number for which the rule has to be determined. | |
| 192 * @return The keyword of the selected rule. | |
| 193 * @stable ICU 4.0 | |
| 194 */ | |
| 195 UnicodeString select(int32_t number) const; | |
| 196 | |
| 197 /** | |
| 198 * Given a number, returns the keyword of the first rule that applies to | |
| 199 * the number. This function can be used with isKeyword* functions to | |
| 200 * determine the keyword for default plural rules. | |
| 201 * | |
| 202 * @param number The number for which the rule has to be determined. | |
| 203 * @return The keyword of the selected rule. | |
| 204 * @stable ICU 4.0 | |
| 205 */ | |
| 206 UnicodeString select(double number) const; | |
| 207 | |
| 208 /** | |
| 209 * Returns a list of all rule keywords used in this <code>PluralRules</code> | |
| 210 * object. The rule 'other' is always present by default. | |
| 211 * | |
| 212 * @param status Output param set to success/failure code on exit, which | |
| 213 * must not indicate a failure before the function call. | |
| 214 * @return StringEnumeration with the keywords. | |
| 215 * The caller must delete the object. | |
| 216 * @stable ICU 4.0 | |
| 217 */ | |
| 218 StringEnumeration* getKeywords(UErrorCode& status) const; | |
| 219 | |
| 220 /** | |
| 221 * Returns TRUE if the given keyword is defined in this | |
| 222 * <code>PluralRules</code> object. | |
| 223 * | |
| 224 * @param keyword the input keyword. | |
| 225 * @return TRUE if the input keyword is defined. | |
| 226 * Otherwise, return FALSE. | |
| 227 * @stable ICU 4.0 | |
| 228 */ | |
| 229 UBool isKeyword(const UnicodeString& keyword) const; | |
| 230 | |
| 231 | |
| 232 /** | |
| 233 * Returns keyword for default plural form. | |
| 234 * | |
| 235 * @return keyword for default plural form. | |
| 236 * @internal 4.0 | |
| 237 * @stable ICU 4.0 | |
| 238 */ | |
| 239 UnicodeString getKeywordOther() const; | |
| 240 | |
| 241 /** | |
| 242 * Compares the equality of two PluralRules objects. | |
| 243 * | |
| 244 * @param other The other PluralRules object to be compared with. | |
| 245 * @return True if the given PluralRules is the same as this | |
| 246 * PluralRules; false otherwise. | |
| 247 * @stable ICU 4.0 | |
| 248 */ | |
| 249 virtual UBool operator==(const PluralRules& other) const; | |
| 250 | |
| 251 /** | |
| 252 * Compares the inequality of two PluralRules objects. | |
| 253 * | |
| 254 * @param other The PluralRules object to be compared with. | |
| 255 * @return True if the given PluralRules is not the same as this | |
| 256 * PluralRules; false otherwise. | |
| 257 * @stable ICU 4.0 | |
| 258 */ | |
| 259 UBool operator!=(const PluralRules& other) const {return !operator==(other)
;} | |
| 260 | |
| 261 | |
| 262 /** | |
| 263 * ICU "poor man's RTTI", returns a UClassID for this class. | |
| 264 * | |
| 265 * @stable ICU 4.0 | |
| 266 * | |
| 267 */ | |
| 268 static UClassID U_EXPORT2 getStaticClassID(void); | |
| 269 | |
| 270 /** | |
| 271 * ICU "poor man's RTTI", returns a UClassID for the actual class. | |
| 272 * | |
| 273 * @stable ICU 4.0 | |
| 274 */ | |
| 275 virtual UClassID getDynamicClassID() const; | |
| 276 | |
| 277 | |
| 278 private: | |
| 279 Hashtable *fLocaleStringsHash; | |
| 280 UnicodeString mLocaleName; | |
| 281 RuleChain *mRules; | |
| 282 RuleParser *mParser; | |
| 283 | |
| 284 PluralRules(); // default constructor not implemented | |
| 285 int32_t getRepeatLimit() const; | |
| 286 void parseDescription(UnicodeString& ruleData, RuleChain& rules, UErrorCode
&status); | |
| 287 void getNextLocale(const UnicodeString& localeData, int32_t* curIndex, Unico
deString& localeName); | |
| 288 void addRules(RuleChain& rules); | |
| 289 int32_t getNumberValue(const UnicodeString& token) const; | |
| 290 UnicodeString getRuleFromResource(const Locale& locale, UErrorCode& status); | |
| 291 | |
| 292 }; | |
| 293 | |
| 294 U_NAMESPACE_END | |
| 295 | |
| 296 #endif /* #if !UCONFIG_NO_FORMATTING */ | |
| 297 | |
| 298 #endif // _PLURRULE | |
| 299 //eof | |
| OLD | NEW |