package ch.epfl.isochrone.tiledmap;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Classe à représenter un cache de tuile, utile pour stocker des tuiles souvent
 * demandées
 * 
 * @author Charles Thiebaut (238935)
 * @author Arnaud Delamare (234841)
 * 
 */
public class TileCache {
    public static final int MAX_SIZE = 100;
    private LinkedHashMap<Long, Tile> cache = new LinkedHashMap<Long, Tile>() {
        /**
                 * 
                 */
        private static final long serialVersionUID = 1L;

        @Override
        protected boolean removeEldestEntry(Map.Entry<Long, Tile> e) {
            return size() > MAX_SIZE;
        }
    };

    /**
     * Ajoute une tuile au cache selon ses coordonnées et son zoom
     */
    public void put(int zoom, int x, int y, Tile tile) {
        cache.put(toLong(zoom, x, y), tile);
    }

    /**
     * 
     * Renvoie la tuile stockée avec les coordonnées envoyées ou null si la
     * tuile ne s'y trouve pas
     */
    public Tile get(int zoom, int x, int y) {
        return cache.get(toLong(zoom, x, y));
    }

    /**
     * 
     * Transforme un triplet de nombre en un long pour pouvoir stocker les
     * tuiles efficacement
     */
    private long toLong(int zoom, int x, int y) {
        return zoom + x * (int) Math.pow(2, 20) + y * (int) Math.pow(2, 40);
    }
}
