message: Add checkState and checkElementIndex in SupportPreconditions
diff: @@ -108,6 +108,79 @@ public final class SupportPreconditions {
  }
  }
  + /**
  + * Ensures that {@code index} specifies a valid <i>element</i> in an array, list or string of size
  + * {@code size}. An element index may range from zero, inclusive, to {@code size}, exclusive.
  + *
  + * @param index a user-supplied index identifying an element of an array, list or string
  + * @param size the size of that array, list or string
  + * @return the value of {@code index}
  + * @throws IndexOutOfBoundsException if {@code index} is negative or is not less than {@code size}
  + * @throws IllegalArgumentException if {@code size} is negative
  + */
  + public static int checkElementIndex(int index, int size) {
  + return checkElementIndex(index, size, "index");
  + }
  +
  + /**
  + * Ensures that {@code index} specifies a valid <i>element</i> in an array, list or string of size
  + * {@code size}. An element index may range from zero, inclusive, to {@code size}, exclusive.
  + *
  + * @param index a user-supplied index identifying an element of an array, list or string
  + * @param size the size of that array, list or string
  + * @param desc the text to use to describe this index in an error message
  + * @return the value of {@code index}
  + * @throws IndexOutOfBoundsException if {@code index} is negative or is not less than {@code size}
  + * @throws IllegalArgumentException if {@code size} is negative
  + */
  + public static int checkElementIndex(int index, int size, @Nullable String desc) {
  + // Carefully optimized for execution by hotspot (explanatory comment above)
  + if (index < 0 || index >= size) {
  + throw new IndexOutOfBoundsException(badElementIndex(index, size, desc));
  + }
  + return index;
  + }
  +
  + /**
  + * Ensures the truth of an expression involving the state of the calling instance, but not
  + * involving any parameters to the calling method.
  + *
  + * @param expression a boolean expression
  + * @throws IllegalStateException if {@code expression} is false
  + * @see Verify#verify Verify.verify()
  + */
  + public static void checkState(boolean expression) {
  + if (!expression) {
  + throw new IllegalStateException();
  + }
  + }
  +
  + /**
  + * Ensures the truth of an expression involving the state of the calling instance, but not
  + * involving any parameters to the calling method.
  + *
  + * @param expression a boolean expression
  + * @param errorMessage the exception message to use if the check fails; will be converted to a
  + * string using {@link String#valueOf(Object)}
  + * @throws IllegalStateException if {@code expression} is false
  + * @see Verify#verify Verify.verify()
  + */
  + public static void checkState(boolean expression, @Nullable Object errorMessage) {
  + if (!expression) {
  + throw new IllegalStateException(String.valueOf(errorMessage));
  + }
  + }
  +
  + private static String badElementIndex(int index, int size, @Nullable String desc) {
  + if (index < 0) {
  + return String.format("%s (%s) must not be negative", desc, index);
  + } else if (size < 0) {
  + throw new IllegalArgumentException("negative size: " + size);
  + } else { // index >= size
  + return String.format("%s (%s) must be less than size (%s)", desc, index, size);
  + }
  + }
  +
  private SupportPreconditions() {
  throw new AssertionError("SupportPreconditions is Uninstantiable.");
  }
  