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