Class ByteRingBuffer

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

public class ByteRingBuffer 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
    ByteRingBuffer(int capacity)
    Create an unbounded-growth ring buffer of byte primitives.
    ByteRingBuffer(int capacity, boolean growable)
    Create a ring buffer of byte primitives.
  • Method Summary

    Modifier and Type
    Method
    Description
    boolean
    add(byte e)
    Adds an entry to the ring buffer, will throw an exception if buffer is full.
    byte
    addOverwrite(byte e, byte notFullResult)
    Add an entry to the ring buffer.
    void
    addUnsafe(byte e)
    Add values without overflow detection.
    byte
    Returns the element at the tail of the ring buffer
    int
     
    void
     
    protected void
    copyRingBufferToArray(byte[] dest)
    Copy the contents of the buffer to a destination buffer.
    byte
    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.
    byte
    Returns the element at the head of the ring buffer
    byte
    front(int offset)
    Returns the element at the specified offset in the ring buffer.
    byte[]
    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(byte e)
    Attempt to add an entry to the ring buffer.
    byte
    peek(byte onEmpty)
    If the ring buffer is non-empty, returns the element at the head of the ring buffer.
    byte
    peekBack(byte onEmpty)
    If the ring buffer is non-empty, returns the element at the tail of the ring buffer.
    byte
    poll(byte onEmpty)
    If the ring buffer is non-empty, removes the element at the head of the ring buffer.
    int
     
    byte
    Remove one element from the front of the ring buffer.
    byte[]
    remove(int count)
    Remove multiple elements from the front of the ring buffer
    byte
    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

    • ByteRingBuffer

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

      public ByteRingBuffer(int capacity, boolean growable)
      Create a ring buffer of byte 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(byte[] 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(byte e)
      Adds an entry to the ring buffer, will throw an exception if buffer is full. For a graceful failure, use offer(byte)
      Parameters:
      e - the byte to be added to the buffer
      Returns:
      true if the byte 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(byte).
      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(byte 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 byte addOverwrite(byte e, byte 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 byte 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(byte 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 byte to be added to the buffer
      Returns:
      true if the value was added successfully, false otherwise
    • remove

      public byte[] 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 byte remove()
      Remove one element from the front of the ring buffer.
      Throws:
      NoSuchElementException - if the buffer is empty
    • removeUnsafe

      public byte 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 byte poll(byte 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 byte 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 byte peek(byte 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 byte front()
      Returns the element at the head of the ring buffer
      Returns:
      The element at the head of the ring buffer
    • front

      public byte 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 byte 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 byte peekBack(byte 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 byte[] 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 ByteRingBuffer.Iterator iterator()
      Create an iterator for the ring buffer