10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2009 The Guava Authors 30888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 40888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); 50888a09821a98ac0680fad765217302858e70fa4Paul Duffin * you may not use this file except in compliance with the License. 60888a09821a98ac0680fad765217302858e70fa4Paul Duffin * You may obtain a copy of the License at 70888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 80888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 90888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 100888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Unless required by applicable law or agreed to in writing, software 110888a09821a98ac0680fad765217302858e70fa4Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS, 120888a09821a98ac0680fad765217302858e70fa4Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130888a09821a98ac0680fad765217302858e70fa4Paul Duffin * See the License for the specific language governing permissions and 140888a09821a98ac0680fad765217302858e70fa4Paul Duffin * limitations under the License. 150888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 160888a09821a98ac0680fad765217302858e70fa4Paul Duffin 170888a09821a98ac0680fad765217302858e70fa4Paul Duffinpackage com.google.common.collect; 180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 190888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport static com.google.common.base.Preconditions.checkNotNull; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.ArrayList; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collections; 240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Iterator; 250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.List; 260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Set; 270888a09821a98ac0680fad765217302858e70fa4Paul Duffin 280888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 290888a09821a98ac0680fad765217302858e70fa4Paul Duffin * GWT emulated version of {@link ImmutableSet}. For the unsorted sets, they 300888a09821a98ac0680fad765217302858e70fa4Paul Duffin * are thin wrapper around {@link java.util.Collections#emptySet()}, {@link 310888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Collections#singleton(Object)} and {@link java.util.LinkedHashSet} for 320888a09821a98ac0680fad765217302858e70fa4Paul Duffin * empty, singleton and regular sets respectively. For the sorted sets, it's 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin * a thin wrapper around {@link java.util.TreeSet}. 340888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @see ImmutableSortedSet 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Hayward Chan 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin@SuppressWarnings("serial") // Serialization only done in GWT. 400888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class ImmutableSet<E> extends ImmutableCollection<E> implements Set<E> { 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin ImmutableSet() {} 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin 430888a09821a98ac0680fad765217302858e70fa4Paul Duffin // Casting to any type is safe because the set will never hold any elements. 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings({"unchecked"}) 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> of() { 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin return (ImmutableSet<E>) EmptyImmutableSet.INSTANCE; 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> of(E element) { 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SingletonImmutableSet<E>(element); 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> of(E e1, E e2) { 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin return create(e1, e2); 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> of(E e1, E e2, E e3) { 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin return create(e1, e2, e3); 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4) { 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin return create(e1, e2, e3, e4); 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5) { 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin return create(e1, e2, e3, e4, e5); 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5, E e6, E... others) { 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin int size = others.length + 6; 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin List<E> all = new ArrayList<E>(size); 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collections.addAll(all, e1, e2, e3, e4, e5, e6); 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collections.addAll(all, others); 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin return copyOf(all.iterator()); 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> copyOf(E[] elements) { 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(elements); 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin switch (elements.length) { 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin case 0: 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin return of(); 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin case 1: 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin return of(elements[0]); 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin default: 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin return create(elements); 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> copyOf(Collection<? extends E> elements) { 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin Iterable<? extends E> iterable = elements; 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin return copyOf(iterable); 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> copyOf(Iterable<? extends E> elements) { 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (elements instanceof ImmutableSet && !(elements instanceof ImmutableSortedSet)) { 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin @SuppressWarnings("unchecked") // all supported methods are covariant 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin ImmutableSet<E> set = (ImmutableSet<E>) elements; 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin return set; 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin return copyOf(elements.iterator()); 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> ImmutableSet<E> copyOf(Iterator<? extends E> elements) { 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (!elements.hasNext()) { 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin return of(); 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin E first = elements.next(); 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (!elements.hasNext()) { 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin // TODO: Remove "ImmutableSet.<E>" when eclipse bug is fixed. 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin return ImmutableSet.<E>of(first); 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<E> delegate = Sets.newLinkedHashSet(); 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin delegate.add(checkNotNull(first)); 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin do { 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin delegate.add(checkNotNull(elements.next())); 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin } while (elements.hasNext()); 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin return unsafeDelegate(delegate); 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin // Factory methods that skips the null checks on elements, only used when 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin // the elements are known to be non-null. 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <E> ImmutableSet<E> unsafeDelegate(Set<E> delegate) { 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin switch (delegate.size()) { 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin case 0: 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin return of(); 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin case 1: 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SingletonImmutableSet<E>(delegate.iterator().next()); 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin default: 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new RegularImmutableSet<E>(delegate); 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static <E> ImmutableSet<E> create(E... elements) { 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin // Create the set first, to remove duplicates if necessary. 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin Set<E> set = Sets.newLinkedHashSet(); 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collections.addAll(set, elements); 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin for (E element : set) { 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(element); 1460888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1470888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1480888a09821a98ac0680fad765217302858e70fa4Paul Duffin switch (set.size()) { 1490888a09821a98ac0680fad765217302858e70fa4Paul Duffin case 0: 1500888a09821a98ac0680fad765217302858e70fa4Paul Duffin return of(); 1510888a09821a98ac0680fad765217302858e70fa4Paul Duffin case 1: 1520888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SingletonImmutableSet<E>(set.iterator().next()); 1530888a09821a98ac0680fad765217302858e70fa4Paul Duffin default: 1540888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new RegularImmutableSet<E>(set); 1550888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1560888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1570888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1580888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(Object obj) { 1590888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.equalsImpl(this, obj); 1600888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1610888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1620888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 1630888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.hashCodeImpl(this); 1640888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1650888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1660888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static <E> Builder<E> builder() { 1670888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new Builder<E>(); 1680888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1690888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1700888a09821a98ac0680fad765217302858e70fa4Paul Duffin public static class Builder<E> extends ImmutableCollection.Builder<E> { 1710888a09821a98ac0680fad765217302858e70fa4Paul Duffin // accessed directly by ImmutableSortedSet 1720888a09821a98ac0680fad765217302858e70fa4Paul Duffin final ArrayList<E> contents = Lists.newArrayList(); 1730888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1740888a09821a98ac0680fad765217302858e70fa4Paul Duffin public Builder() {} 1750888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1760888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> add(E element) { 1770888a09821a98ac0680fad765217302858e70fa4Paul Duffin contents.add(checkNotNull(element)); 1780888a09821a98ac0680fad765217302858e70fa4Paul Duffin return this; 1790888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1800888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1810888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> add(E... elements) { 1820888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkNotNull(elements); // for GWT 1830888a09821a98ac0680fad765217302858e70fa4Paul Duffin contents.ensureCapacity(contents.size() + elements.length); 1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin super.add(elements); 1850888a09821a98ac0680fad765217302858e70fa4Paul Duffin return this; 1860888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1870888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1880888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> addAll(Iterable<? extends E> elements) { 1890888a09821a98ac0680fad765217302858e70fa4Paul Duffin if (elements instanceof Collection) { 1900888a09821a98ac0680fad765217302858e70fa4Paul Duffin Collection<?> collection = (Collection<?>) elements; 1910888a09821a98ac0680fad765217302858e70fa4Paul Duffin contents.ensureCapacity(contents.size() + collection.size()); 1920888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1930888a09821a98ac0680fad765217302858e70fa4Paul Duffin super.addAll(elements); 1940888a09821a98ac0680fad765217302858e70fa4Paul Duffin return this; 1950888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1960888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1970888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Builder<E> addAll(Iterator<? extends E> elements) { 1980888a09821a98ac0680fad765217302858e70fa4Paul Duffin super.addAll(elements); 1990888a09821a98ac0680fad765217302858e70fa4Paul Duffin return this; 2000888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2010888a09821a98ac0680fad765217302858e70fa4Paul Duffin 2020888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public ImmutableSet<E> build() { 2030888a09821a98ac0680fad765217302858e70fa4Paul Duffin return copyOf(contents.iterator()); 2040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 207