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