Coverage Report

Created: 2025-07-11 06:23

/src/icu/source/common/resource.h
Line
Count
Source (jump to first uncovered line)
1
// © 2016 and later: Unicode, Inc. and others.
2
// License & terms of use: http://www.unicode.org/copyright.html
3
/*
4
*******************************************************************************
5
* Copyright (C) 2015-2016, International Business Machines
6
* Corporation and others.  All Rights Reserved.
7
*******************************************************************************
8
* resource.h
9
*
10
* created on: 2015nov04
11
* created by: Markus W. Scherer
12
*/
13
14
#ifndef __URESOURCE_H__
15
#define __URESOURCE_H__
16
17
/**
18
 * \file
19
 * \brief ICU resource bundle key and value types.
20
 */
21
22
// Note: Ported from ICU4J class UResource and its nested classes,
23
// but the C++ classes are separate, not nested.
24
25
// We use the Resource prefix for C++ classes, as usual.
26
// The UResource prefix would be used for C types.
27
28
#include "unicode/utypes.h"
29
#include "unicode/unistr.h"
30
#include "unicode/ures.h"
31
32
struct ResourceData;
33
34
U_NAMESPACE_BEGIN
35
36
class ResourceValue;
37
38
// Note: In C++, we use const char * pointers for keys,
39
// rather than an abstraction like Java UResource.Key.
40
41
/**
42
 * Interface for iterating over a resource bundle array resource.
43
 */
44
class U_COMMON_API ResourceArray {
45
public:
46
    /** Constructs an empty array object. */
47
0
    ResourceArray() : items16(NULL), items32(NULL), length(0) {}
48
49
    /** Only for implementation use. @internal */
50
    ResourceArray(const uint16_t *i16, const uint32_t *i32, int32_t len) :
51
0
            items16(i16), items32(i32), length(len) {}
52
53
    /**
54
     * @return The number of items in the array resource.
55
     */
56
0
    int32_t getSize() const { return length; }
57
    /**
58
     * @param i Array item index.
59
     * @param value Output-only, receives the value of the i'th item.
60
     * @return TRUE if i is non-negative and less than getSize().
61
     */
62
    UBool getValue(int32_t i, ResourceValue &value) const;
63
64
    /** Only for implementation use. @internal */
65
    uint32_t internalGetResource(const ResourceData *pResData, int32_t i) const;
66
67
private:
68
    const uint16_t *items16;
69
    const uint32_t *items32;
70
    int32_t length;
71
};
72
73
/**
74
 * Interface for iterating over a resource bundle table resource.
75
 */
76
class U_COMMON_API ResourceTable {
77
public:
78
    /** Constructs an empty table object. */
79
0
    ResourceTable() : keys16(NULL), keys32(NULL), items16(NULL), items32(NULL), length(0) {}
80
81
    /** Only for implementation use. @internal */
82
    ResourceTable(const uint16_t *k16, const int32_t *k32,
83
                  const uint16_t *i16, const uint32_t *i32, int32_t len) :
84
0
            keys16(k16), keys32(k32), items16(i16), items32(i32), length(len) {}
85
86
    /**
87
     * @return The number of items in the array resource.
88
     */
89
0
    int32_t getSize() const { return length; }
90
    /**
91
     * @param i Array item index.
92
     * @param key Output-only, receives the key of the i'th item.
93
     * @param value Output-only, receives the value of the i'th item.
94
     * @return TRUE if i is non-negative and less than getSize().
95
     */
96
    UBool getKeyAndValue(int32_t i, const char *&key, ResourceValue &value) const;
97
98
private:
99
    const uint16_t *keys16;
100
    const int32_t *keys32;
101
    const uint16_t *items16;
102
    const uint32_t *items32;
103
    int32_t length;
104
};
105
106
/**
107
 * Represents a resource bundle item's value.
108
 * Avoids object creations as much as possible.
109
 * Mutable, not thread-safe.
110
 */
