/** * Copyright 2013 JogAmp Community. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of JogAmp Community. */ package com.jogamp.common.util; import java.io.PrintStream; /** * Ring buffer interface, a.k.a circular buffer. *

* Caller can chose whether to block until get / put is able to proceed or not. *

*

* Caller can chose whether to pass an empty array and clear references at get, * or using a preset array for circular access of same objects. *

*

* Synchronization and hence thread safety details belong to the implementation. *

*/ public interface Ringbuffer { /** Returns a short string representation incl. size/capacity and internal r/w index (impl. dependent). */ @Override public String toString(); /** Debug functionality - Dumps the contents of the internal array. */ public void dump(PrintStream stream, String prefix); /** Returns the net capacity of this ring buffer. */ public int capacity(); /** * Resets the read and write position according to an empty ring buffer * and set all ring buffer slots to null. *

* {@link #isEmpty()} will return true after calling this method. *

*/ public void clear(); /** * Resets the read and write position according to a full ring buffer * and fill all slots w/ elements of array copyFrom. *

* Array's copyFrom elements will be copied into the internal array, * hence it's length must be equal to {@link #capacity()}. *

* @param copyFrom Mandatory array w/ length {@link #capacity()} to be copied into the internal array. * @throws IllegalArgumentException if copyFrom is null. * @throws IllegalArgumentException if copyFrom's length is different from {@link #capacity()}. */ public void resetFull(T[] copyFrom) throws IllegalArgumentException; /** Returns the number of elements in this ring buffer. */ public int size(); /** Returns the number of free slots available to put. */ public int getFreeSlots(); /** Returns true if this ring buffer is empty, otherwise false. */ public boolean isEmpty(); /** Returns true if this ring buffer is full, otherwise false. */ public boolean isFull(); /** * Dequeues the oldest enqueued element if available, otherwise null. *

* The returned ring buffer slot will be set to null to release the reference * and move ownership to the caller. *

*

* Method is non blocking and returns immediately;. *

* @return the oldest put element if available, otherwise null. */ public T get(); /** * Dequeues the oldest enqueued element. *

* The returned ring buffer slot will be set to null to release the reference * and move ownership to the caller. *

*

* Methods blocks until an element becomes available via put. *

* @return the oldest put element * @throws InterruptedException */ public T getBlocking() throws InterruptedException; /** * Peeks the next element at the read position w/o modifying pointer, nor blocking. * @return null if empty, otherwise the element which would be read next. */ public T peek(); /** * Peeks the next element at the read position w/o modifying pointer, but w/ blocking. * @return null if empty, otherwise the element which would be read next. */ public T peekBlocking() throws InterruptedException; /** * Enqueues the given element. *

* Returns true if successful, otherwise false in case buffer is full. *

*

* Method is non blocking and returns immediately;. *

*/ public boolean put(T e); /** * Enqueues the given element. *

* Method blocks until a free slot becomes available via get. *

* @throws InterruptedException */ public void putBlocking(T e) throws InterruptedException; /** * Enqueues the same element at it's write position, if not full. *

* Returns true if successful, otherwise false in case buffer is full. *

*

* If blocking is true, method blocks until a free slot becomes available via get. *

* @param blocking if true, wait until a free slot becomes available via get. * @throws InterruptedException */ public boolean putSame(boolean blocking) throws InterruptedException; /** * Blocks until at least count free slots become available. * @throws InterruptedException */ public void waitForFreeSlots(int count) throws InterruptedException; /** * Grows an empty ring buffer, increasing it's capacity about the amount. *

* Growing an empty ring buffer increases it's size about the amount, i.e. renders it not empty. * The new elements are inserted at the read position, able to be read out via {@link #get()} etc. *

* * @param newElements array of new full elements the empty buffer shall grow about. * @throws IllegalStateException if buffer is not empty * @throws IllegalArgumentException if newElements is null */ public void growEmptyBuffer(T[] newElements) throws IllegalStateException, IllegalArgumentException; /** * Grows a full ring buffer, increasing it's capacity about the amount. *

* Growing a full ring buffer leaves the size intact, i.e. renders it not full. * New null elements are inserted at the write position, able to be written to via {@link #put(Object)} etc. *

* @param amount the amount of elements the buffer shall grow about * * @throws IllegalStateException if buffer is not full * @throws IllegalArgumentException if amount is < 0 */ public void growFullBuffer(int amount) throws IllegalStateException, IllegalArgumentException; }