11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors 31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0 81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the License 101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * or implied. See the License for the specific language governing permissions and limitations under 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * the License. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert*/ 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect; 151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible; 171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible; 181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException; 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * An empty contiguous set. 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Gregory Kick 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin@SuppressWarnings("unchecked") // allow ungenerified Comparable types 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertfinal class EmptyContiguousSet<C extends Comparable> extends ContiguousSet<C> { 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert EmptyContiguousSet(DiscreteDomain<C> domain) { 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(domain); 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public C first() { 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new NoSuchElementException(); 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public C last() { 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new NoSuchElementException(); 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int size() { 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 0; 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public ContiguousSet<C> intersection(ContiguousSet<C> other) { 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Range<C> range() { 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new NoSuchElementException(); 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Range<C> range(BoundType lowerBoundType, BoundType upperBoundType) { 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert throw new NoSuchElementException(); 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override ContiguousSet<C> headSetImpl(C toElement, boolean inclusive) { 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override ContiguousSet<C> subSetImpl( 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin C fromElement, boolean fromInclusive, C toElement, boolean toInclusive) { 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override ContiguousSet<C> tailSetImpl(C fromElement, boolean fromInclusive) { 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 747dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("not used by GWT emulation") 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override int indexOf(Object target) { 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return -1; 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public UnmodifiableIterator<C> iterator() { 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Iterators.emptyIterator(); 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 837dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("NavigableSet") 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public UnmodifiableIterator<C> descendingIterator() { 857dd252788645e940eada959bdde927426e2531c9Paul Duffin return Iterators.emptyIterator(); 867dd252788645e940eada959bdde927426e2531c9Paul Duffin } 877dd252788645e940eada959bdde927426e2531c9Paul Duffin 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override boolean isPartialView() { 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean isEmpty() { 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public ImmutableList<C> asList() { 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableList.of(); 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public String toString() { 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "[]"; 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(@Nullable Object object) { 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (object instanceof Set) { 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<?> that = (Set<?>) object; 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return that.isEmpty(); 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return 0; 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("serialization") 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final class SerializedForm<C extends Comparable> implements Serializable { 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final DiscreteDomain<C> domain; 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private SerializedForm(DiscreteDomain<C> domain) { 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.domain = domain; 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private Object readResolve() { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new EmptyContiguousSet<C>(domain); 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1317dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("serialization") 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Object writeReplace() { 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new SerializedForm<C>(domain); 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1367dd252788645e940eada959bdde927426e2531c9Paul Duffin 1377dd252788645e940eada959bdde927426e2531c9Paul Duffin @GwtIncompatible("NavigableSet") 1387dd252788645e940eada959bdde927426e2531c9Paul Duffin ImmutableSortedSet<C> createDescendingSet() { 1397dd252788645e940eada959bdde927426e2531c9Paul Duffin return new EmptyImmutableSortedSet<C>(Ordering.natural().reverse()); 1407dd252788645e940eada959bdde927426e2531c9Paul Duffin } 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 142