]> git.saurik.com Git - apple/icu.git/blob - icuSources/i18n/plurrule_impl.h
ICU-511.32.tar.gz
[apple/icu.git] / icuSources / i18n / plurrule_impl.h
1 /*
2 *******************************************************************************
3 * Copyright (C) 2007-2011, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 *******************************************************************************
6 *
7 * File PLURRULE_IMPL.H
8 *
9 *******************************************************************************
10 */
11
12
13 #ifndef PLURRULE_IMPLE
14 #define PLURRULE_IMPLE
15
16 // Internal definitions for the PluralRules implementation.
17
18 #if !UCONFIG_NO_FORMATTING
19
20 #include "unicode/format.h"
21 #include "unicode/locid.h"
22 #include "unicode/parseerr.h"
23 #include "unicode/utypes.h"
24 #include "uvector.h"
25 #include "hash.h"
26
27 U_NAMESPACE_BEGIN
28
29 #define DOT ((UChar)0x002E)
30 #define SINGLE_QUOTE ((UChar)0x0027)
31 #define SLASH ((UChar)0x002F)
32 #define BACKSLASH ((UChar)0x005C)
33 #define SPACE ((UChar)0x0020)
34 #define QUOTATION_MARK ((UChar)0x0022)
35 #define NUMBER_SIGN ((UChar)0x0023)
36 #define ASTERISK ((UChar)0x002A)
37 #define COMMA ((UChar)0x002C)
38 #define HYPHEN ((UChar)0x002D)
39 #define U_ZERO ((UChar)0x0030)
40 #define U_ONE ((UChar)0x0031)
41 #define U_TWO ((UChar)0x0032)
42 #define U_THREE ((UChar)0x0033)
43 #define U_FOUR ((UChar)0x0034)
44 #define U_FIVE ((UChar)0x0035)
45 #define U_SIX ((UChar)0x0036)
46 #define U_SEVEN ((UChar)0x0037)
47 #define U_EIGHT ((UChar)0x0038)
48 #define U_NINE ((UChar)0x0039)
49 #define COLON ((UChar)0x003A)
50 #define SEMI_COLON ((UChar)0x003B)
51 #define CAP_A ((UChar)0x0041)
52 #define CAP_B ((UChar)0x0042)
53 #define CAP_R ((UChar)0x0052)
54 #define CAP_Z ((UChar)0x005A)
55 #define LOWLINE ((UChar)0x005F)
56 #define LEFTBRACE ((UChar)0x007B)
57 #define RIGHTBRACE ((UChar)0x007D)
58
59 #define LOW_A ((UChar)0x0061)
60 #define LOW_B ((UChar)0x0062)
61 #define LOW_C ((UChar)0x0063)
62 #define LOW_D ((UChar)0x0064)
63 #define LOW_E ((UChar)0x0065)
64 #define LOW_F ((UChar)0x0066)
65 #define LOW_G ((UChar)0x0067)
66 #define LOW_H ((UChar)0x0068)
67 #define LOW_I ((UChar)0x0069)
68 #define LOW_J ((UChar)0x006a)
69 #define LOW_K ((UChar)0x006B)
70 #define LOW_L ((UChar)0x006C)
71 #define LOW_M ((UChar)0x006D)
72 #define LOW_N ((UChar)0x006E)
73 #define LOW_O ((UChar)0x006F)
74 #define LOW_P ((UChar)0x0070)
75 #define LOW_Q ((UChar)0x0071)
76 #define LOW_R ((UChar)0x0072)
77 #define LOW_S ((UChar)0x0073)
78 #define LOW_T ((UChar)0x0074)
79 #define LOW_U ((UChar)0x0075)
80 #define LOW_V ((UChar)0x0076)
81 #define LOW_W ((UChar)0x0077)
82 #define LOW_Y ((UChar)0x0079)
83 #define LOW_Z ((UChar)0x007A)
84
85
86 #define PLURAL_RANGE_HIGH 0x7fffffff;
87
88
89 typedef enum PluralKey {
90 pZero,
91 pOne,
92 pTwo,
93 pFew,
94 pMany,
95 pOther,
96 pLast
97 }PluralKey;
98
99 typedef enum tokenType {
100 none,
101 tLetter,
102 tNumber,
103 tComma,
104 tSemiColon,
105 tSpace,
106 tColon,
107 tDot,
108 tKeyword,
109 tZero,
110 tOne,
111 tTwo,
112 tFew,
113 tMany,
114 tOther,
115 tAnd,
116 tOr,
117 tMod,
118 tNot,
119 tIn,
120 tWithin,
121 tNotIn,
122 tVariableN,
123 tIs,
124 tLeftBrace,
125 tRightBrace
126 }tokenType;
127
128 class RuleParser : public UMemory {
129 public:
130 RuleParser();
131 virtual ~RuleParser();
132 void getNextToken(const UnicodeString& ruleData, int32_t *ruleIndex, UnicodeString& token,
133 tokenType& type, UErrorCode &status);
134 void checkSyntax(tokenType prevType, tokenType curType, UErrorCode &status);
135 private:
136 void getKeyType(const UnicodeString& token, tokenType& type, UErrorCode &status);
137 UBool inRange(UChar ch, tokenType& type);
138 UBool isValidKeyword(const UnicodeString& token);
139 };
140
141 class AndConstraint : public UMemory {
142 public:
143 typedef enum RuleOp {
144 NONE,
145 MOD
146 } RuleOp;
147 RuleOp op;
148 int32_t opNum;
149 int32_t rangeLow;
150 int32_t rangeHigh;
151 UBool notIn;
152 UBool integerOnly;
153 AndConstraint *next;
154
155 AndConstraint();
156 AndConstraint(const AndConstraint& other);
157 virtual ~AndConstraint();
158 AndConstraint* add();
159 UBool isFulfilled(double number);
160 UBool isLimited();
161 int32_t updateRepeatLimit(int32_t maxLimit);
162 };
163
164 class OrConstraint : public UMemory {
165 public:
166 AndConstraint *childNode;
167 OrConstraint *next;
168 OrConstraint();
169
170 OrConstraint(const OrConstraint& other);
171 virtual ~OrConstraint();
172 AndConstraint* add();
173 UBool isFulfilled(double number);
174 UBool isLimited();
175 };
176
177 class RuleChain : public UMemory {
178 public:
179 OrConstraint *ruleHeader;
180 UnicodeString keyword;
181 RuleChain();
182 RuleChain(const RuleChain& other);
183 RuleChain *next;
184
185 virtual ~RuleChain();
186 UnicodeString select(double number) const;
187 void dumpRules(UnicodeString& result);
188 int32_t getRepeatLimit();
189 UBool isLimited();
190 UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const;
191 UBool isKeyword(const UnicodeString& keyword) const;
192 void setRepeatLimit();
193 private:
194 int32_t repeatLimit;
195 };
196
197 class PluralKeywordEnumeration : public StringEnumeration {
198 public:
199 PluralKeywordEnumeration(RuleChain *header, UErrorCode& status);
200 virtual ~PluralKeywordEnumeration();
201 static UClassID U_EXPORT2 getStaticClassID(void);
202 virtual UClassID getDynamicClassID(void) const;
203 virtual const UnicodeString* snext(UErrorCode& status);
204 virtual void reset(UErrorCode& status);
205 virtual int32_t count(UErrorCode& status) const;
206 private:
207 int32_t pos;
208 UVector fKeywordNames;
209 };
210
211 U_NAMESPACE_END
212
213 #endif /* #if !UCONFIG_NO_FORMATTING */
214
215 #endif // _PLURRULE_IMPL
216 //eof