Preconditions.java revision 97f1c854993a65b2c700426a1e3a83b23ea65337
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    /**
18697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * Ensures that the argument int value is within the inclusive range.
18797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     *
18897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param value a int value
18997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param lower the lower endpoint of the inclusive range
19097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param upper the upper endpoint of the inclusive range
19197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @param valueName the name of the argument to use if the check fails
19297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     *
19397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @return the validated int value
19497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     *
19597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     * @throws IllegalArgumentException if {@code value} was not within the range
19697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh     */
19797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh    public static int checkArgumentInRange(int value, int lower, int upper,
19897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh            String valueName) {
19997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        if (value < lower) {
20097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh            throw new IllegalArgumentException(
20197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                    String.format(
20297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                            "%s is out of range of [%d, %d] (too low)", valueName, lower, upper));
20397f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        } else if (value > upper) {
20497f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh            throw new IllegalArgumentException(
20597f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                    String.format(
20697f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh                            "%s is out of range of [%d, %d] (too high)", valueName, lower, upper));
20797f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        }
20897f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh
20997f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh        return value;
21097f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh    }
21197f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh
21297f1c854993a65b2c700426a1e3a83b23ea65337Yin-Chia Yeh    /**
213b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that the array is not {@code null}, and none if its elements are {@code null}.
214b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
215b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value an array of boxed objects
216b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
217b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
218b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated array
219b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
220b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws NullPointerException if the {@code value} or any of its elements were {@code null}
221b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
222b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static <T> T[] checkArrayElementsNotNull(final T[] value, final String valueName) {
223b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        if (value == null) {
224b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            throw new NullPointerException(valueName + " must not be null");
225b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
226b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
227b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        for (int i = 0; i < value.length; ++i) {
228b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            if (value[i] == null) {
229b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new NullPointerException(
230b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] must not be null", valueName, i));
231b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            }
232b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
233b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
234b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
235b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
236b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
237b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    /**
238b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * Ensures that all elements in the argument floating point array are within the inclusive range
239b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
240b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * <p>While this can be used to range check against +/- infinity, note that all NaN numbers
241b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * will always be out of range.</p>
242b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
243b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param value a floating point array of values
244b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param lower the lower endpoint of the inclusive range
245b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param upper the upper endpoint of the inclusive range
246b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @param valueName the name of the argument to use if the check fails
247b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
248b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @return the validated floating point value
249b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     *
250b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws IllegalArgumentException if any of the elements in {@code value} were out of range
251b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     * @throws NullPointerException if the {@code value} was {@code null}
252b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin     */
253b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    public static float[] checkArrayElementsInRange(float[] value, float lower, float upper,
254b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            String valueName) {
255b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        checkNotNull(value, valueName + " must not be null");
256b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
257b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        for (int i = 0; i < value.length; ++i) {
258b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            float v = value[i];
259b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
260b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            if (Float.isNaN(v)) {
261b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(valueName + "[" + i + "] must not be NaN");
262b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            } else if (v < lower) {
263b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(
264b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] is out of range of [%f, %f] (too low)",
265b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                                valueName, i, lower, upper));
266b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            } else if (v > upper) {
267b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                throw new IllegalArgumentException(
268b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                        String.format("%s[%d] is out of range of [%f, %f] (too high)",
269b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin                                valueName, i, lower, upper));
270b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin            }
271b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        }
272b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin
273b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin        return value;
274b3a78b2ca9655396e2d73950221d187b7e5bb3baIgor Murashkin    }
275d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey}
276