Class LongRingBuffer

java.lang.Object
io.deephaven.base.ringbuffer.LongRingBuffer
All Implemented Interfaces:
Serializable

public class LongRingBuffer extends Object implements Serializable
A simple circular buffer for primitive values, like java.util.concurrent.ArrayBlockingQueue but without the synchronization and collection overhead. Storage is between head (inclusive) and tail (exclusive) using incrementing long values. Head and tail will not wrap around; instead we use storage arrays sized to 2^N to allow fast determination of storage indices through a mask operation.
See Also:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    class 
     
  • Constructor Summary

    Constructors
    Constructor
    Description
    LongRingBuffer(int capacity)
    Create an unbounded-growth ring buffer of long primitives.
    LongRingBuffer(int capacity, boolean growable)
    Create a ring buffer of long primitives.
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    add(long e)
    Adds an entry to the ring buffer, will throw an exception if buffer is full.
    long
    addOverwrite(long e, long notFullResult)
    Add an entry to the ring buffer.
    void
    addUnsafe(long e)
    Add values without overflow detection.
    long
    Returns the element at the tail of the ring buffer
    int
     
    void
     
    protected void
    copyRingBufferToArray(long[] dest)
    Copy the contents of the buffer to a destination buffer.
    long
    If the ring buffer is non-empty, returns the element at the head of the ring buffer.
    void
    ensureRemaining(int count)
    Ensure that there is sufficient empty space to store count items in the buffer.
    long
    Returns the element at the head of the ring buffer
    long
    front(int offset)
    Returns the element at the specified offset in the ring buffer.
    long[]
    Make a copy of the elements in the ring buffer.
    protected void
    grow(int increase)
    Increase the capacity of the ring buffer.
    boolean
     
    boolean
     
    Create an iterator for the ring buffer
    boolean
    offer(long e)
    Attempt to add an entry to the ring buffer.
    long
    peek(long onEmpty)
    If the ring buffer is non-empty, returns the element at the head of the ring buffer.
    long
    peekBack(long onEmpty)
    If the ring buffer is non-empty, returns the element at the tail of the ring buffer.
    long
    poll(long onEmpty)
    If the ring buffer is non-empty, removes the element at the head of the ring buffer.
    int
     
    long
    Remove one element from the front of the ring buffer.
    long[]
    remove(int count)
    Remove multiple elements from the front of the ring buffer
    long
    Remove an element without empty buffer detection.
    int
     

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • LongRingBuffer

      public LongRingBuffer(int capacity)
      Create an unbounded-growth ring buffer of long primitives.
      Parameters:
      capacity - minimum capacity of the ring buffer
    • LongRingBuffer

      public LongRingBuffer(int capacity, boolean growable)
      Create a ring buffer of long primitives.
      Parameters:
      capacity - minimum capacity of ring buffer
      growable - whether to allow growth when the buffer is full.
  • Method Details

    • grow

      protected void grow(int increase)
      Increase the capacity of the ring buffer.
      Parameters:
      increase - Increase amount. The ring buffer's capacity will be increased by at least this amount.
    • copyRingBufferToArray

      protected void copyRingBufferToArray(long[] dest)
      Copy the contents of the buffer to a destination buffer. If the destination buffer capacity is smaller than size(), the copy will not fail but will terminate after the buffer is full.
      Parameters:
      dest - The destination buffer.
    • isFull

      public boolean isFull()
    • isEmpty

      public boolean isEmpty()
    • size

      public int size()
    • capacity

      public int capacity()
    • remaining

      public int remaining()
    • clear

      public void clear()
    • add

      public boolean add(long e)
      Adds an entry to the ring buffer, will throw an exception if buffer is full. For a graceful failure, use offer(long)
      Parameters:
      e - the long to be added to the buffer
      Returns:
      true if the long was added successfully
      Throws:
      UnsupportedOperationException - when growable is false and buffer is full
    • ensureRemaining

      public void ensureRemaining(int count)
      Ensure that there is sufficient empty space to store count items in the buffer. If the buffer is growable, this may result in an internal growth operation. This call should be used in conjunction with addUnsafe(long).
      Parameters:
      count - the minimum number of empty entries in the buffer after this call
      Throws:
      UnsupportedOperationException - when growable is false and buffer is full
    • addUnsafe

      public void addUnsafe(long e)
      Add values without overflow detection. The caller *must* ensure that there is at least one element of free space in the ring buffer before calling this method. The caller may use ensureRemaining(int) or remaining() for this purpose.
      Parameters:
      e - the value to add to the buffer
    • addOverwrite

      public long addOverwrite(long e, long notFullResult)
      Add an entry to the ring buffer. If the buffer is full, will overwrite the oldest entry with the new one.
      Parameters:
      e - the long to be added to the buffer
      notFullResult - value to return is the buffer is not full
      Returns:
      the overwritten entry if the buffer is full, the provided value otherwise
    • offer

      public boolean offer(long e)
      Attempt to add an entry to the ring buffer. If the buffer is full, the add will fail and the buffer will not grow even if growable.
      Parameters:
      e - the long to be added to the buffer
      Returns:
      true if the value was added successfully, false otherwise
    • remove

      public long[] remove(int count)
      Remove multiple elements from the front of the ring buffer
      Parameters:
      count - The number of elements to remove.
      Throws:
      NoSuchElementException - if the buffer is empty
    • remove

      public long remove()
      Remove one element from the front of the ring buffer.
      Throws:
      NoSuchElementException - if the buffer is empty
    • removeUnsafe

      public long removeUnsafe()
      Remove an element without empty buffer detection. The caller *must* ensure that there is at least one element in the ring buffer. The size() method may be used for this purpose.
      Returns:
      the value removed from the buffer
    • poll

      public long poll(long onEmpty)
      If the ring buffer is non-empty, removes the element at the head of the ring buffer. Otherwise does nothing.
      Parameters:
      onEmpty - the value to return if the ring buffer is empty
      Returns:
      The removed element if the ring buffer was non-empty, otherwise the value of 'onEmpty'
    • element

      public long element()
      If the ring buffer is non-empty, returns the element at the head of the ring buffer.
      Returns:
      The head element if the ring buffer is non-empty, otherwise the value of 'onEmpty'
      Throws:
      NoSuchElementException - if the buffer is empty
    • peek

      public long peek(long onEmpty)
      If the ring buffer is non-empty, returns the element at the head of the ring buffer. Otherwise returns the specified element.
      Parameters:
      onEmpty - the value to return if the ring buffer is empty
      Returns:
      The head element if the ring buffer is non-empty, otherwise the value of 'onEmpty'
    • front

      public long front()
      Returns the element at the head of the ring buffer
      Returns:
      The element at the head of the ring buffer
    • front

      public long front(int offset)
      Returns the element at the specified offset in the ring buffer.
      Parameters:
      offset - The specified offset.
      Returns:
      The element at the specified offset
      Throws:
      NoSuchElementException - if the buffer is empty
    • back

      public long back()
      Returns the element at the tail of the ring buffer
      Returns:
      The element at the tail of the ring buffer
      Throws:
      NoSuchElementException - if the buffer is empty
    • peekBack

      public long peekBack(long onEmpty)
      If the ring buffer is non-empty, returns the element at the tail of the ring buffer. Otherwise returns the specified element.
      Parameters:
      onEmpty - the value to return if the ring buffer is empty
      Returns:
      The tail element if the ring buffer is non-empty, otherwise the value of 'onEmpty'
    • getAll

      public long[] getAll()
      Make a copy of the elements in the ring buffer.
      Returns:
      An array containing a copy of the elements in the ring buffer.
    • iterator

      public LongRingBuffer.Iterator iterator()
      Create an iterator for the ring buffer