/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed 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.jkiss.utils;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import java.lang.reflect.Array;
import java.util.*;
/**
* Common utils
*/
public class ArrayUtils {
public static boolean isEmpty(@Nullable Object[] arr)
{
return arr == null || arr.length == 0;
}
public static boolean isEmpty(@Nullable short[] array)
{
return array == null || array.length == 0;
}
public static boolean contains(@Nullable short[] array, short value)
{
if (array == null)
return false;
for (int i = 0, arrayLength = array.length; i < arrayLength; i++) {
if (array[i] == value)
return true;
}
return false;
}
public static boolean contains(@Nullable char[] array, char value)
{
if (array == null || array.length == 0)
return false;
for (int i = 0, arrayLength = array.length; i < arrayLength; i++) {
if (array[i] == value)
return true;
}
return false;
}
public static boolean isEmpty(@Nullable int[] array)
{
return array == null || array.length == 0;
}
public static boolean contains(@Nullable int[] array, int value)
{
if (array == null)
return false;
for (int v : array) {
if (v == value)
return true;
}
return false;
}
public static boolean isEmpty(@Nullable long[] array)
{
return array == null || array.length == 0;
}
public static boolean contains(@Nullable long[] array, long value)
{
if (array == null)
return false;
for (long v : array) {
if (v == value)
return true;
}
return false;
}
public static <OBJECT_TYPE> boolean contains(OBJECT_TYPE[] array, OBJECT_TYPE value)
{
if (isEmpty(array))
return false;
for (int i = 0; i < array.length; i++) {
if (CommonUtils.equalObjects(value, array[i]))
return true;
}
return false;
}
public static boolean containsIgnoreCase(String[] array, String value)
{
if (isEmpty(array) || value == null)
return false;
for (int i = 0; i < array.length; i++) {
if (value.equalsIgnoreCase(array[i]))
return true;
}
return false;
}
public static <OBJECT_TYPE> boolean containsRef(@NotNull OBJECT_TYPE[] array, @Nullable OBJECT_TYPE value)
{
final int length = array.length;
for (int i = 0; i < length; i++) {
if (value == array[i])
return true;
}
return false;
}
@SafeVarargs
public static <OBJECT_TYPE> boolean contains(OBJECT_TYPE[] array, OBJECT_TYPE... values)
{
if (isEmpty(array))
return false;
for (int i = 0; i < array.length; i++) {
for (int k = 0; k < values.length; k++) {
if (CommonUtils.equalObjects(array[i], values[k]))
return true;
}
}
return false;
}
@NotNull
public static <T> T[] concatArrays(@NotNull T[] first, @NotNull T[] second)
{
T[] result = Arrays.copyOf(first, first.length + second.length);
System.arraycopy(second, 0, result, first.length, second.length);
return result;
}
@NotNull
public static <T> List<T> safeArray(@Nullable T[] array)
{
if (array == null) {
return Collections.emptyList();
} else {
return Arrays.asList(array);
}
}
public static <T> int indexOf(T[] array, T element) {
for (int i = 0; i < array.length; i++) {
if (CommonUtils.equalObjects(array[i], element)) {
return i;
}
}
return -1;
}
public static int indexOf(byte[] array, int offset, byte element) {
for (int i = offset; i < array.length; i++) {
if (array[i] == element) {
return i;
}
}
return -1;
}
@SuppressWarnings("unchecked")
public static <T> T[] deleteArea(Class<T> type, T[] elements, int from, int to) {
int delCount = to - from + 1;
T[] newArray = (T[]) Array.newInstance(type, elements.length - delCount);
System.arraycopy(elements, 0, newArray, 0, from);
if (to < elements.length - 1) {
System.arraycopy(elements, to + 1, newArray, from, elements.length - from - delCount);
}
return newArray;
}
@SuppressWarnings("unchecked")
public static <T> T[] insertArea(Class<T> type, Object[] elements, int pos, Object[] add) {
T[] newArray = (T[]) Array.newInstance(type, elements.length + add.length);
System.arraycopy(elements, 0, newArray, 0, pos);
System.arraycopy(add, 0, newArray, pos, add.length);
System.arraycopy(elements, pos, newArray, pos + add.length, elements.length - pos);
return newArray;
}
@SuppressWarnings("unchecked")
public static <T> T[] add(Class<T> type, T[] elements, T add) {
T[] newArray = (T[]) Array.newInstance(type, elements.length + 1);
System.arraycopy(elements, 0, newArray, 0, elements.length);
newArray[elements.length] = add;
return newArray;
}
@SuppressWarnings("unchecked")
public static <T> T[] remove(Class<T> type, T[] elements, int index) {
T[] newArray = (T[]) Array.newInstance(type, elements.length - 1);
System.arraycopy(elements, 0, newArray, 0, index);
if (index < elements.length - 1) {
System.arraycopy(elements, index + 1, newArray, index, elements.length - index - 1);
}
return newArray;
}
public static <T> T[] remove(Class<T> type, T[] elements, T element) {
for (int i = 0; i < elements.length; i++) {
if (elements[i] == element) {
return remove(type, elements, i);
}
}
return elements;
}
public static void main(String[] args) {
String[] arr = new String[0];
for (int i = 0; i < 100; i++) {
arr = add(String.class, arr, String.valueOf(i));
}
System.out.println(Arrays.toString(arr));
for (int i = 0; i < 100; i++) {
arr = remove(String.class, arr, 0);
}
System.out.println(Arrays.toString(arr));
}
@SuppressWarnings("unchecked")
public static <T> T[] toArray(Class<T> type, Collection<? extends T> list) {
return list.toArray((T[]) Array.newInstance(type, list.size()));
}
}