/* * Copyright (C) 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.util; import static com.android.internal.util.Preconditions.*; import android.hardware.camera2.utils.HashCodeHelpers; /** * Immutable class for describing the range of two numeric values. *

* A range (or "interval") defines the inclusive boundaries around a contiguous span of * values of some {@link Comparable} type; for example, * "integers from 1 to 100 inclusive." *

*

* All ranges are bounded, and the left side of the range is always {@code >=} * the right side of the range. *

* *

Although the implementation itself is immutable, there is no restriction that objects * stored must also be immutable. If mutable objects are stored here, then the range * effectively becomes mutable.

*/ public final class Range> { /** * Create a new immutable range. * *

* The endpoints are {@code [lower, upper]}; that * is the range is bounded. {@code lower} must be {@link Comparable#compareTo lesser or equal} * to {@code upper}. *

* * @param lower The lower endpoint (inclusive) * @param upper The upper endpoint (inclusive) * * @throws NullPointerException if {@code lower} or {@code upper} is {@code null} */ public Range(final T lower, final T upper) { mLower = checkNotNull(lower, "lower must not be null"); mUpper = checkNotNull(upper, "upper must not be null"); if (lower.compareTo(upper) > 0) { throw new IllegalArgumentException("lower must be less than or equal to upper"); } } /** * Create a new immutable range, with the argument types inferred. * *

* The endpoints are {@code [lower, upper]}; that * is the range is bounded. {@code lower} must be {@link Comparable#compareTo lesser or equal} * to {@code upper}. *

* * @param lower The lower endpoint (inclusive) * @param upper The upper endpoint (inclusive) * * @throws NullPointerException if {@code lower} or {@code upper} is {@code null} */ public static > Range create(final T lower, final T upper) { return new Range(lower, upper); } /** * Get the lower endpoint. * * @return a non-{@code null} {@code T} reference */ public T getLower() { return mLower; } /** * Get the upper endpoint. * * @return a non-{@code null} {@code T} reference */ public T getUpper() { return mUpper; } /** * Compare two ranges for equality. * *

A range is considered equal if and only if both the lower and upper endpoints * are also equal.

* * @return {@code true} if the ranges are equal, {@code false} otherwise */ @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (obj instanceof Range) { @SuppressWarnings("rawtypes") final Range other = (Range) obj; return mLower.equals(other.mLower) && mUpper.equals(other.mUpper); } return false; } /** * Return the range as a string representation {@code "[lower, upper]"}. * * @return string representation of the range */ @Override public String toString() { return String.format("[%s, %s]", mLower, mUpper); } /** * {@inheritDoc} */ @Override public int hashCode() { return HashCodeHelpers.hashCode(mLower, mUpper); } private final T mLower; private final T mUpper; };