jdk/src/java.base/share/classes/sun/text/normalizer/Trie2.java
author martin
Tue, 15 Sep 2015 21:56:04 -0700
changeset 32649 2ee9017c7597
parent 31680 88c53c2293b4
permissions -rw-r--r--
8136583: Core libraries should use blessed modifier order Summary: Run blessed-modifier-order script (see bug) Reviewed-by: psandoz, chegar, alanb, plevart
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
31680
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     1
/*
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     2
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     4
 *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    10
 *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    15
 * accompanied this code).
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    16
 *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    20
 *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    23
 * questions.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    24
 */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    25
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    26
/*
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    27
 *******************************************************************************
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    28
 * Copyright (C) 2009-2014, International Business Machines Corporation and
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    29
 * others. All Rights Reserved.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    30
 *******************************************************************************
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    31
 */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    32
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    33
package sun.text.normalizer;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    34
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    35
import java.io.IOException;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    36
import java.nio.ByteBuffer;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    37
import java.nio.ByteOrder;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    38
import java.util.Iterator;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    39
import java.util.NoSuchElementException;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    40
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    41
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    42
/**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    43
 * This is the interface and common implementation of a Unicode Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    44
 * It is a kind of compressed table that maps from Unicode code points (0..0x10ffff)
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    45
 * to 16- or 32-bit integer values.  It works best when there are ranges of
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    46
 * characters with the same value, which is generally the case with Unicode
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    47
 * character properties.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    48
 *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    49
 * This is the second common version of a Unicode trie (hence the name Trie2).
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    50
 *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    51
 */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    52
