/*
*******************************************************************************
* 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