10596faeddefbf198de137d5e893708495ab1584cFredrik Roubert// © 2016 and later: Unicode, Inc. and others. 264339d36f8bd4db5025fe2988eda22b491a9219cFredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html 30b3ec0516c035ea443fdc334025048597c740be1Markus Scherer/* 40b3ec0516c035ea443fdc334025048597c740be1Markus Scherer ******************************************************************************* 50b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * Copyright (C) 2015, International Business Machines Corporation 60b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * and others. All Rights Reserved. 70b3ec0516c035ea443fdc334025048597c740be1Markus Scherer ******************************************************************************* 80b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * standardplural.h 90b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * 100b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * created on: 2015dec14 110b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * created by: Markus W. Scherer 120b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 130b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 140b3ec0516c035ea443fdc334025048597c740be1Markus Scherer#ifndef __STANDARDPLURAL_H__ 150b3ec0516c035ea443fdc334025048597c740be1Markus Scherer#define __STANDARDPLURAL_H__ 160b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 170b3ec0516c035ea443fdc334025048597c740be1Markus Scherer#include "unicode/utypes.h" 180b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 190b3ec0516c035ea443fdc334025048597c740be1Markus Scherer#if !UCONFIG_NO_FORMATTING 200b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 210b3ec0516c035ea443fdc334025048597c740be1Markus SchererU_NAMESPACE_BEGIN 220b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 23ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Schererclass UnicodeString; 24ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer 250b3ec0516c035ea443fdc334025048597c740be1Markus Scherer/** 260b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * Standard CLDR plural form/category constants. 270b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * See http://www.unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules 280b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 290b3ec0516c035ea443fdc334025048597c740be1Markus Schererclass U_I18N_API StandardPlural { 300b3ec0516c035ea443fdc334025048597c740be1Markus Schererpublic: 310b3ec0516c035ea443fdc334025048597c740be1Markus Scherer enum Form { 320b3ec0516c035ea443fdc334025048597c740be1Markus Scherer ZERO, 330b3ec0516c035ea443fdc334025048597c740be1Markus Scherer ONE, 340b3ec0516c035ea443fdc334025048597c740be1Markus Scherer TWO, 350b3ec0516c035ea443fdc334025048597c740be1Markus Scherer FEW, 360b3ec0516c035ea443fdc334025048597c740be1Markus Scherer MANY, 370b3ec0516c035ea443fdc334025048597c740be1Markus Scherer OTHER, 380b3ec0516c035ea443fdc334025048597c740be1Markus Scherer COUNT 390b3ec0516c035ea443fdc334025048597c740be1Markus Scherer }; 400b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 410b3ec0516c035ea443fdc334025048597c740be1Markus Scherer /** 420b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @return the lowercase CLDR keyword string for the plural form 430b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 440b3ec0516c035ea443fdc334025048597c740be1Markus Scherer static const char *getKeyword(Form p); 450b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 460b3ec0516c035ea443fdc334025048597c740be1Markus Scherer /** 470b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @param keyword for example "few" or "other" 480b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @return the plural form corresponding to the keyword, or OTHER 490b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 500b3ec0516c035ea443fdc334025048597c740be1Markus Scherer static Form orOtherFromString(const char *keyword) { 510b3ec0516c035ea443fdc334025048597c740be1Markus Scherer return static_cast<Form>(indexOrOtherIndexFromString(keyword)); 520b3ec0516c035ea443fdc334025048597c740be1Markus Scherer } 530b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 540b3ec0516c035ea443fdc334025048597c740be1Markus Scherer /** 55ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @param keyword for example "few" or "other" 56ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @return the plural form corresponding to the keyword, or OTHER 57ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer */ 58ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer static Form orOtherFromString(const UnicodeString &keyword) { 59ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer return static_cast<Form>(indexOrOtherIndexFromString(keyword)); 60ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer } 61ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer 62ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer /** 630b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. 640b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * 650b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @param keyword for example "few" or "other" 660b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @return the plural form corresponding to the keyword 670b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 680b3ec0516c035ea443fdc334025048597c740be1Markus Scherer static Form fromString(const char *keyword, UErrorCode &errorCode) { 690b3ec0516c035ea443fdc334025048597c740be1Markus Scherer return static_cast<Form>(indexFromString(keyword, errorCode)); 700b3ec0516c035ea443fdc334025048597c740be1Markus Scherer } 710b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 720b3ec0516c035ea443fdc334025048597c740be1Markus Scherer /** 73ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. 74ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * 75ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @param keyword for example "few" or "other" 76ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @return the plural form corresponding to the keyword 77ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer */ 78ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer static Form fromString(const UnicodeString &keyword, UErrorCode &errorCode) { 79ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer return static_cast<Form>(indexFromString(keyword, errorCode)); 80ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer } 81ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer 82ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer /** 830b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @param keyword for example "few" or "other" 840b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @return the index of the plural form corresponding to the keyword, or a negative value 850b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 860b3ec0516c035ea443fdc334025048597c740be1Markus Scherer static int32_t indexOrNegativeFromString(const char *keyword); 870b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 880b3ec0516c035ea443fdc334025048597c740be1Markus Scherer /** 890b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @param keyword for example "few" or "other" 90ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @return the index of the plural form corresponding to the keyword, or a negative value 91ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer */ 92ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer static int32_t indexOrNegativeFromString(const UnicodeString &keyword); 93ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer 94ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer /** 95ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @param keyword for example "few" or "other" 96ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @return the index of the plural form corresponding to the keyword, or OTHER 970b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 980b3ec0516c035ea443fdc334025048597c740be1Markus Scherer static int32_t indexOrOtherIndexFromString(const char *keyword) { 990b3ec0516c035ea443fdc334025048597c740be1Markus Scherer int32_t i = indexOrNegativeFromString(keyword); 1000b3ec0516c035ea443fdc334025048597c740be1Markus Scherer return i >= 0 ? i : OTHER; 1010b3ec0516c035ea443fdc334025048597c740be1Markus Scherer } 1020b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 1030b3ec0516c035ea443fdc334025048597c740be1Markus Scherer /** 104ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @param keyword for example "few" or "other" 105ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @return the index of the plural form corresponding to the keyword, or OTHER 106ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer */ 107ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer static int32_t indexOrOtherIndexFromString(const UnicodeString &keyword) { 108ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer int32_t i = indexOrNegativeFromString(keyword); 109ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer return i >= 0 ? i : OTHER; 110ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer } 111ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer 112ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer /** 1130b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. 1140b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * 1150b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @param keyword for example "few" or "other" 1160b3ec0516c035ea443fdc334025048597c740be1Markus Scherer * @return the index of the plural form corresponding to the keyword 1170b3ec0516c035ea443fdc334025048597c740be1Markus Scherer */ 1180b3ec0516c035ea443fdc334025048597c740be1Markus Scherer static int32_t indexFromString(const char *keyword, UErrorCode &errorCode); 119ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer 120ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer /** 121ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * Sets U_ILLEGAL_ARGUMENT_ERROR if the keyword is not a plural form. 122ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * 123ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @param keyword for example "few" or "other" 124ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer * @return the index of the plural form corresponding to the keyword 125ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer */ 126ff847cb5b28f6e576a1f247aabae758caf2ca39aMarkus Scherer static int32_t indexFromString(const UnicodeString &keyword, UErrorCode &errorCode); 1270b3ec0516c035ea443fdc334025048597c740be1Markus Scherer}; 1280b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 1290b3ec0516c035ea443fdc334025048597c740be1Markus SchererU_NAMESPACE_END 1300b3ec0516c035ea443fdc334025048597c740be1Markus Scherer 1310b3ec0516c035ea443fdc334025048597c740be1Markus Scherer#endif // !UCONFIG_NO_FORMATTING 1320b3ec0516c035ea443fdc334025048597c740be1Markus Scherer#endif // __STANDARDPLURAL_H__ 133