00001
00002
00003
00004
00005
00006
00007
00008 #ifndef TRANSLIT_H
00009 #define TRANSLIT_H
00010
00011 #include "unicode/unistr.h"
00012 #include "unicode/parseerr.h"
00013 #include "unicode/utrans.h"
00014
00015 class Replaceable;
00016 class UnicodeFilter;
00017 class TransliterationRuleData;
00018 class Hashtable;
00019 class U_I18N_API UVector;
00020 class CompoundTransliterator;
00021
00225 class U_I18N_API Transliterator {
00226
00227 private:
00228
00232 UnicodeString ID;
00233
00240 UnicodeFilter* filter;
00241
00242 int32_t maximumContextLength;
00243
00248 static Hashtable* cache;
00249
00254 static Hashtable* internalCache;
00255
00259 static UMTX cacheMutex;
00260
00270 static UBool cacheInitialized;
00271
00285 struct CacheEntry {
00286 enum Type {
00287 RULES_FORWARD,
00288 RULES_REVERSE,
00289 PROTOTYPE,
00290 RBT_DATA,
00291 ALIAS,
00292 NONE
00293 } entryType;
00294
00295
00296 UnicodeString stringArg;
00297 union {
00298 Transliterator* prototype;
00299 TransliterationRuleData* data;
00300 } u;
00301 CacheEntry();
00302 ~CacheEntry();
00303 void adoptPrototype(Transliterator* adopted);
00304 };
00305
00311 static const char* RB_DISPLAY_NAME_PREFIX;
00312
00318 static const char* RB_SCRIPT_DISPLAY_NAME_PREFIX;
00319
00326 static const char* RB_DISPLAY_NAME_PATTERN;
00327
00334 static const char* RB_RULE_BASED_IDS;
00335
00339 static const char* RB_RULE;
00340
00341 protected:
00342
00351 Transliterator(const UnicodeString& ID, UnicodeFilter* adoptedFilter);
00352
00356 Transliterator(const Transliterator&);
00357
00361 Transliterator& operator=(const Transliterator&);
00362
00363 public:
00364
00369 virtual ~Transliterator();
00370
00384 virtual Transliterator* clone() const { return 0; }
00385
00404 virtual int32_t transliterate(Replaceable& text,
00405 int32_t start, int32_t limit) const;
00406
00412 virtual void transliterate(Replaceable& text) const;
00413
00476 virtual void transliterate(Replaceable& text, UTransPosition& index,
00477 const UnicodeString& insertion,
00478 UErrorCode& status) const;
00479
00496 virtual void transliterate(Replaceable& text, UTransPosition& index,
00497 UChar insertion,
00498 UErrorCode& status) const;
00499
00512 virtual void transliterate(Replaceable& text, UTransPosition& index,
00513 UErrorCode& status) const;
00514
00526 virtual void finishTransliteration(Replaceable& text,
00527 UTransPosition& index) const;
00528
00529 private:
00530
00538 void _transliterate(Replaceable& text,
00539 UTransPosition& index,
00540 const UnicodeString* insertion,
00541 UErrorCode &status) const;
00542
00543 protected:
00544
00568 virtual void handleTransliterate(Replaceable& text,
00569 UTransPosition& index,
00570 UBool incremental) const = 0;
00571
00572
00573
00574
00575 friend class CompoundTransliterator;
00576
00577 public:
00578
00592 int32_t getMaximumContextLength(void) const;
00593
00594 protected:
00595
00600 void setMaximumContextLength(int32_t maxContextLength);
00601
00602 public:
00603
00613 virtual const UnicodeString& getID(void) const;
00614
00621 static UnicodeString& getDisplayName(const UnicodeString& ID,
00622 UnicodeString& result);
00623
00643 static UnicodeString& getDisplayName(const UnicodeString& ID,
00644 const Locale& inLocale,
00645 UnicodeString& result);
00646
00652 virtual const UnicodeFilter* getFilter(void) const;
00653
00660 UnicodeFilter* orphanFilter(void);
00661
00671 virtual void adoptFilter(UnicodeFilter* adoptedFilter);
00672
00694 Transliterator* createInverse(void) const;
00695
00709 static Transliterator* createInstance(const UnicodeString& ID,
00710 UTransDirection dir = UTRANS_FORWARD,
00711 UParseError* parseError = 0);
00712
00713 private:
00714
00722 static Transliterator* _createInstance(const UnicodeString& ID,
00723 UnicodeString& aliasReturn,
00724 UParseError* parseError = 0);
00725
00726 public:
00727
00745 static void registerInstance(Transliterator* adoptedObj,
00746 UErrorCode& status);
00747
00748 private:
00749
00754 static void _registerInstance(Transliterator* adoptedPrototype,
00755 UErrorCode &status);
00756
00757 public:
00758
00770 static void unregister(const UnicodeString& ID);
00771
00772 private:
00773
00779 static void _unregister(const UnicodeString& ID);
00780
00792
00793
00797 static UVector cacheIDs;
00798
00799 public:
00800
00807 static int32_t countAvailableIDs(void);
00808
00815 static const UnicodeString& getAvailableID(int32_t index);
00816
00817 protected:
00818
00824 UChar filteredCharAt(const Replaceable& text, int32_t i) const;
00825
00830 void setID(const UnicodeString& id);
00831
00832 private:
00837 static UBool compareIDs(void* a, void* b);
00838
00839 static void initializeCache(void);
00840
00841
00842
00843
00844
00845 static const UChar ID_SEP;
00846 static const UChar ID_DELIM;
00847 };
00848
00849 inline int32_t Transliterator::getMaximumContextLength(void) const {
00850 return maximumContextLength;
00851 }
00852
00853 inline void Transliterator::setID(const UnicodeString& id) {
00854 ID = id;
00855 }
00856
00857 #endif