/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
*
* This program and the accompanying materials are made available under
* the terms of the Common Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/cpl-v10.html
*
* $Id: IntVector.java,v 1.1.1.1 2004/05/09 16:57:53 vlad_r Exp $
*/
// ----------------------------------------------------------------------------
/**
* @author Vlad Roubtsov, (C) 2001
*/
public
final class IntVector implements Cloneable
{
// public: ................................................................
public IntVector ()
{
this (5);
}
public IntVector (final int initCapacity)
{
m_values = new int [initCapacity];
}
// ACCESSORS:
public int get (final int index)
{
if (index > m_size - 1)
throw new IndexOutOfBoundsException ("get[" + index + "] on vector of size " + m_size);
return m_values [index];
}
public int [] values ()
{
if (m_size == 0)
return new int[0];
else
{
final int size = m_size;
final int [] result = new int [size];
if (size < COPY_THRESHOLD)
{
for (int i = 0; i < size; ++ i) result [i] = m_values [i];
}
else
{
System.arraycopy (m_values, 0, result, 0, size);
}
return result;
}
}
public int size ()
{
return m_size;
}
// Cloneable:
/**
* Performs deep copy.
*/
public Object clone ()
{
try
{
final IntVector _clone = (IntVector) super.clone ();
// deep clone:
if (m_size < COPY_THRESHOLD)
{
_clone.m_values = new int [m_values.length];
final int [] _clone_values = _clone.m_values;
for (int i = 0; i < m_size; ++ i) _clone_values [i] = m_values [i];
}
else
{
_clone.m_values = (int []) m_values.clone ();
}
return _clone;
}
catch (CloneNotSupportedException e)
{
throw new InternalError (e.toString ());
}
}
public String toString ()
{
final StringBuffer s = new StringBuffer (super.toString() + ", size " + m_size + ": ");
for (int i = 0; i < m_size; ++ i)
{
if (i > 0) s.append (", ");
s.append (m_values [i]);
}
return s.toString ();
}
// MUTATORS:
public int set (final int index, final int value)
{
if (index > m_size - 1)
throw new IndexOutOfBoundsException ("get[" + index + "] on vector of size " + m_size);
final int current_value = m_values [index];
m_values [index] = value;
return current_value;
}
public void add (final int value)
{
final int capacity = m_values.length;
if (capacity == m_size)
{
final int [] values = new int [1 + (capacity << 1)];
if (capacity < COPY_THRESHOLD)
{
for (int i = 0; i < capacity; ++ i) values [i] = m_values [i];
}
else
{
System.arraycopy (m_values, 0, values, 0, capacity);
}
m_values = values;
}
m_values [m_size ++] = value;
}
// protected: .............................................................
// package: ...............................................................
// private: ...............................................................
private int [] m_values; // never null
private int m_size;
private static final int COPY_THRESHOLD = 10;
} // end of class
// ----------------------------------------------------------------------------