00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00022 #ifndef __BYTESTRIEBUILDER_H__
00023 #define __BYTESTRIEBUILDER_H__
00024
00025 #include "unicode/utypes.h"
00026
00027 #if U_SHOW_CPLUSPLUS_API
00028
00029 #include "unicode/bytestrie.h"
00030 #include "unicode/stringpiece.h"
00031 #include "unicode/stringtriebuilder.h"
00032
00033 class BytesTrieTest;
00034
00035 U_NAMESPACE_BEGIN
00036
00037 class BytesTrieElement;
00038 class CharString;
00045 class U_COMMON_API BytesTrieBuilder : public StringTrieBuilder {
00046 public:
00052 BytesTrieBuilder(UErrorCode &errorCode);
00053
00058 virtual ~BytesTrieBuilder();
00059
00074 BytesTrieBuilder &add(StringPiece s, int32_t value, UErrorCode &errorCode);
00075
00094 BytesTrie *build(UStringTrieBuildOption buildOption, UErrorCode &errorCode);
00095
00119 StringPiece buildStringPiece(UStringTrieBuildOption buildOption, UErrorCode &errorCode);
00120
00127 BytesTrieBuilder &clear();
00128
00129 private:
00130 friend class ::BytesTrieTest;
00131
00132 BytesTrieBuilder(const BytesTrieBuilder &other);
00133 BytesTrieBuilder &operator=(const BytesTrieBuilder &other);
00134
00135 void buildBytes(UStringTrieBuildOption buildOption, UErrorCode &errorCode);
00136
00137 virtual int32_t getElementStringLength(int32_t i) const override;
00138 virtual char16_t getElementUnit(int32_t i, int32_t byteIndex) const override;
00139 virtual int32_t getElementValue(int32_t i) const override;
00140
00141 virtual int32_t getLimitOfLinearMatch(int32_t first, int32_t last, int32_t byteIndex) const override;
00142
00143 virtual int32_t countElementUnits(int32_t start, int32_t limit, int32_t byteIndex) const override;
00144 virtual int32_t skipElementsBySomeUnits(int32_t i, int32_t byteIndex, int32_t count) const override;
00145 virtual int32_t indexOfElementWithNextUnit(int32_t i, int32_t byteIndex, char16_t byte) const override;
00146
00147 virtual UBool matchNodesCanHaveValues() const override { return false; }
00148
00149 virtual int32_t getMaxBranchLinearSubNodeLength() const override { return BytesTrie::kMaxBranchLinearSubNodeLength; }
00150 virtual int32_t getMinLinearMatch() const override { return BytesTrie::kMinLinearMatch; }
00151 virtual int32_t getMaxLinearMatchLength() const override { return BytesTrie::kMaxLinearMatchLength; }
00152
00156 class BTLinearMatchNode : public LinearMatchNode {
00157 public:
00158 BTLinearMatchNode(const char *units, int32_t len, Node *nextNode);
00159 virtual bool operator==(const Node &other) const override;
00160 virtual void write(StringTrieBuilder &builder) override;
00161 private:
00162 const char *s;
00163 };
00164
00165 virtual Node *createLinearMatchNode(int32_t i, int32_t byteIndex, int32_t length,
00166 Node *nextNode) const override;
00167
00168 UBool ensureCapacity(int32_t length);
00169 virtual int32_t write(int32_t byte) override;
00170 int32_t write(const char *b, int32_t length);
00171 virtual int32_t writeElementUnits(int32_t i, int32_t byteIndex, int32_t length) override;
00172 virtual int32_t writeValueAndFinal(int32_t i, UBool isFinal) override;
00173 virtual int32_t writeValueAndType(UBool hasValue, int32_t value, int32_t node) override;
00174 virtual int32_t writeDeltaTo(int32_t jumpTarget) override;
00175 static int32_t internalEncodeDelta(int32_t i, char intBytes[]);
00176
00177 CharString *strings;
00178 BytesTrieElement *elements;
00179 int32_t elementsCapacity;
00180 int32_t elementsLength;
00181
00182
00183
00184 char *bytes;
00185 int32_t bytesCapacity;
00186 int32_t bytesLength;
00187 };
00188
00189 U_NAMESPACE_END
00190
00191 #endif
00192
00193 #endif // __BYTESTRIEBUILDER_H__