1 /* 2 * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.nio; 27 28 import libcore.io.Memory; 29 30 class ByteBufferAsIntBuffer extends IntBuffer { // package-private 31 32 protected final ByteBuffer bb; 33 protected final int offset; 34 private final ByteOrder order; 35 ByteBufferAsIntBuffer(ByteBuffer bb, int mark, int pos, int lim, int cap, int off, ByteOrder order)36 ByteBufferAsIntBuffer(ByteBuffer bb, 37 int mark, int pos, int lim, int cap, 38 int off, ByteOrder order) { 39 super(mark, pos, lim, cap); 40 this.bb = bb.duplicate(); 41 this.isReadOnly = bb.isReadOnly; 42 // There are only two possibilities for the type of ByteBuffer "bb", viz, DirectByteBuffer and 43 // HeapByteBuffer. We only have to initialize the field when bb is an instance of 44 // DirectByteBuffer. 45 // The address field is used by NIOAccess#getBasePointer and GetDirectBufferAddress method 46 // in art which return the address of the first usable byte of the underlying memory, i.e, 47 // the position of parent buffer. Therefore, value of "off" will be equal to parent buffer's 48 // position when the method is called from either HeapByteBuffer or DirectByteBuffer. 49 if (bb instanceof DirectByteBuffer) { 50 this.address = bb.address + off; 51 } 52 this.bb.order(order); 53 this.order = order; 54 offset = off; 55 } 56 slice()57 public IntBuffer slice() { 58 int pos = this.position(); 59 int lim = this.limit(); 60 assert (pos <= lim); 61 int rem = (pos <= lim ? lim - pos : 0); 62 int off = (pos << 2) + offset; 63 assert (off >= 0); 64 return new ByteBufferAsIntBuffer(bb, -1, 0, rem, rem, off, order); 65 } 66 duplicate()67 public IntBuffer duplicate() { 68 return new ByteBufferAsIntBuffer(bb, 69 markValue(), 70 position(), 71 limit(), 72 capacity(), 73 offset, 74 order); 75 } 76 asReadOnlyBuffer()77 public IntBuffer asReadOnlyBuffer() { 78 return new ByteBufferAsIntBuffer(bb.asReadOnlyBuffer(), 79 markValue(), 80 position(), 81 limit(), 82 capacity(), 83 offset, 84 order); 85 } 86 ix(int i)87 protected int ix(int i) { 88 return (i << 2) + offset; 89 } 90 get()91 public int get() { 92 return get(nextGetIndex()); 93 } 94 get(int i)95 public int get(int i) { 96 return bb.getIntUnchecked(ix(checkIndex(i))); 97 } 98 get(int[] dst, int offset, int length)99 public IntBuffer get(int[] dst, int offset, int length) { 100 checkBounds(offset, length, dst.length); 101 if (length > remaining()) 102 throw new BufferUnderflowException(); 103 bb.getUnchecked(ix(position), dst, offset, length); 104 position += length; 105 return this; 106 } 107 put(int x)108 public IntBuffer put(int x) { 109 put(nextPutIndex(), x); 110 return this; 111 } 112 put(int i, int x)113 public IntBuffer put(int i, int x) { 114 if (isReadOnly) { 115 throw new ReadOnlyBufferException(); 116 } 117 bb.putIntUnchecked(ix(checkIndex(i)), x); 118 return this; 119 } 120 put(int[] src, int offset, int length)121 public IntBuffer put(int[] src, int offset, int length) { 122 checkBounds(offset, length, src.length); 123 if (length > remaining()) 124 throw new BufferOverflowException(); 125 bb.putUnchecked(ix(position), src, offset, length); 126 position += length; 127 return this; 128 } 129 compact()130 public IntBuffer compact() { 131 if (isReadOnly) { 132 throw new ReadOnlyBufferException(); 133 } 134 int pos = position(); 135 int lim = limit(); 136 assert (pos <= lim); 137 int rem = (pos <= lim ? lim - pos : 0); 138 if (!(bb instanceof DirectByteBuffer)) { 139 System.arraycopy(bb.array(), ix(pos), bb.array(), ix(0), rem << 2); 140 } else { 141 Memory.memmove(this, ix(0), this, ix(pos), rem << 2); 142 } 143 position(rem); 144 limit(capacity()); 145 discardMark(); 146 return this; 147 } 148 isDirect()149 public boolean isDirect() { 150 return bb.isDirect(); 151 } 152 isReadOnly()153 public boolean isReadOnly() { 154 return isReadOnly; 155 } 156 order()157 public ByteOrder order() { 158 return order; 159 } 160 } 161