diff --git a/src/java/org/apache/commons/collections/BinaryHeap.java b/src/java/org/apache/commons/collections/BinaryHeap.java index 20404a77c..6ab6efd01 100644 --- a/src/java/org/apache/commons/collections/BinaryHeap.java +++ b/src/java/org/apache/commons/collections/BinaryHeap.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/BinaryHeap.java,v 1.10 2002/08/15 20:04:31 pjack Exp $ - * $Revision: 1.10 $ - * $Date: 2002/08/15 20:04:31 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/BinaryHeap.java,v 1.11 2002/10/13 12:59:04 scolebourne Exp $ + * $Revision: 1.11 $ + * $Date: 2002/10/13 12:59:04 $ * * ==================================================================== * @@ -64,425 +64,413 @@ import java.util.AbstractCollection; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Comparator; - /** * Binary heap implementation of {@link PriorityQueue} and {@link Buffer}. - * + *

* The removal order of a binary heap is based on either the natural sort * order of its elements or a specified {@link Comparator}. The * {@link #remove()} method always returns the first element as determined - * by the sort order. (The isMinHeap flag in the constructors + * by the sort order. (The isMinHeap flag in the constructors * can be used to reverse the sort order, in which case {@link #remove()} * will always remove the last element.) The removal order is - * not the same as the order of iteration; elements are - * returned by the iterator in no particular order.

- * + * not the same as the order of iteration; elements are + * returned by the iterator in no particular order. + *

* The {@link #add(Object)} and {@link #remove()} operations perform * in logarithmic time. The {@link #get()} operation performs in constant - * time. All other operations perform in linear time or worse.

- * + * time. All other operations perform in linear time or worse. + *

* Note that this implementation is not synchronized. Use * {@link BufferUtils#synchronizedBuffer(Buffer)} to provide - * synchronized access to a BinaryHeap: + * synchronized access to a BinaryHeap: * - *

+ * 
  * Buffer heap = BufferUtils.synchronizedBuffer(new BinaryHeap());
- * 
+ *
* + * @author Peter Donald + * @author Ram Chidambaram + * @author Michael A. Smith + * @author Paul Jack + * @author Stephen Colebourne * @since 1.0 - * @author Peter Donald - * @author Ram Chidambaram - * @author Michael A. Smith - * @author Paul Jack + * @version $Id: BinaryHeap.java,v 1.11 2002/10/13 12:59:04 scolebourne Exp $ */ public final class BinaryHeap extends AbstractCollection - implements PriorityQueue, Buffer -{ + implements PriorityQueue, Buffer { /** - * The default capacity for a binary heap. + * The default capacity for a binary heap. */ - protected final static int DEFAULT_CAPACITY = 13; + private final static int DEFAULT_CAPACITY = 13; + /** + * The number of elements currently in this heap. + */ + int m_size; // package scoped for testing + /** + * The elements in this heap. + */ + Object[] m_elements; // package scoped for testing + /** + * If true, the first element as determined by the sort order will + * be returned. If false, the last element as determined by the + * sort order will be returned. + */ + boolean m_isMinHeap; // package scoped for testing + /** + * The comparator used to order the elements + */ + Comparator m_comparator; // package scoped for testing /** - * The number of elements currently in this heap. + * Constructs a new minimum binary heap. */ - protected int m_size; - - /** - * The elements in this heap. - */ - protected Object[] m_elements; - - /** - * If true, the first element as determined by the sort order will - * be returned. If false, the last element as determiend by the - * sort order will be returned. - */ - protected boolean m_isMinHeap; - private Comparator m_comparator; - - /** - * Create a new minimum binary heap. - */ - public BinaryHeap() - { - this( DEFAULT_CAPACITY, true ); + public BinaryHeap() { + this(DEFAULT_CAPACITY, true); } /** - * Constructs a new BinaryHeap that will use the given - * comparator to order its elements. + * Constructs a new BinaryHeap that will use the given + * comparator to order its elements. + * + * @param comparator the comparator used to order the elements, null + * means use natural order */ - public BinaryHeap( Comparator comparator ) - { + public BinaryHeap(Comparator comparator) { this(); m_comparator = comparator; } - + /** - * Create a new minimum binary heap with the specified initial capacity. + * Constructs a new minimum binary heap with the specified initial capacity. * - * @param capacity the initial capacity for the heap. This value must + * @param capacity The initial capacity for the heap. This value must * be greater than zero. - * - * @exception IllegalArgumentException - * if capacity is <= 0 - **/ - public BinaryHeap( final int capacity ) - { - this( capacity, true ); + * @throws IllegalArgumentException + * if capacity is <= 0 + */ + public BinaryHeap(int capacity) { + this(capacity, true); } /** - * Constructs a new BinaryHeap. + * Constructs a new BinaryHeap. * - * @param capacity the initial capacity for the heap - * @param comparator the comparator to use to order elements - * @exception IllegalArgumentException - * if capacity is <= 0 + * @param capacity the initial capacity for the heap + * @param comparator the comparator used to order the elements, null + * means use natural order + * @throws IllegalArgumentException + * if capacity is <= 0 */ - public BinaryHeap( final int capacity, Comparator comparator ) - { - this( capacity ); + public BinaryHeap(int capacity, Comparator comparator) { + this(capacity); m_comparator = comparator; } /** - * Create a new minimum or maximum binary heap + * Constructs a new minimum or maximum binary heap * - * @param isMinHeap if true the heap is created as a - * minimum heap; otherwise, the heap is created as a maximum heap. - **/ - public BinaryHeap( final boolean isMinHeap ) - { - this( DEFAULT_CAPACITY, isMinHeap ); + * @param isMinHeap if true the heap is created as a + * minimum heap; otherwise, the heap is created as a maximum heap + */ + public BinaryHeap(boolean isMinHeap) { + this(DEFAULT_CAPACITY, isMinHeap); } /** - * Constructs a new BinaryHeap. + * Constructs a new BinaryHeap. * - * @param isMinHeap true to use the order imposed by the given - * comparator; false to reverse that order - * @param comparator the comparator to use to order elements + * @param isMinHeap true to use the order imposed by the given + * comparator; false to reverse that order + * @param comparator the comparator used to order the elements, null + * means use natural order */ - public BinaryHeap( final boolean isMinHeap, Comparator comparator ) - { - this( isMinHeap ); + public BinaryHeap(boolean isMinHeap, Comparator comparator) { + this(isMinHeap); m_comparator = comparator; } /** - * Create a new minimum or maximum binary heap with the specified - * initial capacity. + * Constructs a new minimum or maximum binary heap with the specified + * initial capacity. * - * @param capacity the initial capacity for the heap. This value must - * be greater than zero. - * - * @param isMinHeap if true the heap is created as a + * @param capacity the initial capacity for the heap. This value must + * be greater than zero. + * @param isMinHeap if true the heap is created as a * minimum heap; otherwise, the heap is created as a maximum heap. - * - * @exception IllegalArgumentException - * if capacity is <= 0 - **/ - public BinaryHeap( final int capacity, final boolean isMinHeap ) - { - if( capacity <= 0 ) { - throw new IllegalArgumentException( "invalid capacity" ); + * @throws IllegalArgumentException + * if capacity is <= 0 + */ + public BinaryHeap(int capacity, boolean isMinHeap) { + if (capacity <= 0) { + throw new IllegalArgumentException("invalid capacity"); } m_isMinHeap = isMinHeap; //+1 as 0 is noop - m_elements = new Object[ capacity + 1 ]; + m_elements = new Object[capacity + 1]; } /** - * Constructs a new BinaryHeap. + * Constructs a new BinaryHeap. * - * @param capacity the initial capacity for the heap - * @param isMinHeap true to use the order imposed by the given - * comparator; false to reverse that order - * @param comparator the comparator to use to order elements - * @exception IllegalArgumentException - * if capacity is <= 0 + * @param capacity the initial capacity for the heap + * @param isMinHeap true to use the order imposed by the given + * comparator; false to reverse that order + * @param comparator the comparator used to order the elements, null + * means use natural order + * @throws IllegalArgumentException + * if capacity is <= 0 */ - public BinaryHeap( final int capacity, final boolean isMinHeap, - Comparator comparator ) - { - this( capacity, isMinHeap ); + public BinaryHeap(int capacity, boolean isMinHeap, Comparator comparator) { + this(capacity, isMinHeap); m_comparator = comparator; } + /** - * Clear all elements from queue. + * Clears all elements from queue. */ - public void clear() - { + public void clear() { + m_elements = new Object[m_elements.length]; // for gc m_size = 0; } /** - * Test if queue is empty. + * Tests if queue is empty. * * @return true if queue is empty; false - * otherwise. + * otherwise. */ - public boolean isEmpty() - { - return ( 0 == m_size ); + public boolean isEmpty() { + return m_size == 0; } /** - * Test if queue is full. + * Tests if queue is full. * * @return true if queue is full; false - * otherwise. + * otherwise. */ - public boolean isFull() - { + public boolean isFull() { //+1 as element 0 is noop - return ( m_elements.length == m_size+1 ); + return m_elements.length == m_size + 1; } /** - * Insert an element into queue. + * Inserts an element into queue. * - * @param element the element to be inserted + * @param element the element to be inserted */ - public void insert( final Object element ) - { - if( isFull() ) grow(); - + public void insert(Object element) { + if (isFull()) { + grow(); + } //percolate element to it's place in tree - if( m_isMinHeap ) percolateUpMinHeap( element ); - else percolateUpMaxHeap( element ); + if (m_isMinHeap) { + percolateUpMinHeap(element); + } else { + percolateUpMaxHeap(element); + } } /** - * Return element on top of heap but don't remove it. + * Returns the element on top of heap but don't remove it. * * @return the element at top of heap - * @exception NoSuchElementException if isEmpty() == true + * @throws NoSuchElementException if isEmpty() == true */ - public Object peek() throws NoSuchElementException - { - if( isEmpty() ) throw new NoSuchElementException(); - else return m_elements[ 1 ]; + public Object peek() throws NoSuchElementException { + if (isEmpty()) { + throw new NoSuchElementException(); + } else { + return m_elements[1]; + } } /** - * Return element on top of heap and remove it. + * Returns the element on top of heap and remove it. * * @return the element at top of heap - * @exception NoSuchElementException if isEmpty() == true + * @throws NoSuchElementException if isEmpty() == true */ - public Object pop() throws NoSuchElementException - { + public Object pop() throws NoSuchElementException { final Object result = peek(); - m_elements[ 1 ] = m_elements[ m_size-- ]; + m_elements[1] = m_elements[m_size--]; - //set the unused element to 'null' so that the garbage collector - //can free the object if not used anywhere else.(remove reference) - m_elements[ m_size + 1 ] = null; + // set the unused element to 'null' so that the garbage collector + // can free the object if not used anywhere else.(remove reference) + m_elements[m_size + 1] = null; - if( m_size != 0 ) - { - //percolate top element to it's place in tree - if( m_isMinHeap ) percolateDownMinHeap( 1 ); - else percolateDownMaxHeap( 1 ); + if (m_size != 0) { + // percolate top element to it's place in tree + if (m_isMinHeap) { + percolateDownMinHeap(1); + } else { + percolateDownMaxHeap(1); + } } return result; } /** - * Percolate element down heap from top. + * Percolates element down heap from top. * Assume it is a maximum heap. * * @param index the index for the element */ - protected void percolateDownMinHeap( final int index ) - { - final Object element = m_elements[ index ]; - + protected void percolateDownMinHeap(final int index) { + final Object element = m_elements[index]; int hole = index; - while( (hole * 2) <= m_size ) - { + while ((hole * 2) <= m_size) { int child = hole * 2; - //if we have a right child and that child can not be percolated - //up then move onto other child - if( child != m_size && - compare( m_elements[ child + 1 ], m_elements[ child ] ) < 0 ) - { + // if we have a right child and that child can not be percolated + // up then move onto other child + if (child != m_size && compare(m_elements[child + 1], m_elements[child]) < 0) { child++; } - //if we found resting place of bubble then terminate search - if( compare( m_elements[ child ], element ) >= 0 ) - { + // if we found resting place of bubble then terminate search + if (compare(m_elements[child], element) >= 0) { break; } - m_elements[ hole ] = m_elements[ child ]; + m_elements[hole] = m_elements[child]; hole = child; } - m_elements[ hole ] = element; + m_elements[hole] = element; } /** - * Percolate element down heap from top. + * Percolates element down heap from top. * Assume it is a maximum heap. * * @param index the index of the element */ - protected void percolateDownMaxHeap( final int index ) - { - final Object element = m_elements[ index ]; - + protected void percolateDownMaxHeap(final int index) { + final Object element = m_elements[index]; int hole = index; - while( (hole * 2) <= m_size ) - { + while ((hole * 2) <= m_size) { int child = hole * 2; - //if we have a right child and that child can not be percolated - //up then move onto other child - if( child != m_size && - compare( m_elements[ child + 1 ], m_elements[ child ] ) > 0 ) - { + // if we have a right child and that child can not be percolated + // up then move onto other child + if (child != m_size && compare(m_elements[child + 1], m_elements[child]) > 0) { child++; } - //if we found resting place of bubble then terminate search - if( compare( m_elements[ child ], element ) <= 0 ) - { + // if we found resting place of bubble then terminate search + if (compare(m_elements[child], element) <= 0) { break; } - m_elements[ hole ] = m_elements[ child ]; + m_elements[hole] = m_elements[child]; hole = child; } - m_elements[ hole ] = element; + m_elements[hole] = element; } /** - * Percolate element up heap from bottom. + * Percolates element up heap from bottom. * Assume it is a maximum heap. * * @param element the element */ - protected void percolateUpMinHeap( final Object element ) - { + protected void percolateUpMinHeap(final Object element) { int hole = ++m_size; - m_elements[ hole ] = element; + m_elements[hole] = element; - while( hole > 1 && - compare( element, m_elements[ hole / 2 ] ) < 0 ) - { - //save element that is being pushed down - //as the element "bubble" is percolated up + while (hole > 1 && compare(element, m_elements[hole / 2]) < 0) { + // save element that is being pushed down + // as the element "bubble" is percolated up final int next = hole / 2; - m_elements[ hole ] = m_elements[ next ]; + m_elements[hole] = m_elements[next]; hole = next; } - m_elements[ hole ] = element; + m_elements[hole] = element; } /** - * Percolate element up heap from bottom. + * Percolates element up heap from bottom. * Assume it is a maximum heap. * * @param element the element */ - protected void percolateUpMaxHeap( final Object element ) - { + protected void percolateUpMaxHeap(final Object element) { int hole = ++m_size; - while( hole > 1 && - compare( element, m_elements[ hole / 2 ] ) > 0 ) - { - //save element that is being pushed down - //as the element "bubble" is percolated up + while (hole > 1 && compare(element, m_elements[hole / 2]) > 0) { + // save element that is being pushed down + // as the element "bubble" is percolated up final int next = hole / 2; - m_elements[ hole ] = m_elements[ next ]; + m_elements[hole] = m_elements[next]; hole = next; } - m_elements[ hole ] = element; + m_elements[hole] = element; } - + + /** + * Compares two objects using the comparator if specified, or the + * natural order otherwise. + * + * @param a the first object + * @param b the second object + * @return -ve if a less than b, 0 if they are equal, +ve if a greater than b + */ private int compare(Object a, Object b) { - if(m_comparator != null) { + if (m_comparator != null) { return m_comparator.compare(a, b); } else { - return ((Comparable)a).compareTo(b); + return ((Comparable) a).compareTo(b); } } /** - * Increase the size of the heap to support additional elements - **/ - protected void grow() - { - final Object[] elements = new Object[ m_elements.length * 2 ]; - System.arraycopy( m_elements, 0, elements, 0, m_elements.length ); + * Increases the size of the heap to support additional elements + */ + protected void grow() { + final Object[] elements = new Object[m_elements.length * 2]; + System.arraycopy(m_elements, 0, elements, 0, m_elements.length); m_elements = elements; } /** - * Returns a string representation of this heap. The returned string - * is similar to those produced by standard JDK collections. + * Returns a string representation of this heap. The returned string + * is similar to those produced by standard JDK collections. * - * @return a string representation of this heap + * @return a string representation of this heap */ - public String toString() - { + public String toString() { final StringBuffer sb = new StringBuffer(); - sb.append( "[ " ); + sb.append("[ "); - for( int i = 1; i < m_size + 1; i++ ) - { - if( i != 1 ) sb.append( ", " ); - sb.append( m_elements[ i ] ); + for (int i = 1; i < m_size + 1; i++) { + if (i != 1) { + sb.append(", "); + } + sb.append(m_elements[i]); } - sb.append( " ]" ); + sb.append(" ]"); return sb.toString(); } /** - * Returns an iterator over this heap's elements. + * Returns an iterator over this heap's elements. * - * @return an iterator over this heap's elements + * @return an iterator over this heap's elements */ public Iterator iterator() { return new Iterator() { @@ -521,22 +509,21 @@ public final class BinaryHeap extends AbstractCollection /** - * Adds an object to this heap. Same as {@link #insert(Object)}. + * Adds an object to this heap. Same as {@link #insert(Object)}. * - * @param o the object to add - * @return true, always + * @param object the object to add + * @return true, always */ - public boolean add(Object o) { - insert(o); + public boolean add(Object object) { + insert(object); return true; } - /** - * Returns the priority element. Same as {@link #peek()}. + * Returns the priority element. Same as {@link #peek()}. * - * @return the priority element - * @throws BufferUnderflowException if this heap is empty + * @return the priority element + * @throws BufferUnderflowException if this heap is empty */ public Object get() { try { @@ -546,12 +533,11 @@ public final class BinaryHeap extends AbstractCollection } } - /** - * Removes the priority element. Same as {@link #pop()}. + * Removes the priority element. Same as {@link #pop()}. * - * @return the removed priority element - * @throws BufferUnderflowException if this heap is empty + * @return the removed priority element + * @throws BufferUnderflowException if this heap is empty */ public Object remove() { try { @@ -561,23 +547,13 @@ public final class BinaryHeap extends AbstractCollection } } - /** - * Returns the number of elements in this heap. + * Returns the number of elements in this heap. * - * @return the number of elements in this heap + * @return the number of elements in this heap */ public int size() { return m_size; } - /** - * Used by testing code. - * - * @return the otherwise private comparator - */ - Comparator comparator() { - return m_comparator; - } } - diff --git a/src/java/org/apache/commons/collections/BoundedFifoBuffer.java b/src/java/org/apache/commons/collections/BoundedFifoBuffer.java index c59fabfce..c531929a6 100644 --- a/src/java/org/apache/commons/collections/BoundedFifoBuffer.java +++ b/src/java/org/apache/commons/collections/BoundedFifoBuffer.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/BoundedFifoBuffer.java,v 1.4 2002/08/13 00:46:25 pjack Exp $ - * $Revision: 1.4 $ - * $Date: 2002/08/13 00:46:25 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/BoundedFifoBuffer.java,v 1.5 2002/10/13 12:59:04 scolebourne Exp $ + * $Revision: 1.5 $ + * $Date: 2002/10/13 12:59:04 $ * * ==================================================================== * @@ -60,192 +60,177 @@ */ package org.apache.commons.collections; - import java.util.AbstractCollection; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.NoSuchElementException; - - /** * The BoundedFifoBuffer is a very efficient implementation of - * Buffer that does not alter the size of the buffer at runtime.

- * - * The removal order of a BoundedFifoBuffer is based on the + * Buffer that does not alter the size of the buffer at runtime. + *

+ * The removal order of a BoundedFifoBuffer is based on the * insertion order; elements are removed in the same order in which they - * were added. The iteration order is the same as the removal order.

- * + * were added. The iteration order is the same as the removal order. + *

* The {@link #add(Object)}, {@link #remove()} and {@link #get()} operations * all perform in constant time. All other operations perform in linear * time or worse. - * + *

* Note that this implementation is not synchronized. The following can be - * used to provide synchronized access to your BoundedFifoBuffer: - * - *

+ * used to provide synchronized access to your BoundedFifoBuffer:
+ * 
  *   Buffer fifo = BufferUtils.synchronizedBuffer(new BoundedFifoBuffer());
- * 
+ *
+ *

+ * This buffer prevents null objects from being added. * + * @author Avalon * @author Berin Loritsch * @author Paul Jack - * @version $Id: BoundedFifoBuffer.java,v 1.4 2002/08/13 00:46:25 pjack Exp $ - * @since Avalon 4.0 + * @author Stephen Colebourne + * @since 2.1 + * @version $Id: BoundedFifoBuffer.java,v 1.5 2002/10/13 12:59:04 scolebourne Exp $ */ -public class BoundedFifoBuffer extends AbstractCollection implements Buffer -{ +public class BoundedFifoBuffer extends AbstractCollection implements Buffer { private final Object[] m_elements; private int m_start = 0; private int m_end = 0; private boolean m_full = false; - /** - * Constructs a new BoundedFifoBuffer big enough to hold - * the specified number of elements. - * - * @param size the maximum number of elements for this fifo + * Constructs a new BoundedFifoBuffer big enough to hold + * 32 elements. */ - public BoundedFifoBuffer( int size ) - { - m_elements = new Object[ size ]; + public BoundedFifoBuffer() { + this(32); } - /** - * Constructs a new BoundedFifoBuffer big enough to hold - * 32 elements. + * Constructs a new BoundedFifoBuffer big enough to hold + * the specified number of elements. + * + * @param size the maximum number of elements for this fifo + * @throws IllegalArgumentException if the size is less than 1 */ - public BoundedFifoBuffer() - { - this( 32 ); + public BoundedFifoBuffer(int size) { + if (size <= 0) { + throw new IllegalArgumentException("The size must be greater than 0"); + } + m_elements = new Object[size]; } - /** - * Constructs a new BoundedFifoBuffer big enough to hold all - * of the elements in the specified collection. That collection's - * elements will also be added to the fifo. + * Constructs a new BoundedFifoBuffer big enough to hold all + * of the elements in the specified collection. That collection's + * elements will also be added to the buffer. * - * @param c the collection whose elements to add + * @param coll the collection whose elements to add */ - public BoundedFifoBuffer(Collection c) { - this(c.size()); - addAll(c); + public BoundedFifoBuffer(Collection coll) { + this(coll.size()); + addAll(coll); } - /** - * Returns this fifo's size. + * Returns the number of elements stored in the buffer. * - * @return this fifo's size + * @return this buffer's size */ - public int size() - { + public int size() { int size = 0; - if( m_end < m_start ) - { + if (m_end < m_start) { size = m_elements.length - m_start + m_end; - } - else if( m_end == m_start ) - { - size = ( m_full ? m_elements.length : 0 ); - } - else - { + } else if (m_end == m_start) { + size = (m_full ? m_elements.length : 0); + } else { size = m_end - m_start; } return size; } - /** - * Returns true if this fifo is empty; false otherwise. + * Returns true if this buffer is empty; false otherwise. * - * @return true if this fifo is empty + * @return true if this buffer is empty */ - public boolean isEmpty() - { + public boolean isEmpty() { return size() == 0; } + /** + * Clears this buffer. + */ + public void clear() { + m_full = false; + m_start = 0; + m_end = 0; + Arrays.fill(m_elements, null); + } /** - * Adds the given element to this fifo. + * Adds the given element to this buffer. * - * @param element the element to add - * @return true, always - * @throws NullPointerException if the given element is null - * @throws BufferOverflowException if this fifo is full + * @param element the element to add + * @return true, always + * @throws NullPointerException if the given element is null + * @throws BufferOverflowException if this buffer is full */ - public boolean add( Object element ) - { - if( null == element ) - { - throw new NullPointerException( "Attempted to add null object to buffer" ); + public boolean add(Object element) { + if (null == element) { + throw new NullPointerException("Attempted to add null object to buffer"); } - if( m_full ) - { - throw new BufferOverflowException( "The buffer cannot hold more than " - + m_elements.length + " objects." ); + if (m_full) { + throw new BufferOverflowException("The buffer cannot hold more than " + m_elements.length + " objects."); } - m_elements[ m_end++ ] = element; + m_elements[m_end++] = element; - if( m_end >= m_elements.length ) - { + if (m_end >= m_elements.length) { m_end = 0; } - if( m_end == m_start ) - { + if (m_end == m_start) { m_full = true; } return true; } - /** - * Returns the least recently inserted element in this fifo. + * Returns the least recently inserted element in this buffer. * - * @return the least recently inserted element - * @throws BufferUnderflowException if the fifo is empty + * @return the least recently inserted element + * @throws BufferUnderflowException if the buffer is empty */ public Object get() { - if( isEmpty() ) - { - throw new BufferUnderflowException( "The buffer is already empty" ); + if (isEmpty()) { + throw new BufferUnderflowException("The buffer is already empty"); } - return m_elements[ m_start ]; + return m_elements[m_start]; } - /** - * Removes the least recently inserted element from this fifo. + * Removes the least recently inserted element from this buffer. * - * @return the least recently inserted element - * @throws BufferUnderflowException if the fifo is empty + * @return the least recently inserted element + * @throws BufferUnderflowException if the buffer is empty */ - public Object remove() - { - if( isEmpty() ) - { - throw new BufferUnderflowException( "The buffer is already empty" ); + public Object remove() { + if (isEmpty()) { + throw new BufferUnderflowException("The buffer is already empty"); } - Object element = m_elements[ m_start ]; + Object element = m_elements[m_start]; - if( null != element ) - { - m_elements[ m_start++ ] = null; + if (null != element) { + m_elements[m_start++] = null; - if( m_start >= m_elements.length ) - { + if (m_start >= m_elements.length) { m_start = 0; } @@ -255,25 +240,38 @@ public class BoundedFifoBuffer extends AbstractCollection implements Buffer return element; } - + /** + * Increments the internal index. + * + * @param index the index to increment + * @return the updated index + */ private int increment(int index) { index++; - if (index >= m_elements.length) index = 0; + if (index >= m_elements.length) { + index = 0; + } return index; } - - private int decrement(int index) { - index--; - if (index < 0) index = m_elements.length - 1; - return index; - } - - /** - * Returns an iterator over this fifo's elements. + * Decrements the internal index. + * + * @param index the index to decrement + * @return the updated index + */ + private int decrement(int index) { + index--; + if (index < 0) { + index = m_elements.length - 1; + } + return index; + } + + /** + * Returns an iterator over this buffer's elements. * - * @return an iterator over this fifo's elements + * @return an iterator over this buffer's elements */ public Iterator iterator() { return new Iterator() { @@ -327,15 +325,4 @@ public class BoundedFifoBuffer extends AbstractCollection implements Buffer }; } - - /** - * Clears this fifo. - */ - public void clear() { - m_full = false; - m_start = 0; - m_end = 0; - Arrays.fill(m_elements, null); - } - } diff --git a/src/java/org/apache/commons/collections/Buffer.java b/src/java/org/apache/commons/collections/Buffer.java index 3e4fb6e72..33ef42984 100644 --- a/src/java/org/apache/commons/collections/Buffer.java +++ b/src/java/org/apache/commons/collections/Buffer.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Buffer.java,v 1.2 2002/07/03 01:45:47 mas Exp $ - * $Revision: 1.2 $ - * $Date: 2002/07/03 01:45:47 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/Buffer.java,v 1.3 2002/10/13 12:58:04 scolebourne Exp $ + * $Revision: 1.3 $ + * $Date: 2002/10/13 12:58:04 $ * * ==================================================================== * @@ -60,10 +60,7 @@ */ package org.apache.commons.collections; - import java.util.Collection; - - /** * A Buffer is a collection that allows objects to be removed in some * well-defined order. The removal order can be based on insertion order @@ -81,12 +78,14 @@ import java.util.Collection; * also implement {@link java.util.List}, {@link java.util.Set} or * {@link Bag}. * - * @author Berin Loritsch - * @version CVS $Revision: 1.2 $ $Date: 2002/07/03 01:45:47 $ - * @since Avalon 4.0 + * @author Avalon + * @author Berin Loritsch + * @author Paul Jack + * @author Stephen Colebourne + * @version $Id: Buffer.java,v 1.3 2002/10/13 12:58:04 scolebourne Exp $ + * @since 2.1 */ -public interface Buffer extends Collection -{ +public interface Buffer extends Collection { /** * Removes the next object from the buffer. @@ -96,13 +95,11 @@ public interface Buffer extends Collection */ Object remove(); - - /** - * Returns the next object in the buffer without removing it. + * Returns the next object in the buffer without removing it. * - * @return the next object in the buffer - * @throws BufferUnderflowException if the buffer is empty + * @return the next object in the buffer + * @throws BufferUnderflowException if the buffer is empty */ Object get(); } diff --git a/src/java/org/apache/commons/collections/BufferUnderflowException.java b/src/java/org/apache/commons/collections/BufferUnderflowException.java index 8723d0090..129721062 100644 --- a/src/java/org/apache/commons/collections/BufferUnderflowException.java +++ b/src/java/org/apache/commons/collections/BufferUnderflowException.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/BufferUnderflowException.java,v 1.4 2002/08/15 20:04:31 pjack Exp $ - * $Revision: 1.4 $ - * $Date: 2002/08/15 20:04:31 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/BufferUnderflowException.java,v 1.5 2002/10/13 12:57:38 scolebourne Exp $ + * $Revision: 1.5 $ + * $Date: 2002/10/13 12:57:38 $ * * ==================================================================== * @@ -63,48 +63,51 @@ package org.apache.commons.collections; /** * The BufferUnderflowException is used when the buffer is already empty * + * @author Avalon * @author Berin Loritsch * @author Jeff Turner - * @since Avalon 4.0 - * @version $Id: BufferUnderflowException.java,v 1.4 2002/08/15 20:04:31 pjack Exp $ + * @author Paul Jack + * @author Stephen Colebourne + * @since 2.1 + * @version $Id: BufferUnderflowException.java,v 1.5 2002/10/13 12:57:38 scolebourne Exp $ */ -public class BufferUnderflowException extends RuntimeException -{ +public class BufferUnderflowException extends RuntimeException { private final Throwable m_throwable; - /** Construct a new BufferUnderflowException. - * @param message The detail message for this exception. - */ - public BufferUnderflowException( String message ) - { - this( message, null ); - } - - /** Construct a new BufferUnderflowException. - * @param message The detail message for this exception. - * @param throwable the root cause of the exception - */ - public BufferUnderflowException( String message, Throwable exception ) - { - super( message ); - m_throwable = exception; - } - /** - * Constructs a new BufferUnderflowException. + * Constructs a new BufferUnderflowException. */ public BufferUnderflowException() { super(); m_throwable = null; } + /** + * Construct a new BufferUnderflowException. + * + * @param message the detail message for this exception + */ + public BufferUnderflowException(String message) { + this(message, null); + } + + /** + * Construct a new BufferUnderflowException. + * + * @param message the detail message for this exception + * @param throwable the root cause of the exception + */ + public BufferUnderflowException(String message, Throwable exception) { + super(message); + m_throwable = exception; + } + /** - * Retrieve root cause of the exception. + * Gets the root cause of the exception. * * @return the root cause */ - public final Throwable getCause() - { + public final Throwable getCause() { return m_throwable; } } diff --git a/src/java/org/apache/commons/collections/UnboundedFifoBuffer.java b/src/java/org/apache/commons/collections/UnboundedFifoBuffer.java index 90ca01aae..61726de67 100644 --- a/src/java/org/apache/commons/collections/UnboundedFifoBuffer.java +++ b/src/java/org/apache/commons/collections/UnboundedFifoBuffer.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/UnboundedFifoBuffer.java,v 1.4 2002/10/12 22:15:18 scolebourne Exp $ - * $Revision: 1.4 $ - * $Date: 2002/10/12 22:15:18 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//collections/src/java/org/apache/commons/collections/UnboundedFifoBuffer.java,v 1.5 2002/10/13 12:59:04 scolebourne Exp $ + * $Revision: 1.5 $ + * $Date: 2002/10/13 12:59:04 $ * * ==================================================================== * @@ -64,85 +64,78 @@ package org.apache.commons.collections; import java.util.AbstractCollection; import java.util.Iterator; import java.util.NoSuchElementException; - - /** * UnboundedFifoBuffer is a very efficient buffer implementation. * According to performance testing, it exhibits a constant access time, but it * also outperforms ArrayList when used for the same purpose. - *

- * The removal order of an UnboundedFifoBuffer is based on the insertion + *

+ * The removal order of an UnboundedFifoBuffer is based on the insertion * order; elements are removed in the same order in which they were added. - * The iteration order is the same as the removal order.

- * + * The iteration order is the same as the removal order. + *

* The {@link #remove()} and {@link #get()} operations perform in constant time. * The {@link #add(Object)} operation performs in amortized constant time. All - * other operations perform in linear time or worse.

- * + * other operations perform in linear time or worse. + *

* Note that this implementation is not synchronized. The following can be - * used to provide synchronized access to your BoundedFifo: - * - *

- *   Buffer fifo = BufferUtils.synchronizedBuffer(new BoundedFifo());
- * 
+ * used to provide synchronized access to your UnboundedFifo: + *
+ *   Buffer fifo = BufferUtils.synchronizedBuffer(new UnboundedFifo());
+ * 
+ *

+ * This buffer prevents null objects from being added. * + * @author Avalon * @author Federico Barbieri * @author Berin Loritsch * @author Paul Jack - * @version CVS $Revision: 1.4 $ $Date: 2002/10/12 22:15:18 $ - * @since Avalon 4.0 + * @author Stephen Colebourne + * @since 2.1 + * @version $Id: UnboundedFifoBuffer.java,v 1.5 2002/10/13 12:59:04 scolebourne Exp $ */ -public final class UnboundedFifoBuffer extends AbstractCollection implements Buffer -{ +public final class UnboundedFifoBuffer extends AbstractCollection implements Buffer { protected Object[] m_buffer; protected int m_head; protected int m_tail; /** - * Initialize the UnboundedFifoBuffer with the specified number of elements. The - * integer must be a positive integer. + * Constructs an UnboundedFifoBuffer with the default number of elements. + * It is exactly the same as performing the following: + * + *

+     *   new UnboundedFifoBuffer(32);
+     * 
*/ - public UnboundedFifoBuffer( int size ) - { - m_buffer = new Object[ size + 1 ]; + public UnboundedFifoBuffer() { + this(32); + } + + /** + * Constructs an UnboundedFifoBuffer with the specified number of elements. + * The integer must be a positive integer. + * + * @throws IllegalArgumentException if the size is less than 1 + */ + public UnboundedFifoBuffer(int size) { + if (size <= 0) { + throw new IllegalArgumentException("The size must be greater than 0"); + } + m_buffer = new Object[size + 1]; m_head = 0; m_tail = 0; } - /** - * Initialize the UnboundedFifoBuffer with the default number of elements. It is - * exactly the same as performing the following: - * - *
-     *   new UnboundedFifoBuffer( 32 );
-     * 
- */ - public UnboundedFifoBuffer() - { - this( 32 ); - } - - /** - * Tests to see if the CircularBuffer is empty. - */ - public final boolean isEmpty() - { - return ( size() == 0 ); - } - /** * Returns the number of elements stored in the buffer. + * + * @return this buffer's size */ - public int size() - { + public int size() { int size = 0; - if( m_tail < m_head ) - { + if (m_tail < m_head) { size = m_buffer.length - m_head + m_tail; - } - else - { + } else { size = m_tail - m_head; } @@ -150,29 +143,38 @@ public final class UnboundedFifoBuffer extends AbstractCollection implements Buf } /** - * Add an object into the buffer + * Returns true if this buffer is empty; false otherwise. + * + * @return true if this buffer is empty */ - public boolean add( final Object o ) - { - if( null == o ) - { - throw new NullPointerException( "Attempted to add null object to buffer" ); + public boolean isEmpty() { + return (size() == 0); + } + + /** + * Adds the given element to this buffer. + * + * @param element the element to add + * @return true, always + * @throws NullPointerException if the given element is null + * @throws BufferOverflowException if this buffer is full + */ + public boolean add(final Object o) { + if (null == o) { + throw new NullPointerException("Attempted to add null object to buffer"); } - if( size() + 1 >= m_buffer.length ) - { - Object[] tmp = new Object[ ( ( m_buffer.length - 1 ) * 2 ) + 1 ]; + if (size() + 1 >= m_buffer.length) { + Object[] tmp = new Object[((m_buffer.length - 1) * 2) + 1]; int j = 0; - for( int i = m_head; i != m_tail; ) - { - tmp[ j ] = m_buffer[ i ]; - m_buffer[ i ] = null; + for (int i = m_head; i != m_tail;) { + tmp[j] = m_buffer[i]; + m_buffer[i] = null; j++; i++; - if( i == m_buffer.length ) - { + if (i == m_buffer.length) { i = 0; } } @@ -182,10 +184,9 @@ public final class UnboundedFifoBuffer extends AbstractCollection implements Buf m_tail = j; } - m_buffer[ m_tail ] = o; + m_buffer[m_tail] = o; m_tail++; - if( m_tail >= m_buffer.length ) - { + if (m_tail >= m_buffer.length) { m_tail = 0; } return true; @@ -195,41 +196,34 @@ public final class UnboundedFifoBuffer extends AbstractCollection implements Buf * Returns the next object in the buffer. * * @return the next object in the buffer - * @throws BufferUnderflowException if this buffer is empty + * @throws BufferUnderflowException if this buffer is empty */ - public Object get() - { - if( isEmpty() ) - { - throw new BufferUnderflowException( "The buffer is already empty" ); + public Object get() { + if (isEmpty()) { + throw new BufferUnderflowException("The buffer is already empty"); } - return m_buffer[ m_head ]; + return m_buffer[m_head]; } - /** * Removes the next object from the buffer * * @return the removed object - * @throws BufferUnderflowException if this buffer is empty + * @throws BufferUnderflowException if this buffer is empty */ - public Object remove() - { - if( isEmpty() ) - { - throw new BufferUnderflowException( "The buffer is already empty" ); + public Object remove() { + if (isEmpty()) { + throw new BufferUnderflowException("The buffer is already empty"); } - Object element = m_buffer[ m_head ]; + Object element = m_buffer[m_head]; - if( null != element ) - { - m_buffer[ m_head ] = null; + if (null != element) { + m_buffer[m_head] = null; m_head++; - if( m_head >= m_buffer.length ) - { + if (m_head >= m_buffer.length) { m_head = 0; } } @@ -237,25 +231,36 @@ public final class UnboundedFifoBuffer extends AbstractCollection implements Buf return element; } - + /** + * Increments the internal index. + * + * @param index the index to increment + * @return the updated index + */ private int increment(int index) { - index++; - if (index >= m_buffer.length) index = 0; + index++; + if (index >= m_buffer.length) + index = 0; return index; } - - private int decrement(int index) { - index--; - if (index < 0) index = m_buffer.length - 1; - return index; - } - - /** - * Returns an iterator over this fifo's elements. + * Decrements the internal index. + * + * @param index the index to decrement + * @return the updated index + */ + private int decrement(int index) { + index--; + if (index < 0) + index = m_buffer.length - 1; + return index; + } + + /** + * Returns an iterator over this buffer's elements. * - * @return an iterator over this fifo's elements + * @return an iterator over this buffer's elements */ public Iterator iterator() { return new Iterator() { @@ -265,18 +270,20 @@ public final class UnboundedFifoBuffer extends AbstractCollection implements Buf public boolean hasNext() { return index != m_tail; - + } public Object next() { - if (!hasNext()) throw new NoSuchElementException(); + if (!hasNext()) + throw new NoSuchElementException(); lastReturnedIndex = index; index = increment(index); return m_buffer[lastReturnedIndex]; } public void remove() { - if (lastReturnedIndex == -1) throw new IllegalStateException(); + if (lastReturnedIndex == -1) + throw new IllegalStateException(); // First element can be removed quickly if (lastReturnedIndex == m_head) { @@ -305,6 +312,6 @@ public final class UnboundedFifoBuffer extends AbstractCollection implements Buf }; } - + }