17661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir/*
27661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * Copyright (C) 2017 The Android Open Source Project
37661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir *
47661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License");
57661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * you may not use this file except in compliance with the License.
67661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * You may obtain a copy of the License at
77661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir *
87661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir *      http://www.apache.org/licenses/LICENSE-2.0
97661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir *
107661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * Unless required by applicable law or agreed to in writing, software
117661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS,
127661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * See the License for the specific language governing permissions and
147661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * limitations under the License.
157661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir */
167661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
177661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinirpackage android.support.v4.util;
187661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
197661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinirimport android.support.annotation.IntRange;
207661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinirimport android.support.annotation.NonNull;
217661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinirimport android.support.annotation.RestrictTo;
227661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinirimport android.text.TextUtils;
237661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
247661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinirimport java.util.Collection;
254328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikasimport java.util.Locale;
267661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
277661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir/**
287661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * Simple static methods to be called at the start of your own methods to verify
297661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * correct arguments and state.
307661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir *
317661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir * @hide
327661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir */
337661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
347661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinirpublic class Preconditions {
357661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static void checkArgument(boolean expression) {
367661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (!expression) {
377661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException();
387661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
397661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
407661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
417661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
427661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that an expression checking an argument is true.
437661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
447661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param expression the expression to check
457661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param errorMessage the exception message to use if the check fails; will
467661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *     be converted to a string using {@link String#valueOf(Object)}
477661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code expression} is false
487661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
497661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static void checkArgument(boolean expression, final Object errorMessage) {
507661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (!expression) {
517661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(String.valueOf(errorMessage));
527661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
537661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
547661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
557661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
567661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that an string reference passed as a parameter to the calling
577661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * method is not empty.
587661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
597661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param string an string reference
607661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the string reference that was validated
617661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code string} is empty
627661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
637661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static @NonNull <T extends CharSequence> T checkStringNotEmpty(final T string) {
647661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (TextUtils.isEmpty(string)) {
657661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException();
667661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
677661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return string;
687661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
697661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
707661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
717661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that an string reference passed as a parameter to the calling
727661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * method is not empty.
737661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
747661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param string an string reference
757661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param errorMessage the exception message to use if the check fails; will
767661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *     be converted to a string using {@link String#valueOf(Object)}
777661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the string reference that was validated
787661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code string} is empty
797661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
807661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static @NonNull <T extends CharSequence> T checkStringNotEmpty(final T string,
817661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            final Object errorMessage) {
827661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (TextUtils.isEmpty(string)) {
837661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(String.valueOf(errorMessage));
847661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
857661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return string;
867661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
877661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
887661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
897661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that an object reference passed as a parameter to the calling
907661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * method is not null.
917661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
927661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param reference an object reference
937661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the non-null reference that was validated
947661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws NullPointerException if {@code reference} is null
957661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
967661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static @NonNull <T> T checkNotNull(final T reference) {
977661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (reference == null) {
987661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new NullPointerException();
997661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
1007661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return reference;
1017661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
1027661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1037661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
1047661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that an object reference passed as a parameter to the calling
1057661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * method is not null.
1067661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1077661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param reference an object reference
1087661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param errorMessage the exception message to use if the check fails; will
1097661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *     be converted to a string using {@link String#valueOf(Object)}
1107661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the non-null reference that was validated
1117661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws NullPointerException if {@code reference} is null
1127661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
1137661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static @NonNull <T> T checkNotNull(final T reference, final Object errorMessage) {
1147661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (reference == null) {
1157661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new NullPointerException(String.valueOf(errorMessage));
1167661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
1177661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return reference;
1187661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
1197661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1207661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
1217661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures the truth of an expression involving the state of the calling
1227661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * instance, but not involving any parameters to the calling method.
1237661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1247661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param expression a boolean expression
1257661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param message exception message
1267661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalStateException if {@code expression} is false
1277661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
1287661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static void checkState(final boolean expression, String message) {
1297661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (!expression) {
1307661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalStateException(message);
1317661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
1327661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
1337661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1347661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
1357661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures the truth of an expression involving the state of the calling
1367661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * instance, but not involving any parameters to the calling method.
1377661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1387661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param expression a boolean expression
1397661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalStateException if {@code expression} is false
1407661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
1417661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static void checkState(final boolean expression) {
1427661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        checkState(expression, null);
1437661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
1447661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1457661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
1467661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Check the requested flags, throwing if any requested flags are outside
1477661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * the allowed set.
1487661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1497661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated requested flags.
1507661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
1517661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static int checkFlagsArgument(final int requestedFlags, final int allowedFlags) {
1527661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if ((requestedFlags & allowedFlags) != requestedFlags) {
1537661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException("Requested flags 0x"
1547661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                    + Integer.toHexString(requestedFlags) + ", but only 0x"
1557661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                    + Integer.toHexString(allowedFlags) + " are allowed");
1567661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
1577661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1587661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return requestedFlags;
1597661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
1607661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1617661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
1627661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that that the argument numeric value is non-negative.
1637661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1647661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a numeric int value
1657661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param errorMessage the exception message to use if the check fails
1667661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated numeric value
1677661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was negative
1687661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
1697661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static @IntRange(from = 0) int checkArgumentNonnegative(final int value,
1707661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            final String errorMessage) {
1717661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value < 0) {
1727661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(errorMessage);
1737661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
1747661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1757661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
1767661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
1777661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1787661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
1797661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that that the argument numeric value is non-negative.
1807661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1817661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a numeric int value
1827661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1837661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated numeric value
1847661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was negative
1857661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
1867661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static @IntRange(from = 0) int checkArgumentNonnegative(final int value) {
1877661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value < 0) {
1887661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException();
1897661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
1907661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1917661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
1927661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
1937661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
1947661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
1957661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that that the argument numeric value is non-negative.
1967661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
1977661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a numeric long value
1987661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated numeric value
1997661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was negative
2007661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
2017661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static long checkArgumentNonnegative(final long value) {
2027661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value < 0) {
2037661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException();
2047661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
2057661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2067661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
2077661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
2087661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2097661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
2107661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that that the argument numeric value is non-negative.
2117661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2127661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a numeric long value
2137661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param errorMessage the exception message to use if the check fails
2147661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated numeric value
2157661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was negative
2167661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
2177661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static long checkArgumentNonnegative(final long value, final String errorMessage) {
2187661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value < 0) {
2197661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(errorMessage);
2207661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
2217661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2227661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
2237661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
2247661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2257661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
2267661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that that the argument numeric value is positive.
2277661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2287661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a numeric int value
2297661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param errorMessage the exception message to use if the check fails
2307661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated numeric value
2317661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was not positive
2327661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
2337661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static int checkArgumentPositive(final int value, final String errorMessage) {
2347661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value <= 0) {
2357661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(errorMessage);
2367661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
2377661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2387661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
2397661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
2407661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2417661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
2427661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that the argument floating point value is a finite number.
2437661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2447661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * <p>A finite number is defined to be both representable (that is, not NaN) and
2457661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * not infinite (that is neither positive or negative infinity).</p>
2467661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2477661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a floating point value
2487661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails
2497661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2507661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated floating point value
2517661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2527661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was not finite
2537661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
2547661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static float checkArgumentFinite(final float value, final String valueName) {
2557661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (Float.isNaN(value)) {
2567661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(valueName + " must not be NaN");
2577661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        } else if (Float.isInfinite(value)) {
2587661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(valueName + " must not be infinite");
2597661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
2607661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2617661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
2627661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
2637661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2647661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
2657661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that the argument floating point value is within the inclusive range.
2667661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2677661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * <p>While this can be used to range check against +/- infinity, note that all NaN numbers
2687661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * will always be out of range.</p>
2697661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2707661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a floating point value
2717661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param lower the lower endpoint of the inclusive range
2727661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param upper the upper endpoint of the inclusive range
2737661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails
2747661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2757661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated floating point value
2767661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2777661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was not within the range
2787661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
2797661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static float checkArgumentInRange(float value, float lower, float upper,
2807661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            String valueName) {
2817661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (Float.isNaN(value)) {
2827661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(valueName + " must not be NaN");
2837661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        } else if (value < lower) {
2847661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(
2854328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                    String.format(Locale.US,
2867661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                            "%s is out of range of [%f, %f] (too low)", valueName, lower, upper));
2877661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        } else if (value > upper) {
2887661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(
2894328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                    String.format(Locale.US,
2907661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                            "%s is out of range of [%f, %f] (too high)", valueName, lower, upper));
2917661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
2927661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2937661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
2947661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
2957661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
2967661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
2977661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that the argument int value is within the inclusive range.
2987661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
2997661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a int value
3007661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param lower the lower endpoint of the inclusive range
3017661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param upper the upper endpoint of the inclusive range
3027661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails
3037661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3047661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated int value
3057661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3067661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was not within the range
3077661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
3087661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static int checkArgumentInRange(int value, int lower, int upper,
3097661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            String valueName) {
3107661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value < lower) {
3117661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(
3124328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                    String.format(Locale.US,
3137661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                            "%s is out of range of [%d, %d] (too low)", valueName, lower, upper));
3147661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        } else if (value > upper) {
3157661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(
3164328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                    String.format(Locale.US,
3177661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                            "%s is out of range of [%d, %d] (too high)", valueName, lower, upper));
3187661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
3197661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3207661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
3217661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
3227661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3237661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
3247661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that the argument long value is within the inclusive range.
3257661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3267661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a long value
3277661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param lower the lower endpoint of the inclusive range
3287661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param upper the upper endpoint of the inclusive range
3297661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails
3307661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3317661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated long value
3327661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3337661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if {@code value} was not within the range
3347661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
3357661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static long checkArgumentInRange(long value, long lower, long upper,
3367661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            String valueName) {
3377661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value < lower) {
3387661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(
3394328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                    String.format(Locale.US,
3407661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                            "%s is out of range of [%d, %d] (too low)", valueName, lower, upper));
3417661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        } else if (value > upper) {
3427661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(
3434328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                    String.format(Locale.US,
3447661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                            "%s is out of range of [%d, %d] (too high)", valueName, lower, upper));
3457661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
3467661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3477661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
3487661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
3497661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3507661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
3517661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that the array is not {@code null}, and none of its elements are {@code null}.
3527661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3537661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value an array of boxed objects
3547661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails
3557661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3567661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated array
3577661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3587661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws NullPointerException if the {@code value} or any of its elements were {@code null}
3597661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
3607661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static <T> T[] checkArrayElementsNotNull(final T[] value, final String valueName) {
3617661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value == null) {
3627661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new NullPointerException(valueName + " must not be null");
3637661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
3647661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3657661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        for (int i = 0; i < value.length; ++i) {
3667661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            if (value[i] == null) {
3677661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                throw new NullPointerException(
3684328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                        String.format(Locale.US, "%s[%d] must not be null", valueName, i));
3697661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            }
3707661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
3717661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3727661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
3737661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
3747661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3757661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
3767661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that the {@link Collection} is not {@code null}, and none of its elements are
3777661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * {@code null}.
3787661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3797661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a {@link Collection} of boxed objects
3807661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails
3817661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3827661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated {@link Collection}
3837661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
3847661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws NullPointerException if the {@code value} or any of its elements were {@code null}
3857661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
3867661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static @NonNull <C extends Collection<T>, T> C checkCollectionElementsNotNull(
3877661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            final C value, final String valueName) {
3887661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value == null) {
3897661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new NullPointerException(valueName + " must not be null");
3907661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
3917661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
3927661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        long ctr = 0;
3937661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        for (T elem : value) {
3947661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            if (elem == null) {
3957661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                throw new NullPointerException(
3964328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                        String.format(Locale.US, "%s[%d] must not be null", valueName, ctr));
3977661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            }
3987661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            ++ctr;
3997661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
4007661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
4017661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
4027661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
4037661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
4047661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
4057661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that the {@link Collection} is not {@code null}, and contains at least one element.
4067661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
4077661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a {@link Collection} of boxed elements.
4087661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails.
4097661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
4107661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated {@link Collection}
4117661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
4127661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws NullPointerException if the {@code value} was {@code null}
4137661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if the {@code value} was empty
4147661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
4157661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static <T> Collection<T> checkCollectionNotEmpty(final Collection<T> value,
4167661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            final String valueName) {
4177661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value == null) {
4187661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new NullPointerException(valueName + " must not be null");
4197661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
4207661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        if (value.isEmpty()) {
4217661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            throw new IllegalArgumentException(valueName + " is empty");
4227661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
4237661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
4247661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
4257661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
4267661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    /**
4277661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * Ensures that all elements in the argument floating point array are within the inclusive range
4287661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
4297661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * <p>While this can be used to range check against +/- infinity, note that all NaN numbers
4307661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * will always be out of range.</p>
4317661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
4327661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param value a floating point array of values
4337661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param lower the lower endpoint of the inclusive range
4347661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param upper the upper endpoint of the inclusive range
4357661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @param valueName the name of the argument to use if the check fails
4367661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
4377661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @return the validated floating point value
4387661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     *
4397661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws IllegalArgumentException if any of the elements in {@code value} were out of range
4407661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     * @throws NullPointerException if the {@code value} was {@code null}
4417661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir     */
4427661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    public static float[] checkArrayElementsInRange(float[] value, float lower, float upper,
4437661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            String valueName) {
4447661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        checkNotNull(value, valueName + " must not be null");
4457661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
4467661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        for (int i = 0; i < value.length; ++i) {
4477661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            float v = value[i];
4487661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
4497661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            if (Float.isNaN(v)) {
4507661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                throw new IllegalArgumentException(valueName + "[" + i + "] must not be NaN");
4517661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            } else if (v < lower) {
4527661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                throw new IllegalArgumentException(
4534328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                        String.format(Locale.US, "%s[%d] is out of range of [%f, %f] (too low)",
4547661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                                valueName, i, lower, upper));
4557661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            } else if (v > upper) {
4567661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                throw new IllegalArgumentException(
4574328b29e10111ed2f6325a740a777ed5c0eb23aaAurimas Liutikas                        String.format(Locale.US, "%s[%d] is out of range of [%f, %f] (too high)",
4587661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir                                valueName, i, lower, upper));
4597661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir            }
4607661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        }
4617661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir
4627661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir        return value;
4637661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir    }
4647661f0b5c95fefaaeb3b4af090e1f6abe56b6d23Siyamed Sinir}
465