/*
 *  This file is part of Cubic Chunks Mod, licensed under the MIT License (MIT).
 *
 *  Copyright (c) 2015 contributors
 *
 *  Permission is hereby granted, free of charge, to any person obtaining a copy
 *  of this software and associated documentation files (the "Software"), to deal
 *  in the Software without restriction, including without limitation the rights
 *  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *  copies of the Software, and to permit persons to whom the Software is
 *  furnished to do so, subject to the following conditions:
 *
 *  The above copyright notice and this permission notice shall be included in
 *  all copies or substantial portions of the Software.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *  THE SOFTWARE.
 */
package cubicchunks.util.cache;

import mcp.MethodsReturnNonnullByDefault;

import java.util.function.ToDoubleFunction;
import java.util.function.ToIntFunction;

import javax.annotation.ParametersAreNonnullByDefault;

@ParametersAreNonnullByDefault
@MethodsReturnNonnullByDefault
public class HashCacheDoubles<K> {

    private final double[] cache;
    private final K[] keys;
    private final ToIntFunction<K> hashFunction;
    private final ToDoubleFunction<K> source;

    @SuppressWarnings("uncecked")
    private HashCacheDoubles(int size, ToIntFunction<K> hashCode, ToDoubleFunction<K> source) {
        this.cache = new double[size];
        this.keys = (K[]) new Object[size];
        this.hashFunction = hashCode;
        this.source = source;
    }

    public double get(K key) {
        int index = index(hashFunction.applyAsInt(key));
        if (!key.equals(keys[index])) {
            keys[index] = key;
            cache[index] = source.applyAsDouble(key);
        }
        return cache[index];
    }

    private int index(int hash) {
        return Math.floorMod(hash, cache.length);
    }

    public static <K> HashCacheDoubles<K> create(int size, ToDoubleFunction<K> source) {
        return create(size, k -> k.hashCode(), source);
    }

    public static <K> HashCacheDoubles<K> create(int size, ToIntFunction<K> hashCode, ToDoubleFunction<K> source) {
        return new HashCacheDoubles<K>(size, hashCode, source);
    }
}

@@ -1710,16 +1710,17 @@
 ngs(%22unc
+h
 ecked%22)%0A

fix typo