/* * Copyright © {1999}, International Business Machines Corporation and others. All Rights Reserved. ********************************************************************** * Date Name Description * 11/17/99 aliu Creation. ********************************************************************** */ #ifndef TRANSLIT_H #define TRANSLIT_H #include "unicode/unistr.h" #include "unicode/parseerr.h" #include "unicode/utrans.h" // UTransPosition, UTransDirection class Replaceable; class UnicodeFilter; class TransliterationRuleData; class Hashtable; class U_I18N_API UVector; class CompoundTransliterator; class U_I18N_API Transliterator { private: UnicodeString ID; UnicodeFilter* filter; int32_t maximumContextLength; static Hashtable* cache; static UMTX cacheMutex; static UBool cacheInitialized; struct CacheEntry { enum Type { RULE_BASED_PLACEHOLDER, REVERSE_RULE_BASED_PLACEHOLDER, PROTOTYPE, RBT_DATA, NONE // Only used for uninitialized entries } entryType; UnicodeString rbFile; // For *PLACEHOLDER union { Transliterator* prototype; // For PROTOTYPE TransliterationRuleData* data; // For RBT_DATA } u; CacheEntry(); ~CacheEntry(); void adoptPrototype(Transliterator* adopted); }; static const char* RB_DISPLAY_NAME_PREFIX; static const char* RB_SCRIPT_DISPLAY_NAME_PREFIX; static const char* RB_DISPLAY_NAME_PATTERN; static const char* RB_RULE_BASED_IDS; static const char* RB_RULE; protected: Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter); Transliterator(const Transliterator&); Transliterator& operator=(const Transliterator&); public: virtual ~Transliterator(); virtual Transliterator* clone() const { return 0; } virtual int32_t transliterate(Replaceable& text, int32_t start, int32_t limit) const; virtual void transliterate(Replaceable& text) const; virtual void transliterate(Replaceable& text, UTransPosition& index, const UnicodeString& insertion, UErrorCode& status) const; virtual void transliterate(Replaceable& text, UTransPosition& index, UChar insertion, UErrorCode& status) const; virtual void transliterate(Replaceable& text, UTransPosition& index, UErrorCode& status) const; virtual void finishTransliteration(Replaceable& text, UTransPosition& index) const; private: void _transliterate(Replaceable& text, UTransPosition& index, const UnicodeString* insertion, UErrorCode &status) const; protected: virtual void handleTransliterate(Replaceable& text, UTransPosition& index, UBool incremental) const = 0; // C++ requires this friend declaration so CompoundTransliterator // can access handleTransliterate. Alternatively, we could // make handleTransliterate public. friend class CompoundTransliterator; public: int32_t getMaximumContextLength(void) const; protected: void setMaximumContextLength(int32_t maxContextLength); public: virtual const UnicodeString& getID(void) const; static UnicodeString& getDisplayName(const UnicodeString& ID, UnicodeString& result); static UnicodeString& getDisplayName(const UnicodeString& ID, const Locale& inLocale, UnicodeString& result); virtual const UnicodeFilter* getFilter(void) const; UnicodeFilter* orphanFilter(void); virtual void adoptFilter(UnicodeFilter* adoptedFilter); Transliterator* createInverse(void) const; static Transliterator* createInstance(const UnicodeString& ID, UTransDirection dir = UTRANS_FORWARD, UParseError* parseError = 0); private: static Transliterator* _createInstance(const UnicodeString& ID, UParseError* parseError = 0); public: static void registerInstance(Transliterator* adoptedObj, UErrorCode& status); private: static void _registerInstance(Transliterator* adoptedPrototype, UErrorCode &status); public: static void unregister(const UnicodeString& ID); private: static void _unregister(const UnicodeString& ID); // virtual Enumeration getAvailableIDs(); static UVector cacheIDs; public: static int32_t countAvailableIDs(void); static const UnicodeString& getAvailableID(int32_t index); protected: UChar filteredCharAt(const Replaceable& text, int32_t i) const; void setID(const UnicodeString& id); private: static UBool compareIDs(void* a, void* b); static void initializeCache(void); /* IDs take the form <source> ID_SEP <target>, where * <source> and <target> are (usually) script names. * Compound IDs take the form <ID> ( ID_DELIM <ID> )+. */ static const UChar ID_SEP; // ((UChar)0x002D) /*-*/ static const UChar ID_DELIM; // ((UChar)0x003B) /*;*/ }; inline int32_t Transliterator::getMaximumContextLength(void) const { return maximumContextLength; } inline void Transliterator::setID(const UnicodeString& id) { ID = id; } #endif