12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer/*
432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer *******************************************************************************
532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * Copyright (C) 2015, International Business Machines Corporation and
632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * others. All Rights Reserved.
732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer *******************************************************************************
832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */
932d49d8c5367c893835119b37563984dbee3feb1Markus Schererpackage com.ibm.icu.impl;
1032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
1132d49d8c5367c893835119b37563984dbee3feb1Markus Schererimport java.util.Arrays;
1232d49d8c5367c893835119b37563984dbee3feb1Markus Schererimport java.util.Collections;
1332d49d8c5367c893835119b37563984dbee3feb1Markus Schererimport java.util.List;
1432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
1532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer/**
1632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * Standard CLDR plural form/category constants.
1732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer * See http://www.unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules
1832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer */
1932d49d8c5367c893835119b37563984dbee3feb1Markus Schererpublic enum StandardPlural {
2032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    ZERO("zero"),
2132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    ONE("one"),
2232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    TWO("two"),
2332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    FEW("few"),
2432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    MANY("many"),
2532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    OTHER("other");
2632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
2732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
2832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * Numeric index of OTHER, same as OTHER.ordinal().
2932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
3032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final int OTHER_INDEX = OTHER.ordinal();
3132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
3232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
3332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * Unmodifiable List of all standard plural form constants.
3432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * List version of {@link #values()}.
3532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
3632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final List<StandardPlural> VALUES =
3732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            Collections.unmodifiableList(Arrays.asList(values()));
3832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
3932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
4032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * Number of standard plural forms/categories.
4132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
4232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final int COUNT = VALUES.size();
4332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
4432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    private final String keyword;
4532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
4632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    private StandardPlural(String kw) {
4732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        keyword = kw;
4832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
4932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
5032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
5132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @return the lowercase CLDR keyword string for the plural form
5232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
5332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public final String getKeyword() {
5432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        return keyword;
5532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
5632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
5732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
5832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @param keyword for example "few" or "other"
5932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @return the plural form corresponding to the keyword, or null
6032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
6132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final StandardPlural orNullFromString(CharSequence keyword) {
6232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        switch (keyword.length()) {
6332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        case 3:
6432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            if ("one".contentEquals(keyword)) {
6532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer                return ONE;
6632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            } else if ("two".contentEquals(keyword)) {
6732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer                return TWO;
6832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            } else if ("few".contentEquals(keyword)) {
6932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer                return FEW;
7032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            }
7132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            break;
7232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        case 4:
7332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            if ("many".contentEquals(keyword)) {
7432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer                return MANY;
7532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            } else if ("zero".contentEquals(keyword)) {
7632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer                return ZERO;
7732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            }
7832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            break;
7932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        case 5:
8032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            if ("other".contentEquals(keyword)) {
8132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer                return OTHER;
8232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            }
8332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            break;
8432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        default:
8532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            break;
8632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        }
8732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        return null;
8832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
8932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
9032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
9132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @param keyword for example "few" or "other"
9232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @return the plural form corresponding to the keyword, or OTHER
9332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
9432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final StandardPlural orOtherFromString(CharSequence keyword) {
9532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        StandardPlural p = orNullFromString(keyword);
9632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        return p != null ? p : OTHER;
9732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
9832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
9932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
10032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @param keyword for example "few" or "other"
10132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @return the plural form corresponding to the keyword
10232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @throws IllegalArgumentException if the keyword is not a plural form
10332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
10432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final StandardPlural fromString(CharSequence keyword) {
10532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        StandardPlural p = orNullFromString(keyword);
10632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        if (p != null) {
10732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            return p;
10832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        } else {
10932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            throw new IllegalArgumentException(keyword.toString());
11032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        }
11132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
11232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
11332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
11432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @param keyword for example "few" or "other"
11532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @return the index of the plural form corresponding to the keyword, or a negative value
11632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
11732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final int indexOrNegativeFromString(CharSequence keyword) {
11832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        StandardPlural p = orNullFromString(keyword);
11932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        return p != null ? p.ordinal() : -1;
12032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
12132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
12232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
12332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @param keyword for example "few" or "other"
12432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @return the index of the plural form corresponding to the keyword, or OTHER_INDEX
12532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
12632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final int indexOrOtherIndexFromString(CharSequence keyword) {
12732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        StandardPlural p = orNullFromString(keyword);
12832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        return p != null ? p.ordinal() : OTHER.ordinal();
12932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
13032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer
13132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    /**
13232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @param keyword for example "few" or "other"
13332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @return the index of the plural form corresponding to the keyword
13432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     * @throws IllegalArgumentException if the keyword is not a plural form
13532d49d8c5367c893835119b37563984dbee3feb1Markus Scherer     */
13632d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    public static final int indexFromString(CharSequence keyword) {
13732d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        StandardPlural p = orNullFromString(keyword);
13832d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        if (p != null) {
13932d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            return p.ordinal();
14032d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        } else {
14132d49d8c5367c893835119b37563984dbee3feb1Markus Scherer            throw new IllegalArgumentException(keyword.toString());
14232d49d8c5367c893835119b37563984dbee3feb1Markus Scherer        }
14332d49d8c5367c893835119b37563984dbee3feb1Markus Scherer    }
14432d49d8c5367c893835119b37563984dbee3feb1Markus Scherer}