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