Line data Source code
1 : // © 2016 and later: Unicode, Inc. and others.
2 : // License & terms of use: http://www.unicode.org/copyright.html
3 : /*
4 : ******************************************************************************* * Copyright (C) 2015, International Business Machines
5 : * Corporation and others. All Rights Reserved.
6 : *******************************************************************************
7 : * visibledigits.h
8 : *
9 : * created on: 2015jun20
10 : * created by: Travis Keep
11 : */
12 :
13 : #ifndef __VISIBLEDIGITS_H__
14 : #define __VISIBLEDIGITS_H__
15 :
16 : #include "unicode/utypes.h"
17 :
18 : #if !UCONFIG_NO_FORMATTING
19 :
20 : #include "unicode/uobject.h"
21 :
22 : #include "charstr.h"
23 : #include "digitinterval.h"
24 :
25 : U_NAMESPACE_BEGIN
26 :
27 : class DigitList;
28 :
29 : /**
30 : * VisibleDigits represents the digits visible for formatting.
31 : * Once initialized using a FixedPrecision instance, VisibleDigits instances
32 : * remain unchanged until they are initialized again. A VisibleDigits with
33 : * a numeric value equal to 3.0 could be "3", "3.0", "3.00" or even "003.0"
34 : * depending on settings of the FixedPrecision instance used to initialize it.
35 : */
36 0 : class U_I18N_API VisibleDigits : public UMemory {
37 : public:
38 0 : VisibleDigits() : fExponent(0), fFlags(0), fAbsIntValue(0), fAbsIntValueSet(FALSE), fAbsDoubleValue(0.0), fAbsDoubleValueSet(FALSE) { }
39 :
40 : UBool isNegative() const;
41 : UBool isNaN() const;
42 : UBool isInfinite() const;
43 : UBool isNaNOrInfinity() const;
44 :
45 : /**
46 : * Gets the digit at particular exponent, if number is 987.6, then
47 : * getDigit(2) == 9 and gitDigit(0) == 7 and gitDigit(-1) == 6.
48 : * If isNaN() or isInfinity() return TRUE, then the result of this
49 : * function is undefined.
50 : */
51 : int32_t getDigitByExponent(int32_t digitPos) const;
52 :
53 : /**
54 : * Returns the digit interval which indicates the leftmost and rightmost
55 : * position of this instance.
56 : * If isNaN() or isInfinity() return TRUE, then the result of this
57 : * function is undefined.
58 : */
59 0 : const DigitInterval &getInterval() const { return fInterval; }
60 :
61 : /**
62 : * Gets the parameters needed to create a FixedDecimal.
63 : */
64 : void getFixedDecimal(double &source, int64_t &intValue, int64_t &f, int64_t &t, int32_t &v, UBool &hasIntValue) const;
65 :
66 :
67 : private:
68 : /**
69 : * The digits, least significant first. Both the least and most
70 : * significant digit in this list are non-zero; however, digits in the
71 : * middle may be zero. This field contains values between (char) 0, and
72 : * (char) 9 inclusive.
73 : */
74 : CharString fDigits;
75 :
76 : /**
77 : * The range of displayable digits. This field is needed to account for
78 : * any leading and trailing zeros which are not stored in fDigits.
79 : */
80 : DigitInterval fInterval;
81 :
82 : /**
83 : * The exponent value of the least significant digit in fDigits. For
84 : * example, fExponent = 2 and fDigits = {7, 8, 5} represents 58700.
85 : */
86 : int32_t fExponent;
87 :
88 : /**
89 : * Contains flags such as NaN, Inf, and negative.
90 : */
91 : int32_t fFlags;
92 :
93 : /**
94 : * Contains the absolute value of the digits left of the decimal place
95 : * if fAbsIntValueSet is TRUE
96 : */
97 : int64_t fAbsIntValue;
98 :
99 : /**
100 : * Indicates whether or not fAbsIntValue is set.
101 : */
102 : UBool fAbsIntValueSet;
103 :
104 : /**
105 : * Contains the absolute value of the value this instance represents
106 : * if fAbsDoubleValueSet is TRUE
107 : */
108 : double fAbsDoubleValue;
109 :
110 : /**
111 : * Indicates whether or not fAbsDoubleValue is set.
112 : */
113 : UBool fAbsDoubleValueSet;
114 :
115 : void setNegative();
116 : void setNaN();
117 : void setInfinite();
118 : void clear();
119 : double computeAbsDoubleValue() const;
120 : UBool isOverMaxDigits() const;
121 :
122 : VisibleDigits(const VisibleDigits &);
123 : VisibleDigits &operator=(const VisibleDigits &);
124 :
125 : friend class FixedPrecision;
126 : friend class VisibleDigitsWithExponent;
127 : };
128 :
129 : /**
130 : * A VisibleDigits with a possible exponent.
131 : */
132 0 : class U_I18N_API VisibleDigitsWithExponent : public UMemory {
133 : public:
134 0 : VisibleDigitsWithExponent() : fHasExponent(FALSE) { }
135 0 : const VisibleDigits &getMantissa() const { return fMantissa; }
136 0 : const VisibleDigits *getExponent() const {
137 0 : return fHasExponent ? &fExponent : NULL;
138 : }
139 0 : void clear() {
140 0 : fMantissa.clear();
141 0 : fExponent.clear();
142 0 : fHasExponent = FALSE;
143 0 : }
144 0 : UBool isNegative() const { return fMantissa.isNegative(); }
145 0 : UBool isNaN() const { return fMantissa.isNaN(); }
146 0 : UBool isInfinite() const { return fMantissa.isInfinite(); }
147 : private:
148 : VisibleDigitsWithExponent(const VisibleDigitsWithExponent &);
149 : VisibleDigitsWithExponent &operator=(
150 : const VisibleDigitsWithExponent &);
151 : VisibleDigits fMantissa;
152 : VisibleDigits fExponent;
153 : UBool fHasExponent;
154 :
155 : friend class ScientificPrecision;
156 : friend class FixedPrecision;
157 : };
158 :
159 :
160 : U_NAMESPACE_END
161 : #endif /* #if !UCONFIG_NO_FORMATTING */
162 : #endif // __VISIBLEDIGITS_H__
|