static int32_t bytesTrieMatches(BytesTrie &trie, UText *text, int32_t textLimit, int32_t *lengths, int &count, int limit ) { UChar32 c=utext_next32(text); if(c<0) { return 0; } UStringTrieResult result=trie.first(thaiCharToByte(c)); int32_t numChars=1; count=0; for(;;) { if(USTRINGTRIE_HAS_VALUE(result)) { if(count<limit) { // lengths[count++]=(int32_t)utext_getNativeIndex(text); lengths[count++]=numChars; // CompactTrieDictionary just counts chars too. } if(result==USTRINGTRIE_FINAL_VALUE) { break; } } else if(result==USTRINGTRIE_NO_MATCH) { break; } if(numChars>=textLimit) { break; } UChar32 c=utext_next32(text); if(c<0) { break; } ++numChars; result=trie.next(thaiCharToByte(c)); } return numChars; }
void BytesTrieTest::checkFirst(BytesTrie &trie, const StringAndValue data[], int32_t dataLength) { for(int32_t i=0; i<dataLength; ++i) { int c=*data[i].s; if(c==0) { continue; // skip empty string } UStringTrieResult firstResult=trie.first(c); int32_t firstValue=USTRINGTRIE_HAS_VALUE(firstResult) ? trie.getValue() : -1; UStringTrieResult nextResult=trie.next(data[i].s[1]); if(firstResult!=trie.reset().next(c) || firstResult!=trie.current() || firstValue!=(USTRINGTRIE_HAS_VALUE(firstResult) ? trie.getValue() : -1) || nextResult!=trie.next(data[i].s[1]) ) { errln("trie.first(%c)!=trie.reset().next(same) for %s", c, data[i].s); } } trie.reset(); }