/* * 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" class Replaceable; class UnicodeFilter; class TransliterationRuleData; struct UHashtable; class U_I18N_API UVector; class CompoundTransliterator; class U_I18N_API Transliterator { public: enum Direction { FORWARD, REVERSE }; class Position { public: int32_t start; int32_t limit; int32_t cursor; }; private: UnicodeString ID; UnicodeFilter* filter; int32_t maximumContextLength; static UHashtable* cache; static UMTX cacheMutex; static bool_t 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, Position& index, const UnicodeString& insertion, UErrorCode& status) const; virtual void transliterate(Replaceable& text, Position& index, UChar insertion, UErrorCode& status) const; virtual void transliterate(Replaceable& text, Position& index, UErrorCode& status) const; virtual void finishTransliteration(Replaceable& text, Position& index) const; private: void _transliterate(Replaceable& text, Position& index, const UnicodeString* insertion, UErrorCode &status) const; protected: virtual void handleTransliterate(Replaceable& text, Position& index, bool_t 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; virtual void adoptFilter(UnicodeFilter* adoptedFilter); Transliterator* createInverse(void) const; static Transliterator* createInstance(const UnicodeString& ID, Direction dir = FORWARD); private: static char* DATA_DIR; static const char* RESOURCE_SUB_DIR; static const char* getDataDirectory(void); static int32_t hash(const UnicodeString& str); static Transliterator* _createInstance(const UnicodeString& ID); 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; private: static bool_t compareIDs(void* a, void* b); static void initializeCache(void); }; inline int32_t Transliterator::getMaximumContextLength(void) const { return maximumContextLength; } #endif