185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho/* 285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************* 359d709d503bab6e2b61931737e662dd293b40578ccornelius* Copyright (C) 2007-2013, International Business Machines Corporation and 485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* others. All Rights Reserved. 585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************* 685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* 785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* File PLURRULE_IMPL.H 885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho* 985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho******************************************************************************* 1085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho*/ 1185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 1385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#ifndef PLURRULE_IMPLE 1485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#define PLURRULE_IMPLE 1585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 16b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho// Internal definitions for the PluralRules implementation. 17b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 1885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#if !UCONFIG_NO_FORMATTING 1985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/format.h" 2185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/locid.h" 2285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/parseerr.h" 2359d709d503bab6e2b61931737e662dd293b40578ccornelius#include "unicode/ures.h" 2485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "unicode/utypes.h" 2585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "uvector.h" 2685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#include "hash.h" 2785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 2859d709d503bab6e2b61931737e662dd293b40578ccorneliusclass PluralRulesTest; 2959d709d503bab6e2b61931737e662dd293b40578ccornelius 3085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_BEGIN 3185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 3259d709d503bab6e2b61931737e662dd293b40578ccorneliusclass AndConstraint; 3359d709d503bab6e2b61931737e662dd293b40578ccorneliusclass RuleChain; 3459d709d503bab6e2b61931737e662dd293b40578ccornelius 3559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar DOT = ((UChar)0x002E); 3659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar SINGLE_QUOTE = ((UChar)0x0027); 3759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar SLASH = ((UChar)0x002F); 3859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar BACKSLASH = ((UChar)0x005C); 3959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar SPACE = ((UChar)0x0020); 4059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar EXCLAMATION = ((UChar)0x0021); 4159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar QUOTATION_MARK = ((UChar)0x0022); 4259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar NUMBER_SIGN = ((UChar)0x0023); 4359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar PERCENT_SIGN = ((UChar)0x0025); 4459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar ASTERISK = ((UChar)0x002A); 4559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar COMMA = ((UChar)0x002C); 4659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar HYPHEN = ((UChar)0x002D); 4759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_ZERO = ((UChar)0x0030); 4859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_ONE = ((UChar)0x0031); 4959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_TWO = ((UChar)0x0032); 5059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_THREE = ((UChar)0x0033); 5159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_FOUR = ((UChar)0x0034); 5259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_FIVE = ((UChar)0x0035); 5359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_SIX = ((UChar)0x0036); 5459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_SEVEN = ((UChar)0x0037); 5559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_EIGHT = ((UChar)0x0038); 5659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar U_NINE = ((UChar)0x0039); 5759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar COLON = ((UChar)0x003A); 5859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar SEMI_COLON = ((UChar)0x003B); 5959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar EQUALS = ((UChar)0x003D); 6059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar AT = ((UChar)0x0040); 6159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar CAP_A = ((UChar)0x0041); 6259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar CAP_B = ((UChar)0x0042); 6359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar CAP_R = ((UChar)0x0052); 6459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar CAP_Z = ((UChar)0x005A); 6559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOWLINE = ((UChar)0x005F); 6659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LEFTBRACE = ((UChar)0x007B); 6759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar RIGHTBRACE = ((UChar)0x007D); 6859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar TILDE = ((UChar)0x007E); 6959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar ELLIPSIS = ((UChar)0x2026); 7059d709d503bab6e2b61931737e662dd293b40578ccornelius 7159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_A = ((UChar)0x0061); 7259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_B = ((UChar)0x0062); 7359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_C = ((UChar)0x0063); 7459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_D = ((UChar)0x0064); 7559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_E = ((UChar)0x0065); 7659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_F = ((UChar)0x0066); 7759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_G = ((UChar)0x0067); 7859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_H = ((UChar)0x0068); 7959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_I = ((UChar)0x0069); 8059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_J = ((UChar)0x006a); 8159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_K = ((UChar)0x006B); 8259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_L = ((UChar)0x006C); 8359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_M = ((UChar)0x006D); 8459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_N = ((UChar)0x006E); 8559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_O = ((UChar)0x006F); 8659d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_P = ((UChar)0x0070); 8759d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_Q = ((UChar)0x0071); 8859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_R = ((UChar)0x0072); 8959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_S = ((UChar)0x0073); 9059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_T = ((UChar)0x0074); 9159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_U = ((UChar)0x0075); 9259d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_V = ((UChar)0x0076); 9359d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_W = ((UChar)0x0077); 9459d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_Y = ((UChar)0x0079); 9559d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const UChar LOW_Z = ((UChar)0x007A); 9659d709d503bab6e2b61931737e662dd293b40578ccornelius 9759d709d503bab6e2b61931737e662dd293b40578ccornelius 9859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic const int32_t PLURAL_RANGE_HIGH = 0x7fffffff; 9959d709d503bab6e2b61931737e662dd293b40578ccornelius 10059d709d503bab6e2b61931737e662dd293b40578ccorneliusenum tokenType { 10185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho none, 10285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tNumber, 10385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tComma, 10485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tSemiColon, 10585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tSpace, 10685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tColon, 10759d709d503bab6e2b61931737e662dd293b40578ccornelius tAt, // '@' 10885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tDot, 10959d709d503bab6e2b61931737e662dd293b40578ccornelius tDot2, 11059d709d503bab6e2b61931737e662dd293b40578ccornelius tEllipsis, 11185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tKeyword, 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tAnd, 11385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tOr, 11459d709d503bab6e2b61931737e662dd293b40578ccornelius tMod, // 'mod' or '%' 11559d709d503bab6e2b61931737e662dd293b40578ccornelius tNot, // 'not' only. 11659d709d503bab6e2b61931737e662dd293b40578ccornelius tIn, // 'in' only. 11759d709d503bab6e2b61931737e662dd293b40578ccornelius tEqual, // '=' only. 11859d709d503bab6e2b61931737e662dd293b40578ccornelius tNotEqual, // '!=' 11959d709d503bab6e2b61931737e662dd293b40578ccornelius tTilde, 12085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tWithin, 12185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho tIs, 12259d709d503bab6e2b61931737e662dd293b40578ccornelius tVariableN, 12359d709d503bab6e2b61931737e662dd293b40578ccornelius tVariableI, 12459d709d503bab6e2b61931737e662dd293b40578ccornelius tVariableF, 12559d709d503bab6e2b61931737e662dd293b40578ccornelius tVariableV, 12659d709d503bab6e2b61931737e662dd293b40578ccornelius tVariableT, 12759d709d503bab6e2b61931737e662dd293b40578ccornelius tDecimal, 12859d709d503bab6e2b61931737e662dd293b40578ccornelius tInteger, 12959d709d503bab6e2b61931737e662dd293b40578ccornelius tEOF 13059d709d503bab6e2b61931737e662dd293b40578ccornelius}; 13159d709d503bab6e2b61931737e662dd293b40578ccornelius 13285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 13359d709d503bab6e2b61931737e662dd293b40578ccorneliusclass PluralRuleParser: public UMemory { 13485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic: 13559d709d503bab6e2b61931737e662dd293b40578ccornelius PluralRuleParser(); 13659d709d503bab6e2b61931737e662dd293b40578ccornelius virtual ~PluralRuleParser(); 13759d709d503bab6e2b61931737e662dd293b40578ccornelius 13859d709d503bab6e2b61931737e662dd293b40578ccornelius void parse(const UnicodeString &rules, PluralRules *dest, UErrorCode &status); 13959d709d503bab6e2b61931737e662dd293b40578ccornelius void getNextToken(UErrorCode &status); 14059d709d503bab6e2b61931737e662dd293b40578ccornelius void checkSyntax(UErrorCode &status); 14159d709d503bab6e2b61931737e662dd293b40578ccornelius static int32_t getNumberValue(const UnicodeString &token); 14259d709d503bab6e2b61931737e662dd293b40578ccornelius 14385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate: 14459d709d503bab6e2b61931737e662dd293b40578ccornelius static tokenType getKeyType(const UnicodeString& token, tokenType type); 14559d709d503bab6e2b61931737e662dd293b40578ccornelius static tokenType charType(UChar ch); 14659d709d503bab6e2b61931737e662dd293b40578ccornelius static UBool isValidKeyword(const UnicodeString& token); 14759d709d503bab6e2b61931737e662dd293b40578ccornelius 14859d709d503bab6e2b61931737e662dd293b40578ccornelius const UnicodeString *ruleSrc; // The rules string. 14959d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t ruleIndex; // String index in the input rules, the current parse position. 15059d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString token; // Token most recently scanned. 15159d709d503bab6e2b61931737e662dd293b40578ccornelius tokenType type; 15259d709d503bab6e2b61931737e662dd293b40578ccornelius tokenType prevType; 15359d709d503bab6e2b61931737e662dd293b40578ccornelius 15459d709d503bab6e2b61931737e662dd293b40578ccornelius // The items currently being parsed & built. 15559d709d503bab6e2b61931737e662dd293b40578ccornelius // Note: currentChain may not be the last RuleChain in the 15659d709d503bab6e2b61931737e662dd293b40578ccornelius // list because the "other" chain is forced to the end. 15759d709d503bab6e2b61931737e662dd293b40578ccornelius AndConstraint *curAndConstraint; 15859d709d503bab6e2b61931737e662dd293b40578ccornelius RuleChain *currentChain; 15959d709d503bab6e2b61931737e662dd293b40578ccornelius 16059d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t rangeLowIdx; // Indices in the UVector of ranges of the 16159d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t rangeHiIdx; // low and hi values currently being parsed. 16259d709d503bab6e2b61931737e662dd293b40578ccornelius 16359d709d503bab6e2b61931737e662dd293b40578ccornelius enum EParseState { 16459d709d503bab6e2b61931737e662dd293b40578ccornelius kKeyword, 16559d709d503bab6e2b61931737e662dd293b40578ccornelius kExpr, 16659d709d503bab6e2b61931737e662dd293b40578ccornelius kValue, 16759d709d503bab6e2b61931737e662dd293b40578ccornelius kRangeList, 16859d709d503bab6e2b61931737e662dd293b40578ccornelius kSamples 16959d709d503bab6e2b61931737e662dd293b40578ccornelius }; 17059d709d503bab6e2b61931737e662dd293b40578ccornelius 17159d709d503bab6e2b61931737e662dd293b40578ccornelius}; 17259d709d503bab6e2b61931737e662dd293b40578ccornelius 17359d709d503bab6e2b61931737e662dd293b40578ccornelius/** 17459d709d503bab6e2b61931737e662dd293b40578ccornelius * class FixedDecimal serves to communicate the properties 17559d709d503bab6e2b61931737e662dd293b40578ccornelius * of a formatted number from a decimal formatter to PluralRules::select() 17659d709d503bab6e2b61931737e662dd293b40578ccornelius * 17759d709d503bab6e2b61931737e662dd293b40578ccornelius * see DecimalFormat::getFixedDecimal() 17859d709d503bab6e2b61931737e662dd293b40578ccornelius * @internal 17959d709d503bab6e2b61931737e662dd293b40578ccornelius */ 18059d709d503bab6e2b61931737e662dd293b40578ccorneliusclass U_I18N_API FixedDecimal: public UMemory { 18159d709d503bab6e2b61931737e662dd293b40578ccornelius public: 18259d709d503bab6e2b61931737e662dd293b40578ccornelius /** 18359d709d503bab6e2b61931737e662dd293b40578ccornelius * @param n the number, e.g. 12.345 18459d709d503bab6e2b61931737e662dd293b40578ccornelius * @param v The number of visible fraction digits, e.g. 3 18559d709d503bab6e2b61931737e662dd293b40578ccornelius * @param f The fraction digits, e.g. 345 18659d709d503bab6e2b61931737e662dd293b40578ccornelius */ 18759d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal(double n, int32_t v, int64_t f); 18859d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal(double n, int32_t); 18959d709d503bab6e2b61931737e662dd293b40578ccornelius explicit FixedDecimal(double n); 19059d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal(); 19159d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal(const UnicodeString &s, UErrorCode &ec); 19259d709d503bab6e2b61931737e662dd293b40578ccornelius FixedDecimal(const FixedDecimal &other); 19359d709d503bab6e2b61931737e662dd293b40578ccornelius 19459d709d503bab6e2b61931737e662dd293b40578ccornelius double get(tokenType operand) const; 19559d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t getVisibleFractionDigitCount() const; 19659d709d503bab6e2b61931737e662dd293b40578ccornelius 19759d709d503bab6e2b61931737e662dd293b40578ccornelius void init(double n, int32_t v, int64_t f); 19859d709d503bab6e2b61931737e662dd293b40578ccornelius void init(double n); 19959d709d503bab6e2b61931737e662dd293b40578ccornelius UBool quickInit(double n); // Try a fast-path only initialization, 20059d709d503bab6e2b61931737e662dd293b40578ccornelius // return TRUE if successful. 20159d709d503bab6e2b61931737e662dd293b40578ccornelius void adjustForMinFractionDigits(int32_t min); 20259d709d503bab6e2b61931737e662dd293b40578ccornelius static int64_t getFractionalDigits(double n, int32_t v); 20359d709d503bab6e2b61931737e662dd293b40578ccornelius static int32_t decimals(double n); 20459d709d503bab6e2b61931737e662dd293b40578ccornelius 20559d709d503bab6e2b61931737e662dd293b40578ccornelius double source; 20659d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t visibleDecimalDigitCount; 20759d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t decimalDigits; 20859d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t decimalDigitsWithoutTrailingZeros; 20959d709d503bab6e2b61931737e662dd293b40578ccornelius int64_t intValue; 21059d709d503bab6e2b61931737e662dd293b40578ccornelius UBool hasIntegerValue; 21159d709d503bab6e2b61931737e662dd293b40578ccornelius UBool isNegative; 21259d709d503bab6e2b61931737e662dd293b40578ccornelius UBool isNanOrInfinity; 21385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 21485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 21585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass AndConstraint : public UMemory { 21685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic: 21785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho typedef enum RuleOp { 21885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho NONE, 21985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho MOD 22085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } RuleOp; 22185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RuleOp op; 22259d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t opNum; // for mod expressions, the right operand of the mod. 22359d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t value; // valid for 'is' rules only. 22459d709d503bab6e2b61931737e662dd293b40578ccornelius UVector32 *rangeList; // for 'in', 'within' rules. Null otherwise. 22559d709d503bab6e2b61931737e662dd293b40578ccornelius UBool negated; // TRUE for negated rules. 22659d709d503bab6e2b61931737e662dd293b40578ccornelius UBool integerOnly; // TRUE for 'within' rules. 22759d709d503bab6e2b61931737e662dd293b40578ccornelius tokenType digitsType; // n | i | v | f constraint. 22885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AndConstraint *next; 229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 23085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AndConstraint(); 23185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AndConstraint(const AndConstraint& other); 23285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual ~AndConstraint(); 23385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AndConstraint* add(); 23459d709d503bab6e2b61931737e662dd293b40578ccornelius // UBool isFulfilled(double number); 23559d709d503bab6e2b61931737e662dd293b40578ccornelius UBool isFulfilled(const FixedDecimal &number); 23685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 23785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 23885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass OrConstraint : public UMemory { 23985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic: 24085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AndConstraint *childNode; 24185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho OrConstraint *next; 24285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho OrConstraint(); 243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 24485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho OrConstraint(const OrConstraint& other); 24585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual ~OrConstraint(); 24685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho AndConstraint* add(); 24759d709d503bab6e2b61931737e662dd293b40578ccornelius // UBool isFulfilled(double number); 24859d709d503bab6e2b61931737e662dd293b40578ccornelius UBool isFulfilled(const FixedDecimal &number); 24985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 25085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 25185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass RuleChain : public UMemory { 25285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic: 25359d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString fKeyword; 25459d709d503bab6e2b61931737e662dd293b40578ccornelius RuleChain *fNext; 25559d709d503bab6e2b61931737e662dd293b40578ccornelius OrConstraint *ruleHeader; 25659d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString fDecimalSamples; // Samples strings from rule source 25759d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString fIntegerSamples; // without @decimal or @integer, otherwise unprocessed. 25859d709d503bab6e2b61931737e662dd293b40578ccornelius UBool fDecimalSamplesUnbounded; 25959d709d503bab6e2b61931737e662dd293b40578ccornelius UBool fIntegerSamplesUnbounded; 26059d709d503bab6e2b61931737e662dd293b40578ccornelius 26159d709d503bab6e2b61931737e662dd293b40578ccornelius 26285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RuleChain(); 26385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho RuleChain(const RuleChain& other); 26485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual ~RuleChain(); 26559d709d503bab6e2b61931737e662dd293b40578ccornelius 26659d709d503bab6e2b61931737e662dd293b40578ccornelius UnicodeString select(const FixedDecimal &number) const; 26759d709d503bab6e2b61931737e662dd293b40578ccornelius void dumpRules(UnicodeString& result); 26859d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode getKeywords(int32_t maxArraySize, UnicodeString *keywords, int32_t& arraySize) const; 26959d709d503bab6e2b61931737e662dd293b40578ccornelius UBool isKeyword(const UnicodeString& keyword) const; 27085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 27185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 27285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoclass PluralKeywordEnumeration : public StringEnumeration { 27385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hopublic: 27485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho PluralKeywordEnumeration(RuleChain *header, UErrorCode& status); 27585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual ~PluralKeywordEnumeration(); 27685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho static UClassID U_EXPORT2 getStaticClassID(void); 27785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual UClassID getDynamicClassID(void) const; 27885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual const UnicodeString* snext(UErrorCode& status); 27985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual void reset(UErrorCode& status); 28085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho virtual int32_t count(UErrorCode& status) const; 28185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoprivate: 28259d709d503bab6e2b61931737e662dd293b40578ccornelius int32_t pos; 28359d709d503bab6e2b61931737e662dd293b40578ccornelius UVector fKeywordNames; 28459d709d503bab6e2b61931737e662dd293b40578ccornelius}; 28559d709d503bab6e2b61931737e662dd293b40578ccornelius 28659d709d503bab6e2b61931737e662dd293b40578ccornelius 28759d709d503bab6e2b61931737e662dd293b40578ccorneliusclass U_I18N_API PluralAvailableLocalesEnumeration: public StringEnumeration { 28859d709d503bab6e2b61931737e662dd293b40578ccornelius public: 28959d709d503bab6e2b61931737e662dd293b40578ccornelius PluralAvailableLocalesEnumeration(UErrorCode &status); 29059d709d503bab6e2b61931737e662dd293b40578ccornelius virtual ~PluralAvailableLocalesEnumeration(); 29159d709d503bab6e2b61931737e662dd293b40578ccornelius virtual const char* next(int32_t *resultLength, UErrorCode& status); 29259d709d503bab6e2b61931737e662dd293b40578ccornelius virtual void reset(UErrorCode& status); 29359d709d503bab6e2b61931737e662dd293b40578ccornelius virtual int32_t count(UErrorCode& status) const; 29459d709d503bab6e2b61931737e662dd293b40578ccornelius private: 29559d709d503bab6e2b61931737e662dd293b40578ccornelius UErrorCode fOpenStatus; 29659d709d503bab6e2b61931737e662dd293b40578ccornelius UResourceBundle *fLocales; 29759d709d503bab6e2b61931737e662dd293b40578ccornelius UResourceBundle *fRes; 29885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho}; 29985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 30085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoU_NAMESPACE_END 30185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 30285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif /* #if !UCONFIG_NO_FORMATTING */ 30385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 30485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho#endif // _PLURRULE_IMPL 30585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho//eof 306