Index: source/common/resource.h |
diff --git a/source/common/resource.h b/source/common/resource.h |
index 042e298b798242bb5ae05339337fb4636f0dd3c3..43c3309b5e9917484e3d590467f35d4ec73ae8be 100644 |
--- a/source/common/resource.h |
+++ b/source/common/resource.h |
@@ -1,6 +1,8 @@ |
+// Copyright (C) 2016 and later: Unicode, Inc. and others. |
+// License & terms of use: http://www.unicode.org/copyright.html |
/* |
******************************************************************************* |
-* Copyright (C) 2015, International Business Machines |
+* Copyright (C) 2015-2016, International Business Machines |
* Corporation and others. All Rights Reserved. |
******************************************************************************* |
* resource.h |
@@ -27,14 +29,81 @@ |
#include "unicode/unistr.h" |
#include "unicode/ures.h" |
+struct ResourceData; |
+ |
U_NAMESPACE_BEGIN |
-class ResourceTableSink; |
+class ResourceValue; |
// Note: In C++, we use const char * pointers for keys, |
// rather than an abstraction like Java UResource.Key. |
/** |
+ * Interface for iterating over a resource bundle array resource. |
+ */ |
+class U_COMMON_API ResourceArray { |
+public: |
+ /** Constructs an empty array object. */ |
+ ResourceArray() : items16(NULL), items32(NULL), length(0) {} |
+ |
+ /** Only for implementation use. @internal */ |
+ ResourceArray(const uint16_t *i16, const uint32_t *i32, int32_t len) : |
+ items16(i16), items32(i32), length(len) {} |
+ |
+ /** |
+ * @return The number of items in the array resource. |
+ */ |
+ int32_t getSize() const { return length; } |
+ /** |
+ * @param i Array item index. |
+ * @param value Output-only, receives the value of the i'th item. |
+ * @return TRUE if i is non-negative and less than getSize(). |
+ */ |
+ UBool getValue(int32_t i, ResourceValue &value) const; |
+ |
+ /** Only for implementation use. @internal */ |
+ uint32_t internalGetResource(const ResourceData *pResData, int32_t i) const; |
+ |
+private: |
+ const uint16_t *items16; |
+ const uint32_t *items32; |
+ int32_t length; |
+}; |
+ |
+/** |
+ * Interface for iterating over a resource bundle table resource. |
+ */ |
+class U_COMMON_API ResourceTable { |
+public: |
+ /** Constructs an empty table object. */ |
+ ResourceTable() : keys16(NULL), keys32(NULL), items16(NULL), items32(NULL), length(0) {} |
+ |
+ /** Only for implementation use. @internal */ |
+ ResourceTable(const uint16_t *k16, const int32_t *k32, |
+ const uint16_t *i16, const uint32_t *i32, int32_t len) : |
+ keys16(k16), keys32(k32), items16(i16), items32(i32), length(len) {} |
+ |
+ /** |
+ * @return The number of items in the array resource. |
+ */ |
+ int32_t getSize() const { return length; } |
+ /** |
+ * @param i Array item index. |
+ * @param key Output-only, receives the key of the i'th item. |
+ * @param value Output-only, receives the value of the i'th item. |
+ * @return TRUE if i is non-negative and less than getSize(). |
+ */ |
+ UBool getKeyAndValue(int32_t i, const char *&key, ResourceValue &value) const; |
+ |
+private: |
+ const uint16_t *keys16; |
+ const int32_t *keys32; |
+ const uint16_t *items16; |
+ const uint32_t *items32; |
+ int32_t length; |
+}; |
+ |
+/** |
* Represents a resource bundle item's value. |
* Avoids object creations as much as possible. |
* Mutable, not thread-safe. |
@@ -100,147 +169,109 @@ public: |
*/ |
virtual const uint8_t *getBinary(int32_t &length, UErrorCode &errorCode) const = 0; |
-protected: |
- ResourceValue() {} |
- |
-private: |
- ResourceValue(const ResourceValue &); // no copy constructor |
- ResourceValue &operator=(const ResourceValue &); // no assignment operator |
-}; |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource |
+ */ |
+ virtual ResourceArray getArray(UErrorCode &errorCode) const = 0; |
-/** |
- * Sink for ICU resource array contents. |
- * The base class does nothing. |
- * |
- * Nested arrays and tables are stored as nested sinks, |
- * never put() as ResourceValue items. |
- */ |
-class U_COMMON_API ResourceArraySink : public UObject { |
-public: |
- ResourceArraySink() {} |
- virtual ~ResourceArraySink(); |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not a table resource |
+ */ |
+ virtual ResourceTable getTable(UErrorCode &errorCode) const = 0; |
/** |
- * Adds a value from a resource array. |
+ * Is this a no-fallback/no-inheritance marker string? |
+ * Such a marker is used for |
+ * CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205} |
+ * when enumerating tables with fallback from the specific resource bundle to root. |
* |
- * @param index of the resource array item |
- * @param value resource value |
+ * @return TRUE if this is a no-inheritance marker string |
*/ |
- virtual void put(int32_t index, const ResourceValue &value, UErrorCode &errorCode); |
+ virtual UBool isNoInheritanceMarker() const = 0; |
/** |
- * Returns a nested resource array at the array index as another sink. |
- * Creates the sink if none exists for the key. |
- * Returns NULL if nested arrays are not supported. |
- * The default implementation always returns NULL. |
+ * Sets the dest strings from the string values in this array resource. |
* |
- * This sink (not the caller) owns the nested sink. |
+ * @return the number of strings in this array resource. |
+ * If greater than capacity, then an overflow error is set. |
* |
- * @param index of the resource array item |
- * @param size number of array items |
- * @return nested-array sink, or NULL |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not an array resource |
+ * or if any of the array items is not a string |
*/ |
- virtual ResourceArraySink *getOrCreateArraySink( |
- int32_t index, int32_t size, UErrorCode &errorCode); |
+ virtual int32_t getStringArray(UnicodeString *dest, int32_t capacity, |
+ UErrorCode &errorCode) const = 0; |
/** |
- * Returns a nested resource table at the array index as another sink. |
- * Creates the sink if none exists for the key. |
- * Returns NULL if nested tables are not supported. |
- * The default implementation always returns NULL. |
- * |
- * This sink (not the caller) owns the nested sink. |
+ * Same as |
+ * <pre> |
+ * if (getType() == URES_STRING) { |
+ * return new String[] { getString(); } |
+ * } else { |
+ * return getStringArray(); |
+ * } |
+ * </pre> |
* |
- * @param index of the resource array item |
- * @param initialSize size hint for creating the sink if necessary |
- * @return nested-table sink, or NULL |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is |
+ * neither a string resource nor an array resource containing strings |
+ * @see getString() |
+ * @see getStringArray() |
*/ |
- virtual ResourceTableSink *getOrCreateTableSink( |
- int32_t index, int32_t initialSize, UErrorCode &errorCode); |
+ virtual int32_t getStringArrayOrStringAsArray(UnicodeString *dest, int32_t capacity, |
+ UErrorCode &errorCode) const = 0; |
/** |
- * "Leaves" the array. |
- * Indicates that all of the resources and sub-resources of the current array |
- * have been enumerated. |
+ * Same as |
+ * <pre> |
+ * if (getType() == URES_STRING) { |
+ * return getString(); |
+ * } else { |
+ * return getStringArray()[0]; |
+ * } |
+ * </pre> |
+ * |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is |
+ * neither a string resource nor an array resource containing strings |
+ * @see getString() |
+ * @see getStringArray() |
*/ |
- virtual void leave(UErrorCode &errorCode); |
+ virtual UnicodeString getStringOrFirstOfArray(UErrorCode &errorCode) const = 0; |
+ |
+protected: |
+ ResourceValue() {} |
private: |
- ResourceArraySink(const ResourceArraySink &); // no copy constructor |
- ResourceArraySink &operator=(const ResourceArraySink &); // no assignment operator |
+ ResourceValue(const ResourceValue &); // no copy constructor |
+ ResourceValue &operator=(const ResourceValue &); // no assignment operator |
}; |
/** |
- * Sink for ICU resource table contents. |
- * The base class does nothing. |
- * |
- * Nested arrays and tables are stored as nested sinks, |
- * never put() as ResourceValue items. |
+ * Sink for ICU resource bundle contents. |
*/ |
-class U_COMMON_API ResourceTableSink : public UObject { |
+class U_COMMON_API ResourceSink : public UObject { |
public: |
- ResourceTableSink() {} |
- virtual ~ResourceTableSink(); |
- |
- /** |
- * Adds a key-value pair from a resource table. |
- * |
- * @param key resource key string |
- * @param value resource value |
- */ |
- virtual void put(const char *key, const ResourceValue &value, UErrorCode &errorCode); |
+ ResourceSink() {} |
+ virtual ~ResourceSink(); |
/** |
- * Adds a no-fallback/no-inheritance marker for this key. |
- * Used for CLDR no-fallback data values of (three empty-set symbols)=={2205, 2205, 2205} |
- * when enumerating tables with fallback from the specific resource bundle to root. |
- * |
- * The default implementation does nothing. |
- * |
- * @param key to be removed |
- */ |
- virtual void putNoFallback(const char *key, UErrorCode &errorCode); |
- |
- /** |
- * Returns a nested resource array for the key as another sink. |
- * Creates the sink if none exists for the key. |
- * Returns NULL if nested arrays are not supported. |
- * The default implementation always returns NULL. |
- * |
- * This sink (not the caller) owns the nested sink. |
+ * Called once for each bundle (child-parent-...-root). |
+ * The value is normally an array or table resource, |
+ * and implementations of this method normally iterate over the |
+ * tree of resource items stored there. |
* |
- * @param key resource key string |
- * @param size number of array items |
- * @return nested-array sink, or NULL |
- */ |
- virtual ResourceArraySink *getOrCreateArraySink( |
- const char *key, int32_t size, UErrorCode &errorCode); |
- |
- /** |
- * Returns a nested resource table for the key as another sink. |
- * Creates the sink if none exists for the key. |
- * Returns NULL if nested tables are not supported. |
- * The default implementation always returns NULL. |
- * |
- * This sink (not the caller) owns the nested sink. |
- * |
- * @param key resource key string |
- * @param initialSize size hint for creating the sink if necessary |
- * @return nested-table sink, or NULL |
- */ |
- virtual ResourceTableSink *getOrCreateTableSink( |
- const char *key, int32_t initialSize, UErrorCode &errorCode); |
- |
- /** |
- * "Leaves" the table. |
- * Indicates that all of the resources and sub-resources of the current table |
- * have been enumerated. |
+ * @param key The key string of the enumeration-start resource. |
+ * Empty if the enumeration starts at the top level of the bundle. |
+ * @param value Call getArray() or getTable() as appropriate. |
+ * Then reuse for output values from Array and Table getters. |
+ * @param noFallback true if the bundle has no parent; |
+ * that is, its top-level table has the nofallback attribute, |
+ * or it is the root bundle of a locale tree. |
*/ |
- virtual void leave(UErrorCode &errorCode); |
+ virtual void put(const char *key, ResourceValue &value, UBool noFallback, |
+ UErrorCode &errorCode) = 0; |
private: |
- ResourceTableSink(const ResourceTableSink &); // no copy constructor |
- ResourceTableSink &operator=(const ResourceTableSink &); // no assignment operator |
+ ResourceSink(const ResourceSink &); // no copy constructor |
+ ResourceSink &operator=(const ResourceSink &); // no assignment operator |
}; |
U_NAMESPACE_END |