public class

SmartList

extends ArrayList<E>
package org.anddev.andengine.util;

import java.util.ArrayList;

/**
 * (c) 2010 Nicolas Gramlich 
 * (c) 2011 Zynga Inc.
 * 
 * @author Nicolas Gramlich
 * @since 22:20:08 - 27.12.2010
 */
public class SmartList<T> extends ArrayList<T> {
	// ===========================================================
	// Constants
	// ===========================================================

	private static final long serialVersionUID = -8335986399182700102L;

	// ===========================================================
	// Fields
	// ===========================================================

	// ===========================================================
	// Constructors
	// ===========================================================

	public SmartList() {

	}

	public SmartList(final int pCapacity) {
		super(pCapacity);
	}

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	/**
	 * @param pItem the item to remove.
	 * @param pParameterCallable to be called with the removed item, if it was removed.
	 */
	public boolean remove(final T pItem, final ParameterCallable<T> pParameterCallable) {
		final boolean removed = this.remove(pItem);
		if(removed) {
			pParameterCallable.call(pItem);
		}
		return removed;
	}

	public T remove(final IMatcher<T> pMatcher) {
		for(int i = 0; i < this.size(); i++) {
			if(pMatcher.matches(this.get(i))) {
				return this.remove(i);
			}
		}
		return null;
	}

	public T remove(final IMatcher<T> pMatcher, final ParameterCallable<T> pParameterCallable) {
		for(int i = this.size() - 1; i >= 0; i--) {
			if(pMatcher.matches(this.get(i))) {
				final T removed = this.remove(i);
				pParameterCallable.call(removed);
				return removed;
			}
		}
		return null;
	}

	public boolean removeAll(final IMatcher<T> pMatcher) {
		boolean result = false;
		for(int i = this.size() - 1; i >= 0; i--) {
			if(pMatcher.matches(this.get(i))) {
				this.remove(i);
				result = true;
			}
		}
		return result;
	}

	/**
	 * @param pMatcher to find the items.
	 * @param pParameterCallable to be called with each matched item after it was removed.
	 */
	public boolean removeAll(final IMatcher<T> pMatcher, final ParameterCallable<T> pParameterCallable) {
		boolean result = false;
		for(int i = this.size() - 1; i >= 0; i--) {
			if(pMatcher.matches(this.get(i))) {
				final T removed = this.remove(i);
				pParameterCallable.call(removed);
				result = true;
			}
		}
		return result;
	}

	public void clear(final ParameterCallable<T> pParameterCallable) {
		for(int i = this.size() - 1; i >= 0; i--) {
			final T removed = this.remove(i);
			pParameterCallable.call(removed);
		}
	}

	public T find(final IMatcher<T> pMatcher) {
		for(int i = this.size() - 1; i >= 0; i--) {
			final T item = this.get(i);
			if(pMatcher.matches(item)) {
				return item;
			}
		}
		return null;
	}

	public void call(final ParameterCallable<T> pParameterCallable) {
		for(int i = this.size() - 1; i >= 0; i--) {
			final T item = this.get(i);
			pParameterCallable.call(item);
		}
	}

	public void call(final IMatcher<T> pMatcher, final ParameterCallable<T> pParameterCallable) {
		for(int i = this.size() - 1; i >= 0; i--) {
			final T item = this.get(i);
			if(pMatcher.matches(item)) {
				pParameterCallable.call(item);
			}
		}
	}

	// ===========================================================
	// Methods
	// ===========================================================

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}