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 java.util.ArrayList; 221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection; 231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections; 241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator; 251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List; 261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set; 271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/** 291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * GWT emulated version of {@link ImmutableSet}. For the unsorted sets, they 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * are thin wrapper around {@link java.util.Collections#emptySet()}, {@link 311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Collections#singleton(Object)} and {@link java.util.LinkedHashSet} for 321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * empty, singleton and regular sets respectively. For the sorted sets, it's 331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a thin wrapper around {@link java.util.TreeSet}. 341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @see ImmutableSortedSet 361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Hayward Chan 381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@SuppressWarnings("serial") // Serialization only done in GWT. 401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic abstract class ImmutableSet<E> extends ForwardingImmutableCollection<E> 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements Set<E> { 421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet(Set<E> delegate) { 441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super(Collections.unmodifiableSet(delegate)); 451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet() { 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this(Collections.<E>emptySet()); 491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Casting to any type is safe because the set will never hold any elements. 521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings({"unchecked"}) 531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> of() { 541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (ImmutableSet<E>) EmptyImmutableSet.INSTANCE; 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> of(E element) { 581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new SingletonImmutableSet<E>(element); 591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> of(E e1, E e2) { 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return create(e1, e2); 641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> of(E e1, E e2, E e3) { 681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return create(e1, e2, e3); 691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4) { 731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return create(e1, e2, e3, e4); 741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5) { 781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return create(e1, e2, e3, e4, e5); 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") 821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> of(E e1, E e2, E e3, E e4, E e5, E e6, 831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert E... others) { 841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert int size = others.length + 6; 851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert List<E> all = new ArrayList<E>(size); 861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collections.addAll(all, e1, e2, e3, e4, e5, e6); 871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collections.addAll(all, others); 881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return copyOf(all.iterator()); 891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** @deprecated */ 921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Deprecated public static <E> ImmutableSet<E> of(E[] elements) { 931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return copyOf(elements); 941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> copyOf(E[] elements) { 971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(elements); 981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert switch (elements.length) { 991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 0: 1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return of(); 1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 1: 1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return of(elements[0]); 1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert default: 1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return create(elements); 1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> copyOf(Collection<? extends E> elements) { 1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Iterable<? extends E> iterable = elements; 1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return copyOf(iterable); 1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> copyOf(Iterable<? extends E> elements) { 1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (elements instanceof ImmutableSet 1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && !(elements instanceof ImmutableSortedSet)) { 1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // all supported methods are covariant 1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ImmutableSet<E> set = (ImmutableSet<E>) elements; 1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return set; 1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return copyOf(elements.iterator()); 1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> ImmutableSet<E> copyOf(Iterator<? extends E> elements) { 1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!elements.hasNext()) { 1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return of(); 1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert E first = elements.next(); 1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!elements.hasNext()) { 1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO: Remove "ImmutableSet.<E>" when eclipse bug is fixed. 1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ImmutableSet.<E>of(first); 1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<E> delegate = Sets.newLinkedHashSet(); 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert delegate.add(checkNotNull(first)); 1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert do { 1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert delegate.add(checkNotNull(elements.next())); 1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } while (elements.hasNext()); 1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return unsafeDelegate(delegate); 1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Factory methods that skips the null checks on elements, only used when 1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // the elements are known to be non-null. 1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert static <E> ImmutableSet<E> unsafeDelegate(Set<E> delegate) { 1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert switch (delegate.size()) { 1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 0: 1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return of(); 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 1: 1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new SingletonImmutableSet<E>(delegate.iterator().next()); 1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert default: 1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new RegularImmutableSet<E>(delegate); 1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static <E> ImmutableSet<E> create(E... elements) { 1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Create the set first, to remove duplicates if necessary. 1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Set<E> set = Sets.newLinkedHashSet(); 1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collections.addAll(set, elements); 1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (E element : set) { 1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(element); 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert switch (set.size()) { 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 0: 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return of(); 1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert case 1: 1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new SingletonImmutableSet<E>(set.iterator().next()); 1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert default: 1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new RegularImmutableSet<E>(set); 1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(Object obj) { 1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Sets.equalsImpl(this, obj); 1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return delegate.hashCode(); 1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <E> Builder<E> builder() { 1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new Builder<E>(); 1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static class Builder<E> extends ImmutableCollection.Builder<E> { 1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // accessed directly by ImmutableSortedSet 1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final ArrayList<E> contents = Lists.newArrayList(); 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public Builder() {} 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Builder<E> add(E element) { 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert contents.add(checkNotNull(element)); 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Builder<E> add(E... elements) { 1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert checkNotNull(elements); // for GWT 1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert contents.ensureCapacity(contents.size() + elements.length); 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super.add(elements); 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Builder<E> addAll(Iterable<? extends E> elements) { 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (elements instanceof Collection) { 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Collection<?> collection = (Collection<?>) elements; 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert contents.ensureCapacity(contents.size() + collection.size()); 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super.addAll(elements); 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public Builder<E> addAll(Iterator<? extends E> elements) { 2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert super.addAll(elements); 2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return this; 2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public ImmutableSet<E> build() { 2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return copyOf(contents.iterator()); 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert} 222