Class BytesTrie

  • All Implemented Interfaces:
    java.lang.Cloneable, java.lang.Iterable<BytesTrie.Entry>

    public final class BytesTrie
    extends java.lang.Object
    implements java.lang.Cloneable, java.lang.Iterable<BytesTrie.Entry>
    Light-weight, non-const reader class for a BytesTrie. Traverses a byte-serialized data structure with minimal state, for mapping byte sequences to non-negative integer values.

    This class is not intended for public subclassing.

    • Constructor Detail

      • BytesTrie

        public BytesTrie​(byte[] trieBytes,
                         int offset)
        Constructs a BytesTrie reader instance.

        The array must contain a copy of a byte sequence from the BytesTrieBuilder, with the offset indicating the first byte of that sequence. The BytesTrie object will not read more bytes than the BytesTrieBuilder generated in the corresponding build() call.

        The array is not copied/cloned and must not be modified while the BytesTrie object is in use.

        Parameters:
        trieBytes - Bytes array that contains the serialized trie.
        offset - Root offset of the trie in the array.
      • BytesTrie

        public BytesTrie​(BytesTrie other)
        Copy constructor. Makes a shallow copy of the other trie reader object and its state. Does not copy the byte array which will be shared. Same as clone() but without the throws clause.
    • Method Detail

      • clone

        public BytesTrie clone()
                        throws java.lang.CloneNotSupportedException
        Clones this trie reader object and its state, but not the byte array which will be shared.
        Overrides:
        clone in class java.lang.Object
        Returns:
        A shallow clone of this trie.
        Throws:
        java.lang.CloneNotSupportedException
      • reset

        public BytesTrie reset()
        Resets this trie to its initial state.
        Returns:
        this
      • getState64

        public long getState64()
        Returns the state of this trie as a 64-bit integer. The state value is never 0.
        Returns:
        opaque state value
        See Also:
        resetToState64(long)
      • current

        public BytesTrie.Result current()
        Determines whether the byte sequence so far matches, whether it has a value, and whether another input byte can continue a matching byte sequence.
        Returns:
        The match/value Result.
      • first

        public BytesTrie.Result first​(int inByte)
        Traverses the trie from the initial state for this input byte. Equivalent to reset().next(inByte).
        Parameters:
        inByte - Input byte value. Values -0x100..-1 are treated like 0..0xff. Values below -0x100 and above 0xff will never match.
        Returns:
        The match/value Result.
      • next

        public BytesTrie.Result next​(int inByte)
        Traverses the trie from the current state for this input byte.
        Parameters:
        inByte - Input byte value. Values -0x100..-1 are treated like 0..0xff. Values below -0x100 and above 0xff will never match.
        Returns:
        The match/value Result.
      • next

        public BytesTrie.Result next​(byte[] s,
                                     int sIndex,
                                     int sLimit)
        Traverses the trie from the current state for this byte sequence. Equivalent to
         Result result=current();
         for(each c in s)
           if(!result.hasNext()) return Result.NO_MATCH;
           result=next(c);
         return result;
         
        Parameters:
        s - Contains a string or byte sequence.
        sIndex - The start index of the byte sequence in s.
        sLimit - The (exclusive) end index of the byte sequence in s.
        Returns:
        The match/value Result.
      • getValue

        public int getValue()
        Returns a matching byte sequence's value if called immediately after current()/first()/next() returned Result.INTERMEDIATE_VALUE or Result.FINAL_VALUE. getValue() can be called multiple times. Do not call getValue() after Result.NO_MATCH or Result.NO_VALUE!
        Returns:
        The value for the byte sequence so far.
      • getUniqueValue

        public long getUniqueValue()
        Determines whether all byte sequences reachable from the current state map to the same value, and if so, returns that value.
        Returns:
        The unique value in bits 32..1 with bit 0 set, if all byte sequences reachable from the current state map to the same value; otherwise returns 0.
      • getNextBytes

        public int getNextBytes​(java.lang.Appendable out)
        Finds each byte which continues the byte sequence from the current state. That is, each byte b for which it would be next(b)!=Result.NO_MATCH now.
        Parameters:
        out - Each next byte is 0-extended to a char and appended to this object. (Only uses the out.append(c) method.)
        Returns:
        The number of bytes which continue the byte sequence from here.
      • iterator

        public BytesTrie.Iterator iterator()
        Iterates from the current state of this trie.
        Specified by:
        iterator in interface java.lang.Iterable<BytesTrie.Entry>
        Returns:
        A new BytesTrie.Iterator.
      • iterator

        public BytesTrie.Iterator iterator​(int maxStringLength)
        Iterates from the current state of this trie.
        Parameters:
        maxStringLength - If 0, the iterator returns full strings/byte sequences. Otherwise, the iterator returns strings with this maximum length.
        Returns:
        A new BytesTrie.Iterator.
      • iterator

        public static BytesTrie.Iterator iterator​(byte[] trieBytes,
                                                  int offset,
                                                  int maxStringLength)
        Iterates from the root of a byte-serialized BytesTrie.
        Parameters:
        trieBytes - Bytes array that contains the serialized trie.
        offset - Root offset of the trie in the array.
        maxStringLength - If 0, the iterator returns full strings/byte sequences. Otherwise, the iterator returns strings with this maximum length.
        Returns:
        A new BytesTrie.Iterator.
      • stop

        private void stop()
      • readValue

        private static int readValue​(byte[] bytes,
                                     int pos,
                                     int leadByte)
      • skipValue

        private static int skipValue​(int pos,
                                     int leadByte)
      • skipValue

        private static int skipValue​(byte[] bytes,
                                     int pos)
      • jumpByDelta

        @Deprecated
        public static int jumpByDelta​(byte[] bytes,
                                      int pos)
        Deprecated.
        This API is ICU internal only.
        Reads a jump delta and jumps.
      • skipDelta

        private static int skipDelta​(byte[] bytes,
                                     int pos)
      • branchNext

        private BytesTrie.Result branchNext​(int pos,
                                            int length,
                                            int inByte)
      • findUniqueValueFromBranch

        private static long findUniqueValueFromBranch​(byte[] bytes,
                                                      int pos,
                                                      int length,
                                                      long uniqueValue)
      • findUniqueValue

        private static long findUniqueValue​(byte[] bytes,
                                            int pos,
                                            long uniqueValue)
      • getNextBranchBytes

        private static void getNextBranchBytes​(byte[] bytes,
                                               int pos,
                                               int length,
                                               java.lang.Appendable out)
      • append

        private static void append​(java.lang.Appendable out,
                                   int c)