001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * LongList.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.util;
030:
031: import java.io.Serializable;
032:
033: /**
034: * A Array-List for integer objects. Ints can be added to the list and will be stored in an int-array.
035: * <p/>
036: * Using this list for storing ints is much faster than creating java.lang.Long objects and storing them in an
037: * ArrayList.
038: * <p/>
039: * This list is not synchronized and does not implement the full List interface. In fact, this list can only be used to
040: * add new values or to clear the complete list.
041: *
042: * @author Thomas Morgner
043: */
044: public class LongList implements Serializable, Cloneable {
045: /**
046: * An empty array used to avoid object creation.
047: */
048: private static final long[] EMPTY_ARRAY = new long[0];
049: /**
050: * The array holding the list data.
051: */
052: private long[] data;
053: /**
054: * The size of the list.
055: */
056: private int size;
057: /**
058: * The number of free slots added on every resize.
059: */
060: private int increment;
061:
062: /**
063: * Creates a new IntList with the given initial capacity. The capacity will also be used as increment value when
064: * extending the capacity of the list.
065: *
066: * @param capacity the initial capacity.
067: */
068: public LongList(final int capacity) {
069: data = new long[capacity];
070: increment = capacity;
071: }
072:
073: /**
074: * Ensures, that the list backend can store at least <code>c</code> elements. This method does nothing, if the new
075: * capacity is less than the current capacity.
076: *
077: * @param c the new capacity of the list.
078: */
079: private void ensureCapacity(final int c) {
080: if (data.length <= c) {
081: final long[] newData = new long[Math.max(data.length
082: + increment, c + 1)];
083: System.arraycopy(data, 0, newData, 0, size);
084: data = newData;
085: }
086: }
087:
088: /**
089: * Adds the given int value to the list.
090: *
091: * @param value the new value to be added.
092: */
093: public void add(final long value) {
094: ensureCapacity(size);
095: data[size] = value;
096: size += 1;
097: }
098:
099: /**
100: * Adds the given int value to the list.
101: *
102: * @param value the new value to be defined.
103: * @param index the position of the valur that should be redefined.
104: */
105: public void set(final int index, final long value) {
106: ensureCapacity(index);
107: data[index] = value;
108: if (index >= size) {
109: size = index + 1;
110: }
111: }
112:
113: /**
114: * Returns the value at the given index.
115: *
116: * @param index the index
117: * @return the value at the given index
118: * @throws IndexOutOfBoundsException if the index is greater or equal to the list size or if the index is negative.
119: */
120: public long get(final int index) {
121: if (index >= size || index < 0) {
122: throw new IndexOutOfBoundsException("Illegal Index: "
123: + index + " Max:" + size);
124: }
125: return data[index];
126: }
127:
128: /**
129: * Clears the list.
130: */
131: public void clear() {
132: size = 0;
133: }
134:
135: /**
136: * Returns the number of elements in this list.
137: *
138: * @return the number of elements in the list
139: */
140: public int size() {
141: return size;
142: }
143:
144: /**
145: * Copys the list contents into a new array.
146: *
147: * @return the list contents as array.
148: */
149: public long[] toArray() {
150: if (size == 0) {
151: return LongList.EMPTY_ARRAY;
152: }
153:
154: if (size == data.length) {
155: return (long[]) data.clone();
156: }
157:
158: final long[] retval = new long[size];
159: System.arraycopy(data, 0, retval, 0, size);
160: return retval;
161: }
162:
163: /**
164: * Copys the list contents into a new array.
165: *
166: * @param retval the array that should receive the contents.
167: * @return the list contents as array.
168: */
169: public long[] toArray(long[] retval) {
170: if (retval == null || retval.length < size) {
171: retval = new long[size];
172: }
173: System.arraycopy(data, 0, retval, 0, size);
174: return retval;
175: }
176:
177: /**
178: * Creates a copy of this list.
179: *
180: * @return a copy of this list.
181: * @throws CloneNotSupportedException if something went wrong during the cloning.
182: */
183: public Object clone() throws CloneNotSupportedException {
184: final LongList intList = (LongList) super .clone();
185: intList.data = (long[]) data.clone();
186: return data;
187: }
188: }
|