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