Index: icu46/source/i18n/transreg.h |
=================================================================== |
--- icu46/source/i18n/transreg.h (revision 0) |
+++ icu46/source/i18n/transreg.h (revision 0) |
@@ -0,0 +1,462 @@ |
+/* |
+********************************************************************** |
+* Copyright (c) 2001-2008, International Business Machines |
+* Corporation and others. All Rights Reserved. |
+********************************************************************** |
+* Date Name Description |
+* 08/10/2001 aliu Creation. |
+********************************************************************** |
+*/ |
+#ifndef _TRANSREG_H |
+#define _TRANSREG_H |
+ |
+#include "unicode/utypes.h" |
+ |
+#if !UCONFIG_NO_TRANSLITERATION |
+ |
+#include "unicode/uobject.h" |
+#include "unicode/translit.h" |
+#include "hash.h" |
+#include "uvector.h" |
+ |
+U_NAMESPACE_BEGIN |
+ |
+class TransliteratorEntry; |
+class TransliteratorSpec; |
+class UnicodeString; |
+ |
+//------------------------------------------------------------------ |
+// TransliteratorAlias |
+//------------------------------------------------------------------ |
+ |
+/** |
+ * A TransliteratorAlias object is returned by get() if the given ID |
+ * actually translates into something else. The caller then invokes |
+ * the create() method on the alias to create the actual |
+ * transliterator, and deletes the alias. |
+ * |
+ * Why all the shenanigans? To prevent circular calls between |
+ * the registry code and the transliterator code that deadlocks. |
+ */ |
+class TransliteratorAlias : public UMemory { |
+ public: |
+ /** |
+ * Construct a simple alias (type == SIMPLE) |
+ * @param aliasID the given id. |
+ */ |
+ TransliteratorAlias(const UnicodeString& aliasID, const UnicodeSet* compoundFilter); |
+ |
+ /** |
+ * Construct a compound RBT alias (type == COMPOUND) |
+ */ |
+ TransliteratorAlias(const UnicodeString& ID, const UnicodeString& idBlocks, |
+ UVector* adoptedTransliterators, |
+ const UnicodeSet* compoundFilter); |
+ |
+ /** |
+ * Construct a rules alias (type = RULES) |
+ */ |
+ TransliteratorAlias(const UnicodeString& theID, |
+ const UnicodeString& rules, |
+ UTransDirection dir); |
+ |
+ ~TransliteratorAlias(); |
+ |
+ /** |
+ * The whole point of create() is that the caller must invoke |
+ * it when the registry mutex is NOT held, to prevent deadlock. |
+ * It may only be called once. |
+ * |
+ * Note: Only call create() if isRuleBased() returns FALSE. |
+ * |
+ * This method must be called *outside* of the TransliteratorRegistry |
+ * mutex. |
+ */ |
+ Transliterator* create(UParseError&, UErrorCode&); |
+ |
+ /** |
+ * Return TRUE if this alias is rule-based. If so, the caller |
+ * must call parse() on it, then call TransliteratorRegistry::reget(). |
+ */ |
+ UBool isRuleBased() const; |
+ |
+ /** |
+ * If isRuleBased() returns TRUE, then the caller must call this |
+ * method, followed by TransliteratorRegistry::reget(). The latter |
+ * method must be called inside the TransliteratorRegistry mutex. |
+ * |
+ * Note: Only call parse() if isRuleBased() returns TRUE. |
+ * |
+ * This method must be called *outside* of the TransliteratorRegistry |
+ * mutex, because it can instantiate Transliterators embedded in |
+ * the rules via the "&Latin-Arabic()" syntax. |
+ */ |
+ void parse(TransliteratorParser& parser, |
+ UParseError& pe, UErrorCode& ec) const; |
+ |
+ private: |
+ // We actually come in three flavors: |
+ // 1. Simple alias |
+ // Here aliasID is the alias string. Everything else is |
+ // null, zero, empty. |
+ // 2. CompoundRBT |
+ // Here ID is the ID, aliasID is the idBlock, trans is the |
+ // contained RBT, and idSplitPoint is the offet in aliasID |
+ // where the contained RBT goes. compoundFilter is the |
+ // compound filter, and it is _not_ owned. |
+ // 3. Rules |
+ // Here ID is the ID, aliasID is the rules string. |
+ // idSplitPoint is the UTransDirection. |
+ UnicodeString ID; |
+ UnicodeString aliasesOrRules; |
+ UVector* transes; // owned |
+ const UnicodeSet* compoundFilter; // alias |
+ UTransDirection direction; |
+ enum { SIMPLE, COMPOUND, RULES } type; |
+ |
+ TransliteratorAlias(const TransliteratorAlias &other); // forbid copying of this class |
+ TransliteratorAlias &operator=(const TransliteratorAlias &other); // forbid copying of this class |
+}; |
+ |
+ |
+/** |
+ * A registry of system transliterators. This is the data structure |
+ * that implements the mapping between transliterator IDs and the data |
+ * or function pointers used to create the corresponding |
+ * transliterators. There is one instance of the registry that is |
+ * created statically. |
+ * |
+ * The registry consists of a dynamic component -- a hashtable -- and |
+ * a static component -- locale resource bundles. The dynamic store |
+ * is semantically overlaid on the static store, so the static mapping |
+ * can be dynamically overridden. |
+ * |
+ * This is an internal class that is only used by Transliterator. |
+ * Transliterator maintains one static instance of this class and |
+ * delegates all registry-related operations to it. |
+ * |
+ * @author Alan Liu |
+ */ |
+class TransliteratorRegistry : public UMemory { |
+ |
+ public: |
+ |
+ /** |
+ * Contructor |
+ * @param status Output param set to success/failure code. |
+ */ |
+ TransliteratorRegistry(UErrorCode& status); |
+ |
+ /** |
+ * Nonvirtual destructor -- this class is not subclassable. |
+ */ |
+ ~TransliteratorRegistry(); |
+ |
+ //------------------------------------------------------------------ |
+ // Basic public API |
+ //------------------------------------------------------------------ |
+ |
+ /** |
+ * Given a simple ID (forward direction, no inline filter, not |
+ * compound) attempt to instantiate it from the registry. Return |
+ * 0 on failure. |
+ * |
+ * Return a non-NULL aliasReturn value if the ID points to an alias. |
+ * We cannot instantiate it ourselves because the alias may contain |
+ * filters or compounds, which we do not understand. Caller should |
+ * make aliasReturn NULL before calling. |
+ * @param ID the given ID |
+ * @param aliasReturn output param to receive TransliteratorAlias; |
+ * should be NULL on entry |
+ * @param parseError Struct to recieve information on position |
+ * of error if an error is encountered |
+ * @param status Output param set to success/failure code. |
+ */ |
+ Transliterator* get(const UnicodeString& ID, |
+ TransliteratorAlias*& aliasReturn, |
+ UErrorCode& status); |
+ |
+ /** |
+ * The caller must call this after calling get(), if [a] calling get() |
+ * returns an alias, and [b] the alias is rule based. In that |
+ * situation the caller must call alias->parse() to do the parsing |
+ * OUTSIDE THE REGISTRY MUTEX, then call this method to retry |
+ * instantiating the transliterator. |
+ * |
+ * Note: Another alias might be returned by this method. |
+ * |
+ * This method (like all public methods of this class) must be called |
+ * from within the TransliteratorRegistry mutex. |
+ * |
+ * @param aliasReturn output param to receive TransliteratorAlias; |
+ * should be NULL on entry |
+ */ |
+ Transliterator* reget(const UnicodeString& ID, |
+ TransliteratorParser& parser, |
+ TransliteratorAlias*& aliasReturn, |
+ UErrorCode& status); |
+ |
+ /** |
+ * Register a prototype (adopted). This adds an entry to the |
+ * dynamic store, or replaces an existing entry. Any entry in the |
+ * underlying static locale resource store is masked. |
+ */ |
+ void put(Transliterator* adoptedProto, |
+ UBool visible, |
+ UErrorCode& ec); |
+ |
+ /** |
+ * Register an ID and a factory function pointer. This adds an |
+ * entry to the dynamic store, or replaces an existing entry. Any |
+ * entry in the underlying static locale resource store is masked. |
+ */ |
+ void put(const UnicodeString& ID, |
+ Transliterator::Factory factory, |
+ Transliterator::Token context, |
+ UBool visible, |
+ UErrorCode& ec); |
+ |
+ /** |
+ * Register an ID and a resource name. This adds an entry to the |
+ * dynamic store, or replaces an existing entry. Any entry in the |
+ * underlying static locale resource store is masked. |
+ */ |
+ void put(const UnicodeString& ID, |
+ const UnicodeString& resourceName, |
+ UTransDirection dir, |
+ UBool readonlyResourceAlias, |
+ UBool visible, |
+ UErrorCode& ec); |
+ |
+ /** |
+ * Register an ID and an alias ID. This adds an entry to the |
+ * dynamic store, or replaces an existing entry. Any entry in the |
+ * underlying static locale resource store is masked. |
+ */ |
+ void put(const UnicodeString& ID, |
+ const UnicodeString& alias, |
+ UBool readonlyAliasAlias, |
+ UBool visible, |
+ UErrorCode& ec); |
+ |
+ /** |
+ * Unregister an ID. This removes an entry from the dynamic store |
+ * if there is one. The static locale resource store is |
+ * unaffected. |
+ * @param ID the given ID. |
+ */ |
+ void remove(const UnicodeString& ID); |
+ |
+ //------------------------------------------------------------------ |
+ // Public ID and spec management |
+ //------------------------------------------------------------------ |
+ |
+ /** |
+ * Return a StringEnumeration over the IDs currently registered |
+ * with the system. |
+ * @internal |
+ */ |
+ StringEnumeration* getAvailableIDs() const; |
+ |
+ /** |
+ * == OBSOLETE - remove in ICU 3.4 == |
+ * Return the number of IDs currently registered with the system. |
+ * To retrieve the actual IDs, call getAvailableID(i) with |
+ * i from 0 to countAvailableIDs() - 1. |
+ * @return the number of IDs currently registered with the system. |
+ * @internal |
+ */ |
+ int32_t countAvailableIDs(void) const; |
+ |
+ /** |
+ * == OBSOLETE - remove in ICU 3.4 == |
+ * Return the index-th available ID. index must be between 0 |
+ * and countAvailableIDs() - 1, inclusive. If index is out of |
+ * range, the result of getAvailableID(0) is returned. |
+ * @param index the given index. |
+ * @return the index-th available ID. index must be between 0 |
+ * and countAvailableIDs() - 1, inclusive. If index is out of |
+ * range, the result of getAvailableID(0) is returned. |
+ * @internal |
+ */ |
+ const UnicodeString& getAvailableID(int32_t index) const; |
+ |
+ /** |
+ * Return the number of registered source specifiers. |
+ * @return the number of registered source specifiers. |
+ */ |
+ int32_t countAvailableSources(void) const; |
+ |
+ /** |
+ * Return a registered source specifier. |
+ * @param index which specifier to return, from 0 to n-1, where |
+ * n = countAvailableSources() |
+ * @param result fill-in paramter to receive the source specifier. |
+ * If index is out of range, result will be empty. |
+ * @return reference to result |
+ */ |
+ UnicodeString& getAvailableSource(int32_t index, |
+ UnicodeString& result) const; |
+ |
+ /** |
+ * Return the number of registered target specifiers for a given |
+ * source specifier. |
+ * @param source the given source specifier. |
+ * @return the number of registered target specifiers for a given |
+ * source specifier. |
+ */ |
+ int32_t countAvailableTargets(const UnicodeString& source) const; |
+ |
+ /** |
+ * Return a registered target specifier for a given source. |
+ * @param index which specifier to return, from 0 to n-1, where |
+ * n = countAvailableTargets(source) |
+ * @param source the source specifier |
+ * @param result fill-in paramter to receive the target specifier. |
+ * If source is invalid or if index is out of range, result will |
+ * be empty. |
+ * @return reference to result |
+ */ |
+ UnicodeString& getAvailableTarget(int32_t index, |
+ const UnicodeString& source, |
+ UnicodeString& result) const; |
+ |
+ /** |
+ * Return the number of registered variant specifiers for a given |
+ * source-target pair. There is always at least one variant: If |
+ * just source-target is registered, then the single variant |
+ * NO_VARIANT is returned. If source-target/variant is registered |
+ * then that variant is returned. |
+ * @param source the source specifiers |
+ * @param target the target specifiers |
+ * @return the number of registered variant specifiers for a given |
+ * source-target pair. |
+ */ |
+ int32_t countAvailableVariants(const UnicodeString& source, |
+ const UnicodeString& target) const; |
+ |
+ /** |
+ * Return a registered variant specifier for a given source-target |
+ * pair. If NO_VARIANT is one of the variants, then it will be |
+ * at index 0. |
+ * @param index which specifier to return, from 0 to n-1, where |
+ * n = countAvailableVariants(source, target) |
+ * @param source the source specifier |
+ * @param target the target specifier |
+ * @param result fill-in paramter to receive the variant |
+ * specifier. If source is invalid or if target is invalid or if |
+ * index is out of range, result will be empty. |
+ * @return reference to result |
+ */ |
+ UnicodeString& getAvailableVariant(int32_t index, |
+ const UnicodeString& source, |
+ const UnicodeString& target, |
+ UnicodeString& result) const; |
+ |
+ private: |
+ |
+ //---------------------------------------------------------------- |
+ // Private implementation |
+ //---------------------------------------------------------------- |
+ |
+ TransliteratorEntry* find(const UnicodeString& ID); |
+ |
+ TransliteratorEntry* find(UnicodeString& source, |
+ UnicodeString& target, |
+ UnicodeString& variant); |
+ |
+ TransliteratorEntry* findInDynamicStore(const TransliteratorSpec& src, |
+ const TransliteratorSpec& trg, |
+ const UnicodeString& variant) const; |
+ |
+ TransliteratorEntry* findInStaticStore(const TransliteratorSpec& src, |
+ const TransliteratorSpec& trg, |
+ const UnicodeString& variant); |
+ |
+ static TransliteratorEntry* findInBundle(const TransliteratorSpec& specToOpen, |
+ const TransliteratorSpec& specToFind, |
+ const UnicodeString& variant, |
+ UTransDirection direction); |
+ |
+ void registerEntry(const UnicodeString& source, |
+ const UnicodeString& target, |
+ const UnicodeString& variant, |
+ TransliteratorEntry* adopted, |
+ UBool visible); |
+ |
+ void registerEntry(const UnicodeString& ID, |
+ TransliteratorEntry* adopted, |
+ UBool visible); |
+ |
+ void registerEntry(const UnicodeString& ID, |
+ const UnicodeString& source, |
+ const UnicodeString& target, |
+ const UnicodeString& variant, |
+ TransliteratorEntry* adopted, |
+ UBool visible); |
+ |
+ void registerSTV(const UnicodeString& source, |
+ const UnicodeString& target, |
+ const UnicodeString& variant); |
+ |
+ void removeSTV(const UnicodeString& source, |
+ const UnicodeString& target, |
+ const UnicodeString& variant); |
+ |
+ Transliterator* instantiateEntry(const UnicodeString& ID, |
+ TransliteratorEntry *entry, |
+ TransliteratorAlias*& aliasReturn, |
+ UErrorCode& status); |
+ |
+ /** |
+ * A StringEnumeration over the registered IDs in this object. |
+ */ |
+ class Enumeration : public StringEnumeration { |
+ public: |
+ Enumeration(const TransliteratorRegistry& reg); |
+ virtual ~Enumeration(); |
+ virtual int32_t count(UErrorCode& status) const; |
+ virtual const UnicodeString* snext(UErrorCode& status); |
+ virtual void reset(UErrorCode& status); |
+ static UClassID U_EXPORT2 getStaticClassID(); |
+ virtual UClassID getDynamicClassID() const; |
+ private: |
+ int32_t index; |
+ const TransliteratorRegistry& reg; |
+ }; |
+ friend class Enumeration; |
+ |
+ private: |
+ |
+ /** |
+ * Dynamic registry mapping full IDs to Entry objects. This |
+ * contains both public and internal entities. The visibility is |
+ * controlled by whether an entry is listed in availableIDs and |
+ * specDAG or not. |
+ */ |
+ Hashtable registry; |
+ |
+ /** |
+ * DAG of visible IDs by spec. Hashtable: source => (Hashtable: |
+ * target => (UVector: variant)) The UVector of variants is never |
+ * empty. For a source-target with no variant, the special |
+ * variant NO_VARIANT (the empty string) is stored in slot zero of |
+ * the UVector. |
+ */ |
+ Hashtable specDAG; |
+ |
+ /** |
+ * Vector of public full IDs. |
+ */ |
+ UVector availableIDs; |
+ |
+ TransliteratorRegistry(const TransliteratorRegistry &other); // forbid copying of this class |
+ TransliteratorRegistry &operator=(const TransliteratorRegistry &other); // forbid copying of this class |
+}; |
+ |
+U_NAMESPACE_END |
+ |
+#endif /* #if !UCONFIG_NO_TRANSLITERATION */ |
+ |
+#endif |
+//eof |
Property changes on: icu46/source/i18n/transreg.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |