1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html#License
3 /*
4  *******************************************************************************
5  * Copyright (C) 2015, International Business Machines Corporation and
6  * others. All Rights Reserved.
7  *******************************************************************************
8  */
9 package com.ibm.icu.impl;
10 
11 import java.util.Arrays;
12 import java.util.Collections;
13 import java.util.List;
14 
15 /**
16  * Standard CLDR plural form/category constants.
17  * See http://www.unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules
18  */
19 public enum StandardPlural {
20     ZERO("zero"),
21     ONE("one"),
22     TWO("two"),
23     FEW("few"),
24     MANY("many"),
25     OTHER("other");
26 
27     /**
28      * Numeric index of OTHER, same as OTHER.ordinal().
29      */
30     public static final int OTHER_INDEX = OTHER.ordinal();
31 
32     /**
33      * Unmodifiable List of all standard plural form constants.
34      * List version of {@link #values()}.
35      */
36     public static final List<StandardPlural> VALUES =
37             Collections.unmodifiableList(Arrays.asList(values()));
38 
39     /**
40      * Number of standard plural forms/categories.
41      */
42     public static final int COUNT = VALUES.size();
43 
44     private final String keyword;
45 
StandardPlural(String kw)46     private StandardPlural(String kw) {
47         keyword = kw;
48     }
49 
50     /**
51      * @return the lowercase CLDR keyword string for the plural form
52      */
getKeyword()53     public final String getKeyword() {
54         return keyword;
55     }
56 
57     /**
58      * @param keyword for example "few" or "other"
59      * @return the plural form corresponding to the keyword, or null
60      */
orNullFromString(CharSequence keyword)61     public static final StandardPlural orNullFromString(CharSequence keyword) {
62         switch (keyword.length()) {
63         case 3:
64             if ("one".contentEquals(keyword)) {
65                 return ONE;
66             } else if ("two".contentEquals(keyword)) {
67                 return TWO;
68             } else if ("few".contentEquals(keyword)) {
69                 return FEW;
70             }
71             break;
72         case 4:
73             if ("many".contentEquals(keyword)) {
74                 return MANY;
75             } else if ("zero".contentEquals(keyword)) {
76                 return ZERO;
77             }
78             break;
79         case 5:
80             if ("other".contentEquals(keyword)) {
81                 return OTHER;
82             }
83             break;
84         default:
85             break;
86         }
87         return null;
88     }
89 
90     /**
91      * @param keyword for example "few" or "other"
92      * @return the plural form corresponding to the keyword, or OTHER
93      */
orOtherFromString(CharSequence keyword)94     public static final StandardPlural orOtherFromString(CharSequence keyword) {
95         StandardPlural p = orNullFromString(keyword);
96         return p != null ? p : OTHER;
97     }
98 
99     /**
100      * @param keyword for example "few" or "other"
101      * @return the plural form corresponding to the keyword
102      * @throws IllegalArgumentException if the keyword is not a plural form
103      */
fromString(CharSequence keyword)104     public static final StandardPlural fromString(CharSequence keyword) {
105         StandardPlural p = orNullFromString(keyword);
106         if (p != null) {
107             return p;
108         } else {
109             throw new IllegalArgumentException(keyword.toString());
110         }
111     }
112 
113     /**
114      * @param keyword for example "few" or "other"
115      * @return the index of the plural form corresponding to the keyword, or a negative value
116      */
indexOrNegativeFromString(CharSequence keyword)117     public static final int indexOrNegativeFromString(CharSequence keyword) {
118         StandardPlural p = orNullFromString(keyword);
119         return p != null ? p.ordinal() : -1;
120     }
121 
122     /**
123      * @param keyword for example "few" or "other"
124      * @return the index of the plural form corresponding to the keyword, or OTHER_INDEX
125      */
indexOrOtherIndexFromString(CharSequence keyword)126     public static final int indexOrOtherIndexFromString(CharSequence keyword) {
127         StandardPlural p = orNullFromString(keyword);
128         return p != null ? p.ordinal() : OTHER.ordinal();
129     }
130 
131     /**
132      * @param keyword for example "few" or "other"
133      * @return the index of the plural form corresponding to the keyword
134      * @throws IllegalArgumentException if the keyword is not a plural form
135      */
indexFromString(CharSequence keyword)136     public static final int indexFromString(CharSequence keyword) {
137         StandardPlural p = orNullFromString(keyword);
138         if (p != null) {
139             return p.ordinal();
140         } else {
141             throw new IllegalArgumentException(keyword.toString());
142         }
143     }
144 }