00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef __UCHARSTRIEBUILDER_H__
00016 #define __UCHARSTRIEBUILDER_H__
00017
00018 #include "unicode/utypes.h"
00019 #include "unicode/stringtriebuilder.h"
00020 #include "unicode/ucharstrie.h"
00021 #include "unicode/unistr.h"
00022
00028 U_NAMESPACE_BEGIN
00029
00030 class UCharsTrieElement;
00031
00038 class U_COMMON_API UCharsTrieBuilder : public StringTrieBuilder {
00039 public:
00045 UCharsTrieBuilder(UErrorCode &errorCode);
00046
00051 virtual ~UCharsTrieBuilder();
00052
00067 UCharsTrieBuilder &add(const UnicodeString &s, int32_t value, UErrorCode &errorCode);
00068
00087 UCharsTrie *build(UStringTrieBuildOption buildOption, UErrorCode &errorCode);
00088
00113 UnicodeString &buildUnicodeString(UStringTrieBuildOption buildOption, UnicodeString &result,
00114 UErrorCode &errorCode);
00115
00122 UCharsTrieBuilder &clear() {
00123 strings.remove();
00124 elementsLength=0;
00125 ucharsLength=0;
00126 return *this;
00127 }
00128
00129 private:
00130 UCharsTrieBuilder(const UCharsTrieBuilder &other);
00131 UCharsTrieBuilder &operator=(const UCharsTrieBuilder &other);
00132
00133 void buildUChars(UStringTrieBuildOption buildOption, UErrorCode &errorCode);
00134
00135 virtual int32_t getElementStringLength(int32_t i) const;
00136 virtual UChar getElementUnit(int32_t i, int32_t unitIndex) const;
00137 virtual int32_t getElementValue(int32_t i) const;
00138
00139 virtual int32_t getLimitOfLinearMatch(int32_t first, int32_t last, int32_t unitIndex) const;
00140
00141 virtual int32_t countElementUnits(int32_t start, int32_t limit, int32_t unitIndex) const;
00142 virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t unitIndex, int32_t count) const;
00143 virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t unitIndex, UChar unit) const;
00144
00145 virtual UBool matchNodesCanHaveValues() const { return TRUE; }
00146
00147 virtual int32_t getMaxBranchLinearSubNodeLength() const { return UCharsTrie::kMaxBranchLinearSubNodeLength; }
00148 virtual int32_t getMinLinearMatch() const { return UCharsTrie::kMinLinearMatch; }
00149 virtual int32_t getMaxLinearMatchLength() const { return UCharsTrie::kMaxLinearMatchLength; }
00150
00151 class UCTLinearMatchNode : public LinearMatchNode {
00152 public:
00153 UCTLinearMatchNode(const UChar *units, int32_t len, Node *nextNode);
00154 virtual UBool operator==(const Node &other) const;
00155 virtual void write(StringTrieBuilder &builder);
00156 private:
00157 const UChar *s;
00158 };
00159
00160 virtual Node *createLinearMatchNode(int32_t i, int32_t unitIndex, int32_t length,
00161 Node *nextNode) const;
00162
00163 UBool ensureCapacity(int32_t length);
00164 virtual int32_t write(int32_t unit);
00165 int32_t write(const UChar *s, int32_t length);
00166 virtual int32_t writeElementUnits(int32_t i, int32_t unitIndex, int32_t length);
00167 virtual int32_t writeValueAndFinal(int32_t i, UBool isFinal);
00168 virtual int32_t writeValueAndType(UBool hasValue, int32_t value, int32_t node);
00169 virtual int32_t writeDeltaTo(int32_t jumpTarget);
00170
00171 UnicodeString strings;
00172 UCharsTrieElement *elements;
00173 int32_t elementsCapacity;
00174 int32_t elementsLength;
00175
00176
00177
00178 UChar *uchars;
00179 int32_t ucharsCapacity;
00180 int32_t ucharsLength;
00181 };
00182
00183 U_NAMESPACE_END
00184
00185 #endif // __UCHARSTRIEBUILDER_H__