/* ******************************************************************************* * Copyright (C) 2007-2008, International Business Machines Corporation and * others. All Rights Reserved. ******************************************************************************* * * File PLURRULE_IMPL.H * ******************************************************************************* */ #ifndef PLURRULE_IMPLE #define PLURRULE_IMPLE /** * \file * \brief C++ API: Defines rules for mapping positive long values onto a small set of keywords. */ #if !UCONFIG_NO_FORMATTING #include "unicode/format.h" #include "unicode/locid.h" #include "unicode/parseerr.h" #include "unicode/utypes.h" #include "uvector.h" #include "hash.h" U_NAMESPACE_BEGIN #define DOT ((UChar)0x002E) #define SINGLE_QUOTE ((UChar)0x0027) #define SLASH ((UChar)0x002F) #define BACKSLASH ((UChar)0x005C) #define SPACE ((UChar)0x0020) #define QUOTATION_MARK ((UChar)0x0022) #define NUMBER_SIGN ((UChar)0x0023) #define ASTERISK ((UChar)0x002A) #define COMMA ((UChar)0x002C) #define HYPHEN ((UChar)0x002D) #define U_ZERO ((UChar)0x0030) #define U_ONE ((UChar)0x0031) #define U_TWO ((UChar)0x0032) #define U_THREE ((UChar)0x0033) #define U_FOUR ((UChar)0x0034) #define U_FIVE ((UChar)0x0035) #define U_SIX ((UChar)0x0036) #define U_SEVEN ((UChar)0x0037) #define U_EIGHT ((UChar)0x0038) #define U_NINE ((UChar)0x0039) #define COLON ((UChar)0x003A) #define SEMI_COLON ((UChar)0x003B) #define CAP_A ((UChar)0x0041) #define CAP_B ((UChar)0x0042) #define CAP_R ((UChar)0x0052) #define CAP_Z ((UChar)0x005A) #define LOWLINE ((UChar)0x005F) #define LEFTBRACE ((UChar)0x007B) #define RIGHTBRACE ((UChar)0x007D) #define LOW_A ((UChar)0x0061) #define LOW_B ((UChar)0x0062) #define LOW_C ((UChar)0x0063) #define LOW_D ((UChar)0x0064) #define LOW_E ((UChar)0x0065) #define LOW_F ((UChar)0x0066) #define LOW_G ((UChar)0x0067) #define LOW_H ((UChar)0x0068) #define LOW_I ((UChar)0x0069) #define LOW_J ((UChar)0x006a) #define LOW_K ((UChar)0x006B) #define LOW_L ((UChar)0x006C) #define LOW_M ((UChar)0x006D) #define LOW_N ((UChar)0x006E) #define LOW_O ((UChar)0x006F) #define LOW_P ((UChar)0x0070) #define LOW_Q ((UChar)0x0071) #define LOW_R ((UChar)0x0072) #define LOW_S ((UChar)0x0073) #define LOW_T ((UChar)0x0074) #define LOW_U ((UChar)0x0075) #define LOW_V ((UChar)0x0076) #define LOW_W ((UChar)0x0077) #define LOW_Y ((UChar)0x0079) #define LOW_Z ((UChar)0x007A) #define PLURAL_RANGE_HIGH 0x7fffffff; class UnicodeSet; typedef enum PluralKey { pZero, pOne, pTwo, pFew, pMany, pOther, pLast }PluralKey; typedef enum tokenType { none, tLetter, tNumber, tComma, tSemiColon, tSpace, tColon, tDot, tKeyword, tZero, tOne, tTwo, tFew, tMany, tOther, tAnd, tOr, tMod, tNot, tIn, tWithin, tNotIn, tVariableN, tIs, tLeftBrace, tRightBrace }tokenType; class RuleParser : public UMemory { public: RuleParser(); virtual ~RuleParser(); void getNextToken(const UnicodeString& ruleData, int32_t *ruleIndex, UnicodeString& token, tokenType& type, UErrorCode &status); void checkSyntax(tokenType prevType, tokenType curType, UErrorCode &status); private: UnicodeSet *idStartFilter; UnicodeSet *idContinueFilter; void getKeyType(const UnicodeString& token, tokenType& type, UErrorCode &status); UBool inRange(UChar ch, tokenType& type); UBool isValidKeyword(const UnicodeString& token); }; class AndConstraint : public UMemory { public: typedef enum RuleOp { NONE, MOD } RuleOp; RuleOp op; int32_t opNum; int32_t rangeLow; int32_t rangeHigh; UBool notIn; UBool integerOnly; AndConstraint *next; AndConstraint(); AndConstraint(const AndConstraint& other); virtual ~AndConstraint(); AndConstraint* add(); UBool isFulfilled(double number); int32_t updateRepeatLimit(int32_t maxLimit); }; class OrConstraint : public UMemory { public: AndConstraint *childNode; OrConstraint *next; OrConstraint(); OrConstraint(const OrConstraint& other); virtual ~OrConstraint(); AndConstraint* add(); UBool isFulfilled(double number); }; class RuleChain : public UMemory { public: OrConstraint *ruleHeader; UnicodeString keyword; RuleChain(); RuleChain(const RuleChain& other); RuleChain *next; virtual ~RuleChain(); UnicodeString select(double number) const; void dumpRules(UnicodeString& result); int32_t getRepeatLimit(); UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const; UBool isKeyword(const UnicodeString& keyword) const; void setRepeatLimit(); private: int32_t repeatLimit; }; class PluralKeywordEnumeration : public StringEnumeration { public: PluralKeywordEnumeration(RuleChain *header, UErrorCode& status); virtual ~PluralKeywordEnumeration(); static UClassID U_EXPORT2 getStaticClassID(void); virtual UClassID getDynamicClassID(void) const; virtual const UnicodeString* snext(UErrorCode& status); virtual void reset(UErrorCode& status); virtual int32_t count(UErrorCode& status) const; private: int32_t pos; UVector fKeywordNames; }; U_NAMESPACE_END #endif /* #if !UCONFIG_NO_FORMATTING */ #endif // _PLURRULE_IMPL //eof