/* * Copyright (c) 2008, Harald Kuhr * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name "TwelveMonkeys" nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.twelvemonkeys.util; import java.util.Map; import java.util.LinkedHashMap; import java.util.Iterator; /** * Map implementation with size limit, that keeps its entries in LRU * (least recently used) order, also known as access-order. * When the size limit is reached, the least recently accessed mappings are * removed. The number of mappings to be removed from the map, is * controlled by the trim factor. *
*
* The trim factor controls how many percent of the maps current size is * reclaimed, when performing an {@code removeLRU} operation. * Defaults to 1% ({@code 0.01f}). * * @return the current trim factor */ public float getTrimFactor() { return mTrimFactor; } /** * Sets the trim factor. *
* The trim factor controls how many percent of the maps current size is
* reclaimed, when performing an {@code removeLRU} operation.
* Defaults to 1% ({@code 0.01f}).
*
* @param pTrimFactor the new trim factor. Acceptable values are between
* 0 (inclusive) and 1 (exclusive).
*
* @see #removeLRU()
*/
public void setTrimFactor(float pTrimFactor) {
if (pTrimFactor < 0f || pTrimFactor >= 1f) {
throw new IllegalArgumentException("trim factor must be between 0 and 1");
}
mTrimFactor = pTrimFactor;
}
/**
* always returns {@code false}, and instead invokes {@code removeLRU()}
* if {@code size >= maxSize}.
*/
protected boolean removeEldestEntry(Map.Entry
* How many mappings are removed from the map, is controlled by the
* trim factor.
* In any case, at least one mapping will be removed.
*
* @see #getTrimFactor()
*/
public void removeLRU() {
int removeCount = (int) Math.max((size() * mTrimFactor), 1);
Iterator