diff options
Diffstat (limited to 'common/framework/com/android/net/module/util/CollectionUtils.java')
-rw-r--r-- | common/framework/com/android/net/module/util/CollectionUtils.java | 392 |
1 files changed, 0 insertions, 392 deletions
diff --git a/common/framework/com/android/net/module/util/CollectionUtils.java b/common/framework/com/android/net/module/util/CollectionUtils.java deleted file mode 100644 index 39e7ce94..00000000 --- a/common/framework/com/android/net/module/util/CollectionUtils.java +++ /dev/null @@ -1,392 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * 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 com.android.net.module.util; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.util.ArrayMap; -import android.util.Pair; -import android.util.SparseArray; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Objects; -import java.util.function.Function; -import java.util.function.Predicate; - -/** - * Utilities for {@link Collection} and arrays. - * @hide - */ -public final class CollectionUtils { - private CollectionUtils() {} - - /** - * @return True if the array is null or 0-length. - */ - public static <T> boolean isEmpty(@Nullable T[] array) { - return array == null || array.length == 0; - } - - /** - * @return True if the collection is null or 0-length. - */ - public static <T> boolean isEmpty(@Nullable Collection<T> collection) { - return collection == null || collection.isEmpty(); - } - - /** - * Returns an int array from the given Integer list. - */ - @NonNull - public static int[] toIntArray(@NonNull Collection<Integer> list) { - int[] array = new int[list.size()]; - int i = 0; - for (Integer item : list) { - array[i] = item; - i++; - } - return array; - } - - /** - * Returns a long array from the given long list. - */ - @NonNull - public static long[] toLongArray(@NonNull Collection<Long> list) { - long[] array = new long[list.size()]; - int i = 0; - for (Long item : list) { - array[i] = item; - i++; - } - return array; - } - - /** - * @return True if all elements satisfy the predicate, false otherwise. - * Note that means this always returns true for empty collections. - */ - public static <T> boolean all(@NonNull Collection<T> elem, @NonNull Predicate<T> predicate) { - for (final T e : elem) { - if (!predicate.test(e)) return false; - } - return true; - - } - - /** - * @return True if any element satisfies the predicate, false otherwise. - * Note that means this always returns false for empty collections. - */ - public static <T> boolean any(@NonNull Collection<T> elem, @NonNull Predicate<T> predicate) { - return indexOf(elem, predicate) >= 0; - } - - /** - * @return The index of the first element that matches the predicate, or -1 if none. - */ - public static <T> int indexOf(@NonNull final Collection<T> elem, - @NonNull final Predicate<? super T> predicate) { - int idx = 0; - for (final T e : elem) { - if (predicate.test(e)) return idx; - idx++; - } - return -1; - } - - /** - * @return True if there exists at least one element in the sparse array for which - * condition {@code predicate} - */ - public static <T> boolean any(@NonNull SparseArray<T> array, @NonNull Predicate<T> predicate) { - for (int i = 0; i < array.size(); ++i) { - if (predicate.test(array.valueAt(i))) { - return true; - } - } - return false; - } - - /** - * @return true if the array contains the specified value. - */ - public static boolean contains(@Nullable short[] array, short value) { - if (array == null) return false; - for (int element : array) { - if (element == value) { - return true; - } - } - return false; - } - - /** - * @return true if the array contains the specified value. - */ - public static boolean contains(@Nullable int[] array, int value) { - if (array == null) return false; - for (int element : array) { - if (element == value) { - return true; - } - } - return false; - } - - /** - * @return true if the array contains the specified value. - */ - public static <T> boolean contains(@Nullable T[] array, @Nullable T value) { - return indexOf(array, value) != -1; - } - - /** - * Return first index of value in given array, or -1 if not found. - */ - public static <T> int indexOf(@Nullable T[] array, @Nullable T value) { - if (array == null) return -1; - for (int i = 0; i < array.length; i++) { - if (Objects.equals(array[i], value)) return i; - } - return -1; - } - - /** - * Returns the index of the needle array in the haystack array, or -1 if it can't be found. - * This is a byte array equivalent of Collections.indexOfSubList(). - */ - public static int indexOfSubArray(@NonNull byte[] haystack, @NonNull byte[] needle) { - for (int i = 0; i < haystack.length - needle.length + 1; i++) { - boolean found = true; - for (int j = 0; j < needle.length; j++) { - if (haystack[i + j] != needle[j]) { - found = false; - break; - } - } - if (found) { - return i; - } - } - return -1; - } - - /** - * Returns a new collection of elements that match the passed predicate. - * @param source the elements to filter. - * @param test the predicate to test for. - * @return a new collection containing only the source elements that satisfy the predicate. - */ - @NonNull public static <T> ArrayList<T> filter(@NonNull final Collection<T> source, - @NonNull final Predicate<T> test) { - final ArrayList<T> matches = new ArrayList<>(); - for (final T e : source) { - if (test.test(e)) { - matches.add(e); - } - } - return matches; - } - - /** - * Return sum of the given long array. - */ - public static long total(@Nullable long[] array) { - long total = 0; - if (array != null) { - for (long value : array) { - total += value; - } - } - return total; - } - - /** - * Returns true if the first collection contains any of the elements of the second. - * @param haystack where to search - * @param needles what to search for - * @param <T> type of elements - * @return true if |haystack| contains any of the |needles|, false otherwise - */ - public static <T> boolean containsAny(@NonNull final Collection<T> haystack, - @NonNull final Collection<? extends T> needles) { - for (T needle : needles) { - if (haystack.contains(needle)) return true; - } - return false; - } - - /** - * Returns true if the first collection contains all of the elements of the second. - * @param haystack where to search - * @param needles what to search for - * @param <T> type of elements - * @return true if |haystack| contains all of the |needles|, false otherwise - */ - public static <T> boolean containsAll(@NonNull final Collection<T> haystack, - @NonNull final Collection<? extends T> needles) { - return haystack.containsAll(needles); - } - - /** - * Returns the first item of a collection that matches the predicate. - * @param haystack The collection to search. - * @param condition The predicate to match. - * @param <T> The type of element in the collection. - * @return The first element matching the predicate, or null if none. - */ - @Nullable - public static <T> T findFirst(@NonNull final Collection<T> haystack, - @NonNull final Predicate<? super T> condition) { - for (T needle : haystack) { - if (condition.test(needle)) return needle; - } - return null; - } - - /** - * Returns the last item of a List that matches the predicate. - * @param haystack The List to search. - * @param condition The predicate to match. - * @param <T> The type of element in the list. - * @return The last element matching the predicate, or null if none. - */ - // There is no way to reverse iterate a Collection in Java (e.g. the collection may - // be a single-linked list), so implementing this on Collection is necessarily very - // wasteful (store and reverse a copy, test all elements, or recurse to the end of the - // list to test on the up path and possibly blow the call stack) - @Nullable - public static <T> T findLast(@NonNull final List<T> haystack, - @NonNull final Predicate<? super T> condition) { - for (int i = haystack.size() - 1; i >= 0; --i) { - final T needle = haystack.get(i); - if (condition.test(needle)) return needle; - } - return null; - } - - /** - * Returns whether a collection contains an element matching a condition - * @param haystack The collection to search. - * @param condition The predicate to match. - * @param <T> The type of element in the collection. - * @return Whether the collection contains any element matching the condition. - */ - public static <T> boolean contains(@NonNull final Collection<T> haystack, - @NonNull final Predicate<? super T> condition) { - return -1 != indexOf(haystack, condition); - } - - /** - * Standard map function, but returns a new modifiable ArrayList - * - * This returns a new list that contains, for each element of the source collection, its - * image through the passed transform. - * Elements in the source can be null if the transform accepts null inputs. - * Elements in the output can be null if the transform ever returns null. - * This function never returns null. If the source collection is empty, it returns the - * empty list. - * Contract : this method calls the transform function exactly once for each element in the - * list, in iteration order. - * - * @param source the source collection - * @param transform the function to transform the elements - * @param <T> type of source elements - * @param <R> type of destination elements - * @return an unmodifiable list of transformed elements - */ - @NonNull - public static <T, R> ArrayList<R> map(@NonNull final Collection<T> source, - @NonNull final Function<? super T, ? extends R> transform) { - final ArrayList<R> dest = new ArrayList<>(source.size()); - for (final T e : source) { - dest.add(transform.apply(e)); - } - return dest; - } - - /** - * Standard zip function, but returns a new modifiable ArrayList - * - * This returns a list of pairs containing, at each position, a pair of the element from the - * first list at that index and the element from the second list at that index. - * Both lists must be the same size. They may contain null. - * - * The easiest way to visualize what's happening is to think of two lists being laid out next - * to each other and stitched together with a zipper. - * - * Contract : this method will read each element of each list exactly once, in some unspecified - * order. If it throws, it will not read any element. - * - * @param first the first list of elements - * @param second the second list of elements - * @param <T> the type of first elements - * @param <R> the type of second elements - * @return the zipped list - */ - @NonNull - public static <T, R> ArrayList<Pair<T, R>> zip(@NonNull final List<T> first, - @NonNull final List<R> second) { - final int size = first.size(); - if (size != second.size()) { - throw new IllegalArgumentException("zip : collections must be the same size"); - } - final ArrayList<Pair<T, R>> dest = new ArrayList<>(size); - for (int i = 0; i < size; ++i) { - dest.add(new Pair<>(first.get(i), second.get(i))); - } - return dest; - } - - /** - * Returns a new ArrayMap that associates each key with the value at the same index. - * - * Both lists must be the same size. - * Both keys and values may contain null. - * Keys may not contain the same value twice. - * - * Contract : this method will read each element of each list exactly once, but does not - * specify the order, except if it throws in which case the number of reads is undefined. - * - * @param keys The list of keys - * @param values The list of values - * @param <T> The type of keys - * @param <R> The type of values - * @return The associated map - */ - @NonNull - public static <T, R> ArrayMap<T, R> assoc( - @NonNull final List<T> keys, @NonNull final List<R> values) { - final int size = keys.size(); - if (size != values.size()) { - throw new IllegalArgumentException("assoc : collections must be the same size"); - } - final ArrayMap<T, R> dest = new ArrayMap<>(size); - for (int i = 0; i < size; ++i) { - final T key = keys.get(i); - if (dest.containsKey(key)) { - throw new IllegalArgumentException( - "assoc : keys may not contain the same value twice"); - } - dest.put(key, values.get(i)); - } - return dest; - } -} |