|
ICU 73.2
73.2
|
00001 // © 2016 and later: Unicode, Inc. and others. 00002 // License & terms of use: http://www.unicode.org/copyright.html 00003 /* 00004 *************************************************************************** 00005 * Copyright (C) 1999-2016 International Business Machines Corporation * 00006 * and others. All rights reserved. * 00007 *************************************************************************** 00008 00009 ********************************************************************** 00010 * Date Name Description 00011 * 10/22/99 alan Creation. 00012 * 11/11/99 rgillam Complete port from Java. 00013 ********************************************************************** 00014 */ 00015 00016 #ifndef RBBI_H 00017 #define RBBI_H 00018 00019 #include "unicode/utypes.h" 00020 00021 #if U_SHOW_CPLUSPLUS_API 00022 00028 #if !UCONFIG_NO_BREAK_ITERATION 00029 00030 #include "unicode/brkiter.h" 00031 #include "unicode/udata.h" 00032 #include "unicode/parseerr.h" 00033 #include "unicode/schriter.h" 00034 00035 struct UCPTrie; 00036 00037 U_NAMESPACE_BEGIN 00038 00040 class LanguageBreakEngine; 00041 struct RBBIDataHeader; 00042 class RBBIDataWrapper; 00043 class UnhandledEngine; 00044 class UStack; 00045 00057 class U_COMMON_API RuleBasedBreakIterator /*final*/ : public BreakIterator { 00058 00059 private: 00064 UText fText = UTEXT_INITIALIZER; 00065 00066 #ifndef U_HIDE_INTERNAL_API 00067 public: 00068 #endif /* U_HIDE_INTERNAL_API */ 00069 00074 RBBIDataWrapper *fData = nullptr; 00075 00076 private: 00081 UErrorCode fErrorCode = U_ZERO_ERROR; 00082 00087 int32_t fPosition = 0; 00088 00092 int32_t fRuleStatusIndex = 0; 00093 00097 class BreakCache; 00098 BreakCache *fBreakCache = nullptr; 00099 00104 class DictionaryCache; 00105 DictionaryCache *fDictionaryCache = nullptr; 00106 00114 UStack *fLanguageBreakEngines = nullptr; 00115 00123 UnhandledEngine *fUnhandledBreakEngine = nullptr; 00124 00130 uint32_t fDictionaryCharCount = 0; 00131 00137 CharacterIterator *fCharIter = &fSCharIter; 00138 00144 UCharCharacterIterator fSCharIter {u"", 0}; 00145 00149 bool fDone = false; 00150 00154 int32_t *fLookAheadMatches = nullptr; 00155 00159 UBool fIsPhraseBreaking = false; 00160 00161 //======================================================================= 00162 // constructors 00163 //======================================================================= 00164 00175 RuleBasedBreakIterator(RBBIDataHeader* data, UErrorCode &status); 00176 00190 RuleBasedBreakIterator(UDataMemory* image, UBool isPhraseBreaking, UErrorCode &status); 00191 00193 friend class RBBIRuleBuilder; 00195 friend class BreakIterator; 00196 00203 RuleBasedBreakIterator(UErrorCode *status); 00204 00205 public: 00206 00212 RuleBasedBreakIterator(); 00213 00220 RuleBasedBreakIterator(const RuleBasedBreakIterator& that); 00221 00230 RuleBasedBreakIterator( const UnicodeString &rules, 00231 UParseError &parseError, 00232 UErrorCode &status); 00233 00257 RuleBasedBreakIterator(const uint8_t *compiledRules, 00258 uint32_t ruleLength, 00259 UErrorCode &status); 00260 00273 RuleBasedBreakIterator(UDataMemory* image, UErrorCode &status); 00274 00279 virtual ~RuleBasedBreakIterator(); 00280 00288 RuleBasedBreakIterator& operator=(const RuleBasedBreakIterator& that); 00289 00298 virtual bool operator==(const BreakIterator& that) const override; 00299 00307 inline bool operator!=(const BreakIterator& that) const { 00308 return !operator==(that); 00309 } 00310 00321 virtual RuleBasedBreakIterator* clone() const override; 00322 00328 virtual int32_t hashCode(void) const; 00329 00335 virtual const UnicodeString& getRules(void) const; 00336 00337 //======================================================================= 00338 // BreakIterator overrides 00339 //======================================================================= 00340 00365 virtual CharacterIterator& getText(void) const override; 00366 00367 00382 virtual UText *getUText(UText *fillIn, UErrorCode &status) const override; 00383 00391 virtual void adoptText(CharacterIterator* newText) override; 00392 00404 virtual void setText(const UnicodeString& newText) override; 00405 00419 virtual void setText(UText *text, UErrorCode &status) override; 00420 00426 virtual int32_t first(void) override; 00427 00433 virtual int32_t last(void) override; 00434 00445 virtual int32_t next(int32_t n) override; 00446 00452 virtual int32_t next(void) override; 00453 00459 virtual int32_t previous(void) override; 00460 00468 virtual int32_t following(int32_t offset) override; 00469 00477 virtual int32_t preceding(int32_t offset) override; 00478 00487 virtual UBool isBoundary(int32_t offset) override; 00488 00497 virtual int32_t current(void) const override; 00498 00499 00531 virtual int32_t getRuleStatus() const override; 00532 00556 virtual int32_t getRuleStatusVec(int32_t *fillInVec, int32_t capacity, UErrorCode &status) override; 00557 00569 virtual UClassID getDynamicClassID(void) const override; 00570 00582 static UClassID U_EXPORT2 getStaticClassID(void); 00583 00584 #ifndef U_FORCE_HIDE_DEPRECATED_API 00585 00611 virtual RuleBasedBreakIterator *createBufferClone(void *stackBuffer, 00612 int32_t &BufferSize, 00613 UErrorCode &status) override; 00614 #endif // U_FORCE_HIDE_DEPRECATED_API 00615 00633 virtual const uint8_t *getBinaryRules(uint32_t &length); 00634 00660 virtual RuleBasedBreakIterator &refreshInputText(UText *input, UErrorCode &status) override; 00661 00662 00663 private: 00664 //======================================================================= 00665 // implementation 00666 //======================================================================= 00676 int32_t handleSafePrevious(int32_t fromPosition); 00677 00690 int32_t handleNext(); 00691 00692 /* 00693 * Templatized version of handleNext() and handleSafePrevious(). 00694 * 00695 * There will be exactly four instantiations, two each for 8 and 16 bit tables, 00696 * two each for 8 and 16 bit trie. 00697 * Having separate instantiations for the table types keeps conditional tests of 00698 * the table type out of the inner loops, at the expense of replicated code. 00699 * 00700 * The template parameter for the Trie access function is a value, not a type. 00701 * Doing it this way, the compiler will inline the Trie function in the 00702 * expanded functions. (Both the 8 and 16 bit access functions have the same type 00703 * signature) 00704 */ 00705 00706 typedef uint16_t (*PTrieFunc)(const UCPTrie *, UChar32); 00707 00708 template<typename RowType, PTrieFunc trieFunc> 00709 int32_t handleSafePrevious(int32_t fromPosition); 00710 00711 template<typename RowType, PTrieFunc trieFunc> 00712 int32_t handleNext(); 00713 00714 00721 const LanguageBreakEngine *getLanguageBreakEngine(UChar32 c); 00722 00723 public: 00724 #ifndef U_HIDE_INTERNAL_API 00725 00729 void dumpCache(); 00730 00735 void dumpTables(); 00736 #endif /* U_HIDE_INTERNAL_API */ 00737 }; 00738 00739 U_NAMESPACE_END 00740 00741 #endif /* #if !UCONFIG_NO_BREAK_ITERATION */ 00742 00743 #endif /* U_SHOW_CPLUSPLUS_API */ 00744 00745 #endif
1.7.6.1