16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1997-2012, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   file name:  nfrs.h
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   encoding:   US-ASCII
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   tab size:   8 (not used)
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   indentation:4
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification history
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date        Name      Comments
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 10/11/2001  Doug      Ported from ICU4J
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef NFRS_H
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define NFRS_H
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/rbnf.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_RBNF
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/umisc.h"
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "nfrlist.h"
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass NFRuleSet : public UMemory {
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRuleSet(UnicodeString* descriptions, int32_t index, UErrorCode& status);
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void parseRules(UnicodeString& rules, const RuleBasedNumberFormat* owner, UErrorCode& status);
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void makeIntoFractionRuleSet() { fIsFractionRuleSet = TRUE; }
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ~NFRuleSet();
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool operator==(const NFRuleSet& rhs) const;
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool operator!=(const NFRuleSet& rhs) const { return !operator==(rhs); }
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool isPublic() const { return fIsPublic; }
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool isParseable() const { return fIsParseable; }
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool isFractionRuleSet() const { return fIsFractionRuleSet; }
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void  getName(UnicodeString& result) const { result.setTo(name); }
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool isNamed(const UnicodeString& _name) const { return this->name == _name; }
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void  format(int64_t number, UnicodeString& toAppendTo, int32_t pos) const;
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void  format(double number, UnicodeString& toAppendTo, int32_t pos) const;
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool parse(const UnicodeString& text, ParsePosition& pos, double upperBound, Formattable& result) const;
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void appendRules(UnicodeString& result) const; // toString
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRule * findNormalRule(int64_t number) const;
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRule * findDoubleRule(double number) const;
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRule * findFractionRuleSetRule(double number) const;
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString name;
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRuleList rules;
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRule *negativeNumberRule;
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRule *fractionRules[3];
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool fIsFractionRuleSet;
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool fIsPublic;
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool fIsParseable;
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t fRecursionCount;
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRuleSet(const NFRuleSet &other); // forbid copying of this class
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  NFRuleSet &operator=(const NFRuleSet &other); // forbid copying of this class
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// utilities from old llong.h
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// convert mantissa portion of double to int64
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint64_t util64_fromDouble(double d);
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// raise radix to the power exponent, only non-negative exponents
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint64_t util64_pow(int32_t radix, uint32_t exponent);
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// convert n to digit string in buffer, return length of string
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguint32_t util64_tou(int64_t n, UChar* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE);
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef RBNF_DEBUG
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint64_t util64_utoi(const UChar* str, uint32_t radix = 10);
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguint32_t util64_toa(int64_t n, char* buffer, uint32_t buflen, uint32_t radix = 10, UBool raw = FALSE);
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint64_t util64_atoi(const char* str, uint32_t radix);
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* U_HAVE_RBNF */
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// NFRS_H
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
102