/*******************************************************************************
* Copyright 2011 See AUTHORS file.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package com.badlogic.gdx.utils;
import chbachman.api.util.Array;
import chbachman.api.util.ObjectMap;
/**
* Stores a map of {@link Pool}s (usually {@link ReflectionPool}s) by type for
* convenient static access.
*
* @author Nathan Sweet
*/
public class Pools {
static private final ObjectMap<Class, Pool> typePools = new ObjectMap();
/**
* Returns a new or existing pool for the specified type, stored in a Class
* to {@link Pool} map. Note the max size is ignored if this is not the
* first time this pool has been requested.
*/
static public <T> Pool<T> get(Class<T> type, int max) {
Pool pool = typePools.get(type);
if (pool == null) {
pool = new ReflectionPool(type, 4, max);
typePools.put(type, pool);
}
return pool;
}
/**
* Returns a new or existing pool for the specified type, stored in a Class
* to {@link Pool} map. The max size of the pool used is 100.
*/
static public <T> Pool<T> get(Class<T> type) {
return get(type, 100);
}
/**
* Sets an existing pool for the specified type, stored in a Class to
* {@link Pool} map.
*/
static public <T> void set(Class<T> type, Pool<T> pool) {
typePools.put(type, pool);
}
/** Obtains an object from the {@link #get(Class) pool}. */
static public <T> T obtain(Class<T> type) {
return get(type).obtain();
}
/** Frees an object from the {@link #get(Class) pool}. */
static public void free(Object object) {
if (object == null)
throw new IllegalArgumentException("Object cannot be null.");
Pool pool = typePools.get(object.getClass());
if (pool == null)
return; // Ignore freeing an object that was never retained.
pool.free(object);
}
/**
* Frees the specified objects from the {@link #get(Class) pool}. Null
* objects within the array are silently ignored. Objects don't need to be
* from the same pool.
*/
static public void freeAll(Array objects) {
freeAll(objects, false);
}
/**
* Frees the specified objects from the {@link #get(Class) pool}. Null
* objects within the array are silently ignored.
*
* @param samePool
* If true, objects don't need to be from the same pool but the
* pool must be looked up for each object.
*/
static public void freeAll(Array objects, boolean samePool) {
if (objects == null)
throw new IllegalArgumentException("Objects cannot be null.");
Pool pool = null;
for (int i = 0, n = objects.size; i < n; i++) {
Object object = objects.get(i);
if (object == null)
continue;
if (pool == null) {
pool = typePools.get(object.getClass());
if (pool == null)
continue; // Ignore freeing an object that was never
// retained.
}
pool.free(object);
if (!samePool)
pool = null;
}
}
private Pools() {
}
}