1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* Licensed to the Apache Software Foundation (ASF) under one or more 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio; 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A buffer is a list of elements of a specific primitive type. 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A buffer can be described by the following properties: 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Capacity: the number of elements a buffer can hold. Capacity may not be 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * negative and never changes.</li> 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Position: a cursor of this buffer. Elements are read or written at the 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position if you do not specify an index explicitly. Position may not be 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * negative and not greater than the limit.</li> 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Limit: controls the scope of accessible elements. You can only read or 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * write elements from index zero to <code>limit - 1</code>. Accessing 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * elements out of the scope will cause an exception. Limit may not be negative 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and not greater than capacity.</li> 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>Mark: used to remember the current position, so that you can reset the 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * position later. Mark may not be negative and no greater than position.</li> 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A buffer can be read-only or read-write. Trying to modify the elements 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * of a read-only buffer will cause a <code>ReadOnlyBufferException</code>, 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * while changing the position, limit and mark of a read-only buffer is OK.</li> 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>A buffer can be direct or indirect. A direct buffer will try its best to 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * take advantage of native memory APIs and it may not stay in the Java heap, 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thus it is not affected by garbage collection.</li> 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Buffers are not thread-safe. If concurrent access to a buffer instance is 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * required, then the callers are responsible to take care of the 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * synchronization issues. 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Buffer { 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <code>UNSET_MARK</code> means the mark has not been set. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 510440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes static final int UNSET_MARK = -1; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 54e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * The capacity of this buffer, which never changes. 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final int capacity; 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <code>limit - 1</code> is the last element that can be read or written. 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Limit must be no less than zero and no greater than <code>capacity</code>. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int limit; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Mark is where position will be set when <code>reset()</code> is called. 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Mark is not set by default. Mark is always no less than zero and no 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * greater than <code>position</code>. 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int mark = UNSET_MARK; 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The current position of this buffer. Position is always no less than zero 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and no greater than <code>limit</code>. 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int position = 0; 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 787fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes * The log base 2 of the element size of this buffer. Each typed subclass 797fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes * (ByteBuffer, CharBuffer, etc.) is responsible for initializing this 807fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes * value. The value is used by JNI code in frameworks/base/ to avoid the 817fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes * need for costly 'instanceof' tests. 827fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes */ 830440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes final int _elementSizeShift; 847fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes 857fcffb1cb6d3914ea089562a210ccec8fdda93f0Elliott Hughes /** 860f335c4ed1a0cb419c8ce82183fabb241d5dd032Elliott Hughes * For direct buffers, the effective address of the data; zero otherwise. 870f335c4ed1a0cb419c8ce82183fabb241d5dd032Elliott Hughes * This is set in the constructor. 880440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes * TODO: make this final at the cost of loads of extra constructors? [how many?] 89bd8ecd863aa83df50d7ce8f5950d8645ab6356afAndy McFadden */ 900440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes int effectiveDirectAddress; 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 930440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes * For direct buffers, the underlying MemoryBlock; null otherwise. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 950440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes final MemoryBlock block; 960440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes 97934767b07d94041390785d8fe66c86b2379730bcElliott Hughes Buffer(int elementSizeShift, int capacity, MemoryBlock block) { 98934767b07d94041390785d8fe66c86b2379730bcElliott Hughes this._elementSizeShift = elementSizeShift; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (capacity < 0) { 1000440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes throw new IllegalArgumentException("capacity < 0: " + capacity); 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.capacity = this.limit = capacity; 1030440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes this.block = block; 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 107e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * Returns the array that backs this buffer (optional operation). 108e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * The returned value is the actual array, not a copy, so modifications 109e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * to the array write through to the buffer. 110e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * 111e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * <p>Subclasses should override this method with a covariant return type 112e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * to provide the exact type of the array. 113e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * 114e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * <p>Use {@code hasArray} to ensure this method won't throw. 115e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * (A separate call to {@code isReadOnly} is not necessary.) 116e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * 117e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @return the array 118e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @throws ReadOnlyBufferException if the buffer is read-only 119e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * UnsupportedOperationException if the buffer does not expose an array 120e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @since 1.6 121e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes */ 122e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes public abstract Object array(); 123e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes 124e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes /** 125e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * Returns the offset into the array returned by {@code array} of the first 126e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * element of the buffer (optional operation). The backing array (if there is one) 127e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * is not necessarily the same size as the buffer, and position 0 in the buffer is 128e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * not necessarily the 0th element in the array. Use 129e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * {@code buffer.array()[offset + buffer.arrayOffset()} to access element {@code offset} 130e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * in {@code buffer}. 131e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * 132e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * <p>Use {@code hasArray} to ensure this method won't throw. 133e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * (A separate call to {@code isReadOnly} is not necessary.) 134e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * 135e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @return the offset 136e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @throws ReadOnlyBufferException if the buffer is read-only 137e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * UnsupportedOperationException if the buffer does not expose an array 138e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @since 1.6 139e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes */ 140e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes public abstract int arrayOffset(); 141e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes 142e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes /** 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the capacity of this buffer. 144f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of elements that are contained in this buffer. 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int capacity() { 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return capacity; 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 151a1603838fe9e865575c87982e32c6343740e464cElliott Hughes /** 152a1603838fe9e865575c87982e32c6343740e464cElliott Hughes * Used for the scalar get/put operations. 153a1603838fe9e865575c87982e32c6343740e464cElliott Hughes */ 154a1603838fe9e865575c87982e32c6343740e464cElliott Hughes void checkIndex(int index) { 155a1603838fe9e865575c87982e32c6343740e464cElliott Hughes if (index < 0 || index >= limit) { 156a1603838fe9e865575c87982e32c6343740e464cElliott Hughes throw new IndexOutOfBoundsException("index=" + index + ", limit=" + limit); 157a1603838fe9e865575c87982e32c6343740e464cElliott Hughes } 158a1603838fe9e865575c87982e32c6343740e464cElliott Hughes } 159a1603838fe9e865575c87982e32c6343740e464cElliott Hughes 160a1603838fe9e865575c87982e32c6343740e464cElliott Hughes /** 161a1603838fe9e865575c87982e32c6343740e464cElliott Hughes * Used for the ByteBuffer operations that get types larger than a byte. 162a1603838fe9e865575c87982e32c6343740e464cElliott Hughes */ 163a1603838fe9e865575c87982e32c6343740e464cElliott Hughes void checkIndex(int index, int sizeOfType) { 164a1603838fe9e865575c87982e32c6343740e464cElliott Hughes if (index < 0 || index > limit - sizeOfType) { 165a1603838fe9e865575c87982e32c6343740e464cElliott Hughes throw new IndexOutOfBoundsException("index=" + index + ", limit=" + limit + 166a1603838fe9e865575c87982e32c6343740e464cElliott Hughes ", size of type=" + sizeOfType); 167a1603838fe9e865575c87982e32c6343740e464cElliott Hughes } 168a1603838fe9e865575c87982e32c6343740e464cElliott Hughes } 169a1603838fe9e865575c87982e32c6343740e464cElliott Hughes 1708fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes int checkGetBounds(int bytesPerElement, int length, int offset, int count) { 1716944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes int byteCount = bytesPerElement * count; 172a1603838fe9e865575c87982e32c6343740e464cElliott Hughes if ((offset | count) < 0 || offset > length || length - offset < count) { 173a1603838fe9e865575c87982e32c6343740e464cElliott Hughes throw new IndexOutOfBoundsException("offset=" + offset + 174a1603838fe9e865575c87982e32c6343740e464cElliott Hughes ", count=" + count + ", length=" + length); 1756944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes } 1766944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes if (byteCount > remaining()) { 1776944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes throw new BufferUnderflowException(); 1786944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes } 1796944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes return byteCount; 1806944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes } 1816944bea4a129dc2d4be687c72f2a9f228ec532bcElliott Hughes 1828fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes int checkPutBounds(int bytesPerElement, int length, int offset, int count) { 1838fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes int byteCount = bytesPerElement * count; 184a1603838fe9e865575c87982e32c6343740e464cElliott Hughes if ((offset | count) < 0 || offset > length || length - offset < count) { 185a1603838fe9e865575c87982e32c6343740e464cElliott Hughes throw new IndexOutOfBoundsException("offset=" + offset + 186a1603838fe9e865575c87982e32c6343740e464cElliott Hughes ", count=" + count + ", length=" + length); 1878fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes } 1888fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes if (byteCount > remaining()) { 1898fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes throw new BufferOverflowException(); 1908fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes } 1918fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes if (isReadOnly()) { 1928fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes throw new ReadOnlyBufferException(); 1938fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes } 1948fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes return byteCount; 1958fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes } 1968fbc397fc09158bee0bc0cb231c609c4c6e9fc15Elliott Hughes 197a1603838fe9e865575c87982e32c6343740e464cElliott Hughes void checkStartEndRemaining(int start, int end) { 198a1603838fe9e865575c87982e32c6343740e464cElliott Hughes if (end < start || start < 0 || end > remaining()) { 199a1603838fe9e865575c87982e32c6343740e464cElliott Hughes throw new IndexOutOfBoundsException("start=" + start + ", end=" + end + 200a1603838fe9e865575c87982e32c6343740e464cElliott Hughes ", remaining()=" + remaining()); 201a1603838fe9e865575c87982e32c6343740e464cElliott Hughes } 202a1603838fe9e865575c87982e32c6343740e464cElliott Hughes } 203a1603838fe9e865575c87982e32c6343740e464cElliott Hughes 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Clears this buffer. 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * While the content of this buffer is not changed, the following internal 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * changes take place: the current position is reset back to the start of 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer, the value of the buffer limit is made equal to the capacity 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and mark is cleared. 211eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this buffer. 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Buffer clear() { 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = 0; 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mark = UNSET_MARK; 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project limit = capacity; 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Flips this buffer. 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The limit is set to the current position, then the position is set to 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * zero, and the mark is cleared. 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The content of this buffer is not changed. 228eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this buffer. 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Buffer flip() { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project limit = position; 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = 0; 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mark = UNSET_MARK; 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 239e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * Returns true if {@code array} and {@code arrayOffset} won't throw. This method does not 240e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * return true for buffers not backed by arrays because the other methods would throw 241e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * {@code UnsupportedOperationException}, nor does it return true for buffers backed by 242e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * read-only arrays, because the other methods would throw {@code ReadOnlyBufferException}. 243e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @since 1.6 244e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes */ 245e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes public abstract boolean hasArray(); 246e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes 247e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes /** 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates if there are elements remaining in this buffer, that is if 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code position < limit}. 250f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if there are elements remaining in this buffer, 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} otherwise. 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean hasRemaining() { 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return position < limit; 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 259e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * Returns true if this is a direct buffer. 260e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes * @since 1.6 261e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes */ 262e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes public abstract boolean isDirect(); 263e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes 264e2f02b4664644630aca4f1e89358949766e28422Elliott Hughes /** 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether this buffer is read-only. 266f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this buffer is read-only, {@code false} 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean isReadOnly(); 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 272e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes final void checkWritable() { 273e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes if (isReadOnly()) { 274126ab1b546c71137a97cef68cc89267e7f7be634Elliott Hughes throw new IllegalArgumentException("Read-only buffer"); 275e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes } 276e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes } 277e3b6fa2bf357f2712ab2ee9e8487f157595ea0c7Elliott Hughes 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the limit of this buffer. 280f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the limit of this buffer. 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int limit() { 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return limit; 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the limit of this buffer. 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the current position in the buffer is in excess of 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <code>newLimit</code> then, on returning from this call, it will have 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * been adjusted to be equivalent to <code>newLimit</code>. If the mark 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is set and is greater than the new limit, then it is cleared. 294eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newLimit 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new limit, must not be negative and not greater than 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * capacity. 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this buffer. 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalArgumentException 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if <code>newLimit</code> is invalid. 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Buffer limit(int newLimit) { 3030c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes limitImpl(newLimit); 3040c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes return this; 3050c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes } 3060c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes 3070c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes /** 3080c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes * Subverts the fact that limit(int) is final, for the benefit of MappedByteBufferAdapter. 3090c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes */ 3100c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes void limitImpl(int newLimit) { 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newLimit < 0 || newLimit > capacity) { 312a28bc96d63595a77fa918da8ccdda50e9eaae95eElliott Hughes throw new IllegalArgumentException("Bad limit (capacity " + capacity + "): " + newLimit); 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project limit = newLimit; 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (position > newLimit) { 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newLimit; 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((mark != UNSET_MARK) && (mark > newLimit)) { 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mark = UNSET_MARK; 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Marks the current position, so that the position may return to this point 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * later by calling <code>reset()</code>. 327f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this buffer. 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Buffer mark() { 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mark = position; 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the position of this buffer. 337f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the value of this buffer's current position. 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int position() { 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return position; 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the position of this buffer. 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the mark is set and it is greater than the new position, then it is 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * cleared. 349eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newPosition 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the new position, must be not negative and not greater than 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limit. 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this buffer. 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception IllegalArgumentException 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if <code>newPosition</code> is invalid. 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Buffer position(int newPosition) { 3580c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes positionImpl(newPosition); 3590c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes return this; 3600c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes } 3610c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes 3620c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes void positionImpl(int newPosition) { 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition < 0 || newPosition > limit) { 364a28bc96d63595a77fa918da8ccdda50e9eaae95eElliott Hughes throw new IllegalArgumentException("Bad position (limit " + limit + "): " + newPosition); 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if ((mark != UNSET_MARK) && (mark > position)) { 369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mark = UNSET_MARK; 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of remaining elements in this buffer, that is 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code limit - position}. 376f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of remaining elements in this buffer. 378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int remaining() { 380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return limit - position; 381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Resets the position of this buffer to the <code>mark</code>. 385f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this buffer. 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @exception InvalidMarkException 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the mark is not set. 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Buffer reset() { 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (mark == UNSET_MARK) { 392a28bc96d63595a77fa918da8ccdda50e9eaae95eElliott Hughes throw new InvalidMarkException("Mark not set"); 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = mark; 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Rewinds this buffer. 400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The position is set to zero, and the mark is cleared. The content of this 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * buffer is not changed. 403eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson * 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return this buffer. 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Buffer rewind() { 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = 0; 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mark = UNSET_MARK; 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 4110c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes 4120c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes @Override public String toString() { 4130c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes StringBuilder buf = new StringBuilder(); 4140c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes buf.append(getClass().getName()); 4150c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes buf.append(", status: capacity="); 4160c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes buf.append(capacity); 4170c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes buf.append(" position="); 4180c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes buf.append(position); 4190c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes buf.append(" limit="); 4200c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes buf.append(limit); 4210c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes return buf.toString(); 4220c53cf8b2c46deb41e91db50ddc17d598cc64a10Elliott Hughes } 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 424