2 *******************************************************************************
\r
3 * Copyright (C) 1996-2004, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.impl;
\r
12 public class CalendarCache
\r
17 public CalendarCache() {
\r
18 makeArrays(arraySize);
\r
21 private void makeArrays(int newSize) {
\r
22 keys = new long[newSize];
\r
23 values = new long[newSize];
\r
25 for (int i = 0; i < newSize; i++) {
\r
28 arraySize = newSize;
\r
29 threshold = (int)(arraySize * 0.75);
\r
36 public synchronized long get(long key) {
\r
37 return values[findIndex(key)];
\r
43 public synchronized void put(long key, long value)
\r
45 if (size >= threshold) {
\r
48 int index = findIndex(key);
\r
51 values[index] = value;
\r
55 private final int findIndex(long key) {
\r
56 int index = hash(key);
\r
59 while (values[index] != EMPTY && keys[index] != key)
\r
64 index = (index + delta) % arraySize;
\r
69 private void rehash()
\r
71 int oldSize = arraySize;
\r
72 long[] oldKeys = keys;
\r
73 long[] oldValues = values;
\r
75 if (pIndex < primes.length - 1) {
\r
76 arraySize = primes[++pIndex];
\r
78 arraySize = arraySize * 2 + 1;
\r
82 makeArrays(arraySize);
\r
83 for (int i = 0; i < oldSize; i++) {
\r
84 if (oldValues[i] != EMPTY) {
\r
85 put(oldKeys[i], oldValues[i]);
\r
88 oldKeys = oldValues = null; // Help out the garbage collector
\r
93 * Produce a uniformly-distributed hash value from an integer key.
\r
94 * This is essentially a linear congruential random number generator
\r
95 * that uses the key as its seed value.
\r
97 private final int hash(long key)
\r
99 int h = (int)((key * 15821 + 1) % arraySize);
\r
106 private final int hash2(long key) {
\r
107 return arraySize - 2 - (int)(key % (arraySize-2) );
\r
110 static private final int primes[] = { // 5, 17, 31, 47, // for testing
\r
111 61, 127, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521,
\r
115 private int pIndex = 0;
\r
116 private int size = 0;
\r
117 private int arraySize = primes[pIndex];
\r
118 private int threshold = (arraySize * 3) / 4;
\r
120 private long[] keys = new long[arraySize];
\r
121 private long[] values = new long[arraySize];
\r
126 static public long EMPTY = Long.MIN_VALUE;
\r