// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.builtin.hytalegenerator.datastructures.bicoordinatecache;

import java.util.Iterator;
import javax.annotation.Nonnull;
import java.util.concurrent.ConcurrentHashMap;

public class HashedBiCoordinateCache<T> implements BiCoordinateCache<T>
{
    @Nonnull
    private final ConcurrentHashMap<Long, T> values;
    
    public HashedBiCoordinateCache() {
        this.values = new ConcurrentHashMap<Long, T>();
    }
    
    public static long hash(final int x, final int z) {
        long hash = x;
        hash <<= 32;
        hash += z;
        return hash;
    }
    
    @Override
    public T get(final int x, final int z) {
        final long key = hash(x, z);
        if (!this.values.containsKey(key)) {
            throw new IllegalStateException("doesn't contain coordinates");
        }
        return this.values.get(key);
    }
    
    @Override
    public boolean isCached(final int x, final int z) {
        return this.values.containsKey(hash(x, z));
    }
    
    @Nonnull
    @Override
    public T save(final int x, final int z, @Nonnull final T value) {
        final long key = hash(x, z);
        this.values.put(key, value);
        return value;
    }
    
    @Override
    public void flush(final int x, final int z) {
        final long key = hash(x, z);
        if (!this.values.containsKey(key)) {
            return;
        }
        this.values.remove(key);
    }
    
    @Override
    public void flush() {
        for (final long key : this.values.keySet()) {
            this.values.remove(key);
        }
    }
    
    @Override
    public int size() {
        return this.values.size();
    }
    
    @Nonnull
    @Override
    public String toString() {
        return "HashedBiCoordinateCache{values=" + String.valueOf(this.values);
    }
}
