1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 package org.apache.commons.collections.primitives; 18 19 /** 20 * An ordered collection of <code>byte</code> values. 21 * 22 * @see org.apache.commons.collections.primitives.adapters.ByteListList 23 * @see org.apache.commons.collections.primitives.adapters.ListByteList 24 * 25 * @since Commons Primitives 1.0 26 * @version $Revision: 480460 $ $Date: 2006-11-29 03:14:21 -0500 (Wed, 29 Nov 2006) $ 27 * 28 * @author Rodney Waldhoff 29 */ 30 public interface ByteList extends ByteCollection { 31 /** 32 * Appends the specified element to the end of me 33 * (optional operation). Returns <code>true</code> 34 * iff I changed as a result of this call. 35 * <p/> 36 * If a collection refuses to add the specified 37 * element for any reason other than that it already contains 38 * the element, it <i>must</i> throw an exception (rather than 39 * simply returning <tt>false</tt>). This preserves the invariant 40 * that a collection always contains the specified element after 41 * this call returns. 42 * 43 * @param element the value whose presence within me is to be ensured 44 * @return <code>true</code> iff I changed as a result of this call 45 * 46 * @throws UnsupportedOperationException when this operation is not 47 * supported 48 * @throws IllegalArgumentException may be thrown if some aspect of the 49 * specified element prevents it from being added to me 50 */ 51 boolean add(byte element); 52 53 /** 54 * Inserts the specified element at the specified position 55 * (optional operation). Shifts the element currently 56 * at that position (if any) and any subsequent elements to the 57 * right, increasing their indices. 58 * 59 * @param index the index at which to insert the element 60 * @param element the value to insert 61 * 62 * @throws UnsupportedOperationException when this operation is not 63 * supported 64 * @throws IllegalArgumentException if some aspect of the specified element 65 * prevents it from being added to me 66 * @throws IndexOutOfBoundsException if the specified index is out of range 67 */ 68 void add(int index, byte element); 69 70 /** 71 * Inserts all of the elements in the specified collection into me, 72 * at the specified position (optional operation). Shifts the 73 * element currently at that position (if any) and any subsequent 74 * elements to the right, increasing their indices. The new elements 75 * will appear in the order that they are returned by the given 76 * collection's {@link ByteCollection#iterator iterator}. 77 * 78 * @param index the index at which to insert the first element from 79 * the specified collection 80 * @param collection the {@link ByteCollection ByteCollection} of elements to add 81 * @return <code>true</code> iff I changed as a result of this call 82 * 83 * @throws UnsupportedOperationException when this operation is not 84 * supported 85 * @throws IndexOutOfBoundsException if the specified index is out of range 86 */ 87 boolean addAll(int index, ByteCollection collection); 88 89 /** 90 * Returns <code>true</code> iff <i>that</i> is an <code>ByteList</code> 91 * that contains the same elements in the same order as me. 92 * In other words, returns <code>true</code> iff <i>that</i> is 93 * a <code>ByteList</code> that has the same {@link #size() size} as me, 94 * and for which the elements returned by its 95 * {@link ByteList#iterator iterator} are equal (<code>==</code>) to 96 * the corresponding elements within me. 97 * (This contract ensures that this method works properly across 98 * different implementations of the <code>ByteList</code> interface.) 99 * 100 * @param that the object to compare to me 101 * @return <code>true</code> iff <i>that</i> is an <code>ByteList</code> 102 * that contains the same elements in the same order as me 103 */ 104 boolean equals(Object that); 105 106 /** 107 * Returns the value of the element at the specified position 108 * within me. 109 * 110 * @param index the index of the element to return 111 * @return the value of the element at the specified position 112 * @throws IndexOutOfBoundsException if the specified index is out of range 113 */ 114 byte get(int index); 115 116 /** 117 * Returns my hash code. 118 * <p /> 119 * The hash code of an <code>ByteList</code> is defined to be the 120 * result of the following calculation: 121 * <pre> int hash = 1; 122 * for(ByteIterator iter = iterator(); iter.hasNext(); ) { 123 * byte value = iter.next(); 124 * hash = 31*hash + (int)(value ^ (value >>> 32)); 125 * }</pre> 126 * <p /> 127 * This contract ensures that this method is consistent with 128 * {@link #equals equals} and with the 129 * {@link java.util.List#hashCode hashCode} 130 * method of a {@link java.util.List List} of {@link Byte}s. 131 * 132 * @return my hash code 133 */ 134 int hashCode(); 135 136 /** 137 * Returns the index of the first occurrence 138 * of the specified element within me, 139 * or <code>-1</code> if I do not contain 140 * the element. 141 * 142 * @param element the element to search for 143 * @return the smallest index of an element matching the specified value, 144 * or <code>-1</code> if no such matching element can be found 145 */ 146 int indexOf(byte element); 147 148 /** 149 * Returns an {@link ByteIterator iterator} over all my elements, 150 * in the appropriate sequence. 151 * @return an {@link ByteIterator iterator} over all my elements. 152 */ 153 ByteIterator iterator(); 154 155 /** 156 * Returns the index of the last occurrence 157 * of the specified element within me, 158 * or -1 if I do not contain the element. 159 * 160 * @param element the element to search for 161 * @return the largest index of an element matching the specified value, 162 * or <code>-1</code> if no such matching element can be found 163 */ 164 int lastIndexOf(byte element); 165 166 /** 167 * Returns a 168 * {@link ByteListIterator bidirectional iterator} 169 * over all my elements, in the appropriate sequence. 170 */ 171 ByteListIterator listIterator(); 172 173 /** 174 * Returns a 175 * {@link ByteListIterator bidirectional iterator} 176 * over all my elements, in the appropriate sequence, 177 * starting at the specified position. The 178 * specified <i>index</i> indicates the first 179 * element that would be returned by an initial 180 * call to the 181 * {@link ByteListIterator#next next} 182 * method. An initial call to the 183 * {@link ByteListIterator#previous previous} 184 * method would return the element with the specified 185 * <i>index</i> minus one. 186 * 187 * @throws IndexOutOfBoundsException if the specified index is out of range 188 */ 189 ByteListIterator listIterator(int index); 190 191 /** 192 * Removes the element at the specified position in 193 * (optional operation). Any subsequent elements 194 * are shifted to the left, subtracting one from their 195 * indices. Returns the element that was removed. 196 * 197 * @param index the index of the element to remove 198 * @return the value of the element that was removed 199 * 200 * @throws UnsupportedOperationException when this operation is not 201 * supported 202 * @throws IndexOutOfBoundsException if the specified index is out of range 203 */ 204 byte removeElementAt(int index); 205 206 /** 207 * Replaces the element at the specified 208 * position in me with the specified element 209 * (optional operation). 210 * 211 * @param index the index of the element to change 212 * @param element the value to be stored at the specified position 213 * @return the value previously stored at the specified position 214 * 215 * @throws UnsupportedOperationException when this operation is not 216 * supported 217 * @throws IndexOutOfBoundsException if the specified index is out of range 218 */ 219 byte set(int index, byte element); 220 221 /** 222 * Returns a view of the elements within me 223 * between the specified <i>fromIndex</i>, inclusive, and 224 * <i>toIndex</i>, exclusive. The returned <code>ByteList</code> 225 * is backed by me, so that any changes in 226 * the returned list are reflected in me, and vice-versa. 227 * The returned list supports all of the optional operations 228 * that I support. 229 * <p/> 230 * Note that when <code><i>fromIndex</i> == <i>toIndex</i></code>, 231 * the returned list is initially empty, and when 232 * <code><i>fromIndex</i> == 0 && <i>toIndex</i> == {@link #size() size()}</code> 233 * the returned list is my "improper" sublist, containing all my elements. 234 * <p/> 235 * The semantics of the returned list become undefined 236 * if I am structurally modified in any way other than 237 * via the returned list. 238 * 239 * @param fromIndex the smallest index (inclusive) in me that appears in 240 * the returned list 241 * @param toIndex the largest index (exclusive) in me that appears in the 242 * returned list 243 * @return a view of this list from <i>fromIndex</i> (inclusive) to 244 * <i>toIndex</i> (exclusive) 245 * 246 * @throws IndexOutOfBoundsException if either specified index is out of range 247 */ 248 ByteList subList(int fromIndex, int toIndex); 249 250 }