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