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