11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2009 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Static methods pertaining to {@link Range} instances.  Each of the
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link Range nine types of ranges} can be constructed with a corresponding
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * factory method:
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dl>
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code (a..b)}
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #open}
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code [a..b]}
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #closed}
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code [a..b)}
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #closedOpen}
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code (a..b]}
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #openClosed}
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code (a..+∞)}
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #greaterThan}
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code [a..+∞)}
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #atLeast}
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code (-∞..b)}
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #lessThan}
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code (-∞..b]}
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #atMost}
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>{@code (-∞..+∞)}
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #all}
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </dl>
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>Additionally, {@link Range} instances can be constructed by passing the
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link BoundType bound types} explicitly.
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dl>
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>Bounded on both ends
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #range}
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>Unbounded on top ({@code (a..+∞)} or {@code (a..+∞)})
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #downTo}
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dt>Unbounded on bottom ({@code (-∞..b)} or {@code (-∞..b]})
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <dd>{@link #upTo}
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * </dl>
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Gregory Kick
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic final class Ranges {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private Ranges() {}
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  static <C extends Comparable<?>> Range<C> create(
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Cut<C> lowerBound, Cut<C> upperBound) {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Range<C>(lowerBound, upperBound);
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values strictly greater than {@code
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * lower} and strictly less than {@code upper}.
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code lower} is greater than <i>or
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     equal to</i> {@code upper}
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> open(C lower, C upper) {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.aboveValue(lower), Cut.belowValue(upper));
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values greater than or equal to
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code lower} and less than or equal to {@code upper}.
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code lower} is greater than {@code
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     upper}
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> closed(C lower, C upper) {
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.belowValue(lower), Cut.aboveValue(upper));
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values greater than or equal to
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code lower} and strictly less than {@code upper}.
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code lower} is greater than {@code
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     upper}
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> closedOpen(
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      C lower, C upper) {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.belowValue(lower), Cut.belowValue(upper));
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values strictly greater than {@code
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * lower} and less than or equal to {@code upper}.
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code lower} is greater than {@code
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     upper}
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> openClosed(
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      C lower, C upper) {
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.aboveValue(lower), Cut.aboveValue(upper));
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains any value from {@code lower} to {@code
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * upper}, where each endpoint may be either inclusive (closed) or exclusive
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * (open).
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code lower} is greater than {@code
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     upper}
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> range(
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      C lower, BoundType lowerType, C upper, BoundType upperType) {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(lowerType);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(upperType);
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<C> lowerBound = (lowerType == BoundType.OPEN)
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ? Cut.aboveValue(lower)
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        : Cut.belowValue(lower);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Cut<C> upperBound = (upperType == BoundType.OPEN)
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ? Cut.belowValue(upper)
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        : Cut.aboveValue(upper);
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(lowerBound, upperBound);
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values strictly less than {@code
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * endpoint}.
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> lessThan(C endpoint) {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.<C>belowAll(), Cut.belowValue(endpoint));
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values less than or equal to
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code endpoint}.
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> atMost(C endpoint) {
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.<C>belowAll(), Cut.aboveValue(endpoint));
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range with no lower bound up to the given endpoint, which may be
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * either inclusive (closed) or exclusive (open).
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> upTo(
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      C endpoint, BoundType boundType) {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    switch (boundType) {
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case OPEN:
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return lessThan(endpoint);
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case CLOSED:
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return atMost(endpoint);
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      default:
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        throw new AssertionError();
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values strictly greater than {@code
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * endpoint}.
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> greaterThan(C endpoint) {
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.aboveValue(endpoint), Cut.<C>aboveAll());
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that contains all values greater than or equal to
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code endpoint}.
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> atLeast(C endpoint) {
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.belowValue(endpoint), Cut.<C>aboveAll());
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range from the given endpoint, which may be either inclusive
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * (closed) or exclusive (open), with no upper bound.
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> downTo(
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      C endpoint, BoundType boundType) {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    switch (boundType) {
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case OPEN:
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return greaterThan(endpoint);
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      case CLOSED:
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return atLeast(endpoint);
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      default:
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        throw new AssertionError();
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Returns a range that contains every value of type {@code C}. */
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> all() {
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return create(Cut.<C>belowAll(), Cut.<C>aboveAll());
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a range that {@linkplain Range#contains(Comparable) contains} only
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * the given value. The returned range is {@linkplain BoundType#CLOSED closed}
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * on both ends.
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> singleton(C value) {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return closed(value, value);
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the minimal range that
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@linkplain Range#contains(Comparable) contains} all of the given values.
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * The returned range is {@linkplain BoundType#CLOSED closed} on both ends.
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws ClassCastException if the parameters are not <i>mutually
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *     comparable</i>
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NoSuchElementException if {@code values} is empty
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NullPointerException if any of {@code values} is null
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static <C extends Comparable<?>> Range<C> encloseAll(
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterable<C> values) {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(values);
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (values instanceof ContiguousSet) {
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ((ContiguousSet<C>) values).range();
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<C> valueIterator = values.iterator();
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    C min = checkNotNull(valueIterator.next());
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    C max = min;
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    while (valueIterator.hasNext()) {
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      C value = checkNotNull(valueIterator.next());
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      min = Ordering.natural().min(min, value);
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      max = Ordering.natural().max(max, value);
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return closed(min, max);
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
252