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