12d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// © 2016 and later: Unicode, Inc. and others.
22d2bb24f747c65578da13d5b13b82f0669690461Fredrik Roubert// License & terms of use: http://www.unicode.org/copyright.html#License
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
5bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert * Copyright (C) 1996-2015, International Business Machines Corporation and    *
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * others. All Rights Reserved.                                                *
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *******************************************************************************
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.dev.test.collator;
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Collection;
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Comparator;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Iterator;
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.LinkedHashMap;
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.LinkedHashSet;
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Map;
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.Set;
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.TreeMap;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport java.util.TreeSet;
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic class Counter<T> implements Iterable<T>, Comparable<Counter<T>> {
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  Map<T,RWLong> map;
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  Comparator<T> comparator;
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Counter() {
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    this(null);
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Counter(Comparator<T> comparator) {
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    if (comparator != null) {
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      this.comparator = comparator;
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      map = new TreeMap<T, RWLong>(comparator);
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    } else {
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      map = new LinkedHashMap<T, RWLong>();
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  static private final class RWLong implements Comparable<RWLong> {
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // the uniqueCount ensures that two different RWIntegers will always be different
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static int uniqueCount;
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public long value;
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private final int forceUnique;
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    {
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      synchronized (RWLong.class) { // make thread-safe
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        forceUnique = uniqueCount++;
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int compareTo(RWLong that) {
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (that.value < value) return -1;
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (that.value > value) return 1;
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (this == that) return 0;
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      synchronized (this) { // make thread-safe
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if (that.forceUnique < forceUnique) return -1;
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      return 1; // the forceUnique values must be different, so this is the only remaining case
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public String toString() {
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      return String.valueOf(value);
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Counter<T> add(T obj, long countValue) {
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RWLong count = map.get(obj);
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    if (count == null) map.put(obj, count = new RWLong());
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    count.value += countValue;
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return this;
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public long getCount(T obj) {
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      return get(obj);
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public long get(T obj) {
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      RWLong count = map.get(obj);
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      return count == null ? 0 : count.value;
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Counter<T> clear() {
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    map.clear();
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return this;
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public long getTotal() {
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    long count = 0;
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    for (T item : map.keySet()) {
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      count += map.get(item).value;
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return count;
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public int getItemCount() {
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return size();
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  private static class Entry<T> {
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    RWLong count;
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    T value;
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    int uniqueness;
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public Entry(RWLong count, T value, int uniqueness) {
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      this.count = count;
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      this.value = value;
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      this.uniqueness = uniqueness;
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  private static class EntryComparator<T> implements Comparator<Entry<T>>{
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    int countOrdering;
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Comparator<T> byValue;
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public EntryComparator(boolean ascending, Comparator<T> byValue) {
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      countOrdering = ascending ? 1 : -1;
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      this.byValue = byValue;
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public int compare(Entry<T> o1, Entry<T> o2) {
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (o1.count.value < o2.count.value) return -countOrdering;
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (o1.count.value > o2.count.value) return countOrdering;
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (byValue != null) {
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return byValue.compare(o1.value, o2.value);
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      return o1.uniqueness - o2.uniqueness;
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Set<T> getKeysetSortedByCount(boolean ascending) {
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return getKeysetSortedByCount(ascending, null);
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Set<T> getKeysetSortedByCount(boolean ascending, Comparator<T> byValue) {
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Set<Entry<T>> count_key = new TreeSet<Entry<T>>(new EntryComparator<T>(ascending, byValue));
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    int counter = 0;
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    for (T key : map.keySet()) {
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      count_key.add(new Entry<T>(map.get(key), key, counter++));
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Set<T> result = new LinkedHashSet<T>();
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    for (Entry<T> entry : count_key) {
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert       result.add(entry.value);
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return result;
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Set<T> getKeysetSortedByKey() {
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Set<T> s = new TreeSet<T>(comparator);
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    s.addAll(map.keySet());
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return s;
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//public Map<T,RWInteger> getKeyToKey() {
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//Map<T,RWInteger> result = new HashMap<T,RWInteger>();
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//Iterator<T> it = map.keySet().iterator();
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//while (it.hasNext()) {
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//Object key = it.next();
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//result.put(key, key);
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//}
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//return result;
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//}
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Set<T> keySet() {
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.keySet();
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Iterator<T> iterator() {
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.keySet().iterator();
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Map<T, RWLong> getMap() {
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map; // older code was protecting map, but not the integer values.
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public int size() {
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.size();
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public String toString() {
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.toString();
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Counter<T> addAll(Collection<T> keys, int delta) {
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    for (T key : keys) {
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      add(key, delta);
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return this;
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Counter<T> addAll(Counter<T> keys) {
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    for (T key : keys) {
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      add(key, keys.getCount(key));
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return this;
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public int compareTo(Counter<T> o) {
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Iterator<T> i = map.keySet().iterator();
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    Iterator<T> j = o.map.keySet().iterator();
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    while (true) {
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      boolean goti = i.hasNext();
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      boolean gotj = j.hasNext();
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (!goti || !gotj) {
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return goti ? 1 : gotj ? -1 : 0;
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      T ii = i.next();
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      T jj = i.next();
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      int result = ((Comparable<T>)ii).compareTo(jj);
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (result != 0) {
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return result;
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      }
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      final long iv = map.get(ii).value;
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      final long jv = o.map.get(jj).value;
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert      if (iv != jv) return iv < jv ? -1 : 0;
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  public Counter<T> increment(T key) {
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return add(key, 1);
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert  }
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic boolean containsKey(T key) {
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.containsKey(key);
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic boolean equals(Object o) {
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.equals(o);
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic int hashCode() {
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.hashCode();
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic boolean isEmpty() {
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return map.isEmpty();
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic Counter<T> remove(T key) {
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    map.remove(key);
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    return this;
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//public RWLong put(T key, RWLong value) {
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//    return map.put(key, value);
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//}
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//public void putAll(Map<? extends T, ? extends RWLong> t) {
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//    map.putAll(t);
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//}
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//public Set<java.util.Map.Entry<T, Long>> entrySet() {
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//    return map.entrySet();
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//}
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//public Collection<RWLong> values() {
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//    return map.values();
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert//}
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
256bd1cbb618dcaa1ac6ba7c77dece35cb79593a5d7Fredrik Roubert}
257