Home | History | Annotate | Download | only in i18n
      1 /*
      2 *******************************************************************************
      3 * Copyright (C) 1997-2008, International Business Machines
      4 * Corporation and others. All Rights Reserved.
      5 *******************************************************************************
      6 */
      7 
      8 #ifndef NFRULE_H
      9 #define NFRULE_H
     10 
     11 #include "unicode/rbnf.h"
     12 
     13 #if U_HAVE_RBNF
     14 
     15 #include "unicode/utypes.h"
     16 #include "unicode/uobject.h"
     17 #include "unicode/unistr.h"
     18 #include "putilimp.h"
     19 
     20 U_NAMESPACE_BEGIN
     21 
     22 class FieldPosition;
     23 class Formattable;
     24 class NFRuleList;
     25 class NFRuleSet;
     26 class NFSubstitution;
     27 class ParsePosition;
     28 class RuleBasedNumberFormat;
     29 class UnicodeString;
     30 
     31 class NFRule : public UMemory {
     32 public:
     33 
     34     enum ERuleType {
     35         kNoBase = 0,
     36         kNegativeNumberRule = -1,
     37         kImproperFractionRule = -2,
     38         kProperFractionRule = -3,
     39         kMasterRule = -4,
     40         kOtherRule = -5
     41     };
     42 
     43     static void makeRules(UnicodeString& definition,
     44                           const NFRuleSet* ruleSet,
     45                           const NFRule* predecessor,
     46                           const RuleBasedNumberFormat* rbnf,
     47                           NFRuleList& ruleList,
     48                           UErrorCode& status);
     49 
     50     NFRule(const RuleBasedNumberFormat* rbnf);
     51     ~NFRule();
     52 
     53     UBool operator==(const NFRule& rhs) const;
     54     UBool operator!=(const NFRule& rhs) const { return !operator==(rhs); }
     55 
     56     ERuleType getType() const { return (ERuleType)(baseValue <= kNoBase ? (ERuleType)baseValue : kOtherRule); }
     57     void setType(ERuleType ruleType) { baseValue = (int32_t)ruleType; }
     58 
     59     int64_t getBaseValue() const { return baseValue; }
     60     void setBaseValue(int64_t value, UErrorCode& status);
     61 
     62     double getDivisor() const { return uprv_pow(radix, exponent); }
     63 
     64     void doFormat(int64_t number, UnicodeString& toAppendTo, int32_t pos) const;
     65     void doFormat(double  number, UnicodeString& toAppendTo, int32_t pos) const;
     66 
     67     UBool doParse(const UnicodeString& text,
     68                   ParsePosition& pos,
     69                   UBool isFractional,
     70                   double upperBound,
     71                   Formattable& result) const;
     72 
     73     UBool shouldRollBack(double number) const;
     74 
     75     void _appendRuleText(UnicodeString& result) const;
     76 
     77 private:
     78     void parseRuleDescriptor(UnicodeString& descriptor, UErrorCode& status);
     79     void extractSubstitutions(const NFRuleSet* ruleSet, const NFRule* predecessor, const RuleBasedNumberFormat* rbnf, UErrorCode& status);
     80     NFSubstitution* extractSubstitution(const NFRuleSet* ruleSet, const NFRule* predecessor, const RuleBasedNumberFormat* rbnf, UErrorCode& status);
     81 
     82     int16_t expectedExponent() const;
     83     int32_t indexOfAny(const UChar* const strings[]) const;
     84     double matchToDelimiter(const UnicodeString& text, int32_t startPos, double baseValue,
     85                             const UnicodeString& delimiter, ParsePosition& pp, const NFSubstitution* sub,
     86                             double upperBound) const;
     87     void stripPrefix(UnicodeString& text, const UnicodeString& prefix, ParsePosition& pp) const;
     88 
     89     int32_t prefixLength(const UnicodeString& str, const UnicodeString& prefix, UErrorCode& status) const;
     90     UBool allIgnorable(const UnicodeString& str, UErrorCode& status) const;
     91     int32_t findText(const UnicodeString& str, const UnicodeString& key,
     92                      int32_t startingAt, int32_t* resultCount) const;
     93 
     94 private:
     95     int64_t baseValue;
     96     int32_t radix;
     97     int16_t exponent;
     98     UnicodeString ruleText;
     99     NFSubstitution* sub1;
    100     NFSubstitution* sub2;
    101     const RuleBasedNumberFormat* formatter;
    102 
    103     NFRule(const NFRule &other); // forbid copying of this class
    104     NFRule &operator=(const NFRule &other); // forbid copying of this class
    105 };
    106 
    107 U_NAMESPACE_END
    108 
    109 /* U_HAVE_RBNF */
    110 #endif
    111 
    112 // NFRULE_H
    113 #endif
    114 
    115