abstract class Trie2 implements Iterable<Trie2.Range> {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    53
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    54
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    55
     * Create a Trie2 from its serialized form.  Inverse of utrie2_serialize().
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    56
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    57
     * Reads from the current position and leaves the buffer after the end of the trie.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    58
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    59
     * The serialized format is identical between ICU4C and ICU4J, so this function
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    60
     * will work with serialized Trie2s from either.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    61
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    62
     * The actual type of the returned Trie2 will be either Trie2_16 or Trie2_32, depending
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    63
     * on the width of the data.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    64
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    65
     * To obtain the width of the Trie2, check the actual class type of the returned Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    66
     * Or use the createFromSerialized() function of Trie2_16 or Trie2_32, which will
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    67
     * return only Tries of their specific type/size.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    68
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    69
     * The serialized Trie2 on the stream may be in either little or big endian byte order.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    70
     * This allows using serialized Tries from ICU4C without needing to consider the
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    71
     * byte order of the system that created them.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    72
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    73
     * @param bytes a byte buffer to the serialized form of a UTrie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    74
     * @return An unserialized Trie2, ready for use.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    75
     * @throws IllegalArgumentException if the stream does not contain a serialized Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    76
     * @throws IOException if a read error occurs in the buffer.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    77
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    78
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    79
    public static Trie2 createFromSerialized(ByteBuffer bytes) throws IOException {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    80
         //    From ICU4C utrie2_impl.h
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    81
         //    * Trie2 data structure in serialized form:
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    82
         //     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    83
         //     * UTrie2Header header;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    84
         //     * uint16_t index[header.index2Length];
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    85
         //     * uint16_t data[header.shiftedDataLength<<2];  -- or uint32_t data[...]
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    86
         //     * @internal
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    87
         //     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    88
         //    typedef struct UTrie2Header {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    89
         //        /** "Tri2" in big-endian US-ASCII (0x54726932) */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    90
         //        uint32_t signature;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    91
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    92
         //       /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    93
         //         * options bit field:
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    94
         //         * 15.. 4   reserved (0)
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    95
         //         *  3.. 0   UTrie2ValueBits valueBits
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    96
         //         */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    97
         //        uint16_t options;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    98
         //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
    99
         //        /** UTRIE2_INDEX_1_OFFSET..UTRIE2_MAX_INDEX_LENGTH */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   100
         //        uint16_t indexLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   101
         //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   102
         //        /** (UTRIE2_DATA_START_OFFSET..UTRIE2_MAX_DATA_LENGTH)>>UTRIE2_INDEX_SHIFT */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   103
         //        uint16_t shiftedDataLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   104
         //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   105
         //        /** Null index and data blocks, not shifted. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   106
         //        uint16_t index2NullOffset, dataNullOffset;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   107
         //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   108
         //        /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   109
         //         * First code point of the single-value range ending with U+10ffff,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   110
         //         * rounded up and then shifted right by UTRIE2_SHIFT_1.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   111
         //         */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   112
         //        uint16_t shiftedHighStart;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   113
         //    } UTrie2Header;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   114
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   115
        ByteOrder outerByteOrder = bytes.order();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   116
        try {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   117
            UTrie2Header header = new UTrie2Header();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   118
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   119
            /* check the signature */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   120
            header.signature = bytes.getInt();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   121
            switch (header.signature) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   122
            case 0x54726932:
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   123
                // The buffer is already set to the trie data byte order.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   124
                break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   125
            case 0x32697254:
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   126
                // Temporarily reverse the byte order.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   127
                boolean isBigEndian = outerByteOrder == ByteOrder.BIG_ENDIAN;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   128
                bytes.order(isBigEndian ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   129
                header.signature = 0x54726932;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   130
                break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   131
            default:
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   132
                throw new IllegalArgumentException("Buffer does not contain a serialized UTrie2");
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   133
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   134
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   135
            header.options = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   136
            header.indexLength = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   137
            header.shiftedDataLength = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   138
            header.index2NullOffset = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   139
            header.dataNullOffset   = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   140
            header.shiftedHighStart = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   141
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   142
            if ((header.options & UTRIE2_OPTIONS_VALUE_BITS_MASK) != 0) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   143
                throw new IllegalArgumentException("UTrie2 serialized format error.");
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   144
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   145
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   146
            Trie2 This;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   147
            This = new Trie2_16();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   148
            This.header = header;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   149
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   150
            /* get the length values and offsets */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   151
            This.indexLength      = header.indexLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   152
            This.dataLength       = header.shiftedDataLength << UTRIE2_INDEX_SHIFT;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   153
            This.index2NullOffset = header.index2NullOffset;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   154
            This.dataNullOffset   = header.dataNullOffset;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   155
            This.highStart        = header.shiftedHighStart << UTRIE2_SHIFT_1;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   156
            This.highValueIndex   = This.dataLength - UTRIE2_DATA_GRANULARITY;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   157
            This.highValueIndex += This.indexLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   158
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   159
            // Allocate the Trie2 index array. If the data width is 16 bits, the array also
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   160
            // includes the space for the data.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   161
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   162
            int indexArraySize = This.indexLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   163
            indexArraySize += This.dataLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   164
            This.index = new char[indexArraySize];
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   165
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   166
            /* Read in the index */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   167
            int i;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   168
            for (i=0; i<This.indexLength; i++) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   169
                This.index[i] = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   170
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   171
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   172
            /* Read in the data. 16 bit data goes in the same array as the index.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   173
             * 32 bit data goes in its own separate data array.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   174
             */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   175
            This.data16 = This.indexLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   176
            for (i=0; i<This.dataLength; i++) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   177
                This.index[This.data16 + i] = bytes.getChar();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   178
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   179
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   180
            This.data32 = null;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   181
            This.initialValue = This.index[This.dataNullOffset];
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   182
            This.errorValue   = This.index[This.data16+UTRIE2_BAD_UTF8_DATA_OFFSET];
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   183
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   184
            return This;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   185
        } finally {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   186
            bytes.order(outerByteOrder);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   187
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   188
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   189
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   190
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   191
     * Get the value for a code point as stored in the Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   192
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   193
     * @param codePoint the code point
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   194
     * @return the value
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   195
     */
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 31680
diff changeset
   196
    public abstract int get(int codePoint);
31680
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   197
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   198
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   199
     * Get the trie value for a UTF-16 code unit.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   200
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   201
     * A Trie2 stores two distinct values for input in the lead surrogate
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   202
     * range, one for lead surrogates, which is the value that will be
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   203
     * returned by this function, and a second value that is returned
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   204
     * by Trie2.get().
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   205
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   206
     * For code units outside of the lead surrogate range, this function
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   207
     * returns the same result as Trie2.get().
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   208
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   209
     * This function, together with the alternate value for lead surrogates,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   210
     * makes possible very efficient processing of UTF-16 strings without
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   211
     * first converting surrogate pairs to their corresponding 32 bit code point
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   212
     * values.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   213
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   214
     * At build-time, enumerate the contents of the Trie2 to see if there
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   215
     * is non-trivial (non-initialValue) data for any of the supplementary
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   216
     * code points associated with a lead surrogate.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   217
     * If so, then set a special (application-specific) value for the
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   218
     * lead surrogate code _unit_, with Trie2Writable.setForLeadSurrogateCodeUnit().
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   219
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   220
     * At runtime, use Trie2.getFromU16SingleLead(). If there is non-trivial
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   221
     * data and the code unit is a lead surrogate, then check if a trail surrogate
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   222
     * follows. If so, assemble the supplementary code point and look up its value
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   223
     * with Trie2.get(); otherwise reset the lead
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   224
     * surrogate's value or do a code point lookup for it.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   225
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   226
     * If there is only trivial data for lead and trail surrogates, then processing
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   227
     * can often skip them. For example, in normalization or case mapping
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   228
     * all characters that do not have any mappings are simply copied as is.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   229
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   230
     * @param c the code point or lead surrogate value.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   231
     * @return the value
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   232
     */
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 31680
diff changeset
   233
    public abstract int getFromU16SingleLead(char c);
31680
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   234
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   235
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   236
     * When iterating over the contents of a Trie2, Elements of this type are produced.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   237
     * The iterator will return one item for each contiguous range of codepoints  having the same value.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   238
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   239
     * When iterating, the same Trie2EnumRange object will be reused and returned for each range.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   240
     * If you need to retain complete iteration results, clone each returned Trie2EnumRange,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   241
     * or save the range in some other way, before advancing to the next iteration step.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   242
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   243
    public static class Range {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   244
        public int     startCodePoint;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   245
        public int     endCodePoint;     // Inclusive.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   246
        public int     value;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   247
        public boolean leadSurrogate;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   248
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   249
        public boolean equals(Object other) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   250
            if (other == null || !(other.getClass().equals(getClass()))) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   251
                return false;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   252
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   253
            Range tother = (Range)other;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   254
            return this.startCodePoint == tother.startCodePoint &&
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   255
                   this.endCodePoint   == tother.endCodePoint   &&
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   256
                   this.value          == tother.value          &&
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   257
                   this.leadSurrogate  == tother.leadSurrogate;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   258
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   259
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   260
        public int hashCode() {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   261
            int h = initHash();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   262
            h = hashUChar32(h, startCodePoint);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   263
            h = hashUChar32(h, endCodePoint);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   264
            h = hashInt(h, value);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   265
            h = hashByte(h, leadSurrogate? 1: 0);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   266
            return h;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   267
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   268
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   269
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   270
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   271
     *  Create an iterator over the value ranges in this Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   272
     *  Values from the Trie2 are not remapped or filtered, but are returned as they
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   273
     *  are stored in the Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   274
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   275
     * @return an Iterator
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   276
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   277
    public Iterator<Range> iterator() {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   278
        return iterator(defaultValueMapper);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   279
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   280
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   281
    private static ValueMapper defaultValueMapper = new ValueMapper() {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   282
        public int map(int in) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   283
            return in;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   284
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   285
    };
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   286
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   287
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   288
     * Create an iterator over the value ranges from this Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   289
     * Values from the Trie2 are passed through a caller-supplied remapping function,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   290
     * and it is the remapped values that determine the ranges that
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   291
     * will be produced by the iterator.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   292
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   293
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   294
     * @param mapper provides a function to remap values obtained from the Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   295
     * @return an Iterator
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   296
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   297
    public Iterator<Range> iterator(ValueMapper mapper) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   298
        return new Trie2Iterator(mapper);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   299
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   300
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   301
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   302
     * When iterating over the contents of a Trie2, an instance of TrieValueMapper may
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   303
     * be used to remap the values from the Trie2.  The remapped values will be used
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   304
     * both in determining the ranges of codepoints and as the value to be returned
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   305
     * for each range.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   306
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   307
     * Example of use, with an anonymous subclass of TrieValueMapper:
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   308
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   309
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   310
     * ValueMapper m = new ValueMapper() {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   311
     *    int map(int in) {return in & 0x1f;};
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   312
     * }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   313
     * for (Iterator<Trie2EnumRange> iter = trie.iterator(m); i.hasNext(); ) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   314
     *     Trie2EnumRange r = i.next();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   315
     *     ...  // Do something with the range r.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   316
     * }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   317
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   318
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   319
    public interface ValueMapper {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   320
        public int  map(int originalVal);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   321
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   322
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   323
    //--------------------------------------------------------------------------------
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   324
    //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   325
    // Below this point are internal implementation items.  No further public API.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   326
    //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   327
    //--------------------------------------------------------------------------------
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   328
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   329
     /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   330
     * Trie2 data structure in serialized form:
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   331
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   332
     * UTrie2Header header;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   333
     * uint16_t index[header.index2Length];
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   334
     * uint16_t data[header.shiftedDataLength<<2];  -- or uint32_t data[...]
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   335
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   336
     * For Java, this is read from the stream into an instance of UTrie2Header.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   337
     * (The C version just places a struct over the raw serialized data.)
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   338
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   339
     * @internal
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   340
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   341
    static class UTrie2Header {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   342
        /** "Tri2" in big-endian US-ASCII (0x54726932) */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   343
        int signature;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   344
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   345
        /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   346
         * options bit field (uint16_t):
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   347
         * 15.. 4   reserved (0)
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   348
         *  3.. 0   UTrie2ValueBits valueBits
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   349
         */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   350
        int  options;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   351
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   352
        /** UTRIE2_INDEX_1_OFFSET..UTRIE2_MAX_INDEX_LENGTH  (uint16_t) */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   353
        int  indexLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   354
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   355
        /** (UTRIE2_DATA_START_OFFSET..UTRIE2_MAX_DATA_LENGTH)>>UTRIE2_INDEX_SHIFT  (uint16_t) */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   356
        int  shiftedDataLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   357
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   358
        /** Null index and data blocks, not shifted.  (uint16_t) */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   359
        int  index2NullOffset, dataNullOffset;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   360
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   361
        /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   362
         * First code point of the single-value range ending with U+10ffff,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   363
         * rounded up and then shifted right by UTRIE2_SHIFT_1.  (uint16_t)
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   364
         */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   365
        int shiftedHighStart;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   366
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   367
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   368
    //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   369
    //  Data members of UTrie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   370
    //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   371
    UTrie2Header  header;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   372
    char          index[];           // Index array.  Includes data for 16 bit Tries.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   373
    int           data16;            // Offset to data portion of the index array, if 16 bit data.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   374
                                     //    zero if 32 bit data.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   375
    int           data32[];          // NULL if 16b data is used via index
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   376
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   377
    int           indexLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   378
    int           dataLength;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   379
    int           index2NullOffset;  // 0xffff if there is no dedicated index-2 null block
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   380
    int           initialValue;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   381
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   382
    /** Value returned for out-of-range code points and illegal UTF-8. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   383
    int           errorValue;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   384
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   385
    /* Start of the last range which ends at U+10ffff, and its value. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   386
    int           highStart;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   387
    int           highValueIndex;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   388
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   389
    int           dataNullOffset;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   390
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   391
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   392
     * Trie2 constants, defining shift widths, index array lengths, etc.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   393
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   394
     * These are needed for the runtime macros but users can treat these as
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   395
     * implementation details and skip to the actual public API further below.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   396
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   397
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   398
    static final int UTRIE2_OPTIONS_VALUE_BITS_MASK=0x000f;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   399
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   400
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   401
    /** Shift size for getting the index-1 table offset. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   402
    static final int UTRIE2_SHIFT_1=6+5;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   403
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   404
    /** Shift size for getting the index-2 table offset. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   405
    static final int UTRIE2_SHIFT_2=5;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   406
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   407
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   408
     * Difference between the two shift sizes,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   409
     * for getting an index-1 offset from an index-2 offset. 6=11-5
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   410
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   411
    static final int UTRIE2_SHIFT_1_2=UTRIE2_SHIFT_1-UTRIE2_SHIFT_2;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   412
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   413
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   414
     * Number of index-1 entries for the BMP. 32=0x20
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   415
     * This part of the index-1 table is omitted from the serialized form.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   416
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   417
    static final int UTRIE2_OMITTED_BMP_INDEX_1_LENGTH=0x10000>>UTRIE2_SHIFT_1;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   418
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   419
    /** Number of entries in an index-2 block. 64=0x40 */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   420
    static final int UTRIE2_INDEX_2_BLOCK_LENGTH=1<<UTRIE2_SHIFT_1_2;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   421
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   422
    /** Mask for getting the lower bits for the in-index-2-block offset. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   423
    static final int UTRIE2_INDEX_2_MASK=UTRIE2_INDEX_2_BLOCK_LENGTH-1;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   424
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   425
    /** Number of entries in a data block. 32=0x20 */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   426
    static final int UTRIE2_DATA_BLOCK_LENGTH=1<<UTRIE2_SHIFT_2;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   427
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   428
    /** Mask for getting the lower bits for the in-data-block offset. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   429
    static final int UTRIE2_DATA_MASK=UTRIE2_DATA_BLOCK_LENGTH-1;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   430
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   431
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   432
     * Shift size for shifting left the index array values.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   433
     * Increases possible data size with 16-bit index values at the cost
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   434
     * of compactability.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   435
     * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   436
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   437
    static final int UTRIE2_INDEX_SHIFT=2;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   438
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   439
    /** The alignment size of a data block. Also the granularity for compaction. */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   440
    static final int UTRIE2_DATA_GRANULARITY=1<<UTRIE2_INDEX_SHIFT;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   441
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   442
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   443
     * The part of the index-2 table for U+D800..U+DBFF stores values for
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   444
     * lead surrogate code _units_ not code _points_.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   445
     * Values for lead surrogate code _points_ are indexed with this portion of the table.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   446
     * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   447
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   448
    static final int UTRIE2_LSCP_INDEX_2_OFFSET=0x10000>>UTRIE2_SHIFT_2;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   449
    static final int UTRIE2_LSCP_INDEX_2_LENGTH=0x400>>UTRIE2_SHIFT_2;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   450
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   451
    /** Count the lengths of both BMP pieces. 2080=0x820 */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   452
    static final int UTRIE2_INDEX_2_BMP_LENGTH=UTRIE2_LSCP_INDEX_2_OFFSET+UTRIE2_LSCP_INDEX_2_LENGTH;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   453
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   454
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   455
     * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   456
     * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   457
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   458
    static final int UTRIE2_UTF8_2B_INDEX_2_OFFSET=UTRIE2_INDEX_2_BMP_LENGTH;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   459
    static final int UTRIE2_UTF8_2B_INDEX_2_LENGTH=0x800>>6;  /* U+0800 is the first code point after 2-byte UTF-8 */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   460
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   461
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   462
     * The index-1 table, only used for supplementary code points, at offset 2112=0x840.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   463
     * Variable length, for code points up to highStart, where the last single-value range starts.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   464
     * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   465
     * (For 0x100000 supplementary code points U+10000..U+10ffff.)
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   466
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   467
     * The part of the index-2 table for supplementary code points starts
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   468
     * after this index-1 table.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   469
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   470
     * Both the index-1 table and the following part of the index-2 table
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   471
     * are omitted completely if there is only BMP data.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   472
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   473
    static final int UTRIE2_INDEX_1_OFFSET=UTRIE2_UTF8_2B_INDEX_2_OFFSET+UTRIE2_UTF8_2B_INDEX_2_LENGTH;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   474
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   475
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   476
     * The illegal-UTF-8 data block follows the ASCII block, at offset 128=0x80.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   477
     * Used with linear access for single bytes 0..0xbf for simple error handling.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   478
     * Length 64=0x40, not UTRIE2_DATA_BLOCK_LENGTH.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   479
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   480
    static final int UTRIE2_BAD_UTF8_DATA_OFFSET=0x80;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   481
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   482
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   483
     * Implementation class for an iterator over a Trie2.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   484
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   485
     *   Iteration over a Trie2 first returns all of the ranges that are indexed by code points,
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   486
     *   then returns the special alternate values for the lead surrogates
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   487
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   488
     * @internal
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   489
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   490
    class Trie2Iterator implements Iterator<Range> {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   491
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   492
        // The normal constructor that configures the iterator to cover the complete
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   493
        //   contents of the Trie2
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   494
        Trie2Iterator(ValueMapper vm) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   495
            mapper    = vm;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   496
            nextStart = 0;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   497
            limitCP   = 0x110000;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   498
            doLeadSurrogates = true;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   499
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   500
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   501
        /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   502
         *  The main next() function for Trie2 iterators
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   503
         *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   504
         */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   505
        public Range next() {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   506
            if (!hasNext()) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   507
                throw new NoSuchElementException();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   508
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   509
            if (nextStart >= limitCP) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   510
                // Switch over from iterating normal code point values to
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   511
                //   doing the alternate lead-surrogate values.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   512
                doingCodePoints = false;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   513
                nextStart = 0xd800;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   514
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   515
            int   endOfRange = 0;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   516
            int   val = 0;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   517
            int   mappedVal = 0;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   518
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   519
            if (doingCodePoints) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   520
                // Iteration over code point values.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   521
                val = get(nextStart);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   522
                mappedVal = mapper.map(val);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   523
                endOfRange = rangeEnd(nextStart, limitCP, val);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   524
                // Loop once for each range in the Trie2 with the same raw (unmapped) value.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   525
                // Loop continues so long as the mapped values are the same.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   526
                for (;;) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   527
                    if (endOfRange >= limitCP-1) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   528
                        break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   529
                    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   530
                    val = get(endOfRange+1);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   531
                    if (mapper.map(val) != mappedVal) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   532
                        break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   533
                    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   534
                    endOfRange = rangeEnd(endOfRange+1, limitCP, val);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   535
                }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   536
            } else {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   537
                // Iteration over the alternate lead surrogate values.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   538
                val = getFromU16SingleLead((char)nextStart);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   539
                mappedVal = mapper.map(val);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   540
                endOfRange = rangeEndLS((char)nextStart);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   541
                // Loop once for each range in the Trie2 with the same raw (unmapped) value.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   542
                // Loop continues so long as the mapped values are the same.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   543
                for (;;) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   544
                    if (endOfRange >= 0xdbff) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   545
                        break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   546
                    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   547
                    val = getFromU16SingleLead((char)(endOfRange+1));
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   548
                    if (mapper.map(val) != mappedVal) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   549
                        break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   550
                    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   551
                    endOfRange = rangeEndLS((char)(endOfRange+1));
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   552
                }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   553
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   554
            returnValue.startCodePoint = nextStart;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   555
            returnValue.endCodePoint   = endOfRange;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   556
            returnValue.value          = mappedVal;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   557
            returnValue.leadSurrogate  = !doingCodePoints;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   558
            nextStart                  = endOfRange+1;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   559
            return returnValue;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   560
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   561
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   562
        /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   563
         *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   564
         */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   565
        public boolean hasNext() {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   566
            return doingCodePoints && (doLeadSurrogates || nextStart < limitCP) || nextStart < 0xdc00;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   567
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   568
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   569
        private int rangeEndLS(char startingLS) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   570
            if (startingLS >= 0xdbff) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   571
                return 0xdbff;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   572
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   573
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   574
            int c;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   575
            int val = getFromU16SingleLead(startingLS);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   576
            for (c = startingLS+1; c <= 0x0dbff; c++) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   577
                if (getFromU16SingleLead((char)c) != val) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   578
                    break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   579
                }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   580
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   581
            return c-1;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   582
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   583
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   584
        //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   585
        //   Iteration State Variables
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   586
        //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   587
        private ValueMapper    mapper;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   588
        private Range          returnValue = new Range();
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   589
        // The starting code point for the next range to be returned.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   590
        private int            nextStart;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   591
        // The upper limit for the last normal range to be returned.  Normally 0x110000, but
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   592
        //   may be lower when iterating over the code points for a single lead surrogate.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   593
        private int            limitCP;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   594
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   595
        // True while iterating over the the Trie2 values for code points.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   596
        // False while iterating over the alternate values for lead surrogates.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   597
        private boolean        doingCodePoints = true;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   598
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   599
        // True if the iterator should iterate the special values for lead surrogates in
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   600
        //   addition to the normal values for code points.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   601
        private boolean        doLeadSurrogates = true;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   602
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   603
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   604
    /**
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   605
     * Find the last character in a contiguous range of characters with the
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   606
     * same Trie2 value as the input character.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   607
     *
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   608
     * @param c  The character to begin with.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   609
     * @return   The last contiguous character with the same value.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   610
     */
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   611
    int rangeEnd(int start, int limitp, int val) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   612
        int c;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   613
        int limit = Math.min(highStart, limitp);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   614
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   615
        for (c = start+1; c < limit; c++) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   616
            if (get(c) != val) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   617
                break;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   618
            }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   619
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   620
        if (c >= highStart) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   621
            c = limitp;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   622
        }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   623
        return c - 1;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   624
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   625
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   626
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   627
    //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   628
    //  Hashing implementation functions.  FNV hash.  Respected public domain algorithm.
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   629
    //
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   630
    private static int initHash() {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   631
        return 0x811c9DC5;  // unsigned 2166136261
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   632
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   633
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   634
    private static int hashByte(int h, int b) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   635
        h = h * 16777619;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   636
        h = h ^ b;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   637
        return h;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   638
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   639
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   640
    private static int hashUChar32(int h, int c) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   641
        h = Trie2.hashByte(h, c & 255);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   642
        h = Trie2.hashByte(h, (c>>8) & 255);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   643
        h = Trie2.hashByte(h, c>>16);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   644
        return h;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   645
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   646
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   647
    private static int hashInt(int h, int i) {
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   648
        h = Trie2.hashByte(h, i & 255);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   649
        h = Trie2.hashByte(h, (i>>8) & 255);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   650
        h = Trie2.hashByte(h, (i>>16) & 255);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   651
        h = Trie2.hashByte(h, (i>>24) & 255);
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   652
        return h;
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   653
    }
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   654
88c53c2293b4 8032446: Support Unicode 7.0.0 in JDK 9
peytoia
parents:
diff changeset
   655
}