All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.jogamp.common.util.IntegerStack Maven / Gradle / Ivy

/**
 * Copyright 2012 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.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.IntBuffer;

/**
 * Simple primitive-type stack.
 * 

* Implemented operations: *

    *
  • FILO - First In, Last Out
  • *
*

*/ public class /*name*/IntegerStack/*name*/ implements PrimitiveStack { private int position; private int[] buffer; private int growSize; /** * @param initialSize initial size, must be > zero * @param growSize grow size if {@link #position()} is reached, maybe 0 * in which case an {@link IndexOutOfBoundsException} is thrown. */ public /*name*/IntegerStack/*name*/(final int initialSize, final int growSize) { this.position = 0; this.growSize = growSize; this.buffer = new int[initialSize]; } @Override public final int capacity() { return buffer.length; } @Override public final int position() { return position; } @Override public final void position(final int newPosition) throws IndexOutOfBoundsException { if( 0 > position || position >= buffer.length ) { throw new IndexOutOfBoundsException("Invalid new position "+newPosition+", "+this.toString()); } position = newPosition; } @Override public final int remaining() { return buffer.length - position; } @Override public final int getGrowSize() { return growSize; } @Override public final void setGrowSize(final int newGrowSize) { growSize = newGrowSize; } @Override public final String toString() { return "IntegerStack[0..(pos "+position+").."+buffer.length+", remaining "+remaining()+"]"; } public final int[] buffer() { return buffer; } private final void growIfNecessary(final int length) throws IndexOutOfBoundsException { if( position + length > buffer.length ) { if( 0 >= growSize ) { throw new IndexOutOfBoundsException("Out of fixed stack size: "+this); } final int[] newBuffer = new int[buffer.length + growSize]; System.arraycopy(buffer, 0, newBuffer, 0, position); buffer = newBuffer; } } /** * FILO put operation * * @param src source buffer * @param srcOffset offset of src * @param length number of float elements to put from src on-top this stack * @return the src float[] * @throws IndexOutOfBoundsException if stack cannot grow due to zero grow-size or offset+length exceeds src. */ public final int[] putOnTop(final int[] src, final int srcOffset, final int length) throws IndexOutOfBoundsException { growIfNecessary(length); System.arraycopy(src, srcOffset, buffer, position, length); position += length; return src; } /** * FILO put operation * * @param src source buffer, it's position is incremented by length * @param length number of float elements to put from src on-top this stack * @return the src FloatBuffer * @throws IndexOutOfBoundsException if stack cannot grow due to zero grow-size * @throws BufferUnderflowException if src FloatBuffer has less remaining elements than length. */ public final IntBuffer putOnTop(final IntBuffer src, final int length) throws IndexOutOfBoundsException, BufferUnderflowException { growIfNecessary(length); src.get(buffer, position, length); position += length; return src; } /** * FILO get operation * * @param dest destination buffer * @param destOffset offset of dest * @param length number of float elements to get from-top this stack to dest. * @return the dest float[] * @throws IndexOutOfBoundsException if stack or dest has less elements than length. */ public final int[] getFromTop(final int[] dest, final int destOffset, final int length) throws IndexOutOfBoundsException { System.arraycopy(buffer, position-length, dest, destOffset, length); position -= length; return dest; } /** * FILO get operation * * @param dest destination buffer, it's position is incremented by length. * @param length number of float elements to get from-top this stack to dest. * @return the dest FloatBuffer * @throws IndexOutOfBoundsException if stack has less elements than length * @throws BufferOverflowException if src FloatBuffer has less remaining elements than length. */ public final IntBuffer getFromTop(final IntBuffer dest, final int length) throws IndexOutOfBoundsException, BufferOverflowException { dest.put(buffer, position-length, length); position -= length; return dest; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy