private void checkFirst(BytesTrie trie, StringAndValue[] data, int dataLength) { for (int i = 0; i < dataLength; ++i) { if (data[i].s.Length == 0) { continue; // skip empty string } int c = data[i].bytes[0]; Result firstResult = trie.First(c); int firstValue = firstResult.HasValue() ? trie.GetValue() : -1; int nextC = data[i].s.Length > 1 ? data[i].bytes[1] : 0; Result nextResult = trie.Next(nextC); if (firstResult != trie.Reset().Next(c) || firstResult != trie.Current || firstValue != (firstResult.HasValue() ? trie.GetValue() : -1) || nextResult != trie.Next(nextC) ) { Errln(string.Format("trie.First({0})!=trie.Reset().Next(same) for {1}", (char)c, data[i].s)); } } trie.Reset(); }
public override int Matches(CharacterIterator text_, int maxLength, int[] lengths, int[] count_, int limit, int[] values) { UCharacterIterator text = UCharacterIterator.GetInstance(text_); BytesTrie bt = new BytesTrie(characters, 0); int c = text.NextCodePoint(); if (c == UCharacterIterator.DONE) { return(0); } Result result = bt.First(Transform(c)); // TODO: should numChars count Character.charCount() ? int numChars = 1; int count = 0; for (; ;) { if (result.HasValue()) { if (count < limit) { if (values != null) { values[count] = bt.GetValue(); } lengths[count] = numChars; count++; } if (result == Result.FinalValue) { break; } } else if (result == Result.NoMatch) { break; } if (numChars >= maxLength) { break; } c = text.NextCodePoint(); if (c == UCharacterIterator.DONE) { break; } ++numChars; result = bt.Next(Transform(c)); } count_[0] = count; return(numChars); }
public void Test41GetNextBytes() { BytesTrie trie = buildMonthsTrie(TrieBuilderOption.Small); StringBuilder buffer = new StringBuilder(); int count = trie.GetNextBytes(buffer); if (count != 2 || !"aj".ContentEquals(buffer)) { Errln("months getNextBytes()!=[aj] at root"); } trie.Next('j'); trie.Next('a'); trie.Next('n'); // getNextBytes() directly after next() buffer.Length = (0); count = trie.GetNextBytes(buffer); if (count != 20 || !".abcdefghijklmnopqru".ContentEquals(buffer)) { Errln("months getNextBytes()!=[.abcdefghijklmnopqru] after \"jan\""); } // getNextBytes() after getValue() trie.GetValue(); // next() had returned BytesTrieResult.INTERMEDIATE_VALUE. buffer.Length = (0); count = trie.GetNextBytes(buffer); if (count != 20 || !".abcdefghijklmnopqru".ContentEquals(buffer)) { Errln("months getNextBytes()!=[.abcdefghijklmnopqru] after \"jan\"+getValue()"); } // getNextBytes() from a linear-match node trie.Next('u'); buffer.Length = (0); count = trie.GetNextBytes(buffer); if (count != 1 || !"a".ContentEquals(buffer)) { Errln("months getNextBytes()!=[a] after \"janu\""); } trie.Next('a'); buffer.Length = (0); count = trie.GetNextBytes(buffer); if (count != 1 || !"r".ContentEquals(buffer)) { Errln("months getNextBytes()!=[r] after \"janua\""); } trie.Next('r'); trie.Next('y'); // getNextBytes() after a final match buffer.Length = (0); count = trie.GetNextBytes(buffer); if (count != 0 || buffer.Length != 0) { Errln("months getNextBytes()!=[] after \"january\""); } }
private int GetPropertyOrValueEnum(int bytesTrieOffset, ICharSequence alias) { BytesTrie trie = new BytesTrie(bytesTries, bytesTrieOffset); if (ContainsName(trie, alias)) { return(trie.GetValue()); } else { #pragma warning disable 612, 618 return((int)UProperty.Undefined); #pragma warning restore 612, 618 } }
public void Test40GetUniqueValue() { BytesTrie trie = buildMonthsTrie(TrieBuilderOption.Fast); long uniqueValue; if ((uniqueValue = trie.GetUniqueValue()) != 0) { Errln("unique value at root"); } trie.Next('j'); trie.Next('a'); trie.Next('n'); // getUniqueValue() directly after next() if ((uniqueValue = trie.GetUniqueValue()) != ((1 << 1) | 1)) { Errln("not unique value 1 after \"jan\": instead " + uniqueValue); } trie.First('j'); trie.Next('u'); if ((uniqueValue = trie.GetUniqueValue()) != 0) { Errln("unique value after \"ju\""); } if (trie.Next('n') != Result.IntermediateValue || 6 != trie.GetValue()) { Errln("not normal value 6 after \"jun\""); } // getUniqueValue() after getValue() if ((uniqueValue = trie.GetUniqueValue()) != ((6 << 1) | 1)) { Errln("not unique value 6 after \"jun\""); } // getUniqueValue() from within a linear-match node trie.First('a'); trie.Next('u'); if ((uniqueValue = trie.GetUniqueValue()) != ((8 << 1) | 1)) { Errln("not unique value 8 after \"au\""); } }
private void checkNextWithState(BytesTrie trie, StringAndValue[] data, int dataLength) { BytesTrieState noState = new BytesTrieState(), state = new BytesTrieState(); for (int i = 0; i < dataLength; ++i) { if ((i & 1) == 0) { try { trie.ResetToState(noState); Errln("trie.ResetToState(noState) should throw an ArgumentException"); } catch (ArgumentException e) { // good } } byte[] expectedString = data[i].bytes; int stringLength = data[i].s.Length; int partialLength = stringLength / 3; for (int j = 0; j < partialLength; ++j) { if (!trie.Next(expectedString[j]).Matches()) { Errln("trie.Next()=BytesTrieResult.NO_MATCH for a prefix of " + data[i].s); return; } } trie.SaveState(state); Result resultAtState = trie.Current; Result result; int valueAtState = -99; if (resultAtState.HasValue()) { valueAtState = trie.GetValue(); } result = trie.Next(0); // mismatch if (result != Result.NoMatch || result != trie.Current) { Errln("trie.Next(0) matched after part of " + data[i].s); } if (resultAtState != trie.ResetToState(state).Current || (resultAtState.HasValue() && valueAtState != trie.GetValue()) ) { Errln("trie.Next(part of " + data[i].s + ") changes current()/getValue() after " + "saveState/next(0)/resetToState"); } else if (!(result = trie.Next(expectedString, partialLength, stringLength)).HasValue() || result != trie.Current) { Errln("trie.Next(rest of " + data[i].s + ") does not seem to contain " + data[i].s + " after " + "saveState/next(0)/resetToState"); } else if (!(result = trie.ResetToState(state). Next(expectedString, partialLength, stringLength)).HasValue() || result != trie.Current) { Errln("trie does not seem to contain " + data[i].s + " after saveState/next(rest)/resetToState"); } else if (trie.GetValue() != data[i].value) { Errln(String.Format("trie value for {0} is {1:d}=0x{2:x} instead of expected {3:d}=0x{4:x}", data[i].s, trie.GetValue(), trie.GetValue(), data[i].value, data[i].value)); } trie.Reset(); } }
private void checkNext(BytesTrie trie, StringAndValue[] data, int dataLength) { BytesTrieState state = new BytesTrieState(); for (int i = 0; i < dataLength; ++i) { int stringLength = data[i].s.Length; Result result; if (!(result = trie.Next(data[i].bytes, 0, stringLength)).HasValue() || result != trie.Current ) { Errln("trie does not seem to contain " + data[i].s); } else if (trie.GetValue() != data[i].value) { Errln(string.Format("trie value for {0} is {1:d}=0x{2:x} instead of expected {3:d}=0x{4:x}", data[i].s, trie.GetValue(), trie.GetValue(), data[i].value, data[i].value)); } else if (result != trie.Current || trie.GetValue() != data[i].value) { Errln("trie value for " + data[i].s + " changes when repeating current()/getValue()"); } trie.Reset(); result = trie.Current; for (int j = 0; j < stringLength; ++j) { if (!result.HasNext()) { Errln(String.Format("trie.Current!=hasNext before end of {0} (at index {1:d})", data[i].s, j)); break; } if (result == Result.IntermediateValue) { trie.GetValue(); if (trie.Current != Result.IntermediateValue) { Errln(String.Format("trie.GetValue().Current!=BytesTrieResult.INTERMEDIATE_VALUE " + "before end of {0} (at index {1:d})", data[i].s, j)); break; } } result = trie.Next(data[i].bytes[j]); if (!result.Matches()) { Errln(String.Format("trie.Next()=BytesTrieResult.NO_MATCH " + "before end of {0} (at index {1:d})", data[i].s, j)); break; } if (result != trie.Current) { Errln(String.Format("trie.Next()!=following current() " + "before end of {0} (at index {1:d})", data[i].s, j)); break; } } if (!result.HasValue()) { Errln("trie.Next()!=hasValue at the end of " + data[i].s); continue; } trie.GetValue(); if (result != trie.Current) { Errln("trie.Current != current()+getValue()+current() after end of " + data[i].s); } // Compare the final current() with whether next() can actually continue. trie.SaveState(state); bool nextContinues = false; for (int c = 0x20; c < 0x7f; ++c) { if (trie.ResetToState(state).Next(c).Matches()) { nextContinues = true; break; } } if ((result == Result.IntermediateValue) != nextContinues) { Errln("(trie.Current==BytesTrieResult.INTERMEDIATE_VALUE) contradicts " + "(trie.Next(some UChar)!=BytesTrieResult.NO_MATCH) after end of " + data[i].s); } trie.Reset(); } }