org.oscim.utils.pool.Pool Maven / Gradle / Ivy
/*
* Copyright 2013 Hannes Janetzek
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see .
*/
package org.oscim.utils.pool;
import javax.annotation.CheckReturnValue;
@SuppressWarnings({"rawtypes", "unchecked"})
public abstract class Pool> {
protected T mPool;
protected int mLimit;
protected int mFill;
/**
* @param item release resources
* @return whether item should be added to
* pool. use to manage pool size manually
*/
protected boolean clearItem(T item) {
return true;
}
/**
* Release 'item' to pool.
*
* Usage item = pool.release(item), to ensure to not keep a reference to
* item!
*/
@CheckReturnValue
public T release(T item) {
if (item == null)
return null;
if (!clearItem(item))
return null;
((Inlist) item).next = mPool;
mPool = item;
return null;
}
/**
* Release 'list' to pool.
*
* Usage list = pool.releaseAll(list), to ensure to not keep a reference to
* list!
*/
@CheckReturnValue
public T releaseAll(T list) {
if (list == null)
return null;
while (list != null) {
T next = (T) list.next;
clearItem(list);
((Inlist) list).next = mPool;
mPool = list;
list = next;
}
return null;
}
/**
* remove 'item' from 'list' and add back to pool
*/
public T release(T list, T item) {
if (item == null)
return list;
clearItem(item);
return (T) Inlist.remove((Inlist) list, item);
}
/**
* get an item from pool
*/
public T get() {
if (mPool == null)
return createItem();
Inlist ret = mPool;
mPool = (T) mPool.next;
ret.next = null;
return (T) ret;
}
protected abstract T createItem();
}