info.monitorenter.util.collections
Class RingBufferArrayFast

java.lang.Object
  extended by info.monitorenter.util.collections.RingBufferArrayFast
All Implemented Interfaces:
IRingBuffer, Serializable, Cloneable
Direct Known Subclasses:
RingBufferArray

public class RingBufferArrayFast
extends Object
implements Cloneable, IRingBuffer

Fast ringbuffer implementation.

This implementation differs from the RingBufferArray in one point:
If setBufferSize(int asize) decreases the size of the buffer and it will get smaller than the actual amount of elements stored, they will get lost. This avoids the need for an internal List to store elements overhanging. Some tests may be left out that may speed up this IRingBuffer. Adding 5000000 elements was about 25 % faster compared to the RingBufferArray on an Athlon 1200, 256 MB RAM.

For allowing high performance single-threaded use this implementation and the implementations of the retrieveable Iterator- instances are not synchronized at all.

Author:
Achim Westermann
See Also:
Serialized Form

Nested Class Summary
protected  class RingBufferArrayFast.ARingBufferIterator
          Base for ringbuffer iterators that has access to the ringbuffer by being an non-static inner class.
 
Nested classes/interfaces inherited from interface info.monitorenter.util.collections.IRingBuffer
IRingBuffer.RingBufferException
 
Field Summary
static boolean DEBUG
          Flip the switch and you will see how the compiler changes the size of the classfile.
protected  Object[] m_buffer
          The internal array used as buffer.
protected  boolean m_empty
          Flag that marks wether this buffer is empty or not.
protected  int m_headpointer
          The internal index to buffer where the next element is going to be placed (not placed yet!).
protected  int m_size
          The internal size of the buffer.
protected  int m_tailpointer
          The internal index to buffer where the next element is going to be read.
 
Constructor Summary
RingBufferArrayFast(int aSize)
          Constructs a RingBuffer with the given size.
 
Method Summary
 Object add(Object anObject)
          Adds an element to the ring buffer, potentially removing the first element to make more room.
 void clear()
          Fast method to clear the buffer - only needs to set three primitive members.
protected  Object clone()
           
 int getBufferSize()
          Returns the absolute amount of space in the buffer.
 Object getOldest()
          Returns the oldest element from the buffer.
 Object getYoungest()
          Returns the last element added.
 boolean isEmpty()
          Tests wether no elements are stored in the buffer.
 boolean isFull()
          Returns true if no more space in the buffer is available.
 Iterator iteratorF2L()
          Returns an Iterator that will return the elements in exactly the inverse order the subsequent call to remove() would do.
 Iterator iteratorL2F()
          Returns an Iterator that will return the elements in exactly the order the subsequent call to remove() would do.
 Object remove()
          Removes the oldest element from the buffer.
 Object[] removeAll()
          Clears the buffer.
 void setBufferSize(int newSize)
          Sets a new buffer- size.
 int size()
          Returns the actual amount of elements stored in the buffer.
 String toString()
          Returns a string representation of the RingBuffer and it's contents.
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

DEBUG

public static final boolean DEBUG
Flip the switch and you will see how the compiler changes the size of the classfile.

See Also:
Constant Field Values

m_buffer

protected Object[] m_buffer
The internal array used as buffer.


m_empty

protected boolean m_empty
Flag that marks wether this buffer is empty or not.

    
             headpointer
              |
        +---+---+---+---+
        | 0 | 1 | 2 | 3 |
        +---+---+---+---+
              |
             tailpointer
    
        From where to where are the elements?
        Where is empty space?
        empty == true:  0 elements are contained: buffer empty
        empty == false:  4 elements are contained: buffer full
        remember:
            -the headpointer points to the space where the next element will be inserted.
            -the tailpointer points to the space to read the next element from.
    
    
 


m_headpointer

protected int m_headpointer
The internal index to buffer where the next element is going to be placed (not placed yet!).


m_size

protected int m_size
The internal size of the buffer.

For performance reasons the size of the buffer -1!


m_tailpointer

protected int m_tailpointer
The internal index to buffer where the next element is going to be read.

Constructor Detail

RingBufferArrayFast

public RingBufferArrayFast(int aSize)
Constructs a RingBuffer with the given size.

Parameters:
aSize - the size of the buffer.
Method Detail

add

public Object add(Object anObject)
Adds an element to the ring buffer, potentially removing the first element to make more room.

