Home | History | Annotate | Download | only in i18n
      1 //  2016 and later: Unicode, Inc. and others.
      2 // License & terms of use: http://www.unicode.org/copyright.html
      3 /*
      4 ******************************************************************************
      5 *   Copyright (C) 1997-2015, International Business Machines
      6 *   Corporation and others.  All Rights Reserved.
      7 ******************************************************************************
      8 *   file name:  nfrs.h
      9 *   encoding:   UTF-8
     10 *   tab size:   8 (not used)
     11 *   indentation:4
     12 *
     13 * Modification history
     14 * Date        Name      Comments
     15 * 10/11/2001  Doug      Ported from ICU4J
     16 */
     17 
     18 #ifndef NFRS_H
     19 #define NFRS_H
     20 
     21 #include "unicode/uobject.h"
     22 #include "unicode/rbnf.h"
     23 
     24 #if U_HAVE_RBNF
     25 
     26 #include "unicode/utypes.h"
     27 #include "unicode/umisc.h"
     28 
     29 #include "nfrlist.h"
     30 
     31 U_NAMESPACE_BEGIN
     32 
     33 class NFRuleSet : public UMemory {
     34 public:
     35     NFRuleSet(RuleBasedNumberFormat *owner, UnicodeString* descriptions, int32_t index, UErrorCode& status);
     36     void parseRules(UnicodeString& rules, UErrorCode& status);
     37     void setNonNumericalRule(NFRule *rule);
     38     void setBestFractionRule(int32_t originalIndex, NFRule *newRule, UBool rememberRule);
     39     void makeIntoFractionRuleSet() { fIsFractionRuleSet = TRUE; }
     40 
     41     ~NFRuleSet();
     42 
     43     UBool operator==(const NFRuleSet& rhs) const;
     44     UBool operator!=(const NFRuleSet& rhs) const { return !operator==(rhs); }
     45 
     46     UBool isPublic() const { return fIsPublic; }
     47 
     48     UBool isParseable() const { return fIsParseable; }
     49 
     50     UBool isFractionRuleSet() const { return fIsFractionRuleSet; }
     51 
     52     void  getName(UnicodeString& result) const { result.setTo(name); }
     53     UBool isNamed(const UnicodeString& _name) const { return this->name == _name; }
     54 
     55     void  format(int64_t number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
     56     void  format(double number, UnicodeString& toAppendTo, int32_t pos, int32_t recursionCount, UErrorCode& status) const;
     57 
     58     UBool parse(const UnicodeString& text, ParsePosition& pos, double upperBound, Formattable& result) const;
     59 
     60     void appendRules(UnicodeString& result) const; // toString
     61 
     62     void setDecimalFormatSymbols(const DecimalFormatSymbols &newSymbols, UErrorCode& status);
     63 
     64     const RuleBasedNumberFormat *getOwner() const { return owner; }
     65 private:
     66     const NFRule * findNormalRule(int64_t number) const;
     67     const NFRule * findDoubleRule(double number) const;
     68     const NFRule * findFractionRuleSetRule(double number) const;
     69 
     70     friend class NFSubstitution;
     71 
     72 private:
     73     UnicodeString name;
     74     NFRuleList rules;
     75     NFRule *nonNumericalRules[6];
     76     RuleBasedNumberFormat *owner;
     77     NFRuleList fractionRules;
     78     UBool fIsFractionRuleSet;
     79     UBool fIsPublic;
     80     UBool fIsParseable;
     81 
     82     NFRuleSet(const NFRuleSet &other); // forbid copying of this class
     83     NFRuleSet &operator=(const NFRuleSet &other); // forbid copying of this class
     84 };
     85 
     86 // utilities from old llong.h
     87 // convert mantissa portion of double to int64
     88 int64_t util64_fromDouble(double d);
     89 
     90 // raise radix to the power exponent, only non-negative exponents
     91 // Arithmetic is performed in unsigned space since overflow in
     92 // signed space is undefined behavior.
     93 uint64_t util64_pow(uint32_t radix, uint16_t exponent);
     94 
     95 // convert n to digit string in buffer, return length of string
     96 uint32_t util64_tou(int64_t n, UChar* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE);
     97 
     98 #ifdef RBNF_DEBUG
     99 int64_t util64_utoi(const UChar* str, uint32_t radix = 10);
    100 uint32_t util64_toa(int64_t n, char* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE);
    101 int64_t util64_atoi(const char* str, uint32_t radix);
    102 #endif
    103 
    104 
    105 U_NAMESPACE_END
    106 
    107 /* U_HAVE_RBNF */
    108 #endif
    109 
    110 // NFRS_H
    111 #endif
    112