Preconditions.java revision b3a78b2ca9655396e2d73950221d187b7e5bb3ba
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
19d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey/**
20d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Simple static methods to be called at the start of your own methods to verify
21d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * correct arguments and state.
22d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */
23d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeypublic class Preconditions {
24d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
25d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    /**
26d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * Ensures that an object reference passed as a parameter to the calling
27d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * method is not null.
28d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     *
29d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @param reference an object reference
30d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @return the non-null reference that was validated
31d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @throws NullPointerException if {@code reference} is null
32d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     */
33b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static <T> T checkNotNull(final T reference) {
34d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        if (reference == null) {
35d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey            throw new NullPointerException();
36d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        }
37d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        return reference;
38d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    }
39d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
40d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    /**
41d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * Ensures that an object reference passed as a parameter to the calling
42d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * method is not null.
43d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     *
44d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @param reference an object reference
45d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @param errorMessage the exception message to use if the check fails; will
46d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     *     be converted to a string using {@link String#valueOf(Object)}
47d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @return the non-null reference that was validated
48d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     * @throws NullPointerException if {@code reference} is null
49d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey     */
50b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static <T> T checkNotNull(final T reference, final Object errorMessage) {
51d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        if (reference == null) {
52d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey            throw new NullPointerException(String.valueOf(errorMessage));
53d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        }
54d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey        return reference;
55d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    }
56d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey
57c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey    /**
58c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * Ensures the truth of an expression involving the state of the calling
59c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * instance, but not involving any parameters to the calling method.
60c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     *
61c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * @param expression a boolean expression
62c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     * @throws IllegalStateException if {@code expression} is false
63c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey     */
64b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static void checkState(final boolean expression) {
65c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey        if (!expression) {
66c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey            throw new IllegalStateException();
67c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey        }
68c268f0b19efd0b6c6c89c21be0893787f3cc9cf7Jeff Sharkey    }
69ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey
70ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey    /**
71ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey     * Check the requested flags, throwing if any requested flags are outside
72ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey     * the allowed set.
73ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey     */
74b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static void checkFlagsArgument(final int requestedFlags, final int allowedFlags) {
75ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey        if ((requestedFlags & allowedFlags) != requestedFlags) {
76ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey            throw new IllegalArgumentException("Requested flags 0x"
77ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey                    + Integer.toHexString(requestedFlags) + ", but only 0x"
78ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey                    + Integer.toHexString(allowedFlags) + " are allowed");
79ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey        }
80ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627fJeff Sharkey    }
81b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
82b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
83b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that that the argument numeric value is non-negative.
84b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
85b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a numeric int value
86b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param errorMessage the exception message to use if the check fails
87b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated numeric value
88b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was negative
89b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
90b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static int checkArgumentNonnegative(final int value, final String errorMessage) {
91b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value < 0) {
92b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(errorMessage);
93b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
94b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
95b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
96b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
97b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
98b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
99b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that that the argument numeric value is non-negative.
100b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
101b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a numeric long value
102b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param errorMessage the exception message to use if the check fails
103b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated numeric value
104b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was negative
105b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
106b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static long checkArgumentNonnegative(final long value, final String errorMessage) {
107b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value < 0) {
108b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(errorMessage);
109b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
110b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
111b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
112b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
113b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
114b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
115b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that that the argument numeric value is positive.
116b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
117b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a numeric int value
118b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param errorMessage the exception message to use if the check fails
119b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated numeric value
120b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was not positive
121b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
122b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static int checkArgumentPositive(final int value, final String errorMessage) {
123b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value <= 0) {
124b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(errorMessage);
125b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
126b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
127b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
128b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
129b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
130b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
131b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that the argument floating point value is a finite number.
132b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
133b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>A finite number is defined to be both representable (that is, not NaN) and
134b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * not infinite (that is neither positive or negative infinity).</p>
135b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
136b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a floating point value
137b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
138b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
139b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated floating point value
140b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
141b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was not finite
142b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
143b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static float checkArgumentFinite(final float value, final String valueName) {
144b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (Float.isNaN(value)) {
145b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(valueName + " must not be NaN");
146b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        } else if (Float.isInfinite(value)) {
147b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(valueName + " must not be infinite");
148b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
149b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
150b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
151b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
152b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
153b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
154b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that the argument floating point value is within the inclusive range.
155b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
156b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>While this can be used to range check against +/- infinity, note that all NaN numbers
157b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * will always be out of range.</p>
158b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
159b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a floating point value
160b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param lower the lower endpoint of the inclusive range
161b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param upper the upper endpoint of the inclusive range
162b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
163b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
164b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated floating point value
165b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
166b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if {@code value} was not within the range
167b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
168b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static float checkArgumentInRange(float value, float lower, float upper,
169b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            String valueName) {
170b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (Float.isNaN(value)) {
171b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(valueName + " must not be NaN");
172b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        } else if (value < lower) {
173b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(
174b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                    String.format(
175b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                            "%s is out of range of [%f, %f] (too low)", valueName, lower, upper));
176b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        } else if (value > upper) {
177b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new IllegalArgumentException(
178b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                    String.format(
179b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                            "%s is out of range of [%f, %f] (too high)", valueName, lower, upper));
180b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
181b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
182b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
183b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
184b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
185b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
186b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that the array is not {@code null}, and none if its elements are {@code null}.
187b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
188b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value an array of boxed objects
189b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
190b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
191b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated array
192b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
193b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws NullPointerException if the {@code value} or any of its elements were {@code null}
194b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
195b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static <T> T[] checkArrayElementsNotNull(final T[] value, final String valueName) {
196b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value == null) {
197b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new NullPointerException(valueName + " must not be null");
198b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
199b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
200b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        for (int i = 0; i < value.length; ++i) {
201b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            if (value[i] == null) {
202b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new NullPointerException(
203b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] must not be null", valueName, i));
204b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            }
205b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
206b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
207b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
208b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
209b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
210b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
211b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that all elements in the argument floating point array are within the inclusive range
212b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
213b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>While this can be used to range check against +/- infinity, note that all NaN numbers
214b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * will always be out of range.</p>
215b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
216b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a floating point array of values
217b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param lower the lower endpoint of the inclusive range
218b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param upper the upper endpoint of the inclusive range
219b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
220b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
221b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated floating point value
222b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
223b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if any of the elements in {@code value} were out of range
224b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws NullPointerException if the {@code value} was {@code null}
225b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
226b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static float[] checkArrayElementsInRange(float[] value, float lower, float upper,
227b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            String valueName) {
228b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        checkNotNull(value, valueName + " must not be null");
229b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
230b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        for (int i = 0; i < value.length; ++i) {
231b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            float v = value[i];
232b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
233b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            if (Float.isNaN(v)) {
234b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(valueName + "[" + i + "] must not be NaN");
235b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            } else if (v < lower) {
236b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(
237b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] is out of range of [%f, %f] (too low)",
238b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                                valueName, i, lower, upper));
239b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            } else if (v > upper) {
240b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(
241b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] is out of range of [%f, %f] (too high)",
242b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                                valueName, i, lower, upper));
243b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            }
244b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
245b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
246b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
247b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
248d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey}
249