Coverage Report

Created: 2025-12-07 06:36

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/icu/icu4c/source/i18n/number_decnum.h
Line
Count
Source
1
// © 2017 and later: Unicode, Inc. and others.
2
// License & terms of use: http://www.unicode.org/copyright.html
3
4
#include "unicode/utypes.h"
5
6
#if !UCONFIG_NO_FORMATTING
7
#ifndef __NUMBER_DECNUM_H__
8
#define __NUMBER_DECNUM_H__
9
10
#include "decNumber.h"
11
#include "charstr.h"
12
#include "bytesinkutil.h"
13
14
U_NAMESPACE_BEGIN
15
16
#define DECNUM_INITIAL_CAPACITY 34
17
18
namespace number::impl {
19
20
/** A very thin C++ wrapper around decNumber.h */
21
// Exported as U_I18N_API_CLASS for tests
22
class U_I18N_API_CLASS DecNum : public UMemory {
23
  public:
24
    U_I18N_API DecNum();  // leaves object in valid but undefined state
25
26
    // Copy-like constructor; use the default move operators.
27
    DecNum(const DecNum& other, UErrorCode& status);
28
29
    /** Sets the decNumber to the StringPiece. */
30
    void setTo(StringPiece str, UErrorCode& status);
31
32
    /** Sets the decNumber to the NUL-terminated char string. */
33
    void setTo(const char* str, UErrorCode& status);
34
35
    /** Uses double_conversion to set this decNumber to the given double. */
36
    void setTo(double d, UErrorCode& status);
37
38
    /** Sets the decNumber to the BCD representation. */
39
    void setTo(const uint8_t* bcd, int32_t length, int32_t scale, bool isNegative, UErrorCode& status);
40
41
    void normalize();
42
43
    void multiplyBy(const DecNum& rhs, UErrorCode& status);
44
45
    void divideBy(const DecNum& rhs, UErrorCode& status);
46
47
    bool isNegative() const;
48
49
    bool isZero() const;
50
51
    /** Is infinity or NaN */
52
    bool isSpecial() const;
53
54
    bool isInfinity() const;
55
56
    bool isNaN() const;
57
58
    void toString(ByteSink& output, UErrorCode& status) const;
59
60
0
    inline CharString toCharString(UErrorCode& status) const {
61
0
      CharString cstr;
62
0
      CharStringByteSink sink(&cstr);
63
0
      toString(sink, status);
64
0
      return cstr;
65
0
    }
66
67
5.32k
    inline const decNumber* getRawDecNumber() const {
68
5.32k
        return fData.getAlias();
69
5.32k
    }
70
71
  private:
72
    static constexpr int32_t kDefaultDigits = DECNUM_INITIAL_CAPACITY;
73
    MaybeStackHeaderAndArray<decNumber, char, kDefaultDigits> fData;
74
    decContext fContext;
75
76
    void _setTo(const char* str, int32_t maxDigits, UErrorCode& status);
77
};
78
79
} // namespace number::impl
80
81
U_NAMESPACE_END
82
83
#endif // __NUMBER_DECNUM_H__
84
85
#endif /* #if !UCONFIG_NO_FORMATTING */