//revised from marf
import java.util.Vector;
import java.util.Collection;
import java.util.List;
/**
* Adaptive extension of the java.util.Vector class.
*
* You may access elements of a Vector beyond it's initial length --- the Vector
* will be automaticall adjusted as appropriate.
*
* Useful in the applications where desirable vector's growth by setting an element
* beyond its upper boundary automatticaly lengthens the vector to accomondate the
* change (similar to Perl arrays).
*
* Similarly, getting an element beyond the upper boundary is not desirable failure, but
* an empty element returned. This makes the application to see as vector of a theoretically infinite
* in length.
*
* TODO: allow negative index boundaries.
*
* $Id: FreeVector.java,v 1.12 2005/08/11 00:44:50 mokhov Exp $
*
* @author Serguei Mokhov
* @version $Revision: 1.12 $
* @since 0.3.0.1
*/
public class FreeVector
extends Vector
{
/**
* For serialization versioning.
* When adding new members or make other structural
* changes regenerate this number with the
* serialver
tool that comes with JDK.
* @since 0.3.0.4
*/
private static final long serialVersionUID = 8706834105778495182L;
/**
* A free vector with default capacity as specified by java.util.Vector.
*/
public FreeVector()
{
super();
}
/**
* Constructs this vector given capacity other than default.
* Inherited from java.util.Vector.
* @param piInitialCapacity initial element capacity (number of object placeholders)
*/
public FreeVector(int piInitialCapacity)
{
super(piInitialCapacity);
}
/**
* Constructs this vector given capacity and its increment.
* Inherited from java.util.Vector.
* @param piInitialCapacity initial element capacity (number of object placeholders)
* @param piCapacityIncrement when current capacity reached, until how much capacity should be extened
*/
public FreeVector(int piInitialCapacity, int piCapacityIncrement)
{
super(piInitialCapacity, piCapacityIncrement);
}
/**
* Constructs this vector out of a collection.
* Inherited from java.util.Vector.
* @param poCollection collection for the vector elements.
*/
public FreeVector(Collection poCollection)
{
super(poCollection);
}
/**
* Access an element of the vector given index.
* Overridden from java.util.Vector.
* @param piIndex vector element index to retrieve
* @return object cotained at specified index, null if beyond boundary
*/
public Object elementAt(int piIndex)
{
if(piIndex > size() - 1)
return null;
return super.elementAt(piIndex);
}
/**
* Set an element of the vector given index.
* Capacity is always ensured to be able to accomodate
* any positive inidex (barring out of memory problems).
* Overridden from java.util.Vector.
*
* @param poElement element to set at the index
* @param piIndex the index
*/
public void setElementAt(Object poElement, int piIndex)
{
ensureIndexCapacity(piIndex);
super.setElementAt(poElement, piIndex);
}
/**
* Inserts an element of the vector after given index.
* Capacity is always ensured to be able to accomodate
* any positive inidex (barring out of memory problems).
* Overridden from java.util.Vector.
*
* @param poElement element to set after the index
* @param piIndex the index
*/
public void insertElementAt(Object poElement, int piIndex)
{
ensureIndexCapacity(piIndex);
super.insertElementAt(poElement, piIndex);
}
/**
* Make sure the capacity of the vector is enough
* to hold an element with the specified index.
* Has effect only if the index is greater than
* the current vector's size.
*
* @param piIndex the index to accomodate
*/
public void ensureIndexCapacity(int piIndex)
{
if(piIndex > size() - 1)
{
ensureCapacity(piIndex + 1);
setSize(piIndex + 1);
}
}
/**
* Access an element of the vector given index.
* Overridden from java.util.Vector. Calls the overridden elementAt().
*
* @param piIndex vector element index to retrieve
* @return object cotained at specified index, null if beyond boundary
*/
public synchronized Object get(int piIndex)
{
return elementAt(piIndex);
}
/**
* Set an element of the vector given index.
* Capacity is always ensured to be able to accomodate
* any positive inidex (barring out of memory problems).
* Overridden from java.util.Vector.
*
* @param poElement element to set at the index
* @param piIndex the index
* @return object that was previously at that index.
*/
public synchronized Object set(int piIndex, Object poElement)
{
Object oOldElement = elementAt(piIndex);
setElementAt(poElement, piIndex);
return oOldElement;
}
/**
* Adds an element of the vector at the specified index.
* Overridden from java.util.Vector. Calls the overridden insertElementAt().
* @param piIndex the index
* @param poElement element to set after the index
*/
public synchronized void add(int piIndex, Object poElement)
{
insertElementAt(poElement, piIndex);
}
/**
* Removes an element at index.
* If the index is beyond the upper boundary, returns null.
* Overrides java.util.Vector.
* @param piIndex index of the element to be removed
* @return object reference of the element just removed; null if index exceeds the upper bound
*/
public synchronized Object remove(int piIndex)
{
if(piIndex >= size())
{
//???
// 1 less than the index
//ensureIndexCapacity(piIndex - 1);
return null;
}
return super.remove(piIndex);
}
/**
* Adds a collection of elements to this vector starting at given index.
* Makes sure the capacity of the current vector reaches the piIndex.
* Overrides java.util.Vector.
*
* @param piIndex starting index to add elements from
* @param poCollection collection of elements to add
*
* @return true
if the vector has changed
*/
public synchronized boolean addAll(int piIndex, Collection poCollection)
{
ensureIndexCapacity(piIndex);
return super.addAll(piIndex, poCollection);
}
/**
* Retrieves a sublist subset of vector elements given index boundaries.
* Makes sure the capacity of the current vector reaches the piToIndex.
* Overrides java.util.Vector.
*
* @param piFromIndex starting index to fetch elements from
* @param piToIndex last index to fetch elements to
*
* @return a corresponding List reference.
*/
public synchronized List subList(int piFromIndex, int piToIndex)
{
ensureIndexCapacity(piToIndex);
return super.subList(piFromIndex, piToIndex);
}
/**
* Not implemented.
* Meant to remove a set of elements between two specified indices.
* @param piFromIndex starting index to remove elements from
* @param piToIndex last index to remove elements to
* @throws NotImplementedException
*/
public synchronized void removeRange(int piFromIndex, int piToIndex)
{
// TODO: implement
throw new RuntimeException( "removeRange()");
}
/**
* Retrieves class' revision.
* @return revision string
* @since 0.3.0.2
*/
public static String getMARFSourceCodeRevision()
{
return "$Revision: 1.12 $";
}
}
// EOF