1 17 package org.apache.commons.collections.primitives; 18 19 import java.io.IOException ; 20 import java.io.ObjectInputStream ; 21 import java.io.ObjectOutputStream ; 22 import java.io.Serializable ; 23 24 33 public class ArrayByteList extends RandomAccessByteList implements ByteList, Serializable { 34 35 38 42 public ArrayByteList() { 43 this(8); 44 } 45 46 51 public ArrayByteList(int initialCapacity) { 52 if(initialCapacity < 0) { 53 throw new IllegalArgumentException ("capacity " + initialCapacity); 54 } 55 _data = new byte[initialCapacity]; 56 _size = 0; 57 } 58 59 68 public ArrayByteList(ByteCollection that) { 69 this(that.size()); 70 addAll(that); 71 } 72 73 79 public ArrayByteList(byte[] array) { 80 this(array.length); 81 System.arraycopy(array, 0, _data, 0, array.length); 82 _size = array.length; 83 } 84 85 88 public byte get(int index) { 89 checkRange(index); 90 return _data[index]; 91 } 92 93 public int size() { 94 return _size; 95 } 96 97 110 public byte removeElementAt(int index) { 111 checkRange(index); 112 incrModCount(); 113 byte oldval = _data[index]; 114 int numtomove = _size - index - 1; 115 if(numtomove > 0) { 116 System.arraycopy(_data,index+1,_data,index,numtomove); 117 } 118 _size--; 119 return oldval; 120 } 121 122 135 public byte set(int index, byte element) { 136 checkRange(index); 137 incrModCount(); 138 byte oldval = _data[index]; 139 _data[index] = element; 140 return oldval; 141 } 142 143 158 public void add(int index, byte element) { 159 checkRangeIncludingEndpoint(index); 160 incrModCount(); 161 ensureCapacity(_size+1); 162 int numtomove = _size-index; 163 System.arraycopy(_data,index,_data,index+1,numtomove); 164 _data[index] = element; 165 _size++; 166 } 167 168 public void clear() { 169 incrModCount(); 170 _size = 0; 171 } 172 173 public boolean addAll(ByteCollection collection) { 174 return addAll(size(), collection); 175 } 176 177 public boolean addAll(int index, ByteCollection collection) { 178 if (collection.size() == 0) { 179 return false; 180 } 181 checkRangeIncludingEndpoint(index); 182 incrModCount(); 183 ensureCapacity(_size + collection.size()); 184 if (index != _size) { 185 System.arraycopy(_data, index, _data, index + collection.size(), _size - index); 187 } 188 for (ByteIterator it = collection.iterator(); it.hasNext();) { 189 _data[index] = it.next(); 190 index++; 191 } 192 _size += collection.size(); 193 return true; 194 } 195 196 199 204 public void ensureCapacity(int mincap) { 205 incrModCount(); 206 if(mincap > _data.length) { 207 int newcap = (_data.length * 3)/2 + 1; 208 byte[] olddata = _data; 209 _data = new byte[newcap < mincap ? mincap : newcap]; 210 System.arraycopy(olddata,0,_data,0,_size); 211 } 212 } 213 214 218 public void trimToSize() { 219 incrModCount(); 220 if(_size < _data.length) { 221 byte[] olddata = _data; 222 _data = new byte[_size]; 223 System.arraycopy(olddata,0,_data,0,_size); 224 } 225 } 226 227 230 private void writeObject(ObjectOutputStream out) throws IOException { 231 out.defaultWriteObject(); 232 out.writeInt(_data.length); 233 for(int i=0;i<_size;i++) { 234 out.writeByte(_data[i]); 235 } 236 } 237 238 private void readObject(ObjectInputStream in) throws IOException , ClassNotFoundException { 239 in.defaultReadObject(); 240 _data = new byte[in.readInt()]; 241 for(int i=0;i<_size;i++) { 242 _data[i] = in.readByte(); 243 } 244 } 245 246 private final void checkRange(int index) { 247 if(index < 0 || index >= _size) { 248 throw new IndexOutOfBoundsException ("Should be at least 0 and less than " + _size + ", found " + index); 249 } 250 } 251 252 private final void checkRangeIncludingEndpoint(int index) { 253 if(index < 0 || index > _size) { 254 throw new IndexOutOfBoundsException ("Should be at least 0 and at most " + _size + ", found " + index); 255 } 256 } 257 258 261 private transient byte[] _data = null; 262 private int _size = 0; 263 264 } 265 | Popular Tags |