DirectByteBuffer.java revision 692222b08ff88eb92b523bf4780d7ea17a23aa80
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200440837fd0013373ba3476283151299e7be9e5a3Elliott Hughesabstract class DirectByteBuffer extends BaseByteBuffer { 210440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes // This is the offset into {@code Buffer.block} at which this buffer logically starts. 220440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes // TODO: rewrite this so we set 'block' to an OffsetMemoryBlock? 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected final int offset; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes protected DirectByteBuffer(MemoryBlock block, int capacity, int offset) { 260440837fd0013373ba3476283151299e7be9e5a3Elliott Hughes super(capacity, block); 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 28eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes long baseSize = block.getSize(); 29c3c38fbbccaf428200acdd819b1f7799edac54d2Elliott Hughes if (baseSize >= 0 && (capacity + offset) > baseSize) { 30c3c38fbbccaf428200acdd819b1f7799edac54d2Elliott Hughes throw new IllegalArgumentException("capacity + offset > baseSize"); 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 32eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.offset = offset; 34eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes this.effectiveDirectAddress = block.toInt() + offset; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 38ccbe3404e0691dab506d017550658e8e5974c83eElliott Hughes public final ByteBuffer get(byte[] dst, int off, int len) { 39ccbe3404e0691dab506d017550658e8e5974c83eElliott Hughes int length = dst.length; 40eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson if ((off < 0) || (len < 0) || (long) off + (long) len > length) { 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (len > remaining()) { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes this.block.peekByteArray(offset + position, dst, off, len); 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position += len; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return this; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 50eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson 51692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes final ByteBuffer get(int[] dst, int off, int intCount) { 52692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes int length = dst.length; 53692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes int byteCount = SIZEOF_INT * intCount; 54692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes if ((off < 0) || (intCount < 0) || (long) off + (long) intCount > length) { 55692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes throw new IndexOutOfBoundsException(); 56692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes } 57692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes if (byteCount > remaining()) { 58692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes throw new BufferUnderflowException(); 59692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes } 60692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes this.block.peekIntArray(offset + position, dst, off, intCount, order.needsSwap); 61692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes position += byteCount; 62692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes return this; 63692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes } 64692222b08ff88eb92b523bf4780d7ea17a23aa80Elliott Hughes 65eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final byte get() { 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (position == limit) { 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes return this.block.peekByte(offset + position++); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 73eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final byte get(int index) { 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (index < 0 || index >= limit) { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes return this.block.peekByte(offset + index); 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 81eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final double getDouble() { 8329dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes int newPosition = position + SIZEOF_DOUBLE; 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes double result = this.block.peekDouble(offset + position, order); 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final double getDouble(int index) { 9429dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes if (index < 0 || (long) index + SIZEOF_DOUBLE > limit) { 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 97eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes return this.block.peekDouble(offset + index, order); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 100eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final float getFloat() { 10229dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes int newPosition = position + SIZEOF_FLOAT; 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes float result = this.block.peekFloat(offset + position, order); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 111eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final float getFloat(int index) { 11329dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes if (index < 0 || (long) index + SIZEOF_FLOAT > limit) { 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 116eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes return this.block.peekFloat(offset + index, order); 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 119eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int getInt() { 12129dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes int newPosition = position + SIZEOF_INT; 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes int result = this.block.peekInt(offset + position, order); 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 130eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int getInt(int index) { 13229dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes if (index < 0 || (long) index + SIZEOF_INT > limit) { 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 135eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes return this.block.peekInt(offset + index, order); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 138eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final long getLong() { 14029dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes int newPosition = position + SIZEOF_LONG; 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 144eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes long result = this.block.peekLong(offset + position, order); 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 149eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final long getLong(int index) { 15129dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes if (index < 0 || (long) index + SIZEOF_LONG > limit) { 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes return this.block.peekLong(offset + index, order); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 157eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final short getShort() { 15929dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes int newPosition = position + SIZEOF_SHORT; 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (newPosition > limit) { 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new BufferUnderflowException(); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 163eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes short result = this.block.peekShort(offset + position, order); 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project position = newPosition; 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return result; 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 168eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final short getShort(int index) { 17029dbfe19b113a13b712be2bc762ef1c81cd06c47Elliott Hughes if (index < 0 || (long) index + SIZEOF_SHORT > limit) { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IndexOutOfBoundsException(); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes return this.block.peekShort(offset + index, order); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 176eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean isDirect() { 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return true; 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void free() { 182eb29579498a8860f81fd38275f8657c21bb67abbElliott Hughes block.free(); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson 185eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final protected byte[] protectedArray() { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 190eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final protected int protectedArrayOffset() { 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new UnsupportedOperationException(); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 195eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson @Override 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project final protected boolean protectedHasArray() { 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 200