Mercurial > jhg
annotate src/org/tmatesoft/hg/util/DirectHashSet.java @ 576:3c4db86e8c1f
Issue 43: poor performance with InflaterDataAccess. Phase 2: inflate into buffer, effective skip and readByte/readBytes()
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Tue, 16 Apr 2013 19:31:57 +0200 | 
| parents | 51d682cf9cdc | 
| children | 
| rev | line source | 
|---|---|
| 304 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 1 /* | 
| 467 
51d682cf9cdc
Cleaned experimental tag and updated comments/javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
304diff
changeset | 2 * Copyright (c) 2011-2012 TMate Software Ltd | 
| 304 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 3 * | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 4 * This program is free software; you can redistribute it and/or modify | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 5 * it under the terms of the GNU General Public License as published by | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 7 * | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 8 * This program is distributed in the hope that it will be useful, | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 11 * GNU General Public License for more details. | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 12 * | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 13 * For information on how to redistribute this software under | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 17 package org.tmatesoft.hg.util; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 19 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 20 /** | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 21 * Memory-friendly alternative to HashSet. With slightly worse performance than that of HashSet, uses n * sizeof(HashMap.Entry) less memory | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 22 * (i.e. for set of 50k elements saves more than 1 Mb of memory). Besides, elements of this set can be obtained (not only queried for presence) - | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 23 * the option essential for canonical mappings (aka Pool) | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 24 * | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 25 * @author Artem Tikhomirov | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 26 * @author TMate Software Ltd. | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 27 */ | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 28 public class DirectHashSet<T> { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 29 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 30 private Object[] table; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 31 private int size; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 32 private int threshold; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 33 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 34 public DirectHashSet() { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 35 this (16); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 36 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 37 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 38 public DirectHashSet(int capacity) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 int result = 2; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 40 while (result < capacity) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 41 result <<= 1; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 42 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 table = new Object[result]; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 threshold = result - (result >>> 2); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 45 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 46 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 47 /** | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 48 * Add element to the set. | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 49 * @param o element, shall not be <code>null</code> | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 50 * @return previous element from the set equal to the argument | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 51 */ | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 52 @SuppressWarnings("unchecked") | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 53 public T put(T o) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 54 final int h = hash(o); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 55 final int mask = table.length - 1; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 56 int i = h & mask; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 57 Object t; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 58 while ((t = table[i]) != null) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 59 if (t.equals(o)) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 60 table[i] = o; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 61 return (T) t; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 62 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 63 i = (i+1) & mask; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 64 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 65 table[i] = o; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 66 if (++size >= threshold) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 67 resize(); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 68 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 69 return null; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 70 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 71 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 72 /** | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 73 * Query set for the element. | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 74 * @param o element, shall not be <code>null</code> | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 75 * @return element from the set, if present | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 76 */ | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 77 @SuppressWarnings("unchecked") | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 78 public T get(T o) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 79 final int h = hash(o); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 80 final int mask = table.length - 1; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 81 int i = h & mask; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 82 Object t; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 83 while ((t = table[i]) != null) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 84 if (t == o || t.equals(o)) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 85 return (T) t; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 86 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 87 i = (i+1) & mask; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 88 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 89 return null; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 90 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 91 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 92 public int size() { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 93 return size; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 94 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 95 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 96 public void clear() { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 97 Object[] t = table; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 98 for (int i = 0, top = t.length; i < top; i++) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 99 t[i] = null; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 100 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 101 size = 0; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 102 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 103 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 104 private void resize() { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 105 final int newSize = table.length << 1; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 106 final int newMask = newSize - 1; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 107 Object[] newTable = new Object[newSize]; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 108 for (int i = 0, size = table.length; i < size; i++) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 109 Object t = table[i]; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 110 if (t != null) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 111 table[i] = null; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 112 int x = hash(t) & newMask; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 113 while (newTable[x] != null) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 114 x = (x+1) & newMask; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 115 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 116 newTable[x] = t; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 117 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 118 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 119 table = newTable; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 120 threshold = newSize - (newSize >>> 2); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 121 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 122 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 123 private static int hash(Object o) { | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 124 int h = o.hashCode(); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 125 // return h; | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 126 // HashMap.newHash() | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 127 h ^= (h >>> 20) ^ (h >>> 12); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 128 return h ^ (h >>> 7) ^ (h >>> 4); | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 129 } | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 130 | 
| 
85b8efde5586
Use memory-friendly set implementation to canonicalize filenames and nodeids
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 131 } | 
