Example #1
0
 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();
 }
Example #2
0
        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);
        }
Example #3
0
        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
            }
        }
Example #5
0
        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\"");
            }
        }
Example #6
0
        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();
            }
        }
Example #7
0
        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();
            }
        }