/* 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 $ */ package com.vladium.util; // ---------------------------------------------------------------------------- /** * @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 IConstants.EMPTY_INT_ARRAY; 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 // ----------------------------------------------------------------------------