1d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey/*
2d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project
3d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey *
4d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * you may not use this file except in compliance with the License.
6d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * You may obtain a copy of the License at
7d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey *
8d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey *
10d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * See the License for the specific language governing permissions and
14d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * limitations under the License.
15d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */
16d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
17d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeypackage com.android.internal.util;
18d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
19c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmannimport android.annotation.IntRange;
20c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmannimport android.annotation.NonNull;
21c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmannimport android.text.TextUtils;
22c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann
2391838ded36131525312739c0929913b215519c2aRuben Brunkimport java.util.Collection;
2491838ded36131525312739c0929913b215519c2aRuben Brunk
25d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey/**
26d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Simple static methods to be called at the start of your own methods to verify
27d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * correct arguments and state.
28d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */
29d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeypublic class Preconditions {
30d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
31620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    public static void checkArgument(boolean expression) {
32620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        if (!expression) {
33620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey            throw new IllegalArgumentException();
34620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey        }
35620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey    }
36620b32b316fd4f1bab4eef55ec8802d14a55e7ddJeff Sharkey
37d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    /**
38d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann     * Ensures that an expression checking an argument is true.
39d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann     *
40d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann     * @param expression the expression to check
41d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann     * @param errorMessage the exception message to use if the check fails; will
42d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann     *     be converted to a string using {@link String#valueOf(Object)}
43d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann     * @throws IllegalArgumentException if {@code expression} is false
44d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann     */
45d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann    public static void checkArgument(boolean expression, final Object errorMessage) {
46d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann        if (!expression) {
47d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann            throw new IllegalArgumentException(String.valueOf(errorMessage));
48d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann        }
49d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann    }
50d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann
51d74d1e549168ba521e8009961b76e8718be37aa1Philip P. Moltmann    /**
52cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     * Ensures that an expression checking an argument is true.
53cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     *
54cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     * @param expression the expression to check
55cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     * @param messageTemplate a printf-style message template to use if the check fails; will
56cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     *     be converted to a string using {@link String#format(String, Object...)}
57cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     * @param messageArgs arguments for {@code messageTemplate}
58cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     * @throws IllegalArgumentException if {@code expression} is false
59cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla     */
60cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla    public static void checkArgument(boolean expression,
61cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla            final String messageTemplate,
62cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla            final Object... messageArgs) {
63cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla        if (!expression) {
64cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla            throw new IllegalArgumentException(String.format(messageTemplate, messageArgs));
65cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla        }
66cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla    }
67cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla
68cf00adebec29d4cdbec5bc0f004b26a09327c236Eugene Susla    /**
69c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * Ensures that an string reference passed as a parameter to the calling
70c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * method is not empty.
71c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     *
72c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @param string an string reference
73c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @return the string reference that was validated
74c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     * @throws IllegalArgumentException if {@code string} is empty
75c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann     */
769dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public static @NonNull <T extends CharSequence> T checkStringNotEmpty(final T string) {
7776d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann        if (TextUtils.isEmpty(string)) {
7876d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann            throw new IllegalArgumentException();
7976d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann        }
8076d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann        return string;
8176d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann    }
8276d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann
8376d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann    /**
8476d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     * Ensures that an string reference passed as a parameter to the calling
8576d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     * method is not empty.
8676d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     *
8776d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     * @param string an string reference
8876d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     * @param errorMessage the exception message to use if the check fails; will
8976d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     *     be converted to a string using {@link String#valueOf(Object)}
9076d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     * @return the string reference that was validated
9176d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     * @throws IllegalArgumentException if {@code string} is empty
9276d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann     */
939dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public static @NonNull <T extends CharSequence> T checkStringNotEmpty(final T string,
94c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            final Object errorMessage) {
95c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        if (TextUtils.isEmpty(string)) {
96c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            throw new IllegalArgumentException(String.valueOf(errorMessage));
97c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        }
98c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann        return string;
99c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    }
100c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann
101c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    /**
102d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * Ensures that an object reference passed as a parameter to the calling
103d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * method is not null.
104d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     *
105d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @param reference an object reference
106d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @return the non-null reference that was validated
107d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @throws NullPointerException if {@code reference} is null
108d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     */
109c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    public static @NonNull <T> T checkNotNull(final T reference) {
110d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        if (reference == null) {
111d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey            throw new NullPointerException();
112d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        }
113d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        return reference;
114d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    }
115d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
116d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    /**
117d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * Ensures that an object reference passed as a parameter to the calling
118d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * method is not null.
119d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     *
120d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @param reference an object reference
121d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @param errorMessage the exception message to use if the check fails; will
122d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     *     be converted to a string using {@link String#valueOf(Object)}
123d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @return the non-null reference that was validated
124d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @throws NullPointerException if {@code reference} is null
125d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     */
126c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    public static @NonNull <T> T checkNotNull(final T reference, final Object errorMessage) {
127d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        if (reference == null) {
128d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey            throw new NullPointerException(String.valueOf(errorMessage));
129d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        }
130d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        return reference;
131d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    }
132d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
133c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey    /**
134adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     * Ensures that an object reference passed as a parameter to the calling
135adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     * method is not null.
136adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     *
137adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     * @param reference an object reference
138adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     * @param messageTemplate a printf-style message template to use if the check fails; will
139adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     *     be converted to a string using {@link String#format(String, Object...)}
140adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     * @param messageArgs arguments for {@code messageTemplate}
141adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     * @return the non-null reference that was validated
142adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     * @throws NullPointerException if {@code reference} is null
143adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla     */
144adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla    public static @NonNull <T> T checkNotNull(final T reference,
145adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla            final String messageTemplate,
146adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla            final Object... messageArgs) {
147adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla        if (reference == null) {
148adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla            throw new NullPointerException(String.format(messageTemplate, messageArgs));
149adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla        }
150adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla        return reference;
151adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla    }
152adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla
153adce09b9a48b1d25c97fe7d3c731de1862f0487bEugene Susla    /**
154c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * Ensures the truth of an expression involving the state of the calling
155c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * instance, but not involving any parameters to the calling method.
156c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     *
157c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * @param expression a boolean expression
1581a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki     * @param message exception message
159c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * @throws IllegalStateException if {@code expression} is false
160c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     */
1611a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki    public static void checkState(final boolean expression, String message) {
162c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey        if (!expression) {
1631a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki            throw new IllegalStateException(message);
164c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey        }
165c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey    }
166ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey
167ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey    /**
1681a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki     * Ensures the truth of an expression involving the state of the calling
1691a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki     * instance, but not involving any parameters to the calling method.
1701a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki     *
1711a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki     * @param expression a boolean expression
1721a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki     * @throws IllegalStateException if {@code expression} is false
1731a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki     */
1741a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki    public static void checkState(final boolean expression) {
1751a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki        checkState(expression, null);
1761a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki    }
1771a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki
1781a5ee776ee51ae6fba30c8f3b33e26eb7f9dedc6Makoto Onuki    /**
179ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey     * Check the requested flags, throwing if any requested flags are outside
180ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey     * the allowed set.
1819dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
1829dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @return the validated requested flags.
183ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey     */
1849dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public static int checkFlagsArgument(final int requestedFlags, final int allowedFlags) {
185ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey        if ((requestedFlags & allowedFlags) != requestedFlags) {
186ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey            throw new IllegalArgumentException("Requested flags 0x"
187ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey                    + Integer.toHexString(requestedFlags) + ", but only 0x"
188ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey                    + Integer.toHexString(allowedFlags) + " are allowed");
189ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey        }
1909dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
1919dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        return requestedFlags;
192ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey    }
193b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
194b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
195b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that that the argument numeric value is non-negative.
196b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
197b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a numeric int value
198b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param errorMessage the exception message to use if the check fails
199b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated numeric value
200b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was negative
201b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
202c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann    public static @IntRange(from = 0) int checkArgumentNonnegative(final int value,
203c2ad22663ba8cbd0ceb35e760c5f3c4084fb5033Philip P. Moltmann            final String errorMessage) {
204b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value < 0) {
205b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(errorMessage);
206b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
207b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
208b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
209b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
210b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
211b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
212b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that that the argument numeric value is non-negative.
213b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
2149dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @param value a numeric int value
2159dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
2169dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @return the validated numeric value
2179dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * @throws IllegalArgumentException if {@code value} was negative
2189dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     */
2199dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    public static @IntRange(from = 0) int checkArgumentNonnegative(final int value) {
2209dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        if (value < 0) {
2219dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann            throw new IllegalArgumentException();
2229dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        }
2239dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
2249dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann        return value;
2259dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    }
2269dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann
2279dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann    /**
2289dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     * Ensures that that the argument numeric value is non-negative.
2299dcb86a48d73f399fb1b5c020005d76d350eeac2Philip P. Moltmann     *
230b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a numeric long value
2314723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann     * @return the validated numeric value
2324723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann     * @throws IllegalArgumentException if {@code value} was negative
2334723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann     */
2344723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann    public static long checkArgumentNonnegative(final long value) {
2354723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann        if (value < 0) {
2364723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann            throw new IllegalArgumentException();
2374723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann        }
2384723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann
2394723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann        return value;
2404723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann    }
2414723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann
2424723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann    /**
2434723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann     * Ensures that that the argument numeric value is non-negative.
2444723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann     *
2454723f36d3e93ce4585233de31c72143a46b657f7Philip P. Moltmann     * @param value a numeric long value
246b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param errorMessage the exception message to use if the check fails
247b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated numeric value
248b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was negative
249b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
250b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static long checkArgumentNonnegative(final long value, final String errorMessage) {
251b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value < 0) {
252b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(errorMessage);
253b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
254b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
255b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
256b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
257b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
258b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
259b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that that the argument numeric value is positive.
260b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
261b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a numeric int value
262b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param errorMessage the exception message to use if the check fails
263b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated numeric value
264b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was not positive
265b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
266b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static int checkArgumentPositive(final int value, final String errorMessage) {
267b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value <= 0) {
268b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(errorMessage);
269b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
270b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
271b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
272b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
273b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
274b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
275b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that the argument floating point value is a finite number.
276b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
277b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>A finite number is defined to be both representable (that is, not NaN) and
278b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * not infinite (that is neither positive or negative infinity).</p>
279b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
280b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a floating point value
281b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
282b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
283b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated floating point value
284b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
285b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was not finite
286b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
287b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static float checkArgumentFinite(final float value, final String valueName) {
288b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (Float.isNaN(value)) {
289b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(valueName + " must not be NaN");
290b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        } else if (Float.isInfinite(value)) {
291b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(valueName + " must not be infinite");
292b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
293b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
294b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
295b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
296b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
297b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
298b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that the argument floating point value is within the inclusive range.
299b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
300b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>While this can be used to range check against +/- infinity, note that all NaN numbers
301b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * will always be out of range.</p>
302b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
303b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a floating point value
304b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param lower the lower endpoint of the inclusive range
305b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param upper the upper endpoint of the inclusive range
306b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
307b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
308b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated floating point value
309b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
310b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was not within the range
311b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
312b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static float checkArgumentInRange(float value, float lower, float upper,
313b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            String valueName) {
314b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (Float.isNaN(value)) {
315b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(valueName + " must not be NaN");
316b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        } else if (value < lower) {
317b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(
318b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                    String.format(
319b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                            "%s is out of range of [%f, %f] (too low)", valueName, lower, upper));
320b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        } else if (value > upper) {
321b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(
322b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                    String.format(
323b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                            "%s is out of range of [%f, %f] (too high)", valueName, lower, upper));
324b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
325b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
326b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
327b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
328b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
329b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
33097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * Ensures that the argument int value is within the inclusive range.
33197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     *
33297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param value a int value
33397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param lower the lower endpoint of the inclusive range
33497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param upper the upper endpoint of the inclusive range
33597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param valueName the name of the argument to use if the check fails
33697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     *
33797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @return the validated int value
33897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     *
33997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @throws IllegalArgumentException if {@code value} was not within the range
34097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     */
34197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh    public static int checkArgumentInRange(int value, int lower, int upper,
34297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh            String valueName) {
34397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        if (value < lower) {
34497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh            throw new IllegalArgumentException(
34597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                    String.format(
34697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                            "%s is out of range of [%d, %d] (too low)", valueName, lower, upper));
34797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        } else if (value > upper) {
34897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh            throw new IllegalArgumentException(
34997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                    String.format(
35097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                            "%s is out of range of [%d, %d] (too high)", valueName, lower, upper));
35197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        }
35297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh
35397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        return value;
35497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh    }
35597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh
35697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh    /**
3572dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     * Ensures that the argument long value is within the inclusive range.
3582dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     *
3592dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     * @param value a long value
3602dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     * @param lower the lower endpoint of the inclusive range
3612dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     * @param upper the upper endpoint of the inclusive range
3622dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     * @param valueName the name of the argument to use if the check fails
3632dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     *
3642dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     * @return the validated long value
3652dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     *
3662dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     * @throws IllegalArgumentException if {@code value} was not within the range
3672dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono     */
3682dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono    public static long checkArgumentInRange(long value, long lower, long upper,
3692dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono            String valueName) {
3702dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono        if (value < lower) {
3712dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono            throw new IllegalArgumentException(
3722dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono                    String.format(
3732dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono                            "%s is out of range of [%d, %d] (too low)", valueName, lower, upper));
3742dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono        } else if (value > upper) {
3752dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono            throw new IllegalArgumentException(
3762dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono                    String.format(
3772dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono                            "%s is out of range of [%d, %d] (too high)", valueName, lower, upper));
3782dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono        }
3792dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono
3802dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono        return value;
3812dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono    }
3822dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono
3832dd48256e9657b013dd6fa0ca86d1d7c7c730428Daichi Hirono    /**
38491838ded36131525312739c0929913b215519c2aRuben Brunk     * Ensures that the array is not {@code null}, and none of its elements are {@code null}.
385b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
386b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value an array of boxed objects
387b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
388b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
389b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated array
390b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
391b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws NullPointerException if the {@code value} or any of its elements were {@code null}
392b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
393b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static <T> T[] checkArrayElementsNotNull(final T[] value, final String valueName) {
394b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value == null) {
395b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new NullPointerException(valueName + " must not be null");
396b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
397b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
398b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        for (int i = 0; i < value.length; ++i) {
399b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            if (value[i] == null) {
400b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new NullPointerException(
401b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] must not be null", valueName, i));
402b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            }
403b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
404b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
405b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
406b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
407b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
408b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
40991838ded36131525312739c0929913b215519c2aRuben Brunk     * Ensures that the {@link Collection} is not {@code null}, and none of its elements are
41091838ded36131525312739c0929913b215519c2aRuben Brunk     * {@code null}.
41191838ded36131525312739c0929913b215519c2aRuben Brunk     *
41291838ded36131525312739c0929913b215519c2aRuben Brunk     * @param value a {@link Collection} of boxed objects
41391838ded36131525312739c0929913b215519c2aRuben Brunk     * @param valueName the name of the argument to use if the check fails
41491838ded36131525312739c0929913b215519c2aRuben Brunk     *
41591838ded36131525312739c0929913b215519c2aRuben Brunk     * @return the validated {@link Collection}
41691838ded36131525312739c0929913b215519c2aRuben Brunk     *
41791838ded36131525312739c0929913b215519c2aRuben Brunk     * @throws NullPointerException if the {@code value} or any of its elements were {@code null}
41891838ded36131525312739c0929913b215519c2aRuben Brunk     */
41976d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann    public static @NonNull <C extends Collection<T>, T> C checkCollectionElementsNotNull(
42076d7e3ee70c4299b22b1a03505d2b4f108716c75Philip P. Moltmann            final C value, final String valueName) {
42191838ded36131525312739c0929913b215519c2aRuben Brunk        if (value == null) {
42291838ded36131525312739c0929913b215519c2aRuben Brunk            throw new NullPointerException(valueName + " must not be null");
42391838ded36131525312739c0929913b215519c2aRuben Brunk        }
42491838ded36131525312739c0929913b215519c2aRuben Brunk
42591838ded36131525312739c0929913b215519c2aRuben Brunk        long ctr = 0;
42691838ded36131525312739c0929913b215519c2aRuben Brunk        for (T elem : value) {
42791838ded36131525312739c0929913b215519c2aRuben Brunk            if (elem == null) {
42891838ded36131525312739c0929913b215519c2aRuben Brunk                throw new NullPointerException(
42991838ded36131525312739c0929913b215519c2aRuben Brunk                        String.format("%s[%d] must not be null", valueName, ctr));
43091838ded36131525312739c0929913b215519c2aRuben Brunk            }
43191838ded36131525312739c0929913b215519c2aRuben Brunk            ++ctr;
43291838ded36131525312739c0929913b215519c2aRuben Brunk        }
43391838ded36131525312739c0929913b215519c2aRuben Brunk
43491838ded36131525312739c0929913b215519c2aRuben Brunk        return value;
43591838ded36131525312739c0929913b215519c2aRuben Brunk    }
43691838ded36131525312739c0929913b215519c2aRuben Brunk
43791838ded36131525312739c0929913b215519c2aRuben Brunk    /**
43891838ded36131525312739c0929913b215519c2aRuben Brunk     * Ensures that the {@link Collection} is not {@code null}, and contains at least one element.
43991838ded36131525312739c0929913b215519c2aRuben Brunk     *
44091838ded36131525312739c0929913b215519c2aRuben Brunk     * @param value a {@link Collection} of boxed elements.
44191838ded36131525312739c0929913b215519c2aRuben Brunk     * @param valueName the name of the argument to use if the check fails.
44291838ded36131525312739c0929913b215519c2aRuben Brunk
44391838ded36131525312739c0929913b215519c2aRuben Brunk     * @return the validated {@link Collection}
44491838ded36131525312739c0929913b215519c2aRuben Brunk     *
44591838ded36131525312739c0929913b215519c2aRuben Brunk     * @throws NullPointerException if the {@code value} was {@code null}
44691838ded36131525312739c0929913b215519c2aRuben Brunk     * @throws IllegalArgumentException if the {@code value} was empty
44791838ded36131525312739c0929913b215519c2aRuben Brunk     */
44891838ded36131525312739c0929913b215519c2aRuben Brunk    public static <T> Collection<T> checkCollectionNotEmpty(final Collection<T> value,
44991838ded36131525312739c0929913b215519c2aRuben Brunk            final String valueName) {
45091838ded36131525312739c0929913b215519c2aRuben Brunk        if (value == null) {
45191838ded36131525312739c0929913b215519c2aRuben Brunk            throw new NullPointerException(valueName + " must not be null");
45291838ded36131525312739c0929913b215519c2aRuben Brunk        }
45391838ded36131525312739c0929913b215519c2aRuben Brunk        if (value.isEmpty()) {
45491838ded36131525312739c0929913b215519c2aRuben Brunk            throw new IllegalArgumentException(valueName + " is empty");
45591838ded36131525312739c0929913b215519c2aRuben Brunk        }
45691838ded36131525312739c0929913b215519c2aRuben Brunk        return value;
45791838ded36131525312739c0929913b215519c2aRuben Brunk    }
45891838ded36131525312739c0929913b215519c2aRuben Brunk
45991838ded36131525312739c0929913b215519c2aRuben Brunk    /**
460b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that all elements in the argument floating point array are within the inclusive range
461b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
462b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>While this can be used to range check against +/- infinity, note that all NaN numbers
463b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * will always be out of range.</p>
464b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
465b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a floating point array of values
466b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param lower the lower endpoint of the inclusive range
467b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param upper the upper endpoint of the inclusive range
468b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
469b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
470b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated floating point value
471b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
472b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if any of the elements in {@code value} were out of range
473b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws NullPointerException if the {@code value} was {@code null}
474b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
475b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static float[] checkArrayElementsInRange(float[] value, float lower, float upper,
476b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            String valueName) {
477b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        checkNotNull(value, valueName + " must not be null");
478b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
479b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        for (int i = 0; i < value.length; ++i) {
480b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            float v = value[i];
481b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
482b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            if (Float.isNaN(v)) {
483b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(valueName + "[" + i + "] must not be NaN");
484b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            } else if (v < lower) {
485b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(
486b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] is out of range of [%f, %f] (too low)",
487b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                                valueName, i, lower, upper));
488b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            } else if (v > upper) {
489b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(
490b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] is out of range of [%f, %f] (too high)",
491b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                                valueName, i, lower, upper));
492b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            }
493b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
494b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
495b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
496b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
497d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey}
498