diff options
Diffstat (limited to 'intl/icu/source/i18n/visibledigits.h')
-rw-r--r-- | intl/icu/source/i18n/visibledigits.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/intl/icu/source/i18n/visibledigits.h b/intl/icu/source/i18n/visibledigits.h new file mode 100644 index 000000000..eba2a1bc9 --- /dev/null +++ b/intl/icu/source/i18n/visibledigits.h @@ -0,0 +1,162 @@ +// Copyright (C) 2016 and later: Unicode, Inc. and others. +// License & terms of use: http://www.unicode.org/copyright.html +/* +******************************************************************************* * Copyright (C) 2015, International Business Machines +* Corporation and others. All Rights Reserved. +******************************************************************************* +* visibledigits.h +* +* created on: 2015jun20 +* created by: Travis Keep +*/ + +#ifndef __VISIBLEDIGITS_H__ +#define __VISIBLEDIGITS_H__ + +#include "unicode/utypes.h" + +#if !UCONFIG_NO_FORMATTING + +#include "unicode/uobject.h" + +#include "charstr.h" +#include "digitinterval.h" + +U_NAMESPACE_BEGIN + +class DigitList; + +/** + * VisibleDigits represents the digits visible for formatting. + * Once initialized using a FixedPrecision instance, VisibleDigits instances + * remain unchanged until they are initialized again. A VisibleDigits with + * a numeric value equal to 3.0 could be "3", "3.0", "3.00" or even "003.0" + * depending on settings of the FixedPrecision instance used to initialize it. + */ +class U_I18N_API VisibleDigits : public UMemory { +public: + VisibleDigits() : fExponent(0), fFlags(0), fAbsIntValue(0), fAbsIntValueSet(FALSE), fAbsDoubleValue(0.0), fAbsDoubleValueSet(FALSE) { } + + UBool isNegative() const; + UBool isNaN() const; + UBool isInfinite() const; + UBool isNaNOrInfinity() const; + + /** + * Gets the digit at particular exponent, if number is 987.6, then + * getDigit(2) == 9 and gitDigit(0) == 7 and gitDigit(-1) == 6. + * If isNaN() or isInfinity() return TRUE, then the result of this + * function is undefined. + */ + int32_t getDigitByExponent(int32_t digitPos) const; + + /** + * Returns the digit interval which indicates the leftmost and rightmost + * position of this instance. + * If isNaN() or isInfinity() return TRUE, then the result of this + * function is undefined. + */ + const DigitInterval &getInterval() const { return fInterval; } + + /** + * Gets the parameters needed to create a FixedDecimal. + */ + void getFixedDecimal(double &source, int64_t &intValue, int64_t &f, int64_t &t, int32_t &v, UBool &hasIntValue) const; + + +private: + /** + * The digits, least significant first. Both the least and most + * significant digit in this list are non-zero; however, digits in the + * middle may be zero. This field contains values between (char) 0, and + * (char) 9 inclusive. + */ + CharString fDigits; + + /** + * The range of displayable digits. This field is needed to account for + * any leading and trailing zeros which are not stored in fDigits. + */ + DigitInterval fInterval; + + /** + * The exponent value of the least significant digit in fDigits. For + * example, fExponent = 2 and fDigits = {7, 8, 5} represents 58700. + */ + int32_t fExponent; + + /** + * Contains flags such as NaN, Inf, and negative. + */ + int32_t fFlags; + + /** + * Contains the absolute value of the digits left of the decimal place + * if fAbsIntValueSet is TRUE + */ + int64_t fAbsIntValue; + + /** + * Indicates whether or not fAbsIntValue is set. + */ + UBool fAbsIntValueSet; + + /** + * Contains the absolute value of the value this instance represents + * if fAbsDoubleValueSet is TRUE + */ + double fAbsDoubleValue; + + /** + * Indicates whether or not fAbsDoubleValue is set. + */ + UBool fAbsDoubleValueSet; + + void setNegative(); + void setNaN(); + void setInfinite(); + void clear(); + double computeAbsDoubleValue() const; + UBool isOverMaxDigits() const; + + VisibleDigits(const VisibleDigits &); + VisibleDigits &operator=(const VisibleDigits &); + + friend class FixedPrecision; + friend class VisibleDigitsWithExponent; +}; + +/** + * A VisibleDigits with a possible exponent. + */ +class U_I18N_API VisibleDigitsWithExponent : public UMemory { +public: + VisibleDigitsWithExponent() : fHasExponent(FALSE) { } + const VisibleDigits &getMantissa() const { return fMantissa; } + const VisibleDigits *getExponent() const { + return fHasExponent ? &fExponent : NULL; + } + void clear() { + fMantissa.clear(); + fExponent.clear(); + fHasExponent = FALSE; + } + UBool isNegative() const { return fMantissa.isNegative(); } + UBool isNaN() const { return fMantissa.isNaN(); } + UBool isInfinite() const { return fMantissa.isInfinite(); } +private: + VisibleDigitsWithExponent(const VisibleDigitsWithExponent &); + VisibleDigitsWithExponent &operator=( + const VisibleDigitsWithExponent &); + VisibleDigits fMantissa; + VisibleDigits fExponent; + UBool fHasExponent; + + friend class ScientificPrecision; + friend class FixedPrecision; +}; + + +U_NAMESPACE_END +#endif /* #if !UCONFIG_NO_FORMATTING */ +#endif // __VISIBLEDIGITS_H__ |