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 }