Java tutorial
/* 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 // ----------------------------------------------------------------------------