void BytesTrieTest::TestIteratorFromBytes() { static const StringAndValue data[]={ { "mm", 3 }, { "mmm", 33 }, { "mmnop", 333 } }; builder_->clear(); IcuTestErrorCode errorCode(*this, "TestIteratorFromBytes()"); for(int32_t i=0; i<UPRV_LENGTHOF(data); ++i) { builder_->add(data[i].s, data[i].value, errorCode); } StringPiece trieBytes=builder_->buildStringPiece(USTRINGTRIE_BUILD_FAST, errorCode); BytesTrie::Iterator iter(trieBytes.data(), 0, errorCode); checkIterator(iter, data, UPRV_LENGTHOF(data)); }
void BytesTrieTest::TestBuilder() { IcuTestErrorCode errorCode(*this, "TestBuilder()"); builder_->clear(); delete builder_->build(USTRINGTRIE_BUILD_FAST, errorCode); if(errorCode.reset()!=U_INDEX_OUTOFBOUNDS_ERROR) { errln("BytesTrieBuilder().build() did not set U_INDEX_OUTOFBOUNDS_ERROR"); return; } // TODO: remove .build(...) once add() checks for duplicates. builder_->add("=", 0, errorCode).add("=", 1, errorCode).build(USTRINGTRIE_BUILD_FAST, errorCode); if(errorCode.reset()!=U_ILLEGAL_ARGUMENT_ERROR) { errln("BytesTrieBuilder.add() did not detect duplicates"); return; } }
// add a word to the trie void addWord(const UnicodeString &word, int32_t value, UErrorCode &status) { if (bt) { CharString buf; transform(word, buf, status); bt->add(buf.toStringPiece(), value, status); } if (ut) { ut->add(word, value, status); } }
BytesTrie *BytesTrieTest::buildTrie(const StringAndValue data[], int32_t dataLength, UStringTrieBuildOption buildOption) { IcuTestErrorCode errorCode(*this, "buildTrie()"); // Add the items to the trie builder in an interesting (not trivial, not random) order. int32_t index, step; if(dataLength&1) { // Odd number of items. index=dataLength/2; step=2; } else if((dataLength%3)!=0) { // Not a multiple of 3. index=dataLength/5; step=3; } else { index=dataLength-1; step=-1; } builder_->clear(); for(int32_t i=0; i<dataLength; ++i) { builder_->add(data[index].s, data[index].value, errorCode); index=(index+step)%dataLength; } StringPiece sp=builder_->buildStringPiece(buildOption, errorCode); LocalPointer<BytesTrie> trie(builder_->build(buildOption, errorCode)); if(!errorCode.logIfFailureAndReset("add()/build()")) { builder_->add("zzz", 999, errorCode); if(errorCode.reset()!=U_NO_WRITE_PERMISSION) { errln("builder.build().add(zzz) did not set U_NO_WRITE_PERMISSION"); } } logln("serialized trie size: %ld bytes\n", (long)sp.length()); StringPiece sp2=builder_->buildStringPiece(buildOption, errorCode); if(sp.data()==sp2.data()) { errln("builder.buildStringPiece() before & after build() returned same array"); } if(errorCode.isFailure()) { return NULL; } // Tries from either build() method should be identical but // BytesTrie does not implement equals(). // We just return either one. if((dataLength&1)!=0) { return trie.orphan(); } else { return new BytesTrie(sp2.data()); } }
// if we are a bytestrie, give back the StringPiece representing the serialized version of us StringPiece serializeBytes(UErrorCode &status) { return bt->buildStringPiece(USTRINGTRIE_BUILD_SMALL, status); }