111
class U_COMMON_API ResourceValue : public UObject {
112
public:
113
    virtual ~ResourceValue();
114
115
    /**
116
     * @return ICU resource type, for example, URES_STRING
117
     */
118
    virtual UResType getType() const = 0;
119
120
    /**
121
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not a string resource.
122
     *
123
     * @see ures_getString()
124
     */
125
    virtual const UChar *getString(int32_t &length, UErrorCode &errorCode) const = 0;
126
127
0
    inline UnicodeString getUnicodeString(UErrorCode &errorCode) const {
128
0
        int32_t len = 0;
129
0
        const UChar *r = getString(len, errorCode);
130
0
        return UnicodeString(TRUE, r, len);
131
0
    }
132
133
    /**
134
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not an alias resource.
135
     */
136
    virtual const UChar *getAliasString(int32_t &length, UErrorCode &errorCode) const = 0;
137
138
0
    inline UnicodeString getAliasUnicodeString(UErrorCode &errorCode) const {
139
0
        int32_t len = 0;
140
0
        const UChar *r = getAliasString(len, errorCode);
141
0
        return UnicodeString(TRUE, r, len);
142
0
    }
143
144
    /**
145
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
146
     *
147
     * @see ures_getInt()
148
     */
149
    virtual int32_t getInt(UErrorCode &errorCode) const = 0;
150
151
    /**
152
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
153
     *
154
     * @see ures_getUInt()
155
     */
156
    virtual uint32_t getUInt(UErrorCode &errorCode) const = 0;
157
158
    /**
159
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not an intvector resource.
160
     *
161
     * @see ures_getIntVector()
162
     */
163
    virtual const int32_t *getIntVector(int32_t &length, UErrorCode &errorCode) const = 0;
164
165
    /**
166
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not a binary-blob resource.
167
     *
168
     * @see ures_getBinary()
169
     */
170
    virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const = 0;
171
172
    /**
173
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource
174
     */
175
    virtual ResourceArray getArray(UErrorCode &errorCode) const = 0;
176
177
    /**
178
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not a table resource
179
     */
180
    virtual ResourceTable getTable(UErrorCode &errorCode) const = 0;
181
182
    /**
183
     * Is this a no-fallback/no-inheritance marker string?
184
     * Such a marker is used for
185
     * CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205}
186
     * when enumerating tables with fallback from the specific resource bundle to root.
187
     *
188
     * @return TRUE if this is a no-inheritance marker string
189
     */
190
    virtual UBool isNoInheritanceMarker() const = 0;
191
192
    /**
193
     * Sets the dest strings from the string values in this array resource.
194
     *
195
     * @return the number of strings in this array resource.
196
     *     If greater than capacity, then an overflow error is set.
197
     *
198
     * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource
199
     *     or if any of the array items is not a string
200
     */
201
    virtual int32_t getStringArray(UnicodeString *dest, int32_t capacity,
202
                                   UErrorCode &errorCode) const = 0;
203
204
    /**
205
     * Same as
206
     * <pre>
207
     * if (getType() == URES_STRING) {
208
     *     return new String[] { getString(); }
209
     * } else {
210
     *     return getStringArray();
211
     * }
212
     * </pre>
213
     *
214
     * Sets U_RESOURCE_TYPE_MISMATCH if this is
215
     *     neither a string resource nor an array resource containing strings
216
     * @see getString()
217
     * @see getStringArray()
218
     */
219
    virtual int32_t getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity,
220
                                                  UErrorCode &errorCode) const = 0;
221
222
    /**
223
     * Same as
224
     * <pre>
225
     * if (getType() == URES_STRING) {
226
     *     return getString();
227
     * } else {
228
     *     return getStringArray()[0];
229
     * }
230
     * </pre>
231
     *
232
     * Sets U_RESOURCE_TYPE_MISMATCH if this is
233
     *     neither a string resource nor an array resource containing strings
234
     * @see getString()
235
     * @see getStringArray()
236
     */
237
    virtual UnicodeString getStringOrFirstOfArray(UErrorCode &errorCode) const = 0;
238
239
protected:
240
0
    ResourceValue() {}
241
242
private:
243
    ResourceValue(const ResourceValue &);  // no copy constructor
244
    ResourceValue &operator=(const ResourceValue &);  // no assignment operator
245
};
246
247
/**
248
 * Sink for ICU resource bundle contents.
249
 */
250
class U_COMMON_API ResourceSink : public UObject {
251
public:
252
0
    ResourceSink() {}
253
    virtual ~ResourceSink();
254
255
    /**
256
     * Called once for each bundle (child-parent-...-root).
257
     * The value is normally an array or table resource,
258
     * and implementations of this method normally iterate over the
259
     * tree of resource items stored there.
260
     *
261
     * @param key The key string of the enumeration-start resource.
262
     *     Empty if the enumeration starts at the top level of the bundle.
263
     * @param value Call getArray() or getTable() as appropriate.
264
     *     Then reuse for output values from Array and Table getters.
265
     * @param noFallback true if the bundle has no parent;
266
     *     that is, its top-level table has the nofallback attribute,
267
     *     or it is the root bundle of a locale tree.
268
     */
269
    virtual void put(const char *key, ResourceValue &value, UBool noFallback,
270
                     UErrorCode &errorCode) = 0;
271
272
private:
273
    ResourceSink(const ResourceSink &);  // no copy constructor
274
    ResourceSink &operator=(const ResourceSink &);  // no assignment operator
275
};
276
277
U_NAMESPACE_END
278
279
#endif