Frames | No Frames |
1: /* Sequence.java -- a sequence of integers. 2: Copyright (C) 2004, 2006 Free Software Foundation, Inc. 3: 4: This file is a part of GNU Classpath. 5: 6: GNU Classpath is free software; you can redistribute it and/or modify 7: it under the terms of the GNU General Public License as published by 8: the Free Software Foundation; either version 2 of the License, or (at 9: your option) any later version. 10: 11: GNU Classpath is distributed in the hope that it will be useful, but 12: WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: General Public License for more details. 15: 16: You should have received a copy of the GNU General Public License 17: along with GNU Classpath; if not, write to the Free Software 18: Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 19: USA 20: 21: Linking this library statically or dynamically with other modules is 22: making a combined work based on this library. Thus, the terms and 23: conditions of the GNU General Public License cover the whole 24: combination. 25: 26: As a special exception, the copyright holders of this library give you 27: permission to link this library with independent modules to produce an 28: executable, regardless of the license terms of these independent 29: modules, and to copy and distribute the resulting executable under 30: terms of your choice, provided that you also meet, for each linked 31: independent module, the terms and conditions of the license of that 32: module. An independent module is a module which is not derived from 33: or based on this library. If you modify this library, you may extend 34: this exception to your version of the library, but you are not 35: obligated to do so. If you do not wish to do so, delete this 36: exception statement from your version. */ 37: 38: 39: package gnu.java.security.util; 40: 41: import java.util.AbstractList; 42: import java.util.LinkedList; 43: 44: /** 45: * A monotonic sequence of integers in the finite field 2<sup>32</sup>. 46: */ 47: public final class Sequence 48: extends AbstractList 49: { 50: private final Integer[] sequence; 51: 52: /** 53: * Create a sequence of integers from 0 to <i>end</i>, with an increment of 54: * 1. If <i>end</i> is less than 0, then the sequence will wrap around 55: * through all positive integers then negative integers until the end value is 56: * reached. Naturally, this will result in an enormous object, so don't do 57: * this. 58: * 59: * @param end The ending value. 60: */ 61: public Sequence(int end) 62: { 63: this(0, end, 1); 64: } 65: 66: /** 67: * Create a sequence of integers from <i>start</i> to <i>end</i>, with an 68: * increment of 1. If <i>end</i> is less than <i>start</i>, then the 69: * sequence will wrap around until the end value is reached. Naturally, this 70: * will result in an enormous object, so don't do this. 71: * 72: * @param start The starting value. 73: * @param end The ending value. 74: */ 75: public Sequence(int start, int end) 76: { 77: this(start, end, 1); 78: } 79: 80: /** 81: * Create a sequence of integers from <i>start</i> to <i>end</i>, with an 82: * increment of <i>span</i>. If <i>end</i> is less than <i>start</i>, then 83: * the sequence will wrap around until the end value is reached. Naturally, 84: * this will result in an enormous object, so don't do this. 85: * <p> 86: * <i>span</i> can be negative, resulting in a decresing sequence. 87: * <p> 88: * If <i>span</i> is 0, then the sequence will contain {<i>start</i>, 89: * <i>end</i>} if <i>start</i> != <i>end</i>, or just the singleton 90: * <i>start</i> if <i>start</i> == <i>end</i>. 91: * 92: * @param start The starting value. 93: * @param end The ending value. 94: * @param span The increment value. 95: */ 96: public Sequence(int start, int end, int span) 97: { 98: if (span == 0) 99: { 100: if (start != end) 101: sequence = new Integer[] { Integer.valueOf(start), 102: Integer.valueOf(end) }; 103: else 104: sequence = new Integer[] { Integer.valueOf(start) }; 105: } 106: else 107: { 108: LinkedList l = new LinkedList(); 109: for (int i = start; i != end; i += span) 110: l.add(Integer.valueOf(i)); 111: 112: l.add(Integer.valueOf(end)); 113: sequence = (Integer[]) l.toArray(new Integer[l.size()]); 114: } 115: } 116: 117: public Object get(int index) 118: { 119: if (index < 0 || index >= size()) 120: throw new IndexOutOfBoundsException("index=" + index + ", size=" + size()); 121: return sequence[index]; 122: } 123: 124: public int size() 125: { 126: return sequence.length; 127: } 128: 129: public Object[] toArray() 130: { 131: return (Object[]) sequence.clone(); 132: } 133: }