/*******************************************************************************
* Copyright 2015 Analog Devices, Inc.
*
* 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.analog.lyric.collect;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.jdt.annotation.Nullable;
/**
* Extends {@link ArrayList} with additional methods for automatically growing list.
* <p>
* @since 0.08
* @author Christopher Barber
*/
public class ExtendedArrayList<T> extends ArrayList<T>
{
private static final long serialVersionUID = 1L;
/*--------------
* Construction
*/
public ExtendedArrayList()
{
this(10);
}
public ExtendedArrayList(Collection<? extends T> collection)
{
super(collection);
}
public ExtendedArrayList(int initialCapacity)
{
super(initialCapacity);
}
/*--------------
* List methods
*/
/**
* Inserts element at specified position in list, growing if necessary.
* <p>
* Unlike the superclass version of this method, this will grow the list
* using {@link #setSize(int)} instead of throwing an {@link IndexOutOfBoundsException}.
*/
@Override
public void add(int index, @Nullable T element)
{
growSize(index);
super.add(index, element);
}
/**
* Replaces element at specified position in list, growing if necessary.
* <p>
* Unlike the superclass version of this method, this will grow the list
* using {@link #setSize(int)} instead of throwing an {@link IndexOutOfBoundsException}.
*/
@Override
public @Nullable T set(int index, @Nullable T element)
{
growSize(index + 1);
return super.set(index, element);
}
/*---------------------------
* ExtendedArrayList methods
*/
/**
* Returns the element at the specified position, or null if index out of range.
* <p>
* This is similar to {@link #get(int)} but returns null instead of throwing
* an {@link IndexOutOfBoundsException} if {@code index} is not in range.
* @since 0.08
*/
public @Nullable T getOrNull(int index)
{
if (index >= 0 & index < size())
{
return super.get(index);
}
return null;
}
/**
* Sets {@link #size} of array to specified value if larger than current size.
* @param newSize is the new size of the array. Is ignored if less than current size.
* @since 0.08
* @see #setSize
*/
public void growSize(int newSize)
{
if (newSize > size())
{
setSize(newSize);
}
}
/**
* Sets {@link #size} of array to specified value.
* <p>
* @param newSize the new size of the array. If less than the current size, elements will be removed
* from the end of the list; if greater than the current size, new elements with null values will
* be appended to the end of the list.
*
* @since 0.08
* @see #growSize
*/
public void setSize(int newSize)
{
final int prevSize = size();
if (newSize < prevSize)
{
for (int i = prevSize; --i>=newSize;)
{
remove(i);
}
}
else if (newSize > prevSize)
{
ensureCapacity(newSize);
for (int i = prevSize; i < newSize; ++i)
{
add(null);
}
}
}
}