/******************************************************************************* * 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; /** * A simple linked list that pools its nodes. * * @author mzechner */ public class PooledLinkedList<T> { static final class Item<T> { public T payload; public Item<T> next; public Item<T> prev; } private Item<T> head; private Item<T> tail; private Item<T> iter; private Item<T> curr; private int size = 0; private final Pool<Item<T>> pool; public PooledLinkedList(int maxPoolSize) { this.pool = new Pool<Item<T>>(16, maxPoolSize) { protected Item<T> newObject() { return new Item<T>(); } }; } public void add(T object) { Item<T> item = pool.obtain(); item.payload = object; item.next = null; item.prev = null; if (head == null) { head = item; tail = item; size++; return; } item.prev = tail; tail.next = item; tail = item; size++; } /** Starts iterating over the lists items */ public void iter() { iter = head; } /** * Gets the next item in the list * * @return the next item in the list or null if there are no more items */ public T next() { if (iter == null) return null; T payload = iter.payload; curr = iter; iter = iter.next; return payload; } /** Removs the current list item based on the iterator position. */ public void remove() { if (curr == null) return; size--; pool.free(curr); Item<T> c = curr; Item<T> n = curr.next; Item<T> p = curr.prev; curr = null; if (size == 0) { head = null; tail = null; return; } if (c == head) { n.prev = null; head = n; return; } if (c == tail) { p.next = null; tail = p; return; } p.next = n; n.prev = p; } // public static void main (String[] argv) { // PooledLinkedList<Integer> list = new PooledLinkedList<Integer>(10); // // list.add(1); // list.add(2); // list.add(3); // list.add(4); // list.iter(); // list.next(); // list.next(); // list.remove(); // list.next(); // list.next(); // list.remove(); // // list.iter(); // Integer v = null; // while ((v = list.next()) != null) // System.out.println(v); // // list.iter(); // list.next(); // list.next(); // list.remove(); // // list.iter(); // list.next(); // list.remove(); // } public void clear() { iter(); T v = null; while ((v = next()) != null) remove(); } }