You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LongMap.java 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. /*
  2. * Copyright (C) 2009, Google Inc.
  3. * and other copyright owners as documented in the project's IP log.
  4. *
  5. * This program and the accompanying materials are made available
  6. * under the terms of the Eclipse Distribution License v1.0 which
  7. * accompanies this distribution, is reproduced below, and is
  8. * available at http://www.eclipse.org/org/documents/edl-v10.php
  9. *
  10. * All rights reserved.
  11. *
  12. * Redistribution and use in source and binary forms, with or
  13. * without modification, are permitted provided that the following
  14. * conditions are met:
  15. *
  16. * - Redistributions of source code must retain the above copyright
  17. * notice, this list of conditions and the following disclaimer.
  18. *
  19. * - Redistributions in binary form must reproduce the above
  20. * copyright notice, this list of conditions and the following
  21. * disclaimer in the documentation and/or other materials provided
  22. * with the distribution.
  23. *
  24. * - Neither the name of the Eclipse Foundation, Inc. nor the
  25. * names of its contributors may be used to endorse or promote
  26. * products derived from this software without specific prior
  27. * written permission.
  28. *
  29. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  30. * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  31. * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  32. * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  33. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  34. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  35. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  36. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  37. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  38. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  39. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  40. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  41. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  42. */
  43. package org.eclipse.jgit.transport;
  44. /**
  45. * Simple Map<long,Object> helper for {@link PackParser}.
  46. *
  47. * @param <V>
  48. * type of the value instance.
  49. */
  50. final class LongMap<V> {
  51. private static final float LOAD_FACTOR = 0.75f;
  52. private Node<V>[] table;
  53. /** Number of entries currently in the map. */
  54. private int size;
  55. /** Next {@link #size} to trigger a {@link #grow()}. */
  56. private int growAt;
  57. LongMap() {
  58. table = createArray(64);
  59. growAt = (int) (table.length * LOAD_FACTOR);
  60. }
  61. boolean containsKey(final long key) {
  62. return get(key) != null;
  63. }
  64. V get(final long key) {
  65. for (Node<V> n = table[index(key)]; n != null; n = n.next) {
  66. if (n.key == key)
  67. return n.value;
  68. }
  69. return null;
  70. }
  71. V remove(final long key) {
  72. Node<V> n = table[index(key)];
  73. Node<V> prior = null;
  74. while (n != null) {
  75. if (n.key == key) {
  76. if (prior == null)
  77. table[index(key)] = n.next;
  78. else
  79. prior.next = n.next;
  80. size--;
  81. return n.value;
  82. }
  83. prior = n;
  84. n = n.next;
  85. }
  86. return null;
  87. }
  88. V put(final long key, final V value) {
  89. for (Node<V> n = table[index(key)]; n != null; n = n.next) {
  90. if (n.key == key) {
  91. final V o = n.value;
  92. n.value = value;
  93. return o;
  94. }
  95. }
  96. if (++size == growAt)
  97. grow();
  98. insert(new Node<V>(key, value));
  99. return null;
  100. }
  101. private void insert(final Node<V> n) {
  102. final int idx = index(n.key);
  103. n.next = table[idx];
  104. table[idx] = n;
  105. }
  106. private void grow() {
  107. final Node<V>[] oldTable = table;
  108. final int oldSize = table.length;
  109. table = createArray(oldSize << 1);
  110. growAt = (int) (table.length * LOAD_FACTOR);
  111. for (int i = 0; i < oldSize; i++) {
  112. Node<V> e = oldTable[i];
  113. while (e != null) {
  114. final Node<V> n = e.next;
  115. insert(e);
  116. e = n;
  117. }
  118. }
  119. }
  120. private final int index(final long key) {
  121. int h = ((int) key) >>> 1;
  122. h ^= (h >>> 20) ^ (h >>> 12);
  123. return h & (table.length - 1);
  124. }
  125. @SuppressWarnings("unchecked")
  126. private static final <V> Node<V>[] createArray(final int sz) {
  127. return new Node[sz];
  128. }
  129. private static class Node<V> {
  130. final long key;
  131. V value;
  132. Node<V> next;
  133. Node(final long k, final V v) {
  134. key = k;
  135. value = v;
  136. }
  137. }
  138. }