Coverage Report

Created: 2026-01-25 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/icu/icu4c/source/i18n/number_symbolswrapper.cpp
Line
Count
Source
1
// © 2020 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
8
#include "number_microprops.h"
9
#include "unicode/numberformatter.h"
10
11
using namespace icu;
12
using namespace icu::number;
13
using namespace icu::number::impl;
14
15
0
SymbolsWrapper::SymbolsWrapper(const SymbolsWrapper &other) {
16
0
    doCopyFrom(other);
17
0
}
18
19
563k
SymbolsWrapper::SymbolsWrapper(SymbolsWrapper &&src) noexcept {
20
563k
    doMoveFrom(std::move(src));
21
563k
}
22
23
8.41k
SymbolsWrapper &SymbolsWrapper::operator=(const SymbolsWrapper &other) {
24
8.41k
    if (this == &other) {
25
0
        return *this;
26
0
    }
27
8.41k
    doCleanup();
28
8.41k
    doCopyFrom(other);
29
8.41k
    return *this;
30
8.41k
}
31
32
1.68M
SymbolsWrapper &SymbolsWrapper::operator=(SymbolsWrapper &&src) noexcept {
33
1.68M
    if (this == &src) {
34
0
        return *this;
35
0
    }
36
1.68M
    doCleanup();
37
1.68M
    doMoveFrom(std::move(src));
38
1.68M
    return *this;
39
1.68M
}
40
41
2.68M
SymbolsWrapper::~SymbolsWrapper() {
42
2.68M
    doCleanup();
43
2.68M
}
44
45
560k
void SymbolsWrapper::setTo(const DecimalFormatSymbols &dfs) {
46
560k
    doCleanup();
47
560k
    fType = SYMPTR_DFS;
48
560k
    fPtr.dfs = new DecimalFormatSymbols(dfs);
49
560k
}
50
51
0
void SymbolsWrapper::setTo(const NumberingSystem *ns) {
52
0
    doCleanup();
53
0
    fType = SYMPTR_NS;
54
0
    fPtr.ns = ns;
55
0
}
56
57
8.41k
void SymbolsWrapper::doCopyFrom(const SymbolsWrapper &other) {
58
8.41k
    fType = other.fType;
59
8.41k
    switch (fType) {
60
8.41k
    case SYMPTR_NONE:
61
        // No action necessary
62
8.41k
        break;
63
0
    case SYMPTR_DFS:
64
        // Memory allocation failures are exposed in copyErrorTo()
65
0
        if (other.fPtr.dfs != nullptr) {
66
0
            fPtr.dfs = new DecimalFormatSymbols(*other.fPtr.dfs);
67
0
        } else {
68
0
            fPtr.dfs = nullptr;
69
0
        }
70
0
        break;
71
0
    case SYMPTR_NS:
72
        // Memory allocation failures are exposed in copyErrorTo()
73
0
        if (other.fPtr.ns != nullptr) {
74
0
            fPtr.ns = new NumberingSystem(*other.fPtr.ns);
75
0
        } else {
76
0
            fPtr.ns = nullptr;
77
0
        }
78
0
        break;
79
8.41k
    }
80
8.41k
}
81
82
2.24M
void SymbolsWrapper::doMoveFrom(SymbolsWrapper &&src) {
83
2.24M
    fType = src.fType;
84
2.24M
    switch (fType) {
85
563k
    case SYMPTR_NONE:
86
        // No action necessary
87
563k
        break;
88
1.68M
    case SYMPTR_DFS:
89
1.68M
        fPtr.dfs = src.fPtr.dfs;
90
1.68M
        src.fPtr.dfs = nullptr;
91
1.68M
        break;
92
0
    case SYMPTR_NS:
93
0
        fPtr.ns = src.fPtr.ns;
94
0
        src.fPtr.ns = nullptr;
95
0
        break;
96
2.24M
    }
97
2.24M
}
98
99
4.92M
void SymbolsWrapper::doCleanup() {
100
4.92M
    switch (fType) {
101
2.69M
    case SYMPTR_NONE:
102
        // No action necessary
103
2.69M
        break;
104
2.23M
    case SYMPTR_DFS:
105
2.23M
        delete fPtr.dfs;
106
2.23M
        break;
107
0
    case SYMPTR_NS:
108
0
        delete fPtr.ns;
109
0
        break;
110
4.92M
    }
111
4.92M
}
112
113
11.4k
bool SymbolsWrapper::isDecimalFormatSymbols() const {
114
11.4k
    return fType == SYMPTR_DFS;
115
11.4k
}
116
117
11.4k
bool SymbolsWrapper::isNumberingSystem() const {
118
11.4k
    return fType == SYMPTR_NS;
119
11.4k
}
120
121
953k
const DecimalFormatSymbols *SymbolsWrapper::getDecimalFormatSymbols() const {
122
953k
    U_ASSERT(fType == SYMPTR_DFS);
123
953k
    return fPtr.dfs;
124
953k
}
125
126
0
const NumberingSystem *SymbolsWrapper::getNumberingSystem() const {
127
0
    U_ASSERT(fType == SYMPTR_NS);
128
0
    return fPtr.ns;
129
0
}
130
131
#endif /* #if !UCONFIG_NO_FORMATTING */