Index: source/common/resource.h |
diff --git a/source/common/resource.h b/source/common/resource.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..042e298b798242bb5ae05339337fb4636f0dd3c3 |
--- /dev/null |
+++ b/source/common/resource.h |
@@ -0,0 +1,248 @@ |
+/* |
+******************************************************************************* |
+* Copyright (C) 2015, International Business Machines |
+* Corporation and others. All Rights Reserved. |
+******************************************************************************* |
+* resource.h |
+* |
+* created on: 2015nov04 |
+* created by: Markus W. Scherer |
+*/ |
+ |
+#ifndef __URESOURCE_H__ |
+#define __URESOURCE_H__ |
+ |
+/** |
+ * \file |
+ * \brief ICU resource bundle key and value types. |
+ */ |
+ |
+// Note: Ported from ICU4J class UResource and its nested classes, |
+// but the C++ classes are separate, not nested. |
+ |
+// We use the Resource prefix for C++ classes, as usual. |
+// The UResource prefix would be used for C types. |
+ |
+#include "unicode/utypes.h" |
+#include "unicode/unistr.h" |
+#include "unicode/ures.h" |
+ |
+U_NAMESPACE_BEGIN |
+ |
+class ResourceTableSink; |
+ |
+// Note: In C++, we use const char * pointers for keys, |
+// rather than an abstraction like Java UResource.Key. |
+ |
+/** |
+ * Represents a resource bundle item's value. |
+ * Avoids object creations as much as possible. |
+ * Mutable, not thread-safe. |
+ */ |
+class U_COMMON_API ResourceValue : public UObject { |
+public: |
+ virtual ~ResourceValue(); |
+ |
+ /** |
+ * @return ICU resource type, for example, URES_STRING |
+ */ |
+ virtual UResType getType() const = 0; |
+ |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not a string resource. |
+ * |
+ * @see ures_getString() |
+ */ |
+ virtual const UChar *getString(int32_t &length, UErrorCode &errorCode) const = 0; |
+ |
+ inline UnicodeString getUnicodeString(UErrorCode &errorCode) const { |
+ int32_t len = 0; |
+ const UChar *r = getString(len, errorCode); |
+ return UnicodeString(TRUE, r, len); |
+ } |
+ |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not an alias resource. |
+ */ |
+ virtual const UChar *getAliasString(int32_t &length, UErrorCode &errorCode) const = 0; |
+ |
+ inline UnicodeString getAliasUnicodeString(UErrorCode &errorCode) const { |
+ int32_t len = 0; |
+ const UChar *r = getAliasString(len, errorCode); |
+ return UnicodeString(TRUE, r, len); |
+ } |
+ |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource. |
+ * |
+ * @see ures_getInt() |
+ */ |
+ virtual int32_t getInt(UErrorCode &errorCode) const = 0; |
+ |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not an integer resource. |
+ * |
+ * @see ures_getUInt() |
+ */ |
+ virtual uint32_t getUInt(UErrorCode &errorCode) const = 0; |
+ |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not an intvector resource. |
+ * |
+ * @see ures_getIntVector() |
+ */ |
+ virtual const int32_t *getIntVector(int32_t &length, UErrorCode &errorCode) const = 0; |
+ |
+ /** |
+ * Sets U_RESOURCE_TYPE_MISMATCH if this is not a binary-blob resource. |
+ * |
+ * @see ures_getBinary() |
+ */ |
+ 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 |
+}; |
+ |
+/** |
+ * 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(); |
+ |
+ /** |
+ * Adds a value from a resource array. |
+ * |
+ * @param index of the resource array item |
+ * @param value resource value |
+ */ |
+ virtual void put(int32_t index, const ResourceValue &value, UErrorCode &errorCode); |
+ |
+ /** |
+ * 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. |
+ * |
+ * This sink (not the caller) owns the nested sink. |
+ * |
+ * @param index of the resource array item |
+ * @param size number of array items |
+ * @return nested-array sink, or NULL |
+ */ |
+ virtual ResourceArraySink *getOrCreateArraySink( |
+ int32_t index, int32_t size, UErrorCode &errorCode); |
+ |
+ /** |
+ * 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. |
+ * |
+ * @param index of the resource array item |
+ * @param initialSize size hint for creating the sink if necessary |
+ * @return nested-table sink, or NULL |
+ */ |
+ virtual ResourceTableSink *getOrCreateTableSink( |
+ int32_t index, int32_t initialSize, UErrorCode &errorCode); |
+ |
+ /** |
+ * "Leaves" the array. |
+ * Indicates that all of the resources and sub-resources of the current array |
+ * have been enumerated. |
+ */ |
+ virtual void leave(UErrorCode &errorCode); |
+ |
+private: |
+ ResourceArraySink(const ResourceArraySink &); // no copy constructor |
+ ResourceArraySink &operator=(const ResourceArraySink &); // 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. |
+ */ |
+class U_COMMON_API ResourceTableSink : 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); |
+ |
+ /** |
+ * 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. |
+ * |
+ * @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. |
+ */ |
+ virtual void leave(UErrorCode &errorCode); |
+ |
+private: |
+ ResourceTableSink(const ResourceTableSink &); // no copy constructor |
+ ResourceTableSink &operator=(const ResourceTableSink &); // no assignment operator |
+}; |
+ |
+U_NAMESPACE_END |
+ |
+#endif |