diff options
author | Markus Scherer <markus.icu@gmail.com> | 2015-12-16 04:21:28 +0000 |
---|---|---|
committer | Fredrik Roubert <roubert@google.com> | 2016-01-28 16:43:05 +0100 |
commit | ff847cb5b28f6e576a1f247aabae758caf2ca39a (patch) | |
tree | 32cc7f69f1aee67a9afa07ad8fb5a34064466527 | |
parent | 0b3ec0516c035ea443fdc334025048597c740be1 (diff) | |
download | icu-ff847cb5b28f6e576a1f247aabae758caf2ca39a.tar.gz |
Cherry-pick: ticket:12031: StandardPlural from UnicodeString
http://bugs.icu-project.org/trac/changeset/38134
Change-Id: I78ae7f07c4320c150521262a937edd440748e435
-rw-r--r-- | icu4c/source/i18n/standardplural.cpp | 37 | ||||
-rw-r--r-- | icu4c/source/i18n/standardplural.h | 45 |
2 files changed, 81 insertions, 1 deletions
diff --git a/icu4c/source/i18n/standardplural.cpp b/icu4c/source/i18n/standardplural.cpp index 651a9bcc3..34127a42c 100644 --- a/icu4c/source/i18n/standardplural.cpp +++ b/icu4c/source/i18n/standardplural.cpp @@ -13,6 +13,7 @@ #if !UCONFIG_NO_FORMATTING +#include "unicode/unistr.h" #include "cstring.h" #include "standardplural.h" #include "uassert.h" @@ -63,6 +64,42 @@ int32_t StandardPlural::indexOrNegativeFromString(const char *keyword) { return -1; } +static const UChar gZero[] = { 0x7A, 0x65, 0x72, 0x6F }; +static const UChar gOne[] = { 0x6F, 0x6E, 0x65 }; +static const UChar gTwo[] = { 0x74, 0x77, 0x6F }; +static const UChar gFew[] = { 0x66, 0x65, 0x77 }; +static const UChar gMany[] = { 0x6D, 0x61, 0x6E, 0x79 }; +static const UChar gOther[] = { 0x6F, 0x74, 0x68, 0x65, 0x72 }; + +int32_t StandardPlural::indexOrNegativeFromString(const UnicodeString &keyword) { + switch (keyword.length()) { + case 3: + if (keyword.compare(gOne, 3) == 0) { + return ONE; + } else if (keyword.compare(gTwo, 3) == 0) { + return TWO; + } else if (keyword.compare(gFew, 3) == 0) { + return FEW; + } + break; + case 4: + if (keyword.compare(gMany, 4) == 0) { + return MANY; + } else if (keyword.compare(gZero, 4) == 0) { + return ZERO; + } + break; + case 5: + if (keyword.compare(gOther, 5) == 0) { + return OTHER; + } + break; + default: + break; + } + return -1; +} + int32_t StandardPlural::indexFromString(const char *keyword, UErrorCode &errorCode) { if (U_FAILURE(errorCode)) { return OTHER; } int32_t i = indexOrNegativeFromString(keyword); diff --git a/icu4c/source/i18n/standardplural.h b/icu4c/source/i18n/standardplural.h index 174f2a4a4..8a8de2188 100644 --- a/icu4c/source/i18n/standardplural.h +++ b/icu4c/source/i18n/standardplural.h @@ -18,6 +18,8 @@ U_NAMESPACE_BEGIN +class UnicodeString; + /** * Standard CLDR plural form/category constants. * See http://www.unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules @@ -48,6 +50,14 @@ public: } /** + * @param keyword for example "few" or "other" + * @return the plural form corresponding to the keyword, or OTHER + */ + static Form orOtherFromString(const UnicodeString &keyword) { + return static_cast<Form>(indexOrOtherIndexFromString(keyword)); + } + + /** * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. * * @param keyword for example "few" or "other" @@ -58,6 +68,16 @@ public: } /** + * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. + * + * @param keyword for example "few" or "other" + * @return the plural form corresponding to the keyword + */ + static Form fromString(const UnicodeString &keyword, UErrorCode &errorCode) { + return static_cast<Form>(indexFromString(keyword, errorCode)); + } + + /** * @param keyword for example "few" or "other" * @return the index of the plural form corresponding to the keyword, or a negative value */ @@ -65,7 +85,13 @@ public: /** * @param keyword for example "few" or "other" - * @return the index of the plural form corresponding to the keyword, or OTHER_INDEX + * @return the index of the plural form corresponding to the keyword, or a negative value + */ + static int32_t indexOrNegativeFromString(const UnicodeString &keyword); + + /** + * @param keyword for example "few" or "other" + * @return the index of the plural form corresponding to the keyword, or OTHER */ static int32_t indexOrOtherIndexFromString(const char *keyword) { int32_t i = indexOrNegativeFromString(keyword); @@ -73,12 +99,29 @@ public: } /** + * @param keyword for example "few" or "other" + * @return the index of the plural form corresponding to the keyword, or OTHER + */ + static int32_t indexOrOtherIndexFromString(const UnicodeString &keyword) { + int32_t i = indexOrNegativeFromString(keyword); + return i >= 0 ? i : OTHER; + } + + /** * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. * * @param keyword for example "few" or "other" * @return the index of the plural form corresponding to the keyword */ static int32_t indexFromString(const char *keyword, UErrorCode &errorCode); + + /** + * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. + * + * @param keyword for example "few" or "other" + * @return the index of the plural form corresponding to the keyword + */ + static int32_t indexFromString(const UnicodeString &keyword, UErrorCode &errorCode); }; U_NAMESPACE_END |