Specified by:
add in interface IRingBuffer
Parameters:
anObject - the instance to add.
Returns:
the oldes Object, if RingBuffer was filled with 'maxsize' elements before, or null.

clear

public void clear()
Fast method to clear the buffer - only needs to set three primitive members.

Specified by:
clear in interface IRingBuffer
See Also:
IRingBuffer.clear()

getBufferSize

public int getBufferSize()
Description copied from interface: IRingBuffer
Returns the absolute amount of space in the buffer.

Specified by:
getBufferSize in interface IRingBuffer
Returns:
the absolute amount of space in the buffer.
See Also:
IRingBuffer.getBufferSize()

getOldest

public Object getOldest()
                 throws IRingBuffer.RingBufferException
Description copied from interface: IRingBuffer
Returns the oldest element from the buffer. This method does not remove the element.

Specified by:
getOldest in interface IRingBuffer
Returns:
the oldest element from the buffer.
Throws:
IRingBuffer.RingBufferException - if the buffer is empty.
See Also:
IRingBuffer.getOldest()

getYoungest

public Object getYoungest()
                   throws IRingBuffer.RingBufferException
Description copied from interface: IRingBuffer
Returns the last element added. This method does not remove the element.

Specified by:
getYoungest in interface IRingBuffer
Returns:
the last element added.
Throws:
IRingBuffer.RingBufferException - if the buffer is empty.
See Also:
IRingBuffer.getYoungest()

isEmpty

public boolean isEmpty()
Description copied from interface: IRingBuffer
Tests wether no elements are stored in the buffer.

Specified by:
isEmpty in interface IRingBuffer
Returns:
true if no element is stored in the buffer.
See Also:
IRingBuffer.isEmpty()

isFull

public boolean isFull()
Description copied from interface: IRingBuffer
Returns true if no more space in the buffer is available. This method should be used to test before calling IRingBuffer.add(Object).

Specified by:
isFull in interface IRingBuffer
Returns:
true if no more space in the buffer is available.
See Also:
IRingBuffer.isFull()

iteratorF2L

public Iterator iteratorF2L()
Returns an Iterator that will return the elements in exactly the inverse order the subsequent call to remove() would do.

The youngest elements are returned first. The Iterator returned is not thread- safe!

Specified by:
iteratorF2L in interface IRingBuffer
Returns:
an Iterator that will return the elements in exactly the inverse order the subsequent call to remove() would do.

iteratorL2F

public Iterator iteratorL2F()
Returns an Iterator that will return the elements in exactly the order the subsequent call to remove() would do.

The oldest elements are returned first. The Iterator returned is not thread- safe!

Specified by:
iteratorL2F in interface IRingBuffer
Returns:
an Iterator that will return the elements in exactly the order the subsequent call to remove() would do.

remove

public Object remove()
Description copied from interface: IRingBuffer
Removes the oldest element from the buffer.

Specified by:
remove in interface IRingBuffer
Returns:
the removed oldest element from the buffer.
See Also:
IRingBuffer.remove()

removeAll

public Object[] removeAll()
Description copied from interface: IRingBuffer
Clears the buffer. It will return all of it's stored elements.

Specified by:
removeAll in interface IRingBuffer
Returns:
all removed elements.
See Also:
IRingBuffer.removeAll()

setBufferSize

public void setBufferSize(int newSize)
Sets a new buffer- size.

A new size is assigned but the elements "overhanging" are returned by the Object remove()- method first. This may take time until the buffer has its actual size again. Don't pretend on calling this method for saving of memory very often as the whole buffer has to be copied into a new array every time- and if newSize < getSize() additional the overhanging elements references have to be moved to the internal List pendingremove.

Specified by:
setBufferSize in interface IRingBuffer
Parameters:
newSize - the new size of the buffer.

size

public int size()
Description copied from interface: IRingBuffer
Returns the actual amount of elements stored in the buffer.

Specified by:
size in interface IRingBuffer
Returns:
the actual amount of elements stored in the buffer.
See Also:
IRingBuffer.size()

toString

public String toString()
Returns a string representation of the RingBuffer and it's contents.

Don't call this in your application too often: hard arraycopy - operation an memalloc are triggered.

Overrides:
toString in class Object
Returns:
a string representation of the RingBuffer and it's contents.

clone

protected Object clone()
                throws CloneNotSupportedException
Overrides:
clone in class Object
Throws:
CloneNotSupportedException
See Also:
Object.clone()


Copyright © 2001 - 2007 LGPL, All Rights Footloose.