/* * Scriptographer * * This file is part of Scriptographer, a Scripting Plugin for Adobe Illustrator * http://scriptographer.org/ * * Copyright (c) 2002-2010, Juerg Lehni * http://scratchdisk.com/ * * All rights reserved. See LICENSE file for details. * * File created on 16.02.2005. */ package com.scratchdisk.list; /** * @author lehni */ public abstract class AbstractExtendedList<E> extends AbstractList<E> implements ExtendedList<E> { public E getFirst() { return size() > 0 ? get(0) : null; } public E getLast() { int size = size(); return size > 0 ? get(size - 1) : null; } public E removeFirst() { return this.remove(0); } public E removeLast() { return this.remove(size() - 1); } public int indexOf(Object element) { int size = size(); for (int i = 0; i < size; i++) { E obj = get(i); if (obj == null && element == null || obj.equals(element)) return i; } return -1; } public int lastIndexOf(Object element) { for (int i = size() - 1; i >= 0; i--) { E obj = get(i); if (obj == null && element == null || obj.equals(element)) return i; } return -1; } public boolean contains(Object element) { return indexOf(element) != -1; } public E remove(E element) { int index = indexOf(element); if (index >= 0) { return remove(index); } return null; } @SuppressWarnings("unchecked") public E[] toArray(E[] array) { if (array == null) array = (E[]) new Object[size()]; for (int i = 0; i < array.length; i++) array[i] = get(i); return array; } public final E[] toArray() { return toArray(null); } /** * @jshide */ public boolean retainAll(ExtendedList<?> elements) { boolean modified = false; for (int i = size() - 1; i >= 0; i--) { E obj = get(i); if(!elements.contains(obj) && remove(i) != null) modified = true; } return modified; } public final boolean retainAll(Object[] elements) { return retainAll(Lists.asList(elements)); } /** * @jshide */ public boolean removeAll(ExtendedList<?> elements) { boolean modified = false; for (int i = size() - 1; i >= 0; i--) { E obj = get(i); if(elements.contains(obj) && remove(i) != null) modified = true; } return modified; } public final boolean removeAll(Object[] elements) { return removeAll(Lists.asList(elements)); } /** * @jshide */ public boolean containsAll(ReadOnlyList<?> elements) { for (int i = elements.size() - 1; i >= 0; i--) { if (!contains(elements.get(i))) return false; } return true; } public final boolean containsAll(Object[] elements) { return containsAll(Lists.asList(elements)); } public void setSize(int newSize) { int size = size(); if (newSize > size) { // fill with null: for (int i = size; i < newSize; i++) add(i, null); } else if (newSize < size) { remove(newSize, size); } } }