1843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera/* 2843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. 3843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * 5843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * This code is free software; you can redistribute it and/or modify it 6843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * under the terms of the GNU General Public License version 2 only, as 7843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * published by the Free Software Foundation. Oracle designates this 8843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * particular file as subject to the "Classpath" exception as provided 9843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * by Oracle in the LICENSE file that accompanied this code. 10843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * 11843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * This code is distributed in the hope that it will be useful, but WITHOUT 12843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * version 2 for more details (a copy is included in the LICENSE file that 15843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * accompanied this code). 16843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * 17843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * You should have received a copy of the GNU General Public License version 18843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * 2 along with this work; if not, write to the Free Software Foundation, 19843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * 21843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * or visit www.oracle.com if you need additional information or have any 23843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera * questions. 24843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera */ 25843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 26843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmerapackage java.nio; 27843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 2846edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmeraimport libcore.io.Memory; 29843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 30843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmeraclass ByteBufferAsDoubleBuffer 31190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera extends DoubleBuffer { // package-private 32843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 33843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera protected final ByteBuffer bb; 34843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera protected final int offset; 35843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera private final ByteOrder order; 36843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 37843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera ByteBufferAsDoubleBuffer(ByteBuffer bb, 38843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int mark, int pos, int lim, int cap, 39843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int off, ByteOrder order) { 40843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera super(mark, pos, lim, cap); 41c3005946d4806ca6a975fcfc63bdfd3e54b56b9aShubham Ajmera this.bb = bb.duplicate(); 42d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera this.isReadOnly = bb.isReadOnly; 43e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // There are only two possibilities for the type of ByteBuffer "bb", viz, DirectByteBuffer and 44e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // HeapByteBuffer. We only have to initialize the field when bb is an instance of 45e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // DirectByteBuffer. 46e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // The address field is used by NIOAccess#getBasePointer and GetDirectBufferAddress method 47e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // in art which return the address of the first usable byte of the underlying memory, i.e, 48e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // the position of parent buffer. Therefore, value of "off" will be equal to parent buffer's 49e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera // position when the method is called from either HeapByteBuffer or DirectByteBuffer. 50e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera if (bb instanceof DirectByteBuffer) { 51e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera this.address = bb.address + off; 52e0f383ffa625e584e81061ef4ddef83a9f48809eShubham Ajmera } 53cdf4dbb3c1ee370333fdfa628def46a4250c292dShubham Ajmera this.bb.order(order); 54843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera this.order = order; 55843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera offset = off; 56843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 57843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 58843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public DoubleBuffer slice() { 59843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int pos = this.position(); 60843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int lim = this.limit(); 61843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera assert (pos <= lim); 62843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 63843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int off = (pos << 3) + offset; 64843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera assert (off >= 0); 6546edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsDoubleBuffer(bb, -1, 0, rem, rem, off, order); 66843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 67843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 68843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public DoubleBuffer duplicate() { 69843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera return new ByteBufferAsDoubleBuffer(bb, 70190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera markValue(), 71190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera position(), 72190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera limit(), 73190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera capacity(), 74190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, 75190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera order); 76843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 77843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 78843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public DoubleBuffer asReadOnlyBuffer() { 7946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return new ByteBufferAsDoubleBuffer(bb.asReadOnlyBuffer(), 80190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera markValue(), 81190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera position(), 82190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera limit(), 83190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera capacity(), 84190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera offset, 85190a49036750b8bb6c979d958ed56aa3fb4f408aShubham Ajmera order); 86843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 87843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 88843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera protected int ix(int i) { 89843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera return (i << 3) + offset; 90843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 91843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 92843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public double get() { 9346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera return get(nextGetIndex()); 94843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 95843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 96843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public double get(int i) { 97e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera return bb.getDoubleUnchecked(ix(checkIndex(i))); 98843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 99843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 100f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public DoubleBuffer get(double[] dst, int offset, int length) { 101f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, dst.length); 102f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 103f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferUnderflowException(); 104f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.getUnchecked(ix(position), dst, offset, length); 105f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 106f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 107f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 108f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 109843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public DoubleBuffer put(double x) { 11046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera put(nextPutIndex(), x); 111843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera return this; 112843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 113843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 114843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public DoubleBuffer put(int i, double x) { 115e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera if (isReadOnly) { 116e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera throw new ReadOnlyBufferException(); 117e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera } 118e20e1b55eab0f2163e812a28cf3b3a682df38a1dShubham Ajmera bb.putDoubleUnchecked(ix(checkIndex(i)), x); 119843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera return this; 120843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 121843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 122f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera public DoubleBuffer put(double[] src, int offset, int length) { 123f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera checkBounds(offset, length, src.length); 124f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera if (length > remaining()) 125f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera throw new BufferOverflowException(); 126f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera bb.putUnchecked(ix(position), src, offset, length); 127f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera position += length; 128f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera return this; 129f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera } 130f28b09a791e4e5635e4fcdfd1adde27aec0a1ed6Shubham Ajmera 131843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public DoubleBuffer compact() { 132843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera if (isReadOnly) { 133843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera throw new ReadOnlyBufferException(); 134843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 135843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int pos = position(); 136843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int lim = limit(); 137843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera assert (pos <= lim); 138843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera int rem = (pos <= lim ? lim - pos : 0); 13946edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera if (!(bb instanceof DirectByteBuffer)) { 14046edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera System.arraycopy(bb.array(), ix(pos), bb.array(), ix(0), rem << 3); 14146edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } else { 14246edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera Memory.memmove(this, ix(0), this, ix(pos), rem << 3); 14346edfaf31e67122f4f67780a83a0bda4dfbbf6a7Shubham Ajmera } 144843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera position(rem); 145843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera limit(capacity()); 146843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera discardMark(); 147843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera return this; 148843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 149843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 150843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public boolean isDirect() { 151843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera return bb.isDirect(); 152843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 153843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 154843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public boolean isReadOnly() { 155d80eadc041c833c2808beb823f4edb90ff7410f7Shubham Ajmera return isReadOnly; 156843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 157843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera 158843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera public ByteOrder order() { 159843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera return order; 160843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera } 161843f49b521b0bd939675771d312a02c0f1f0a9ffShubham Ajmera} 162