1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2009 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.basicmultitouch; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker /** 20*90c8c64dSAndroid Build Coastguard Worker * Helper class for crating pools of objects. An example use looks like this: 21*90c8c64dSAndroid Build Coastguard Worker * <pre> 22*90c8c64dSAndroid Build Coastguard Worker * public class MyPooledClass { 23*90c8c64dSAndroid Build Coastguard Worker * 24*90c8c64dSAndroid Build Coastguard Worker * private static final SynchronizedPool<MyPooledClass> sPool = 25*90c8c64dSAndroid Build Coastguard Worker * new SynchronizedPool<MyPooledClass>(10); 26*90c8c64dSAndroid Build Coastguard Worker * 27*90c8c64dSAndroid Build Coastguard Worker * public static MyPooledClass obtain() { 28*90c8c64dSAndroid Build Coastguard Worker * MyPooledClass instance = sPool.acquire(); 29*90c8c64dSAndroid Build Coastguard Worker * return (instance != null) ? instance : new MyPooledClass(); 30*90c8c64dSAndroid Build Coastguard Worker * } 31*90c8c64dSAndroid Build Coastguard Worker * 32*90c8c64dSAndroid Build Coastguard Worker * public void recycle() { 33*90c8c64dSAndroid Build Coastguard Worker * // Clear state if needed. 34*90c8c64dSAndroid Build Coastguard Worker * sPool.release(this); 35*90c8c64dSAndroid Build Coastguard Worker * } 36*90c8c64dSAndroid Build Coastguard Worker * 37*90c8c64dSAndroid Build Coastguard Worker * . . . 38*90c8c64dSAndroid Build Coastguard Worker * } 39*90c8c64dSAndroid Build Coastguard Worker * </pre> 40*90c8c64dSAndroid Build Coastguard Worker * 41*90c8c64dSAndroid Build Coastguard Worker * @hide 42*90c8c64dSAndroid Build Coastguard Worker */ 43*90c8c64dSAndroid Build Coastguard Worker public final class Pools { 44*90c8c64dSAndroid Build Coastguard Worker 45*90c8c64dSAndroid Build Coastguard Worker /** 46*90c8c64dSAndroid Build Coastguard Worker * Interface for managing a pool of objects. 47*90c8c64dSAndroid Build Coastguard Worker * 48*90c8c64dSAndroid Build Coastguard Worker * @param <T> The pooled type. 49*90c8c64dSAndroid Build Coastguard Worker */ 50*90c8c64dSAndroid Build Coastguard Worker public static interface Pool<T> { 51*90c8c64dSAndroid Build Coastguard Worker 52*90c8c64dSAndroid Build Coastguard Worker /** 53*90c8c64dSAndroid Build Coastguard Worker * @return An instance from the pool if such, null otherwise. 54*90c8c64dSAndroid Build Coastguard Worker */ acquire()55*90c8c64dSAndroid Build Coastguard Worker public T acquire(); 56*90c8c64dSAndroid Build Coastguard Worker 57*90c8c64dSAndroid Build Coastguard Worker /** 58*90c8c64dSAndroid Build Coastguard Worker * Release an instance to the pool. 59*90c8c64dSAndroid Build Coastguard Worker * 60*90c8c64dSAndroid Build Coastguard Worker * @param instance The instance to release. 61*90c8c64dSAndroid Build Coastguard Worker * @return Whether the instance was put in the pool. 62*90c8c64dSAndroid Build Coastguard Worker * 63*90c8c64dSAndroid Build Coastguard Worker * @throws IllegalStateException If the instance is already in the pool. 64*90c8c64dSAndroid Build Coastguard Worker */ release(T instance)65*90c8c64dSAndroid Build Coastguard Worker public boolean release(T instance); 66*90c8c64dSAndroid Build Coastguard Worker } 67*90c8c64dSAndroid Build Coastguard Worker Pools()68*90c8c64dSAndroid Build Coastguard Worker private Pools() { 69*90c8c64dSAndroid Build Coastguard Worker /* do nothing - hiding constructor */ 70*90c8c64dSAndroid Build Coastguard Worker } 71*90c8c64dSAndroid Build Coastguard Worker 72*90c8c64dSAndroid Build Coastguard Worker /** 73*90c8c64dSAndroid Build Coastguard Worker * Simple (non-synchronized) pool of objects. 74*90c8c64dSAndroid Build Coastguard Worker * 75*90c8c64dSAndroid Build Coastguard Worker * @param <T> The pooled type. 76*90c8c64dSAndroid Build Coastguard Worker */ 77*90c8c64dSAndroid Build Coastguard Worker public static class SimplePool<T> implements Pool<T> { 78*90c8c64dSAndroid Build Coastguard Worker private final Object[] mPool; 79*90c8c64dSAndroid Build Coastguard Worker 80*90c8c64dSAndroid Build Coastguard Worker private int mPoolSize; 81*90c8c64dSAndroid Build Coastguard Worker 82*90c8c64dSAndroid Build Coastguard Worker /** 83*90c8c64dSAndroid Build Coastguard Worker * Creates a new instance. 84*90c8c64dSAndroid Build Coastguard Worker * 85*90c8c64dSAndroid Build Coastguard Worker * @param maxPoolSize The max pool size. 86*90c8c64dSAndroid Build Coastguard Worker * 87*90c8c64dSAndroid Build Coastguard Worker * @throws IllegalArgumentException If the max pool size is less than zero. 88*90c8c64dSAndroid Build Coastguard Worker */ SimplePool(int maxPoolSize)89*90c8c64dSAndroid Build Coastguard Worker public SimplePool(int maxPoolSize) { 90*90c8c64dSAndroid Build Coastguard Worker if (maxPoolSize <= 0) { 91*90c8c64dSAndroid Build Coastguard Worker throw new IllegalArgumentException("The max pool size must be > 0"); 92*90c8c64dSAndroid Build Coastguard Worker } 93*90c8c64dSAndroid Build Coastguard Worker mPool = new Object[maxPoolSize]; 94*90c8c64dSAndroid Build Coastguard Worker } 95*90c8c64dSAndroid Build Coastguard Worker 96*90c8c64dSAndroid Build Coastguard Worker @Override 97*90c8c64dSAndroid Build Coastguard Worker @SuppressWarnings("unchecked") acquire()98*90c8c64dSAndroid Build Coastguard Worker public T acquire() { 99*90c8c64dSAndroid Build Coastguard Worker if (mPoolSize > 0) { 100*90c8c64dSAndroid Build Coastguard Worker final int lastPooledIndex = mPoolSize - 1; 101*90c8c64dSAndroid Build Coastguard Worker T instance = (T) mPool[lastPooledIndex]; 102*90c8c64dSAndroid Build Coastguard Worker mPool[lastPooledIndex] = null; 103*90c8c64dSAndroid Build Coastguard Worker mPoolSize--; 104*90c8c64dSAndroid Build Coastguard Worker return instance; 105*90c8c64dSAndroid Build Coastguard Worker } 106*90c8c64dSAndroid Build Coastguard Worker return null; 107*90c8c64dSAndroid Build Coastguard Worker } 108*90c8c64dSAndroid Build Coastguard Worker 109*90c8c64dSAndroid Build Coastguard Worker @Override release(T instance)110*90c8c64dSAndroid Build Coastguard Worker public boolean release(T instance) { 111*90c8c64dSAndroid Build Coastguard Worker if (isInPool(instance)) { 112*90c8c64dSAndroid Build Coastguard Worker throw new IllegalStateException("Already in the pool!"); 113*90c8c64dSAndroid Build Coastguard Worker } 114*90c8c64dSAndroid Build Coastguard Worker if (mPoolSize < mPool.length) { 115*90c8c64dSAndroid Build Coastguard Worker mPool[mPoolSize] = instance; 116*90c8c64dSAndroid Build Coastguard Worker mPoolSize++; 117*90c8c64dSAndroid Build Coastguard Worker return true; 118*90c8c64dSAndroid Build Coastguard Worker } 119*90c8c64dSAndroid Build Coastguard Worker return false; 120*90c8c64dSAndroid Build Coastguard Worker } 121*90c8c64dSAndroid Build Coastguard Worker isInPool(T instance)122*90c8c64dSAndroid Build Coastguard Worker private boolean isInPool(T instance) { 123*90c8c64dSAndroid Build Coastguard Worker for (int i = 0; i < mPoolSize; i++) { 124*90c8c64dSAndroid Build Coastguard Worker if (mPool[i] == instance) { 125*90c8c64dSAndroid Build Coastguard Worker return true; 126*90c8c64dSAndroid Build Coastguard Worker } 127*90c8c64dSAndroid Build Coastguard Worker } 128*90c8c64dSAndroid Build Coastguard Worker return false; 129*90c8c64dSAndroid Build Coastguard Worker } 130*90c8c64dSAndroid Build Coastguard Worker } 131*90c8c64dSAndroid Build Coastguard Worker 132*90c8c64dSAndroid Build Coastguard Worker /** 133*90c8c64dSAndroid Build Coastguard Worker * Synchronized) pool of objects. 134*90c8c64dSAndroid Build Coastguard Worker * 135*90c8c64dSAndroid Build Coastguard Worker * @param <T> The pooled type. 136*90c8c64dSAndroid Build Coastguard Worker */ 137*90c8c64dSAndroid Build Coastguard Worker public static class SynchronizedPool<T> extends SimplePool<T> { 138*90c8c64dSAndroid Build Coastguard Worker private final Object mLock = new Object(); 139*90c8c64dSAndroid Build Coastguard Worker 140*90c8c64dSAndroid Build Coastguard Worker /** 141*90c8c64dSAndroid Build Coastguard Worker * Creates a new instance. 142*90c8c64dSAndroid Build Coastguard Worker * 143*90c8c64dSAndroid Build Coastguard Worker * @param maxPoolSize The max pool size. 144*90c8c64dSAndroid Build Coastguard Worker * 145*90c8c64dSAndroid Build Coastguard Worker * @throws IllegalArgumentException If the max pool size is less than zero. 146*90c8c64dSAndroid Build Coastguard Worker */ SynchronizedPool(int maxPoolSize)147*90c8c64dSAndroid Build Coastguard Worker public SynchronizedPool(int maxPoolSize) { 148*90c8c64dSAndroid Build Coastguard Worker super(maxPoolSize); 149*90c8c64dSAndroid Build Coastguard Worker } 150*90c8c64dSAndroid Build Coastguard Worker 151*90c8c64dSAndroid Build Coastguard Worker @Override acquire()152*90c8c64dSAndroid Build Coastguard Worker public T acquire() { 153*90c8c64dSAndroid Build Coastguard Worker synchronized (mLock) { 154*90c8c64dSAndroid Build Coastguard Worker return super.acquire(); 155*90c8c64dSAndroid Build Coastguard Worker } 156*90c8c64dSAndroid Build Coastguard Worker } 157*90c8c64dSAndroid Build Coastguard Worker 158*90c8c64dSAndroid Build Coastguard Worker @Override release(T element)159*90c8c64dSAndroid Build Coastguard Worker public boolean release(T element) { 160*90c8c64dSAndroid Build Coastguard Worker synchronized (mLock) { 161*90c8c64dSAndroid Build Coastguard Worker return super.release(element); 162*90c8c64dSAndroid Build Coastguard Worker } 163*90c8c64dSAndroid Build Coastguard Worker } 164*90c8c64dSAndroid Build Coastguard Worker } 165*90c8c64dSAndroid Build Coastguard Worker } 166