Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

translit.h

Go to the documentation of this file.
00001 /*
00002 * Copyright (C) 1999-2001, International Business Machines Corporation and others. All Rights Reserved.
00003 **********************************************************************
00004 *   Date        Name        Description
00005 *   11/17/99    aliu        Creation.
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" // UTransPosition, UTransDirection
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 // Only used for uninitialized entries
00293         } entryType;
00294         // NOTE: stringArg cannot go inside the union because
00295         // it has a copy constructor
00296         UnicodeString stringArg; // For RULES_*, ALIAS
00297         union {
00298             Transliterator* prototype; // For PROTOTYPE
00299             TransliterationRuleData* data; // For RBT_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     // C++ requires this friend declaration so CompoundTransliterator
00573     // can access handleTransliterate.  Alternatively, we could
00574     // make handleTransliterate public.
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     // virtual Enumeration getAvailableIDs();
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     /* IDs take the form <source> ID_SEP <target>, where
00842      * <source> and <target> are (usually) script names.
00843      * Compound IDs take the form <ID> ( ID_DELIM <ID> )+.
00844      */
00845     static const UChar ID_SEP;   // ((UChar)0x002D) /*-*/
00846     static const UChar ID_DELIM; // ((UChar)0x003B) /*;*/
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

Generated at Tue Jun 12 14:03:59 2001 for ICU 1.8.1 by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000