10888a09821a98ac0680fad765217302858e70fa4Paul Duffin/* 20888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Copyright (C) 2008 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.checkArgument; 200888a09821a98ac0680fad765217302858e70fa4Paul Duffin 210888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.base.Function; 220888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.base.Predicate; 230888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport com.google.common.collect.Maps.EntryTransformer; 240888a09821a98ac0680fad765217302858e70fa4Paul Duffin 250888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.io.Serializable; 260888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.AbstractSet; 270888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Collection; 280888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Iterator; 290888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Map; 300888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Set; 310888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.SortedMap; 320888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.SortedSet; 330888a09821a98ac0680fad765217302858e70fa4Paul Duffin 340888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport javax.annotation.Nullable; 350888a09821a98ac0680fad765217302858e70fa4Paul Duffin 360888a09821a98ac0680fad765217302858e70fa4Paul Duffin/** 370888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Minimal GWT emulation of {@code com.google.common.collect.Platform}. 380888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 390888a09821a98ac0680fad765217302858e70fa4Paul Duffin * <p><strong>This .java file should never be consumed by javac.</strong> 400888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 410888a09821a98ac0680fad765217302858e70fa4Paul Duffin * @author Hayward Chan 420888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 430888a09821a98ac0680fad765217302858e70fa4Paul Duffinfinal class Platform { 440888a09821a98ac0680fad765217302858e70fa4Paul Duffin 450888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <T> T[] newArray(T[] reference, int length) { 460888a09821a98ac0680fad765217302858e70fa4Paul Duffin return GwtPlatform.newArray(reference, length); 470888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 480888a09821a98ac0680fad765217302858e70fa4Paul Duffin 490888a09821a98ac0680fad765217302858e70fa4Paul Duffin /* 500888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Regarding newSetForMap() and SetFromMap: 510888a09821a98ac0680fad765217302858e70fa4Paul Duffin * 520888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Written by Doug Lea with assistance from members of JCP JSR-166 530888a09821a98ac0680fad765217302858e70fa4Paul Duffin * Expert Group and released to the public domain, as explained at 540888a09821a98ac0680fad765217302858e70fa4Paul Duffin * http://creativecommons.org/licenses/publicdomain 550888a09821a98ac0680fad765217302858e70fa4Paul Duffin */ 560888a09821a98ac0680fad765217302858e70fa4Paul Duffin 570888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <E> Set<E> newSetFromMap(Map<E, Boolean> map) { 580888a09821a98ac0680fad765217302858e70fa4Paul Duffin return new SetFromMap<E>(map); 590888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 600888a09821a98ac0680fad765217302858e70fa4Paul Duffin 610888a09821a98ac0680fad765217302858e70fa4Paul Duffin private static class SetFromMap<E> extends AbstractSet<E> 620888a09821a98ac0680fad765217302858e70fa4Paul Duffin implements Set<E>, Serializable { 630888a09821a98ac0680fad765217302858e70fa4Paul Duffin private final Map<E, Boolean> m; // The backing map 640888a09821a98ac0680fad765217302858e70fa4Paul Duffin private transient Set<E> s; // Its keySet 650888a09821a98ac0680fad765217302858e70fa4Paul Duffin 660888a09821a98ac0680fad765217302858e70fa4Paul Duffin SetFromMap(Map<E, Boolean> map) { 670888a09821a98ac0680fad765217302858e70fa4Paul Duffin checkArgument(map.isEmpty(), "Map is non-empty"); 680888a09821a98ac0680fad765217302858e70fa4Paul Duffin m = map; 690888a09821a98ac0680fad765217302858e70fa4Paul Duffin s = map.keySet(); 700888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 710888a09821a98ac0680fad765217302858e70fa4Paul Duffin 720888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public void clear() { 730888a09821a98ac0680fad765217302858e70fa4Paul Duffin m.clear(); 740888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 750888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int size() { 760888a09821a98ac0680fad765217302858e70fa4Paul Duffin return m.size(); 770888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 780888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean isEmpty() { 790888a09821a98ac0680fad765217302858e70fa4Paul Duffin return m.isEmpty(); 800888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 810888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean contains(Object o) { 820888a09821a98ac0680fad765217302858e70fa4Paul Duffin return m.containsKey(o); 830888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 840888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean remove(Object o) { 850888a09821a98ac0680fad765217302858e70fa4Paul Duffin return m.remove(o) != null; 860888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 870888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean add(E e) { 880888a09821a98ac0680fad765217302858e70fa4Paul Duffin return m.put(e, Boolean.TRUE) == null; 890888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 900888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Iterator<E> iterator() { 910888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.iterator(); 920888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 930888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public Object[] toArray() { 940888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.toArray(); 950888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 960888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public <T> T[] toArray(T[] a) { 970888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.toArray(a); 980888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 990888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public String toString() { 1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.toString(); 1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public int hashCode() { 1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.hashCode(); 1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean equals(@Nullable Object object) { 1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin return this == object || this.s.equals(object); 1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean containsAll(Collection<?> c) { 1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.containsAll(c); 1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean removeAll(Collection<?> c) { 1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.removeAll(c); 1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin @Override public boolean retainAll(Collection<?> c) { 1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin return s.retainAll(c); 1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin static MapMaker tryWeakKeys(MapMaker mapMaker) { 1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin return mapMaker; 1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V1, V2> SortedMap<K, V2> mapsTransformEntriesSortedMap( 1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V1> fromMap, 1250888a09821a98ac0680fad765217302858e70fa4Paul Duffin EntryTransformer<? super K, ? super V1, V2> transformer) { 1260888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Maps.transformEntriesIgnoreNavigable(fromMap, transformer); 1270888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1280888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1290888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> SortedMap<K, V> mapsAsMapSortedSet( 1300888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedSet<K> set, Function<? super K, V> function) { 1310888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Maps.asMapSortedIgnoreNavigable(set, function); 1320888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1330888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1340888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <E> SortedSet<E> setsFilterSortedSet( 1350888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedSet<E> unfiltered, Predicate<? super E> predicate) { 1360888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Sets.filterSortedIgnoreNavigable(unfiltered, predicate); 1370888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1380888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1390888a09821a98ac0680fad765217302858e70fa4Paul Duffin static <K, V> SortedMap<K, V> mapsFilterSortedMap( 1400888a09821a98ac0680fad765217302858e70fa4Paul Duffin SortedMap<K, V> unfiltered, Predicate<? super Map.Entry<K, V>> predicate) { 1410888a09821a98ac0680fad765217302858e70fa4Paul Duffin return Maps.filterSortedIgnoreNavigable(unfiltered, predicate); 1420888a09821a98ac0680fad765217302858e70fa4Paul Duffin } 1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin 1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin private Platform() {} 1450888a09821a98ac0680fad765217302858e70fa4Paul Duffin} 146