/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.lucene.util;

Additional methods from Java 9's java.util.Arrays.

This class will be removed when Java 9 is minimum requirement. Currently any bytecode is patched to use the Java 9 native classes through MR-JAR (Multi-Release JAR) mechanism. In Java 8 it will use THIS implementation. Because of patching, inside the Java source files we always refer to the Lucene implementations, but the final Lucene JAR files will use the native Java 9 class names when executed with Java 9.

@lucene.internal
/** * Additional methods from Java 9's <a href="https://docs.oracle.com/javase/9/docs/api/java/util/Arrays.html"> * {@code java.util.Arrays}</a>. * <p> * This class will be removed when Java 9 is minimum requirement. * Currently any bytecode is patched to use the Java 9 native * classes through MR-JAR (Multi-Release JAR) mechanism. * In Java 8 it will use THIS implementation. * Because of patching, inside the Java source files we always * refer to the Lucene implementations, but the final Lucene * JAR files will use the native Java 9 class names when executed * with Java 9. * @lucene.internal */
public final class FutureArrays { private FutureArrays() {} // no instance // methods in Arrays are defined stupid: they cannot use Objects.checkFromToIndex // they throw IAE (vs IOOBE) in the case of fromIndex > toIndex. // so this method works just like checkFromToIndex, but with that stupidity added. private static void checkFromToIndex(int fromIndex, int toIndex, int length) { if (fromIndex > toIndex) { throw new IllegalArgumentException("fromIndex " + fromIndex + " > toIndex " + toIndex); } if (fromIndex < 0 || toIndex > length) { throw new IndexOutOfBoundsException("Range [" + fromIndex + ", " + toIndex + ") out-of-bounds for length " + length); } } // byte[]
Behaves like Java 9's Arrays.mismatch
See Also:
/** * Behaves like Java 9's Arrays.mismatch * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#mismatch-byte:A-int-int-byte:A-int-int-">Arrays.mismatch</a> */
public static int mismatch(byte[] a, int aFromIndex, int aToIndex, byte[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; int len = Math.min(aLen, bLen); for (int i = 0; i < len; i++) if (a[i+aFromIndex] != b[i+bFromIndex]) return i; return aLen == bLen ? -1 : len; }
Behaves like Java 9's Arrays.compareUnsigned
See Also:
/** * Behaves like Java 9's Arrays.compareUnsigned * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#compareUnsigned-byte:A-int-int-byte:A-int-int-">Arrays.compareUnsigned</a> */
public static int compareUnsigned(byte[] a, int aFromIndex, int aToIndex, byte[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; int len = Math.min(aLen, bLen); for (int i = 0; i < len; i++) { int aByte = a[i+aFromIndex] & 0xFF; int bByte = b[i+bFromIndex] & 0xFF; int diff = aByte - bByte; if (diff != 0) { return diff; } } // One is a prefix of the other, or, they are equal: return aLen - bLen; }
Behaves like Java 9's Arrays.equals
See Also:
/** * Behaves like Java 9's Arrays.equals * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#equals-byte:A-int-int-byte:A-int-int-">Arrays.equals</a> */
public static boolean equals(byte[] a, int aFromIndex, int aToIndex, byte[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; // lengths differ: cannot be equal if (aLen != bLen) { return false; } for (int i = 0; i < aLen; i++) { if (a[i+aFromIndex] != b[i+bFromIndex]) { return false; } } return true; } // char[]
Behaves like Java 9's Arrays.mismatch
See Also:
/** * Behaves like Java 9's Arrays.mismatch * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#mismatch-char:A-int-int-char:A-int-int-">Arrays.mismatch</a> */
public static int mismatch(char[] a, int aFromIndex, int aToIndex, char[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; int len = Math.min(aLen, bLen); for (int i = 0; i < len; i++) if (a[i+aFromIndex] != b[i+bFromIndex]) return i; return aLen == bLen ? -1 : len; }
Behaves like Java 9's Arrays.compare
See Also:
/** * Behaves like Java 9's Arrays.compare * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#compare-char:A-int-int-char:A-int-int-">Arrays.compare</a> */
public static int compare(char[] a, int aFromIndex, int aToIndex, char[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; int len = Math.min(aLen, bLen); for (int i = 0; i < len; i++) { int aInt = a[i+aFromIndex]; int bInt = b[i+bFromIndex]; if (aInt > bInt) { return 1; } else if (aInt < bInt) { return -1; } } // One is a prefix of the other, or, they are equal: return aLen - bLen; }
Behaves like Java 9's Arrays.equals
See Also:
/** * Behaves like Java 9's Arrays.equals * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#equals-char:A-int-int-char:A-int-int-">Arrays.equals</a> */
public static boolean equals(char[] a, int aFromIndex, int aToIndex, char[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; // lengths differ: cannot be equal if (aLen != bLen) { return false; } for (int i = 0; i < aLen; i++) { if (a[i+aFromIndex] != b[i+bFromIndex]) { return false; } } return true; } // int[]
Behaves like Java 9's Arrays.compare
See Also:
/** * Behaves like Java 9's Arrays.compare * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#compare-int:A-int-int-int:A-int-int-">Arrays.compare</a> */
public static int compare(int[] a, int aFromIndex, int aToIndex, int[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; int len = Math.min(aLen, bLen); for (int i = 0; i < len; i++) { int aInt = a[i+aFromIndex]; int bInt = b[i+bFromIndex]; if (aInt > bInt) { return 1; } else if (aInt < bInt) { return -1; } } // One is a prefix of the other, or, they are equal: return aLen - bLen; }
Behaves like Java 9's Arrays.equals
See Also:
/** * Behaves like Java 9's Arrays.equals * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#equals-int:A-int-int-int:A-int-int-">Arrays.equals</a> */
public static boolean equals(int[] a, int aFromIndex, int aToIndex, int[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; // lengths differ: cannot be equal if (aLen != bLen) { return false; } for (int i = 0; i < aLen; i++) { if (a[i+aFromIndex] != b[i+bFromIndex]) { return false; } } return true; } // long[]
Behaves like Java 9's Arrays.compare
See Also:
/** * Behaves like Java 9's Arrays.compare * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#compare-long:A-int-int-long:A-int-int-">Arrays.compare</a> */
public static int compare(long[] a, int aFromIndex, int aToIndex, long[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; int len = Math.min(aLen, bLen); for (int i = 0; i < len; i++) { long aInt = a[i+aFromIndex]; long bInt = b[i+bFromIndex]; if (aInt > bInt) { return 1; } else if (aInt < bInt) { return -1; } } // One is a prefix of the other, or, they are equal: return aLen - bLen; }
Behaves like Java 9's Arrays.equals
See Also:
/** * Behaves like Java 9's Arrays.equals * @see <a href="http://download.java.net/java/jdk9/docs/api/java/util/Arrays.html#equals-long:A-int-int-long:A-int-int-">Arrays.equals</a> */
public static boolean equals(long[] a, int aFromIndex, int aToIndex, long[] b, int bFromIndex, int bToIndex) { checkFromToIndex(aFromIndex, aToIndex, a.length); checkFromToIndex(bFromIndex, bToIndex, b.length); int aLen = aToIndex - aFromIndex; int bLen = bToIndex - bFromIndex; // lengths differ: cannot be equal if (aLen != bLen) { return false; } for (int i = 0; i < aLen; i++) { if (a[i+aFromIndex] != b[i+bFromIndex]) { return false; } } return true; } }