// Copyright 2017 JanusGraph Authors
//
// 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.janusgraph.util.datastructures;
import com.google.common.base.Preconditions;
import com.google.common.primitives.Longs;
import java.util.Arrays;
/**
* Utility class for sorting and retrieving from primitive arrays
*
* @author Matthias Broecheler (me@matthiasb.com)
*/
public class ArraysUtil {
public static final boolean isSortedInc(long[] arr) {
for (int i = 0; i < arr.length; i++) {
if (i > 0 && arr[i] <= arr[i - 1]) return false;
}
return true;
}
public static final boolean isSortedInc(int[] arr) {
for (int i = 0; i < arr.length; i++) {
if (i > 0 && arr[i] <= arr[i - 1]) return false;
}
return true;
}
public static final long[] insertSortedInc(long[] arr, long element) {
assert arr == null || isSortedInc(arr);
long[] newarr = new long[(arr != null ? arr.length + 1 : 1)];
int offset = 0;
if (arr != null) {
for (int i = 0; i < arr.length; i++) {
Preconditions.checkArgument(element != arr[i]);
if (element < arr[i]) {
newarr[i] = element;
offset = 1;
}
newarr[i + offset] = arr[i];
}
}
if (offset == 0) newarr[newarr.length - 1] = element;
return newarr;
}
public static final long[] arrayDifference(long[] arr, long[] subset) {
long[] res = new long[arr.length - subset.length];
int pos = 0;
for (int i = 0; i < arr.length; i++) {
if (!Longs.contains(subset, arr[i])) {
res[pos] = arr[i];
pos++;
}
}
assert pos == res.length;
return res;
}
public static final long[] mergeSortedInc(long[] a, long[] b) {
assert isSortedInc(a) && isSortedInc(b);
long[] res = new long[a.length + b.length];
int ai = 0, bi = 0;
while (ai < a.length || bi < b.length) {
if (a[ai] < b[bi]) {
res[ai + bi] = a[ai];
ai++;
} else if (b[bi] < a[ai]) {
res[ai + bi] = b[bi];
bi++;
} else throw new IllegalArgumentException(Arrays.toString(a) + "|" + Arrays.toString(b));
}
return res;
}
public static final int sum(int[] values) {
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
public static final int indexOfMin(double[] values) {
if (values.length < 1) return -1;
int index = 0;
for (int i = 1; i < values.length; i++) {
if (values[i] < values[index]) {
index = i;
}
}
return index;
}
public static final int indexOf(int[] array, int value) {
for (int i = 0; i < array.length; i++) {
if (array[i] == value) return i;
}
return -1;
}
}