134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera/* 234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. 334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * 534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * This code is free software; you can redistribute it and/or modify it 634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * under the terms of the GNU General Public License version 2 only, as 734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * published by the Free Software Foundation. Oracle designates this 834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * particular file as subject to the "Classpath" exception as provided 934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * by Oracle in the LICENSE file that accompanied this code. 1034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * 1134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * This code is distributed in the hope that it will be useful, but WITHOUT 1234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * version 2 for more details (a copy is included in the LICENSE file that 1534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * accompanied this code). 1634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * 1734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * You should have received a copy of the GNU General Public License version 1834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * 2 along with this work; if not, write to the Free Software Foundation, 1934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * 2134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * or visit www.oracle.com if you need additional information or have any 2334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera * questions. 2434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera */ 2534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 2634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmerapackage java.nio; 2734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 2846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmeraimport libcore.io.Memory; 2946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera 3034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmeraclass ByteBufferAsFloatBuffer extends FloatBuffer { // package-private 3134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 3234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera protected final ByteBuffer bb; 3334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera protected final int offset; 3434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera private final ByteOrder order; 3534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 3634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera ByteBufferAsFloatBuffer(ByteBuffer bb, 3734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int mark, int pos, int lim, int cap, 3834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int off, ByteOrder order) { 3934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera super(mark, pos, lim, cap); 40c3005946d4806ca6a975fcfc63bdfd3e54b56b9aShubham Ajmera this.bb = bb.duplicate(); 41d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera this.isReadOnly = bb.isReadOnly; 42e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // There are only two possibilities for the type of ByteBuffer "bb", viz, DirectByteBuffer and 43e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // HeapByteBuffer. We only have to initialize the field when bb is an instance of 44e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // DirectByteBuffer. 45e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // The address field is used by NIOAccess#getBasePointer and GetDirectBufferAddress method 46e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // in art which return the address of the first usable byte of the underlying memory, i.e, 47e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // the position of parent buffer. Therefore, value of "off" will be equal to parent buffer's 48e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // position when the method is called from either HeapByteBuffer or DirectByteBuffer. 49e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera if (bb instanceof DirectByteBuffer) { 50e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera this.address = bb.address + off; 51e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera } 52cdf4dbb3c1ee370333fdfa628def46a4250c292dShubham Ajmera this.bb.order(order); 5334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera this.order = order; 5434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera offset = off; 5534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 5634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 5734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public FloatBuffer slice() { 5834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int pos = this.position(); 5934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int lim = this.limit(); 6034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera assert (pos <= lim); 6134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 6234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int off = (pos << 2) + offset; 6334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera assert (off >= 0); 6446edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsFloatBuffer(bb, -1, 0, rem, rem, off, order); 6534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 6634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 6734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public FloatBuffer duplicate() { 6834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera return new ByteBufferAsFloatBuffer(bb, 69190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera markValue(), 70190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera position(), 71190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera limit(), 72190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera capacity(), 73190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, 74190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera order); 7534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 7634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 7734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public FloatBuffer asReadOnlyBuffer() { 7846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsFloatBuffer(bb.asReadOnlyBuffer(), 79190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera markValue(), 80190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera position(), 81190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera limit(), 82190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera capacity(), 83190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, 84190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera order); 8534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 8634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 8734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera protected int ix(int i) { 8834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera return (i << 2) + offset; 8934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 9034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 9134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public float get() { 9246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return get(nextGetIndex()); 9334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 9434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 9534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public float get(int i) { 96e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera return bb.getFloatUnchecked(ix(checkIndex(i))); 9734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 9834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 99f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public FloatBuffer get(float[] dst, int offset, int length) { 100f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, dst.length); 101f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 102f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferUnderflowException(); 103f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.getUnchecked(ix(position), dst, offset, length); 104f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 105f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 106f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 107f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 10834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public FloatBuffer put(float x) { 10946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera put(nextPutIndex(), x); 11034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera return this; 11134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 11234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 11334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public FloatBuffer put(int i, float x) { 114e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera if (isReadOnly) { 115e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera throw new ReadOnlyBufferException(); 116e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera } 117e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera bb.putFloatUnchecked(ix(checkIndex(i)), x); 11834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera return this; 11934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 12034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 121f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public FloatBuffer put(float[] src, int offset, int length) { 122f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, src.length); 123f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 124f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferOverflowException(); 125f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.putUnchecked(ix(position), src, offset, length); 126f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 127f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 128f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 129f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 13034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public FloatBuffer compact() { 13134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera if (isReadOnly) { 13234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera throw new ReadOnlyBufferException(); 13334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 13434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int pos = position(); 13534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int lim = limit(); 13634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera assert (pos <= lim); 13734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 13846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera if (!(bb instanceof DirectByteBuffer)) { 13946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera System.arraycopy(bb.array(), ix(pos), bb.array(), ix(0), rem << 2); 14046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } else { 14146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera Memory.memmove(this, ix(0), this, ix(pos), rem << 2); 14246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } 14334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera position(rem); 14434dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera limit(capacity()); 14534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera discardMark(); 14634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera return this; 14734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 14834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 14934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public boolean isDirect() { 15034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera return bb.isDirect(); 15134dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 15234dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 15334dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public boolean isReadOnly() { 154d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera return isReadOnly; 15534dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 15634dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera 15734dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera public ByteOrder order() { 15834dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera return order; 15934dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera } 16034dd9b7638f85b80ae4082f36c76263904e1c3e4Shubham Ajmera} 161