001    /*
002     * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
003     *
004     * Redistribution and use in source and binary forms, with or without
005     * modification, are permitted provided that the following conditions are met:
006     *
007     *  o Redistributions of source code must retain the above copyright notice,
008     *    this list of conditions and the following disclaimer.
009     *
010     *  o Redistributions in binary form must reproduce the above copyright notice,
011     *    this list of conditions and the following disclaimer in the documentation
012     *    and/or other materials provided with the distribution.
013     *
014     *  o Neither the name of imagero Andrey Kuznetsov nor the names of
015     *    its contributors may be used to endorse or promote products derived
016     *    from this software without specific prior written permission.
017     *
018     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
019     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
020     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
021     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
022     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
023     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
024     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
025     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
026     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
027     * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
028     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
029     */
030    
031     package com.imagero.util;
032    
033    import java.util.EmptyStackException;
034    
035    /**
036     * Ring implementation.
037     */
038    public class Ring {
039    
040        Object[] elements;
041    
042        int start;
043        int count;
044    
045        int max;
046    
047    
048        public Ring() {
049            this(10);
050        }
051    
052        /**
053         * create new Ring object
054         * @param size Ring size
055         */
056        public Ring(int size) {
057            this.elements = new Object[size * 2];
058            start = elements.length;
059            max = size;
060        }
061    
062        public Object add(Object item) {
063            if (start > 0) {
064                elements[--start] = item;
065                if (count < max) {
066                    count++;
067                }
068            }
069            else {
070                System.arraycopy(elements, 0, elements, max, max);
071                start = max;
072                elements[--start] = item;
073            }
074            return item;
075        }
076    
077        public Object get(int index) {
078            if (count > 0) {
079                if (index >= 0 && index < count) {
080                    return elements[start + index];
081                }
082                else {
083                    throw new IndexOutOfBoundsException();
084                }
085            }
086            else {
087                throw new EmptyStackException();
088            }
089        }
090    
091        public int getCount() {
092            return count;
093        }
094    
095        public boolean isEmpty() {
096            return count == 0;
097        }
098    }