IntVector.java Source code

Java tutorial

Introduction

Here is the source code for IntVector.java

Source

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