]> git.saurik.com Git - apple/icu.git/blame - icuSources/common/resource.h
ICU-57165.0.1.tar.gz
[apple/icu.git] / icuSources / common / resource.h
CommitLineData
2ca993e8
A
1/*
2*******************************************************************************
3* Copyright (C) 2015, International Business Machines
4* Corporation and others. All Rights Reserved.
5*******************************************************************************
6* resource.h
7*
8* created on: 2015nov04
9* created by: Markus W. Scherer
10*/
11
12#ifndef __URESOURCE_H__
13#define __URESOURCE_H__
14
15/**
16 * \file
17 * \brief ICU resource bundle key and value types.
18 */
19
20// Note: Ported from ICU4J class UResource and its nested classes,
21// but the C++ classes are separate, not nested.
22
23// We use the Resource prefix for C++ classes, as usual.
24// The UResource prefix would be used for C types.
25
26#include "unicode/utypes.h"
27#include "unicode/unistr.h"
28#include "unicode/ures.h"
29
30U_NAMESPACE_BEGIN
31
32class ResourceTableSink;
33
34// Note: In C++, we use const char * pointers for keys,
35// rather than an abstraction like Java UResource.Key.
36
37/**
38 * Represents a resource bundle item's value.
39 * Avoids object creations as much as possible.
40 * Mutable, not thread-safe.
41 */
42class U_COMMON_API ResourceValue : public UObject {
43public:
44 virtual ~ResourceValue();
45
46 /**
47 * @return ICU resource type, for example, URES_STRING
48 */
49 virtual UResType getType() const = 0;
50
51 /**
52 * Sets U_RESOURCE_TYPE_MISMATCH if this is not a string resource.
53 *
54 * @see ures_getString()
55 */
56 virtual const UChar *getString(int32_t &length, UErrorCode &errorCode) const = 0;
57
58 inline UnicodeString getUnicodeString(UErrorCode &errorCode) const {
59 int32_t len = 0;
60 const UChar *r = getString(len, errorCode);
61 return UnicodeString(TRUE, r, len);
62 }
63
64 /**
65 * Sets U_RESOURCE_TYPE_MISMATCH if this is not an alias resource.
66 */
67 virtual const UChar *getAliasString(int32_t &length, UErrorCode &errorCode) const = 0;
68
69 inline UnicodeString getAliasUnicodeString(UErrorCode &errorCode) const {
70 int32_t len = 0;
71 const UChar *r = getAliasString(len, errorCode);
72 return UnicodeString(TRUE, r, len);
73 }
74
75 /**
76 * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
77 *
78 * @see ures_getInt()
79 */
80 virtual int32_t getInt(UErrorCode &errorCode) const = 0;
81
82 /**
83 * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource.
84 *
85 * @see ures_getUInt()
86 */
87 virtual uint32_t getUInt(UErrorCode &errorCode) const = 0;
88
89 /**
90 * Sets U_RESOURCE_TYPE_MISMATCH if this is not an intvector resource.
91 *
92 * @see ures_getIntVector()
93 */
94 virtual const int32_t *getIntVector(int32_t &length, UErrorCode &errorCode) const = 0;
95
96 /**
97 * Sets U_RESOURCE_TYPE_MISMATCH if this is not a binary-blob resource.
98 *
99 * @see ures_getBinary()
100 */
101 virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const = 0;
102
103protected:
104 ResourceValue() {}
105
106private:
107 ResourceValue(const ResourceValue &); // no copy constructor
108 ResourceValue &operator=(const ResourceValue &); // no assignment operator
109};
110
111/**
112 * Sink for ICU resource array contents.
113 * The base class does nothing.
114 *
115 * Nested arrays and tables are stored as nested sinks,
116 * never put() as ResourceValue items.
117 */
118class U_COMMON_API ResourceArraySink : public UObject {
119public:
120 ResourceArraySink() {}
121 virtual ~ResourceArraySink();
122
123 /**
124 * Adds a value from a resource array.
125 *
126 * @param index of the resource array item
127 * @param value resource value
128 */
129 virtual void put(int32_t index, const ResourceValue &value, UErrorCode &errorCode);
130
131 /**
132 * Returns a nested resource array at the array index as another sink.
133 * Creates the sink if none exists for the key.
134 * Returns NULL if nested arrays are not supported.
135 * The default implementation always returns NULL.
136 *
137 * This sink (not the caller) owns the nested sink.
138 *
139 * @param index of the resource array item
140 * @param size number of array items
141 * @return nested-array sink, or NULL
142 */
143 virtual ResourceArraySink *getOrCreateArraySink(
144 int32_t index, int32_t size, UErrorCode &errorCode);
145
146 /**
147 * Returns a nested resource table at the array index as another sink.
148 * Creates the sink if none exists for the key.
149 * Returns NULL if nested tables are not supported.
150 * The default implementation always returns NULL.
151 *
152 * This sink (not the caller) owns the nested sink.
153 *
154 * @param index of the resource array item
155 * @param initialSize size hint for creating the sink if necessary
156 * @return nested-table sink, or NULL
157 */
158 virtual ResourceTableSink *getOrCreateTableSink(
159 int32_t index, int32_t initialSize, UErrorCode &errorCode);
160
161 /**
162 * "Leaves" the array.
163 * Indicates that all of the resources and sub-resources of the current array
164 * have been enumerated.
165 */
166 virtual void leave(UErrorCode &errorCode);
167
168private:
169 ResourceArraySink(const ResourceArraySink &); // no copy constructor
170 ResourceArraySink &operator=(const ResourceArraySink &); // no assignment operator
171};
172
173/**
174 * Sink for ICU resource table contents.
175 * The base class does nothing.
176 *
177 * Nested arrays and tables are stored as nested sinks,
178 * never put() as ResourceValue items.
179 */
180class U_COMMON_API ResourceTableSink : public UObject {
181public:
182 ResourceTableSink() {}
183 virtual ~ResourceTableSink();
184
185 /**
186 * Adds a key-value pair from a resource table.
187 *
188 * @param key resource key string
189 * @param value resource value
190 */
191 virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode);
192
193 /**
194 * Adds a no-fallback/no-inheritance marker for this key.
195 * Used for CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205}
196 * when enumerating tables with fallback from the specific resource bundle to root.
197 *
198 * The default implementation does nothing.
199 *
200 * @param key to be removed
201 */
202 virtual void putNoFallback(const char *key, UErrorCode &errorCode);
203
204 /**
205 * Returns a nested resource array for the key as another sink.
206 * Creates the sink if none exists for the key.
207 * Returns NULL if nested arrays are not supported.
208 * The default implementation always returns NULL.
209 *
210 * This sink (not the caller) owns the nested sink.
211 *
212 * @param key resource key string
213 * @param size number of array items
214 * @return nested-array sink, or NULL
215 */
216 virtual ResourceArraySink *getOrCreateArraySink(
217 const char *key, int32_t size, UErrorCode &errorCode);
218
219 /**
220 * Returns a nested resource table for the key as another sink.
221 * Creates the sink if none exists for the key.
222 * Returns NULL if nested tables are not supported.
223 * The default implementation always returns NULL.
224 *
225 * This sink (not the caller) owns the nested sink.
226 *
227 * @param key resource key string
228 * @param initialSize size hint for creating the sink if necessary
229 * @return nested-table sink, or NULL
230 */
231 virtual ResourceTableSink *getOrCreateTableSink(
232 const char *key, int32_t initialSize, UErrorCode &errorCode);
233
234 /**
235 * "Leaves" the table.
236 * Indicates that all of the resources and sub-resources of the current table
237 * have been enumerated.
238 */
239 virtual void leave(UErrorCode &errorCode);
240
241private:
242 ResourceTableSink(const ResourceTableSink &); // no copy constructor
243 ResourceTableSink &operator=(const ResourceTableSink &); // no assignment operator
244};
245
246U_NAMESPACE_END
247
248#endif