Index: source/i18n/visibledigits.h |
diff --git a/source/i18n/visibledigits.h b/source/i18n/visibledigits.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..88598d7913737c1fc2ca2889ef47aa6773484ab1 |
--- /dev/null |
+++ b/source/i18n/visibledigits.h |
@@ -0,0 +1,160 @@ |
+/* |
+******************************************************************************* * 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__ |