X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/b75a7d8f3b4adbae880cab104ce2c6a50eee4db2..51004dcb01e06fef634b61be77ed73dd61cb6db9:/icuSources/i18n/nfsubs.h diff --git a/icuSources/i18n/nfsubs.h b/icuSources/i18n/nfsubs.h index 6cbf8920..098ccb41 100644 --- a/icuSources/i18n/nfsubs.h +++ b/icuSources/i18n/nfsubs.h @@ -1,6 +1,6 @@ /* ****************************************************************************** -* Copyright (C) 1997-2001, International Business Machines +* Copyright (C) 1997-2007, International Business Machines * Corporation and others. All Rights Reserved. ****************************************************************************** * file name: nfsubs.h @@ -90,7 +90,7 @@ public: * @param radix The radix of the divisor * @param exponent The exponent of the divisor */ - virtual void setDivisor(int32_t radix, int32_t exponent); + virtual void setDivisor(int32_t radix, int32_t exponent, UErrorCode& status); /** * Replaces result with the string describing the substitution. @@ -248,287 +248,22 @@ public: */ virtual UBool isModulusSubstitution() const; -private: - NFSubstitution(const NFSubstitution &other); // forbid copying of this class - NFSubstitution &operator=(const NFSubstitution &other); // forbid copying of this class - - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; - -class SameValueSubstitution : public NFSubstitution { -public: - SameValueSubstitution(int32_t pos, - const NFRuleSet* ruleset, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status); - - int64_t transformNumber(int64_t number) const { return number; } - double transformNumber(double number) const { return number; } - double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { return newRuleValue; } - double calcUpperBound(double oldUpperBound) const { return oldUpperBound; } - UChar tokenChar() const { return (UChar)0x003d; } // '=' -private: - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; - -class MultiplierSubstitution : public NFSubstitution { - double divisor; - int64_t ldivisor; - -public: - MultiplierSubstitution(int32_t _pos, - double _divisor, - const NFRuleSet* _ruleSet, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status) - : NFSubstitution(_pos, _ruleSet, formatter, description, status), divisor(_divisor) - { - ldivisor = util64_fromDouble(divisor); - } - - void setDivisor(int32_t radix, int32_t exponent) { - divisor = uprv_pow(radix, exponent); - ldivisor = util64_fromDouble(divisor); - } - - UBool operator==(const NFSubstitution& rhs) const; - - int64_t transformNumber(int64_t number) const { - return number / ldivisor; - } - - double transformNumber(double number) const { - return uprv_floor(number / divisor); - } - - double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { - return newRuleValue * divisor; - } - - double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } - - UChar tokenChar() const { return (UChar)0x003c; } // '<' -private: - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; - -class ModulusSubstitution : public NFSubstitution { - double divisor; - int64_t ldivisor; - const NFRule* ruleToUse; -public: - ModulusSubstitution(int32_t pos, - double _divisor, - const NFRule* rulePredecessor, - const NFRuleSet* ruleSet, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status); - - void setDivisor(int32_t radix, int32_t exponent) { - divisor = uprv_pow(radix, exponent); - ldivisor = util64_fromDouble(divisor); - } - - UBool operator==(const NFSubstitution& rhs) const; - - void doSubstitution(int64_t number, UnicodeString& toInsertInto, int32_t pos) const; - void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const; - - int64_t transformNumber(int64_t number) const { return number % ldivisor; } - double transformNumber(double number) const { return uprv_fmod(number, divisor); } - - UBool doParse(const UnicodeString& text, - ParsePosition& parsePosition, - double baseValue, - double upperBound, - UBool lenientParse, - Formattable& result) const; - - double composeRuleValue(double newRuleValue, double oldRuleValue) const { - return oldRuleValue - uprv_fmod(oldRuleValue, divisor) + newRuleValue; - } - - double calcUpperBound(double /*oldUpperBound*/) const { return divisor; } - - UBool isModulusSubstitution() const { return TRUE; } - - UChar tokenChar() const { return (UChar)0x003e; } // '>' -private: - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; - -class IntegralPartSubstitution : public NFSubstitution { -public: - IntegralPartSubstitution(int32_t _pos, - const NFRuleSet* _ruleSet, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status) - : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} - - int64_t transformNumber(int64_t number) const { return number; } - double transformNumber(double number) const { return uprv_floor(number); } - double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue + oldRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return DBL_MAX; } - UChar tokenChar() const { return (UChar)0x003c; } // '<' -private: - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; - -class FractionalPartSubstitution : public NFSubstitution { - UBool byDigits; - UBool useSpaces; - enum { kMaxDecimalDigits = 8 }; -public: - FractionalPartSubstitution(int32_t pos, - const NFRuleSet* ruleSet, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status); - - UBool operator==(const NFSubstitution& rhs) const; - - void doSubstitution(double number, UnicodeString& toInsertInto, int32_t pos) const; - void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} - int64_t transformNumber(int64_t /*number*/) const { return 0; } - double transformNumber(double number) const { return number - uprv_floor(number); } - - UBool doParse(const UnicodeString& text, - ParsePosition& parsePosition, - double baseValue, - double upperBound, - UBool lenientParse, - Formattable& result) const; - - double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue + oldRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return 0.0; } - UChar tokenChar() const { return (UChar)0x003e; } // '>' -private: - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; - -class AbsoluteValueSubstitution : public NFSubstitution { -public: - AbsoluteValueSubstitution(int32_t _pos, - const NFRuleSet* _ruleSet, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status) - : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} - - int64_t transformNumber(int64_t number) const { return number >= 0 ? number : -number; } - double transformNumber(double number) const { return uprv_fabs(number); } - double composeRuleValue(double newRuleValue, double /*oldRuleValue*/) const { return -newRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return DBL_MAX; } - UChar tokenChar() const { return (UChar)0x003e; } // '>' -private: - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; + /** + * @return true if this is a decimal format-only substitution + */ + virtual UBool isDecimalFormatSubstitutionOnly() const; -class NumeratorSubstitution : public NFSubstitution { - double denominator; - int64_t ldenominator; -public: - NumeratorSubstitution(int32_t _pos, - double _denominator, - const NFRuleSet* _ruleSet, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status) - : NFSubstitution(_pos, _ruleSet, formatter, description, status), denominator(_denominator) - { - ldenominator = util64_fromDouble(denominator); - } - - UBool operator==(const NFSubstitution& rhs) const; - - int64_t transformNumber(int64_t number) const { return number * ldenominator; } - double transformNumber(double number) const { return uprv_round(number * denominator); } + /** + * @return true if this substitution only points to another ruleSet (no numberFormat) + */ + virtual UBool isRuleSetSubstitutionOnly() const; - UBool doParse(const UnicodeString& text, - ParsePosition& parsePosition, - double baseValue, - double upperBound, - UBool /*lenientParse*/, - Formattable& result) const - { - // we don't have to do anything special to do the parsing here, - // but we have to turn lenient parsing off-- if we leave it on, - // it SERIOUSLY messes up the algorithm - return NFSubstitution::doParse(text, parsePosition, baseValue, upperBound, FALSE, result); - } - double composeRuleValue(double newRuleValue, double oldRuleValue) const { return newRuleValue / oldRuleValue; } - double calcUpperBound(double /*oldUpperBound*/) const { return denominator; } - UChar tokenChar() const { return (UChar)0x003c; } // '<' private: - static const char fgClassID; - -public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } - virtual UClassID getDynamicClassID(void) const; -}; + NFSubstitution(const NFSubstitution &other); // forbid copying of this class + NFSubstitution &operator=(const NFSubstitution &other); // forbid copying of this class -class NullSubstitution : public NFSubstitution { -public: - NullSubstitution(int32_t _pos, - const NFRuleSet* _ruleSet, - const RuleBasedNumberFormat* formatter, - const UnicodeString& description, - UErrorCode& status) - : NFSubstitution(_pos, _ruleSet, formatter, description, status) {} - - void toString(UnicodeString& /*result*/) const {} - void doSubstitution(double /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} - void doSubstitution(int64_t /*number*/, UnicodeString& /*toInsertInto*/, int32_t /*_pos*/) const {} - int64_t transformNumber(int64_t /*number*/) const { return 0; } - double transformNumber(double /*number*/) const { return 0; } - UBool doParse(const UnicodeString& /*text*/, - ParsePosition& /*parsePosition*/, - double baseValue, - double /*upperBound*/, - UBool /*lenientParse*/, - Formattable& result) const - { result.setDouble(baseValue); return TRUE; } - double composeRuleValue(double /*newRuleValue*/, double /*oldRuleValue*/) const { return 0.0; } // never called - double calcUpperBound(double /*oldUpperBound*/) const { return 0; } // never called - UBool isNullSubstitution() const { return TRUE; } - UChar tokenChar() const { return (UChar)0x0020; } // ' ' never called -private: - static const char fgClassID; - public: - static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; } + static UClassID getStaticClassID(void); virtual UClassID getDynamicClassID(void) const; };