17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2012 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.collect;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Collection;
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Collections;
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.HashSet;
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.LinkedHashSet;
237dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Map;
240888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport java.util.Random;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Set;
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.SortedMap;
277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.TreeSet;
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.concurrent.ConcurrentHashMap;
293ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport java.util.concurrent.ConcurrentSkipListMap;
307dd252788645e940eada959bdde927426e2531c9Paul Duffin
317dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
327dd252788645e940eada959bdde927426e2531c9Paul Duffin * Helper classes for various benchmarks.
337dd252788645e940eada959bdde927426e2531c9Paul Duffin *
347dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Christopher Swenson
357dd252788645e940eada959bdde927426e2531c9Paul Duffin */
367dd252788645e940eada959bdde927426e2531c9Paul Duffinfinal class BenchmarkHelpers {
377dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
387dd252788645e940eada959bdde927426e2531c9Paul Duffin   * So far, this is the best way to test various implementations of {@link Set} subclasses.
397dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
407dd252788645e940eada959bdde927426e2531c9Paul Duffin  public enum SetImpl {
417dd252788645e940eada959bdde927426e2531c9Paul Duffin    Hash {
427dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
437dd252788645e940eada959bdde927426e2531c9Paul Duffin        return new HashSet<E>(contents);
447dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
457dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
467dd252788645e940eada959bdde927426e2531c9Paul Duffin    LinkedHash {
477dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
487dd252788645e940eada959bdde927426e2531c9Paul Duffin        return new LinkedHashSet<E>(contents);
497dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
507dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
517dd252788645e940eada959bdde927426e2531c9Paul Duffin    Tree {
527dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
537dd252788645e940eada959bdde927426e2531c9Paul Duffin        return new TreeSet<E>(contents);
547dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
557dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
567dd252788645e940eada959bdde927426e2531c9Paul Duffin    Unmodifiable {
577dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
587dd252788645e940eada959bdde927426e2531c9Paul Duffin        return Collections.unmodifiableSet(new HashSet<E>(contents));
597dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
607dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
617dd252788645e940eada959bdde927426e2531c9Paul Duffin    Synchronized {
627dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
637dd252788645e940eada959bdde927426e2531c9Paul Duffin        return Collections.synchronizedSet(new HashSet<E>(contents));
647dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
657dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
667dd252788645e940eada959bdde927426e2531c9Paul Duffin    Immutable {
677dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
687dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableSet.copyOf(contents);
697dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
707dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSorted {
727dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override <E extends Comparable<E>> Set<E> create(Collection<E> contents) {
737dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableSortedSet.copyOf(contents);
747dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
757dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
767dd252788645e940eada959bdde927426e2531c9Paul Duffin    ;
777dd252788645e940eada959bdde927426e2531c9Paul Duffin
787dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <E extends Comparable<E>> Set<E> create(Collection<E> contents);
797dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
807dd252788645e940eada959bdde927426e2531c9Paul Duffin
817dd252788645e940eada959bdde927426e2531c9Paul Duffin  public enum ListMultimapImpl {
827dd252788645e940eada959bdde927426e2531c9Paul Duffin    ArrayList {
837dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
847dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
857dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ArrayListMultimap.create(contents);
867dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
877dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
887dd252788645e940eada959bdde927426e2531c9Paul Duffin    LinkedList {
897dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
907dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
917dd252788645e940eada959bdde927426e2531c9Paul Duffin        return LinkedListMultimap.create(contents);
927dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
937dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
947dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableList {
957dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
967dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> ListMultimap<K, V> create(Multimap<K, V> contents) {
977dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableListMultimap.copyOf(contents);
987dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
997dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin
1017dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <K, V> ListMultimap<K, V> create(Multimap<K, V> contents);
1027dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1037dd252788645e940eada959bdde927426e2531c9Paul Duffin
1047dd252788645e940eada959bdde927426e2531c9Paul Duffin  public enum SetMultimapImpl {
1057dd252788645e940eada959bdde927426e2531c9Paul Duffin    Hash {
1067dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
1087dd252788645e940eada959bdde927426e2531c9Paul Duffin          Multimap<K, V> contents) {
1097dd252788645e940eada959bdde927426e2531c9Paul Duffin        return HashMultimap.create(contents);
1107dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1117dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1127dd252788645e940eada959bdde927426e2531c9Paul Duffin    LinkedHash {
1137dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
1157dd252788645e940eada959bdde927426e2531c9Paul Duffin          Multimap<K, V> contents) {
1167dd252788645e940eada959bdde927426e2531c9Paul Duffin        return LinkedHashMultimap.create(contents);
1177dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1187dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1197dd252788645e940eada959bdde927426e2531c9Paul Duffin    Tree {
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1217dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
1227dd252788645e940eada959bdde927426e2531c9Paul Duffin          Multimap<K, V> contents) {
1237dd252788645e940eada959bdde927426e2531c9Paul Duffin        return TreeMultimap.create(contents);
1247dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSet {
1277dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1287dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin          Multimap<K, V> contents) {
1307dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableSetMultimap.copyOf(contents);
1317dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
1337dd252788645e940eada959bdde927426e2531c9Paul Duffin
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <K extends Comparable<K>, V extends Comparable<V>> SetMultimap<K, V> create(
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin        Multimap<K, V> contents);
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin  public enum MapImpl {
1397dd252788645e940eada959bdde927426e2531c9Paul Duffin    Hash {
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1417dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> Map<K, V> create(Map<K, V> map) {
1427dd252788645e940eada959bdde927426e2531c9Paul Duffin        return Maps.newHashMap(map);
1437dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1447dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1457dd252788645e940eada959bdde927426e2531c9Paul Duffin    LinkedHash {
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> Map<K, V> create(Map<K, V> map) {
1487dd252788645e940eada959bdde927426e2531c9Paul Duffin        return Maps.newLinkedHashMap(map);
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1517dd252788645e940eada959bdde927426e2531c9Paul Duffin    ConcurrentHash {
1527dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1537dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> Map<K, V> create(Map<K, V> map) {
1547dd252788645e940eada959bdde927426e2531c9Paul Duffin        return new ConcurrentHashMap<K, V>(map);
1557dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1577dd252788645e940eada959bdde927426e2531c9Paul Duffin    Immutable {
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> Map<K, V> create(Map<K, V> map) {
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableMap.copyOf(map);
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1627dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
1637dd252788645e940eada959bdde927426e2531c9Paul Duffin
1647dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <K, V> Map<K, V> create(Map<K, V> map);
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1667dd252788645e940eada959bdde927426e2531c9Paul Duffin
1677dd252788645e940eada959bdde927426e2531c9Paul Duffin  enum SortedMapImpl {
1687dd252788645e940eada959bdde927426e2531c9Paul Duffin    Tree {
1697dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1707dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) {
1717dd252788645e940eada959bdde927426e2531c9Paul Duffin        SortedMap<K, V> result = Maps.newTreeMap();
1727dd252788645e940eada959bdde927426e2531c9Paul Duffin        result.putAll(map);
1737dd252788645e940eada959bdde927426e2531c9Paul Duffin        return result;
1747dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1757dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1763ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    ConcurrentSkipList {
1773ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      @Override
1783ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) {
1793ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        return new ConcurrentSkipListMap<K, V>(map);
1803ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin      }
1813ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin    },
1827dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSorted {
1837dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1847dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map) {
1857dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableSortedMap.copyOf(map);
1867dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1877dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
1887dd252788645e940eada959bdde927426e2531c9Paul Duffin
1897dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <K extends Comparable<K>, V> SortedMap<K, V> create(Map<K, V> map);
1907dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
1917dd252788645e940eada959bdde927426e2531c9Paul Duffin
1927dd252788645e940eada959bdde927426e2531c9Paul Duffin  enum BiMapImpl {
1937dd252788645e940eada959bdde927426e2531c9Paul Duffin    Hash{
1947dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
1957dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> BiMap<K, V> create(BiMap<K, V> map) {
1967dd252788645e940eada959bdde927426e2531c9Paul Duffin        return HashBiMap.create(map);
1977dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
1987dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
1997dd252788645e940eada959bdde927426e2531c9Paul Duffin    Immutable {
2007dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2017dd252788645e940eada959bdde927426e2531c9Paul Duffin      <K, V> BiMap<K, V> create(BiMap<K, V> map) {
2027dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableBiMap.copyOf(map);
2037dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2047dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
2057dd252788645e940eada959bdde927426e2531c9Paul Duffin
2067dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <K, V> BiMap<K, V> create(BiMap<K, V> map);
2077dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2087dd252788645e940eada959bdde927426e2531c9Paul Duffin
2097dd252788645e940eada959bdde927426e2531c9Paul Duffin  enum MultisetImpl {
2107dd252788645e940eada959bdde927426e2531c9Paul Duffin    Hash {
2117dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2127dd252788645e940eada959bdde927426e2531c9Paul Duffin      <E> Multiset<E> create(Multiset<E> contents) {
2137dd252788645e940eada959bdde927426e2531c9Paul Duffin        return HashMultiset.create(contents);
2147dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2157dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
2167dd252788645e940eada959bdde927426e2531c9Paul Duffin    LinkedHash {
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2187dd252788645e940eada959bdde927426e2531c9Paul Duffin      <E> Multiset<E> create(Multiset<E> contents) {
2197dd252788645e940eada959bdde927426e2531c9Paul Duffin        return LinkedHashMultiset.create(contents);
2207dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2217dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
2227dd252788645e940eada959bdde927426e2531c9Paul Duffin    ConcurrentHash {
2237dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2247dd252788645e940eada959bdde927426e2531c9Paul Duffin      <E> Multiset<E> create(Multiset<E> contents) {
2257dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ConcurrentHashMultiset.create(contents);
2267dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2277dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
2287dd252788645e940eada959bdde927426e2531c9Paul Duffin    Immutable {
2297dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2307dd252788645e940eada959bdde927426e2531c9Paul Duffin      <E> Multiset<E> create(Multiset<E> contents) {
2317dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableMultiset.copyOf(contents);
2327dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2337dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
2347dd252788645e940eada959bdde927426e2531c9Paul Duffin
2357dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <E> Multiset<E> create(Multiset<E> contents);
2367dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2377dd252788645e940eada959bdde927426e2531c9Paul Duffin
2387dd252788645e940eada959bdde927426e2531c9Paul Duffin  enum SortedMultisetImpl {
2397dd252788645e940eada959bdde927426e2531c9Paul Duffin    Tree {
2407dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2417dd252788645e940eada959bdde927426e2531c9Paul Duffin      <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) {
2427dd252788645e940eada959bdde927426e2531c9Paul Duffin        return TreeMultiset.create(contents);
2437dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2447dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
2457dd252788645e940eada959bdde927426e2531c9Paul Duffin    ImmutableSorted {
2467dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2477dd252788645e940eada959bdde927426e2531c9Paul Duffin      <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents) {
2487dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableSortedMultiset.copyOf(contents);
2497dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2507dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
2517dd252788645e940eada959bdde927426e2531c9Paul Duffin
2527dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <E extends Comparable<E>> SortedMultiset<E> create(Multiset<E> contents);
2537dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2547dd252788645e940eada959bdde927426e2531c9Paul Duffin
2557dd252788645e940eada959bdde927426e2531c9Paul Duffin  enum TableImpl {
2567dd252788645e940eada959bdde927426e2531c9Paul Duffin    HashBased {
2577dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2587dd252788645e940eada959bdde927426e2531c9Paul Duffin      <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create(
2597dd252788645e940eada959bdde927426e2531c9Paul Duffin          Table<R, C, V> contents) {
2607dd252788645e940eada959bdde927426e2531c9Paul Duffin        return HashBasedTable.create(contents);
2617dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2627dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
2637dd252788645e940eada959bdde927426e2531c9Paul Duffin    TreeBased {
2647dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2657dd252788645e940eada959bdde927426e2531c9Paul Duffin      <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create(
2667dd252788645e940eada959bdde927426e2531c9Paul Duffin          Table<R, C, V> contents) {
2677dd252788645e940eada959bdde927426e2531c9Paul Duffin        Table<R, C, V> table = TreeBasedTable.create();
2687dd252788645e940eada959bdde927426e2531c9Paul Duffin        table.putAll(contents);
2697dd252788645e940eada959bdde927426e2531c9Paul Duffin        return table;
2707dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2717dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
2727dd252788645e940eada959bdde927426e2531c9Paul Duffin    Array {
2737dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin      <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create(
2757dd252788645e940eada959bdde927426e2531c9Paul Duffin          Table<R, C, V> contents) {
2767dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (contents.isEmpty()) {
2777dd252788645e940eada959bdde927426e2531c9Paul Duffin          return ImmutableTable.of();
2787dd252788645e940eada959bdde927426e2531c9Paul Duffin        } else {
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin          return ArrayTable.create(contents);
2807dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
2817dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin    },
2837dd252788645e940eada959bdde927426e2531c9Paul Duffin    Immutable {
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin      @Override
2857dd252788645e940eada959bdde927426e2531c9Paul Duffin      <R extends Comparable<R>, C extends Comparable<C>, V> Table<R, C, V> create(
2867dd252788645e940eada959bdde927426e2531c9Paul Duffin          Table<R, C, V> contents) {
2877dd252788645e940eada959bdde927426e2531c9Paul Duffin        return ImmutableTable.copyOf(contents);
2887dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
2897dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
2907dd252788645e940eada959bdde927426e2531c9Paul Duffin
2917dd252788645e940eada959bdde927426e2531c9Paul Duffin    abstract <R extends Comparable<R>, C extends Comparable<C>, V>
2927dd252788645e940eada959bdde927426e2531c9Paul Duffin        Table<R, C, V> create(Table<R, C, V> contents);
2937dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2947dd252788645e940eada959bdde927426e2531c9Paul Duffin
2957dd252788645e940eada959bdde927426e2531c9Paul Duffin  public enum Value {
2967dd252788645e940eada959bdde927426e2531c9Paul Duffin    INSTANCE;
2977dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
2980888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2990888a09821a98ac0680fad765217302858e70fa4Paul Duffin  public enum ListSizeDistribution {
3000888a09821a98ac0680fad765217302858e70fa4Paul Duffin    UNIFORM_0_TO_2(0, 2), UNIFORM_0_TO_9(0, 9), ALWAYS_0(0, 0), ALWAYS_10(10, 10);
3010888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final int min;
3030888a09821a98ac0680fad765217302858e70fa4Paul Duffin    final int max;
3040888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    private ListSizeDistribution(int min, int max) {
3060888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.min = min;
3070888a09821a98ac0680fad765217302858e70fa4Paul Duffin      this.max = max;
3080888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3090888a09821a98ac0680fad765217302858e70fa4Paul Duffin
3100888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public int chooseSize(Random random) {
3110888a09821a98ac0680fad765217302858e70fa4Paul Duffin      return random.nextInt(max - min + 1) + min;
3120888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
3130888a09821a98ac0680fad765217302858e70fa4Paul Duffin  }
3147dd252788645e940eada959bdde927426e2531c9Paul Duffin}
315